1. 程式人生 > >演算法設計與分析期末專案

演算法設計與分析期末專案

演算法設計與分析期末專案


1. 題目 固定容量設施分配問題


1.1 題目描述

​假設有\(n\)個設施和\(m\)位客戶,希望從中選擇:

  1. \(n\)個設施中選擇開啟哪些設施
  2. 將客戶分配給開啟的設施

要求開啟設施的總費用和客戶分配到設施的總費用之和最小,且設施的容量不能超過設施中客戶分配費用的總和。


1.2 題目要求

  1. 至少兩種演算法解答題目

  2. 獲得71種測例的執行結果(具體格式略,在文章中體現)


2. 數學模型分析


2.1 變數定義

在本題目中,為方便分析,定義如下的變數:

  1. \(I = \lbrace 0, 1, \cdots, n-1 \rbrace 表示設施 0, 1, \cdots, n-1\)

  2. $J = \lbrace 0, 1, \cdots, m-1 \rbrace 表示客戶0, 1, \cdots, m-1 $

  3. \(y_{i}\)表示設施\(i\)的開啟狀況,具體如下所示:\[y_{i}=\begin{cases} 1, 設施i開啟 \\ 0, 設施i未開啟 \\ \end{cases}\]

  4. \(x_{ij}\)表示客戶\(j\)的分配情況,具體如下所示:\[x_{ij}=\begin{cases} 1, 表示客戶j被分配到設施i \\ 0, 表示客戶j未被分配到設施i \\ \end{cases}\]

  5. \(V_{i}\)表示設施\(i\)的容量

  6. \(C_{i}\)

    表示設施\(i\)的開啟費用

  7. \(D_{ij}\)表示客戶\(j\)分配到設施\(i\)的需求容量

  8. \(G_{ij}\)表示客戶\(j\)分到到設施\(i\)的分配費用

  9. \(L\)表示分配的總費用


2.2 目標函式

題目的目標函式可以寫成如下數學形式,即求所以開啟設施所需要的費用和所用客戶分配到相應工廠所需的費用之和:
\[L=min \lbrace \sum_{i=0}^{n-1}C_{i}y_{i}+\sum_{i=0}^{n-1}\sum_{j=0}^{m-1}G_{ij}x_{ij} \rbrace\]


2.3 約束條件

目標函式的約束條件如下所示,即每個設施中客戶需求量\(D_{ij}\)

的總和不能夠超過設施的容量,且每位客戶只能夠分配到1個設施:
\[\sum_{j=0}^{m-1}D_{ij}x_{ij} \leq V_{i}y_{i}, i \in I \\ \sum_{i=0}^{n-1}x_{ij}=1,j \in J \\ x_{ij},y_{j} \in \lbrace 0, 1\rbrace, i \in I, j \in J\]


3. 演算法設計與分析


3.1 貪心演算法

解決這個問題的第一種解法是採用貪心演算法,貪心的方式是遍歷每一位客戶\(j \in J\),在設施集合\(I\)中尋找最佳的設施\(i\),使得到分配客戶\(j\)為止,所得到的總費用\(F_{j}\)最小,則:\[i=\underset{i \in I}{\operatorname{argmin}}\,\lbrace F_{j-1}+y_{i}C_{i}+G_{ij}\rbrace [V_{i}-D_{j} \geq 0] \\ F_{-1} = 0,G = F_{m-1}\]


3.1.1 演算法分析

固定容量的設施問題在常數時間下是不可解的,因此可以使用一些近似的演算法來求解,貪心演算法就是其中的一種。在實驗中,使用顧客設施的分配序列\(S=[s_1,s_2,\cdots,s_m],s_i \in I\),作為問題的解,使用\(E=[e_1,e_2,\cdots,e_n],n \in \lbrace0,1\rbrace\)表示設施的開啟狀態,總在貪心的過程中,總共需要經歷兩層迴圈,因此演算法的時間複雜度為\(O(n^2)\)。但是貪心演算法畢竟是不是求解固定容量設施的準確解法,因此不可避免會存在誤差,隨著資料規\(n\)模的增大,誤差會以\(lgn\)增大,因此在大資料下,貪心演算法的準確度不高,跟最優解之間的差距可以達到40%,但是在規模較小或者中等的時候,貪心演算法的速度和解的質量還是非常好的,能夠在10%以內。
演算法在C++程式碼中的關鍵部分如下所示:

    // Greedy Algorithm.
    // For every Costomer t.
    for (int t = 0; t < cosNum; t++) {
        int minCos = INT_MAX;
        int bestServe = -1;
        // Costomers t choose facility j.
        // Assume all the facility are open at first.
        for (int j = 0; j < facNum; j++) {
            // fct[j].volumn-csm[t].demand >= 0 means 
            // the fct[j] have enough space to satisfy the demand.
            if ((fct[j].volumn - csm[t].demand >= 0) 
            && (minCos >= G+csm[t].assignment_cost[j])) {
                bestServe = j;
                minCos = G+csm[t].assignment_cost[j];
            }
        }

        serveList[t] = bestServe;
        // Update the current volumns of fct.
        fct[serveList[t]].volumn -= csm[t].demand; 
        // Update the specific fct to open.
        isOpen[serveList[t]] = 1;    
        // Update the current total cost.              
        G = minCos;                                
    }

3.1.2 測例分析

測例 結果 執行時間 設施開啟狀態 設施分配狀態
p1 9440 0s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 8 2 4 4 1 9 0 3 2 0 3 4 0 9 7 3 4 6 4 2 5 1 5 0 5 2 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 3
p2 8126 0s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 8 2 4 4 1 9 0 3 2 0 3 4 0 9 7 3 4 6 4 2 5 1 5 0 5 2 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 3
p3 10126 0s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 8 2 4 4 1 9 0 3 2 0 3 4 0 9 7 3 4 6 4 2 5 1 5 0 5 2 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 3
p4 12126 0s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 8 2 4 4 1 9 0 3 2 0 3 4 0 9 7 3 4 6 4 2 5 1 5 0 5 2 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 3
p5 9375 0s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 8 6 4 2 5 1 5 0 5 2 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 2 0 7 1
p6 8061 0s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 8 6 4 2 5 1 5 0 5 2 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 2 0 7 1
p7 10061 0s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 8 6 4 2 5 1 5 0 5 2 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 2 0 7 1
p8 12061 0s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 8 6 4 2 5 1 5 0 5 2 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 2 0 7 1
p9 9040 0s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 8 6 4 2 5 1 5 0 5 2 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 0
p10 7726 0s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 8 6 4 2 5 1 5 0 5 2 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 0
p11 9726 0s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 8 6 4 2 5 1 5 0 5 2 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 0
p12 11726 0s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 8 6 4 2 5 1 5 0 5 2 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 0
p13 12032 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9
p14 9180 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9
p15 13180 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9
p16 17180 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9
p17 12032 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9
p18 9180 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9
p19 13180 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9
p20 17180 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9
p21 12032 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9
p22 9180 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9
p23 13180 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9
p24 17180 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9
p25 17956 0s 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 19 25 18 8 17 14 25 2 29 7 11 14 28 14 14 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 25 25 5 2 5
p26 15231 0s 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 19 25 18 8 17 14 25 2 29 7 11 14 28 14 14 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 25 25 5 2 5
p27 20031 0s 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 19 25 18 8 17 14 25 2 29 7 11 14 28 14 14 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 25 25 5 2 5
p28 24831 0s 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 19 25 18 8 17 14 25 2 29 7 11 14 28 14 14 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 25 25 5 2 5
p29 19395 0.001s 1 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 8 5 2 24 17 11 17 24 2 19 25 18 8 17 17 25 2 29 17 11 14 28 14 14 2 11 11 27 24 24 24 5 5 8 25 13 18 0 5 9 0 29 0 11 5 5 8 14 17 29 13 17 0 8 13 17 8 25 25 11 2 11
p30 16397 0s 1 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 8 5 2 24 17 11 17 24 2 19 25 18 8 17 17 25 2 29 17 11 14 28 14 14 2 11 11 27 24 24 24 5 5 8 25 13 18 0 5 9 0 29 0 11 5 5 8 14 17 29 13 17 0 8 13 17 8 25 25 11 2 11
p31 21397 0s 1 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 8 5 2 24 17 11 17 24 2 19 25 18 8 17 17 25 2 29 17 11 14 28 14 14 2 11 11 27 24 24 24 5 5 8 25 13 18 0 5 9 0 29 0 11 5 5 8 14 17 29 13 17 0 8 13 17 8 25 25 11 2 11
p32 26397 0s 1 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 8 5 2 24 17 11 17 24 2 19 25 18 8 17 17 25 2 29 17 11 14 28 14 14 2 11 11 27 24 24 24 5 5 8 25 13 18 0 5 9 0 29 0 11 5 5 8 14 17 29 13 17 0 8 13 17 8 25 25 11 2 11
p33 17814 0s 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 19 25 18 8 17 17 25 2 29 17 11 14 28 14 14 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5
p34 15089 0s 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 19 25 18 8 17 17 25 2 29 17 11 14 28 14 14 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5
p35 19889 0s 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 19 25 18 8 17 17 25 2 29 17 11 14 28 14 14 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5
p36 24689 0s 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 19 25 18 8 17 17 25 2 29 17 11 14 28 14 14 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5
p37 17814 0s 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 19 25 18 8 17 17 25 2 29 17 11 14 28 14 14 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5
p38 15089 0s 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 19 25 18 8 17 17 25 2 29 17 11 14 28 14 14 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5
p39 19889 0s 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 19 25 18 8 17 17 25 2 29 17 11 14 28 14 14 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5
p40 24689 0s 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 23 14 0 14 15 28 24 14 7 13 27 8 29 14 14 5 20 20 17 27 11 14 0 5 20 11 11 11 24 0 24 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 19 25 18 8 17 17 25 2 29 17 11 14 28 14 14 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5
p41 7226 0s 1 1 1 1 1 1 1 1 1 1 5 6 4 1 7 9 3 7 8 8 4 9 2 6 2 7 7 3 0 6 6 1 4 1 6 5 5 4 8 5 8 0 0 0 3 9 2 6 6 9 2 7 3 3 3 5 0 5 6 4 1 1 6 6 9 7 2 8 8 8 0 0 1 5 0 6 6 6 4 4 0 4 4 0 7 7 9 2 6 5 7 2 2 7 7 9 2 2 7 2
p42 9957 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 11 9 15 18 16 13 17 1 11 18 6 10 6 15 0 2 14 14 5 11 9 8 12 8 11 16 17 13 7 19 6 8 14 10 10 0 0 1 1 3 3 16 9 14 8 19 15 15 16 17 7 13 13 5 2 14 14 14 11 11 4 3 11 3 0 15 19 6 10 18 19 19 19 18 18 19 19 19
p43 12448 0s 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 15 24 25 22 26 21 27 29 24 23 3 9 18 11 8 15 12 7 25 26 22 20 17 13 29 6 29 4 5 2 2 13 0 22 7 12 21 11 4 12 28 23 5 25 26 17 17 11 21 0 9 18 6 6 19 20 2 29 5 27 1 29 27 28 1 27 28 29
p44 7585 0s 1 1 1 1 1 1 1 1 1 1 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 1 1 1 1 1 7 6 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 6 8 8 8 8 7 5 9 9 7 6 5 5 8 8 7 7 9 5 5 5 9 3 0 6 6 8 1 5 4 9 9 7 7 9 6 6 5 2 7 9 7 9 9 7 6 5 7 5
p45 9848 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 6 6 6 6 2 3 3 2 3 2 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 0 0 2 3 11 12 18 16 19 7 15 16 8 13 11 16 18 19 14 15 10 9 12 9 15 17 13 13 8 12 7 10 18 12 13 17 14 17 8 16 10 7
p46 12639 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 10 0 10 10 10 0 10 1 1 1 1 11 11 11 11 2 3 3 2 3 2 4 4 5 6 6 5 7 7 8 8 8 9 9 10 2 3 17 24 28 29 12 21 22 24 14 18 17 16 28 29 27 13 22 25 26 13 18 18 24 19 15 28 18 26 27 14 13 15 12
p47 6638 0s 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 7 7 6 7 6 0 7 7 7 7 7 8 8 8 8 8 9 8 6 0 9 9 9 6 2 9 2 2
p48 9044 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 1 2 3 3 2 3 3 4 4 4 5 5 5 5 5 5 6 6 6 6 6 7 7 8 8 8 8 8 8 8 9 9 9 9 10 11 11 10 11 10 12 13 12 13 13 12 13 14 15 12 14 12 0 15 14 14 15 16 16 17 17 17 17 17 17 18 18 19 19 19 19 19
p49 12867 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 2 1 2 2 2 3 5 3 5 4 6 6 6 7 7 7 7 7 7 9 10 8 11 10 12 12 14 13 13 13 14 15 15 16 17 17 16 17 16 20 19 18 19 18 20 21 18 21 18 0 22 23 23 22 24 24 26 25 26 25 26 27 27 28 29 28 29
p50 10085 0s 1 1 1 1 1 1 1 1 1 1 3 6 3 0 9 9 5 5 3 7 7 4 9 9 9 9 9 5 5 3 6 0 0 4 0 0 8 4 4 7 7 7 3 3 3 5 9 1 0 6 0 9 9 1 5 5 5 5 5 3 3 5 6 0 0 0 6 6 1 2 1 7 7 7 3 3 0 4 8 7 3 6 6 0 6 4 4 3 3 4 3 5 2 2 1 2 6 7 2 7 1 1 2 2 2 2 2 2 2 2
p51 11616 0s 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 6 19 10 12 13 5 16 15 1 5 3 13 13 6 13 12 16 2 15 0 0 10 14 14 14 9 3 19 7 1 1 17 19 15 5 13 13 10 0 0 13 13 13 16 5 5 5 5 17 15 5 11 14 14 10 6 6 13 12 13 5 1 5 15 15 10 3 9 7 15 0 0 0 10 19 19 19 19 3 19 5 16 12 13 13 6 8 12 1 13 13 18 18 18 13 18 18 18 18
p52 10364 0s 1 1 1 1 1 1 1 1 1 1 7 7 7 7 7 7 7 7 3 4 4 4 3 4 4 4 4 8 8 8 8 3 8 3 3 9 9 9 9 9 9 9 9 5 6 6 6 6 6 6 6 6 6 6 7 7 4 5 5 5 5 3 4 6 2 5 3 3 3 4 6 5 5 5 0 5 5 6 4 7 6 6 4 3 3 5 3 4 7 1 6 3 3 5 5 3 3 7 5 3 1 1 1 1 5 1 3 4 3 7
p53 12839 0s 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 5 5 5 5 5 5 5 19 19 19 7 7 7 7 7 7 12 12 12 12 13 13 12 3 9 9 9 9 9 9 9 9 15 18 18 18 18 18 18 18 18 18 18 5 5 7 12 13 15 15 4 7 18 5 11 3 3 1 6 18 2 15 13 3 13 2 18 10 5 17 18 6 3 3 15 3 6 6 8 14 19 13 15 15 3 1 6 15 4 15 8 17 17 15 17 1 10 1 16
p54 10354 0s 1 1 1 1 1 1 1 1 1 1 9 9 7 7 7 7 7 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 6 6 8 8 8 8 8 8 8 8 3 6 3 6 6 6 6 6 6 6 6 6 5 5 6 5 5 5 6 6 0 0 6 0 0 9 0 0 0 0 0 4 4 0 4 4 4 4 4 4 4 4 9 9 4 4 4 4 4 2 2
p55 12099 0s 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 17 18 16 18 16 4 4 4 8 8 8 8 8 8 2 2 2 2 8 12 12 12 12 12 6 12 12 6 6 6 6 14 14 6 6 6 6 6 6 7 19 19 19 7 0 0 0 0 0 0 0 0 7 7 7 7 10 7 7 7 11 11 9 11 3 11 11 7 11 9 9 11 9 11 18 13 9 13 13 13 13 15 15 15 15 15 15 15 5 15 5 18 18 18 18 18 18 18 18 18
p56 23882 0.001s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p57 32882 0.001s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p58 53882 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p59 39121 0.001s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p60 23882 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p61 32882 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p62 53882 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p63 39121 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p64 23882 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p65 32882 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p66 53882 0.001s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p67 39671 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 22 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 15 18 9 6 26 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 19 5 27 7 28 6 25 25 2 3 27 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p68 23882 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p69 32882 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p70 53882 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19
p71 39121 0s 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19

3.2 多鄰域搜尋與模擬退火演算法

多鄰域搜尋演算法常與模擬退火演算法相結合,是一種啟發式演算法。模擬退火的出發點是基於物理中固體物質的退火過程與一般組合優化問題的相似性,其物理退火過程由加溫過程、等溫過程和冷卻過程兩部分組成。多鄰域搜尋是指利用多種鄰域搜尋演算法對解進行遍歷搜尋,這種方法容易陷入區域性最優解中,因此利用模擬退火演算法可以在一定的概率上接受差解,從而跳出區域性最優解,最終收斂到全域性最優解。


3.2.1 多鄰域搜尋


3.2.1.1 更改分配設施

第一種鄰域搜尋的方式是隨機選擇一個客戶\(j \in J\),在設施集\(I\)中隨機選擇一個不同於當前分配設施的設施\(i\),如果\(i\)的剩餘容量能夠滿足\(j\)的需求\(D_{ij}\),則將\(x_{ij}\)的值置為1,原來的設施置為0。實際操作中發現,如果在選擇設施的時候能夠加入貪心,效果會更好,更好後的相關程式碼如下所示:

    if (p <= 0.5) {
        int cosIndex = random(0, cosNum);
        //int newServe = random(0, facNum);


        // New serve should have enough space
        /*
        while ((newServe == serveList[cosIndex]) 
        || (fctTemp[newServe].volumn < csm[cosIndex].demand)) {
            // If do not have enough space.
            // create a new index.
            newServe = random(0, facNum);
        }*/

        // Find the best new serve.
        int newServe = serveList[cosIndex];
        int minCost = currentBestSolution;
        for (int i = 0; i < facNum; i++) {
            // The i-th facility.
            // If the facility has enough space and not currently facility.
            if (serveList[cosIndex] != i 
            && fctTemp[i].volumn >= csm[cosIndex].demand) {
                // Check whether current serve facility is close after csm[cosIndex] is not assigned.
                int currentOpen = (fctTemp[serveList[cosIndex]].volumn
                                +csm[cosIndex].demand == fctTemp[serveList[cosIndex]].Max) ? -1 : 0;
                int newCost = minCost 
                            - csm[cosIndex].assignment_cost[serveList[cosIndex]] 
                            + csm[cosIndex].assignment_cost[i] 
                            + currentOpen * fctTemp[serveList[cosIndex]].cost;
                if (newCost < minCost) {
                    // Accept the new solution.
                    minCost = newCost;
                    newServe = i;
                }
            }
        }

3.2.1.2 交換設施

第二種鄰域搜尋的方式,是隨機選取兩個不相同的客戶\(j_1\)\(j_2\),如果原先兩個客戶所服務的設施\(i_1\)\(i_2\)不相同,而且容量能夠分別滿足\(j_2\)\(j_1\)的需求,則將兩個客戶所服務的設施交換,在程式碼中的部分如下所示:

    // Case2: swap.
    else if (p > 0.33 && p <= 0.66) {
        // Random select two costomer position.
        int cosNumOne = random(0, cosNum);
        int cosNumTwo = random(0, cosNum);

        // Prevent the two position to be same.
        // Comfiren that the two position have enough space.
        while ((cosNumOne == cosNumTwo)
        || (fctTemp[serveList[cosNumOne]].volumn + csm[cosNumOne].demand < csm[cosNumTwo].demand)
        || (fctTemp[serveList[cosNumTwo]].volumn + csm[cosNumTwo].demand < csm[cosNumOne].demand)) {
            cosNumOne = random(0, cosNum);
            cosNumTwo = random(0, cosNum);
        }
        fctTemp[serveList[cosNumOne]].volumn = fctTemp[serveList[cosNumOne]].volumn + csm[cosNumOne].demand - csm[cosNumTwo].demand;
        fctTemp[serveList[cosNumTwo]].volumn = fctTemp[serveList[cosNumTwo]].volumn + csm[cosNumTwo].demand - csm[cosNumOne].demand;

        newList[cosNumOne] = serveList[cosNumTwo];
        newList[cosNumTwo] = serveList[cosNumOne];
    }

3.2.2 模擬退火

由於多鄰域搜尋容易陷入區域性最優值,因此可以引入模擬退火來跳出區域性最優解,並最終收斂到全域性最優解。
模擬退火可以按照如下步驟進行描述:

給定初溫T=T0,隨機產生出事狀態s=s0,令k=0;
    Repeat:
        Repeat:
            產生新狀態sj=Generate(s)
                if min{1, exp[-(C(sj)-C(s))/tk]}>=random[0,1] s=sj;
        Until 抽樣穩定準則滿足;
        退溫tk+1=update(tk),並令k=k+1;
    Until 演算法終止準則滿足
輸出演算法搜尋結果

結合三種鄰域搜尋,在程式碼中模擬退火的過程程式碼如下所示:

    while (T_begin > T_end) {
        vector<facility> oldTemp = fct;
        vector<int> oldOpen = isOpen;
        vector<int> serveTemp = serveList;
        for (int i = 0; i < iterator; i++) {
            // According to serveList.

            fctTemp = fct;
            vector<int> newSolution = createNewSolution(fctTemp); // A new serveList.
            
            for (int i = 0; i < fctTemp.size(); i++) {
                openTemp[i] = (fctTemp[i].volumn == fctTemp[i].Max) ? 0 : 1;
            }

            int newSolutionLength = getCurrentCost(newSolution, openTemp);
            int delta = newSolutionLength - currentBestSolution;

            // Annealing.
            if (delta >= 0) {
                double r = (double)rand() / (RAND_MAX);
                // Keep the original solution.
                if (exp(-delta / T_begin) <= r) {
                    // Accept the bad solution.
                    serveList = newSolution;
                    fct = fctTemp;
                    isOpen = openTemp;
                    currentBestSolution = newSolutionLength;
                }
            }
            // Else Accept the solution.
            else {
                serveList = newSolution;
                fct = fctTemp;
                isOpen = openTemp;
                currentBestSolution = newSolutionLength;
            }
        }
        
        if (globalBest > currentBestSolution) {
            globalBest = currentBestSolution;
            fct = oldTemp;
            isOpen = oldOpen;
            serveList = serveTemp;
        }

        cout << T_begin << " 當前全域性最優結果為: " << globalBest << endl;

        // Update the temperature.
        T_begin *= q_rate;
    }

演算法分析

相對於貪心演算法,模擬退火演算法和多鄰域演算法在某些測例中的準度都要高很多,但是程式碼執行的速度會比較慢,而且經驗表明,初溫通常設定為50000,退火率為0.99,內迴圈次數為5000,因此程式碼執行的時間往往會比較長,但是通常如果多鄰域演算法比較好的話,會收斂到一個比較好的結果。


測例分析

測例 結果 執行時間 設施開啟狀態 設施分配狀態
p1 9307 23.939s 1 1 1 1 1 1 1 1 1 1 9 7 1 6 8 3 2 4 5 6 0 7 7 5 0 3 5 4 9 6 9 8 6 5 8 5 1 6 7 5 5 4 7 3 9 4 9 3 3 4 6 8 1 7 8 3 1 0 6 0
p2 7942 23.73s 1 0 1 1 1 1 1 1 1 1 8 8 3 6 6 8 2 4 4 6 9 0 8 7 9 3 9 0 6 7 6 9 4 9 3 5 5 6 2 5 5 6 0 3 9 9 5 9 2 4 5 3 6 5 7 5 7 0 9 6
p3 9912 24.129s 1 1 1 1 1 1 1 1 1 1 4 8 1 0 3 0 7 6 8 6 9 0 3 9 0 6 4 2 6 7 9 7 5 4 5 9 1 3 0 9 4 9 3 9 9 4 6 8 0 4 2 8 1 3 2 6 4 2 9 5
p4 11807 23.752s 1 1 1 1 1 1 1 1 1 1 4 3 3 6 9 8 6 5 4 3 4 8 6 2 9 1 9 7 4 7 3 8 6 5 5 0 3 5 0 4 9 9 4 2 9 9 7 3 5 4 8 8 5 5 4 5 7 0 9 1
p5 9228 23.93s 1 1 1 1 1 1 1 1 1 1 6 2 1 6 3 8 4 7 4 7 9 8 8 2 8 4 2 0 7 9 5 2 1 4 8 0 5 5 3 0 7 9 5 9 9 1 3 5 8 4 9 9 8 2 7 8 4 5 5 0
p6 7926 24.044s 1 1 1 1 1 1 1 1 1 1 8 2 4 9 6 7 2 6 4 2 9 0 3 8 8 2 9 0 2 7 9 9 6 7 3 3 1 9 8 2 3 6 3 1 7 4 4 8 6 3 5 7 5 5 8 5 4 8 7 0
p7 9934 23.953s 1 1 1 1 1 1 1 1 1 1 7 2 6 0 5 8 2 2 8 8 9 4 5 0 9 5 6 4 7 8 7 6 2 3 5 9 1 9 4 5 2 9 0 9 2 5 7 3 3 4 0 8 6 8 7 0 9 8 7 1
p8 11927 24.141s 1 1 1 1 1 1 1 1 1 1 4 8 6 9 5 7 3 2 4 6 9 8 8 2 8 1 4 0 6 7 3 9 5 1 9 5 1 9 8 7 0 8 0 9 8 4 0 8 3 4 3 7 1 5 2 6 2 4 7 5
p9 9040 23.968s 1 1 1 1 1 1 1 1 1 1 7 8 1 9 3 8 6 4 4 2 2 5 8 6 9 3 4 8 0 4 8 8 3 0 8 5 3 5 2 8 9 3 8 4 9 7 3 8 9 4 6 8 5 5 3 7 7 9 8 7
p10 7726 23.709s 1 1 1 1 1 1 1 1 1 1 8 8 1 6 3 4 4 9 6 1 0 8 3 7 8 9 6 1 9 4 3 8 6 7 2 5 6 2 9 5 3 9 6 3 9 6 4 8 3 6 4 8 6 4 0 8 9 8 4 0
p11 9726 24.315s 1 1 1 1 1 1 1 1 1 1 7 9 4 8 5 9 2 4 6 4 9 3 9 3 8 2 8 2 9 8 8 8 7 5 2 9 8 5 8 8 9 6 7 5 9 7 1 3 3 7 5 8 8 5 9 0 5 3 4 7
p12 11691 23.38s 1 1 0 1 1 1 1 1 1 1 5 8 8 6 3 9 8 4 4 5 9 5 3 6 0 8 7 0 3 0 3 8 9 9 6 7 1 6 3 5 9 4 8 3 8 6 9 4 8 4 6 8 1 0 9 7 9 5 8 5
p13 9805 28.876s 1 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 16 18 19 10 7 18 17 13 19 17 13 19 19 16 19 15 14 10 19 12 17 15 15 14 9 18 16 17 19 12 18 15 12 18 16 16 15 1 15 19 14 17 7 0 14 19 14 16 18 9
p14 8244 28.253s 1 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 16 16 14 10 16 18 19 18 16 19 10 4 18 10 13 17 15 15 17 14 17 15 15 19 15 17 4 17 17 19 10 7 13 18 18 13 14 18 7 18 19 0 19 19 17 4 14 10 18 9
p15 9972 28.289s 0 1 1 0 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 16 18 16 10 19 17 17 17 14 17 16 10 1 14 14 11 15 18 14 11 17 16 15 19 12 19 18 4 2 15 10 11 4 19 19 17 11 19 15 16 14 16 15 16 19 18 12 4 19 18
p16 13022 28.272s 1 0 1 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 16 17 18 18 19 14 19 16 16 18 16 19 17 19 0 19 15 19 13 14 12 18 15 17 15 13 13 17 18 12 12 15 16 10 11 14 16 16 18 4 17 4 18 15 2 17 18 15 17 19
p17 9585 28.107s 0 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 18 12 10 18 1 18 4 14 14 17 15 17 19 16 14 17 15 10 19 16 17 15 14 11 13 17 16 17 12 12 18 19 14 16 19 10 19 19 13 15 15 18 5 16 14 17 14 5 18 15
p18 7632 26.701s 0 1 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 18 17 10 18 14 19 17 19 18 17 16 19 12 10 13 14 18 19 11 13 12 13 14 19 16 1 14 16 19 12 13 15 19 16 14 10 11 18 18 16 16 15 5 19 13 18 17 17 15 15
p19 10906 27.243s 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 1 1 1 1 1 16 12 17 14 17 10 17 18 18 15 19 4 1 15 13 19 7 15 18 18 19 12 15 16 10 17 12 17 19 17 16 18 16 7 10 14 14 19 19 13 14 15 14 10 12 18 15 18 19 14
p20 12757 27.153s 1 1 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 19 11 14 10 17 18 17 15 14 17 15 4 16 13 13 17 14 13 12 17 17 15 15 19 4 14 11 17 3 18 13 19 1 16 19 14 16 19 9 16 12 0 19 18 17 5 15 18 18 13
p21 9871 29.177s 1 0 0 0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 16 17 10 18 14 18 18 18 13 19 16 4 19 10 14 17 19 18 16 18 19 15 17 19 9 13 18 18 14 17 13 16 19 16 17 15 13 18 19 17 14 0 15 0 17 18 15 14 19 17
p22 7812 29.165s 0 1 0 0 1 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 16 18 16 17 19 19 16 19 17 17 6 4 1 15 13 19 16 15 18 17 15 19 15 19 13 14 16 18 19 19 13 18 13 14 11 18 11 17 19 13 10 15 5 17 15 18 18 10 13 17
p23 9943 28.862s 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 19 17 16 17 12 18 17 10 18 17 16 10 18 14 19 10 15 17 15 18 14 15 15 19 19 17 16 17 19 17 15 15 13 16 3 13 15 15 19 18 18 16 10 16 16 18 18 18 19 19
p24 11893 29.007s 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 13 17 10 10 17 15 17 18 14 16 15 13 19 16 19 14 18 1 4 19 18 15 15 8 10 17 16 11 19 19 19 7 19 15 19 16 17 16 19 13 18 16 15 16 12 17 17 18 4 18
p25 15807 59.412s 0 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 28 29 28 20 20 17 11 17 28 16 26 28 20 29 25 24 28 27 5 29 19 28 29 27 28 28 14 28 5 29 29 24 8 27 20 19 25 24 27 27 17 29 25 20 24 29 29 27 29 8 28 14 29 24 24 20 19 20 11 20 11 5 28 25 11 27 24 27 14 19 20 24 11 25 29 20 26 20 19 20 28 25 11 14 27 17 29 24 20 24 2 11 28 11 17 24 27 19 28 18 8 8 25 25 28 17 17 27 27 28 14 24 28 27 25 27 5 29 27 17 26 3 29 20 27 28 25 17 17 29 27 8 24 29 28 28 25 14 20 14 20 28 29 5 8 29 25 24 25 5
p26