算法设计与分析课程期末项目 - 求解CFLP问题

"Report of Solving Capacitated Facility Location Problem"

Posted by Palette on December 20, 2018

Design report and results showing for Algorithm Course’s Final Project….

算法设计与分析 期末项目 – Capacitated Facility Location Problem

代码仓库

一、问题描述

  1. Capacitated Facility Location Problem(CFLP),也叫做有容量限制的设施区位问题,是指在一组候选位置中选出若干个进行设施建设以服务所有顾客。对于每个位置,都有一个设施开设的成本,以及一个数组来指示从这个位置的设施服务各个顾客的成本。问题求解的目标是找到一个最优解,使得服务所有顾客的总成本最小。

  2. 在求解CFLP问题的过程中,我们的目的是找出使总体开销最小(所有设施启动开销与服务顾客的开销之和),同时又能满足所有顾客需求,保证每台设备不超出其可服务容量的最优规划。

  3. CFLP本质上属于0-1整数规划问题Integer Programming,此处采用Wikipedia上的数学形式进行描述:

    img

    此处的目标开销函数为:img

    • i为设备下标号,范围为0 <= i < facilityNumj为顾客下标号,范围为0 <= j < customerNum

    • c_ij表示设备i为顾客j提供服务的成本costy_ij表示是否让设备i为顾客j提供服务,取值范围为true/false

    • f_i表示设备i开启的成本,即OpenCostx_i为是否开启对应设备进行服务,取值范围也为true/false,即0-1整数取值。

    • u_i表示设备提供的容量,d_j表示顾客的需求。

  4. 同时,上述数学描述还需要满足约束:同一顾客不能被多台设备同时服务;设备服务总数不能超过其容量。在此约束下求解目标规划函数的最优解。此种0-1整数规划问题本质为NP-Hard问题,一般具有两类方法进行问题求解:

    • Branch and Cut,利用运筹学方法直接求解最优解,但是缺点是运行时间十分的长。
    • Approximate Search,近似规划找出问题的近似解,运行时间短找出一个比较好的解。

二、算法设计

  1. 首先基于本问题采取贪心算法策略,为使整体开销最小而实施针对customer于每台不同设备上的assign_cost的贪心策略。考虑到测试样例中顾客的数量一般都比设备数量多,同时每一台设备的open_cost代价并非很高(数量级与顾客的assign_cost相同),此处只采取一阶段的贪心策略,针对服务顾客的开销进行贪心搜索:

    • 顺序遍历所有的顾客,针对每一个未满足需求的顾客,获取将其放置到所有容量足够的设备上所造成的开销队列,从小到大对开销队列进行排序,获取最小开销的操作。

    • 更新当前操作的总体开销,若目标设备原本处于关闭状态,那么还需要加上其open_cost

    贪心算法源码:

    /*
    * GreedyAlgrithm.h -- Use Greedy Search to solve CFL Problem
    */
    #ifndef GREEDY_ALGORITHM_H
    
    #define GREEDY_ALGORITHM_H
    
    #include <iostream>
    
    #include <vector>
    
    #include <fstream>
    
    #include <algorithm>
    
    #include <string>
    
    #include <windows.h>
    
    using namespace std;
    
    struct customer {
    	int cost;
    	int id;
    	customer(int c, int i){
    		cost = c;
    		id = i;
    	}
    };
    
    class Greedy {
    public:
    	Greedy(){}
    	void readFile(string filePath);
    	int performGreedySearch();
    
    	int fac_num, cus_num;
    	// State vector
    	vector<bool> fac_open;
    	// Result vector
    	vector<int> result;
    
    private:
    	// Info vectors
    	vector<int> capacity;
    	vector<int> open_cost;
    	vector<int> demand;
    	vector<vector<int>> assign_cost; 
    };
    
    #endif
    

    结构分析:

    • 采取C++语言进行OOP编程,创建贪心算法求解CFLP问题的类对象,定义读取测试样例输入函数readFile(),同时定义贪心搜索函数performGreedySearch(),作为算法求解的启动函数。

    #include "GreedyAlgorithm.h"
    
    void Greedy::readFile(string filePath){
    	ifstream in(filePath.c_str());
    	in >> fac_num >> cus_num;
    	// Read variables in order
    	for(int i=0; i<fac_num; i++){
    		int temp_cap, temp_cost;
    		in >> temp_cap >> temp_cost;
    		capacity.push_back(temp_cap);
    		open_cost.push_back(temp_cost);
    	}
    
    	for(int i=0; i<cus_num; i++){
    		float temp_demand;
    		in >> temp_demand;
    		demand.push_back((int)temp_demand);
    	}
    
    	for(int i=0; i<fac_num; i++){
    		vector<int> temp;
    		for(int j=0; j<cus_num; j++){
    			float ass_cost;
    			in >> ass_cost;
    			temp.push_back((int)ass_cost);
    		}
    		assign_cost.push_back(temp);
    	}
    
    	// Init State
    	for(int i=0; i<fac_num; i++){
    		fac_open.push_back(false);
    	}
    
    	for(int i=0; i<cus_num; i++){
    		result.push_back(-1);
    	}
    }
    
    bool sort_customer(customer c1, customer c2){
    	return c1.cost < c2.cost;
    }
    
    int Greedy::performGreedySearch(){
    	int total_cost = 0;
    	vector<customer> store;
    	for(int i=0; i<cus_num; i++){
    		store.clear();
       		
    		for(int j=0; j<fac_num; j++){
    			customer target = customer(assign_cost[j][i], j);
    			store.push_back(target);
    		}
    		// Sort customer by their assign cost, keep cost less customer first
    		sort(store.begin(), store.end(), sort_customer);
    		// Pick facillity in order
    		for(int j=0; j<fac_num; j++){
    			int fac_id = store[j].id;
    			if(capacity[fac_id] >= demand[i]){
    				capacity[fac_id] -= demand[i];
    				result[i] = fac_id;
    				total_cost += store[j].cost;
    				// If target facility not open, open it
    				if(!fac_open[fac_id]){
    					fac_open[fac_id] = true;
    					total_cost += open_cost[fac_id];
    				}
    				break;
    			}
    		}
    	}
    	return total_cost;
    }
    
    int main(){
    	for(int i=1; i<=71; i++){
    		string targetName = "p" + to_string(i);
    		string resultFile = "../result/Greedy/" + targetName;
    		ofstream out(resultFile.c_str());
    
    		Greedy gr;
    		string targetFile = "../testData/" + targetName;
    
    		gr.readFile(targetFile);
    
    		int result = gr.performGreedySearch();
    
    	    out << result << "\n";
    	    for(int i=0; i<gr.fac_num; i++){
    	    	out << gr.fac_open[i] << " ";
    	    }
    	    out << "\n";
    	    for(int i=0; i<gr.cus_num; i++){
    	    	out << gr.result[i] << " ";
    	    }
    		out << "\n";
    	}
    
    	return 0;
    }
    

    结构分析:

    • readFile()按照测试样例格式进行初始化信息的读取,将类内部的各项变量进行初始化赋值。

    • performGreedySearch()顺序进行顾客服务,记录当前顾客被assign到不同容量足够的设备上的assign_cost队列,利用STL库的sort函数进行升序排序,获取当前局部最优操作并执行,更新当前总体开销。

    贪心算法测试结果:

    img 贪心算法求解具体结果:

    p1

    9440
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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

    18753
    1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 14 25 2 29 7 11 14 28 14 1 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

    15831
    1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 14 25 2 29 7 11 14 28 14 1 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

    21031
    1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 14 25 2 29 7 11 14 28 14 1 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

    26231
    1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 14 25 2 29 7 11 14 28 14 1 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

    20007
    1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 5 5 8 25 13 18 0 5 9 0 29 0 11 24 5 8 14 17 29 13 17 0 8 13 14 8 25 25 11 2 11 
    

    p30

    16812
    1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 5 5 8 25 13 18 0 5 9 0 29 0 11 24 5 8 14 17 29 13 17 0 8 13 14 8 25 25 11 2 11 
    

    p31

    22212
    1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 5 5 8 25 13 18 0 5 9 0 29 0 11 24 5 8 14 17 29 13 17 0 8 13 14 8 25 25 11 2 11 
    

    p32

    27612
    1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 5 5 8 25 13 18 0 5 9 0 29 0 11 24 5 8 14 17 29 13 17 0 8 13 14 8 25 25 11 2 11 
    

    p33

    18611
    1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 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

    15689
    1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 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

    20889
    1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 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

    26089
    1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 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

    18611
    1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 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

    15689
    1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 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

    20889
    1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 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

    26089
    1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 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 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 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 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 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
    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
    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 3 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
    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
    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
    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 2 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
    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 2 3 2 3 2 4 4 5 6 6 5 7 7 8 7 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

    6634
    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 0 9 9 9 9 2 2 2 9 2 
    

    p48

    9044
    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 2 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 10 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
    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 16 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

    10062
    1 1 1 1 1 1 1 1 1 1 
    3 6 3 0 9 9 5 5 3 7 7 4 1 9 9 9 9 2 5 3 0 0 0 4 0 0 7 4 4 7 7 7 3 3 3 5 9 9 0 6 0 9 9 1 5 5 5 5 5 3 3 5 6 0 0 0 9 6 1 2 1 7 7 7 3 3 0 4 8 7 3 6 6 6 6 4 4 3 3 4 3 5 2 2 2 1 6 7 2 7 1 2 2 2 2 2 2 2 2 2 
    

    p51

    11175
    1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 
    15 6 19 10 12 13 5 16 15 1 5 3 6 13 6 13 12 16 2 15 0 0 10 14 14 14 1 3 19 7 1 1 17 19 15 5 13 13 10 0 0 13 13 13 16 5 5 5 5 17 15 2 0 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 13 18 18 13 18 18 18 18 
    

    p52

    10364
    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

    12876
    1 1 1 1 1 1 1 1 0 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 0 13 2 18 10 5 17 18 6 3 3 15 3 6 6 2 14 19 13 15 15 3 1 6 15 1 2 2 17 17 2 17 1 10 1 16 
    

    p54

    10351
    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 6 8 8 8 8 8 8 3 3 6 6 6 6 6 6 6 6 6 5 5 6 5 5 5 6 6 0 0 0 0 0 9 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 9 9 4 4 4 2 4 2 2 
    

    p55

    12383
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
    17 17 16 17 16 4 4 4 8 8 8 8 2 8 8 2 2 2 8 12 1 12 12 12 12 12 6 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 17 13 9 13 13 13 13 15 15 15 15 15 15 15 5 15 5 18 18 18 18 17 18 18 18 18 
    

    p56

    23882
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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 
    
  2. 考虑到贪心算法容易陷入局部最优解,此处结合禁忌搜索算法,将初始解设为贪心算法的最终局部最优解,然后进行邻域移动的搜索,建立禁忌表进行领域可行解的查找,具体策略如下:

    • 此处算法的解状态规定为:每一位顾客对应的设备序号组成的结果序列,那么邻域的转移就可以看成:customer从当前设备移动到其余设备之后,形成的新序列。
    • 当然,在邻域移动的过程中会遇到许多的非法解(即形成的新序列中有设备超出服务容量),此时根据禁忌准则,不马上删除非法解,而是实施一定程度上的惩罚,设定惩罚系数alpha将惩罚值加入非法解的开销中,最终使其与可行解一起进行最小开销领域获取。
    • 若当前取得的最小开销解为非法解,那么说明当前惩罚系数不够高,为了将搜索过程导向多可行解区域,须提高惩罚值,减少非法解的产生。
    • 同时在搜索过程中进行可行最优解开销进行记录,并且将当前求解的可行最优解push入禁忌表中。整体算法的迭代次数为2.0 * cus_num + fac_num,同时设定禁忌破除规定,设置当禁忌表内部存在比当前更好的可行解时,实施禁忌破除。

    禁忌搜索算法代码:

    /*
    * TabuSearch.h -- Use Tabu Search to solve CFL Problem
    */
    #ifndef TABU_SEARCH_H
    
    #define TABU_SEARCH_H
    
    #include <iostream>
    
    #include <vector>
    
    #include <algorithm>
    
    #include <fstream>
    
    #include <cmath>
    
    #include <string>
    
    #include <windows.h>
    
    using namespace std;
    
    struct customer {
    	int cost;
    	int id;
    	customer(int c, int i){
    		cost = c;
    		id = i;
    	}
    };
    
    struct move_p {
    	int src_cus;
    	int dst_fac;
    	bool feasible;
    	double cost;
    	move_p(int src, int dst, bool fea, double cos){
    		src_cus = src;   dst_fac = dst;
    		feasible = fea;  cost = cos;
    	}
    };
    
    class Tabu {
    public:
    	Tabu(){
    		alpha = 1.0;
    		epsilon = 0.1;
    	}
    	void readFile(string filePath);
    	// Get greedy result as init solution path
    	int performGreedySearch();
    	// Perform Tabu Search
    	int performTabuSearch();
    	// Tabu tools methods
    	int performPenalty();
    	int getCurrentResult();
    	void getNeighborResult(int iteration, int beta);
    
    	int fac_num, cus_num;
    	// State vector
    	vector<bool> fac_open;
    	// Result vector
    	vector<int> result;
    	vector<int> fea_result;
    
    private:
    	int best_feasible_cost, best_cost;
    	double alpha, epsilon;
    	// Info vectors
    	vector<int> capacity;
    	vector<int> temp_capacity;
    	vector<int> open_cost;
    	vector<int> demand;
    	vector<vector<int>> assign_cost;
    	vector<vector<int>> tabu_list;
    };
    #endif
    
    #include "TabuSearch.h"
    
    void Tabu::readFile(string filePath){
    	ifstream in(filePath.c_str());
    	in >> fac_num >> cus_num;
    	// Read variables in order
    	for(int i=0; i<fac_num; i++){
    		int temp_cap, temp_cost;
    		in >> temp_cap >> temp_cost;
    		capacity.push_back(temp_cap);
    		temp_capacity.push_back(temp_cap);
    		open_cost.push_back(temp_cost);
    	}
    
    	for(int i=0; i<cus_num; i++){
    		float temp_demand;
    		in >> temp_demand;
    		demand.push_back((int)temp_demand);
    	}
    
    	for(int i=0; i<fac_num; i++){
    		vector<int> temp;
    		for(int j=0; j<cus_num; j++){
    			float ass_cost;
    			in >> ass_cost;
    			temp.push_back((int)ass_cost);
    		}
    		assign_cost.push_back(temp);
    	}
    
    	// Init State
    	for(int i=0; i<fac_num; i++){
    		fac_open.push_back(false);
    	}
    
    	for(int i=0; i<cus_num; i++){
    		result.push_back(0);
    		fea_result.push_back(0);
    	}
    
    	for(int i=0; i<fac_num; i++){
    		vector<int> temp;
    		for(int j=0; j<cus_num; j++){
    			temp.push_back(-1);
    		}
    		tabu_list.push_back(temp);
    	}
    }
    
    bool sort_customer(customer c1, customer c2){
    	return c1.cost < c2.cost;
    }
    
    bool sort_move(move_p c1, move_p c2){
    	return c1.cost < c2.cost;
    }
    
    // Get greedy result as init solution path
    int Tabu::performGreedySearch(){
    	int total_cost = 0;
    	vector<customer> store;
    	// Greedy choose facility for every customer
    	for(int i=0; i<cus_num; i++){
    		store.clear();
       		
    		for(int j=0; j<fac_num; j++){
    			customer target = customer(assign_cost[j][i], j);
    			store.push_back(target);
    		}
    		// Sort customer by their assign cost, keep cost less customer first
    		sort(store.begin(), store.end(), sort_customer);
    		// Pick facillity in order
    		for(int j=0; j<fac_num; j++){
    			int fac_id = store[j].id;
    			if(capacity[fac_id] >= demand[i]){
    				capacity[fac_id] -= demand[i];
    				result[i] = fac_id;
    				total_cost += store[j].cost;
    				// If target facility not open, open it
    				if(!fac_open[fac_id]){
    					fac_open[fac_id] = true;
    					total_cost += open_cost[fac_id];
    				}
    				break;
    			}
    		}
    	}
    	return total_cost;
    }
    
    // Perform Tabu Search
    int Tabu::performTabuSearch(){
    	best_feasible_cost = performGreedySearch();
    	best_cost = best_feasible_cost;
    	for(int i=0; i<fea_result.size(); i++)
    		fea_result[i] = result[i];
    
    	int count = 0;
    	double temp_result = 0;
    	for(int i=0; i<cus_num*2; i++){
    		getNeighborResult(i, 3 + fac_num / 2);
    		if(fabs(temp_result - best_cost) < 0.00001){
    			count++;
    		}else {
    			count = 0;
    			temp_result = best_cost;
    		}
    		if(count > fac_num)
    			break;
    	}
    	return best_feasible_cost;
    }
    
    // Tabu tools methods
    int Tabu::performPenalty(){
    	int res = 0;
    	vector<int> temp_cap(temp_capacity);
    	for(int i=0; i<cus_num; i++){
    		temp_cap[result[i]] -= demand[i];
    	}
    	for(int i=0; i<fac_num; i++){
    		// Perform penalty
    		if(temp_cap[i] < 0){
    			res -= temp_cap[i];
    		}
    	}
    	return res;
    }
    
    // Return current cost
    int Tabu::getCurrentResult(){
    	int res = 0;
    	bool open[fac_num];
    	for(int i=0; i<fac_num; i++){
    		open[i] = false;
    	}
    	// Create temp records
    	for(int i=0; i<cus_num; i++){
    		res += assign_cost[result[i]][i];
    		open[result[i]] = true;
    	}
    	// Adding open cost
    	for(int i=0; i<fac_num; i++){
    		if(open[i]) res += open_cost[i];
    	}
    
    	return res;
    }
    
    // Get seatch neighbor result
    void Tabu::getNeighborResult(int iteration, int beta){
    	vector<move_p> path;
    
    	for(int i=0; i<cus_num; i++){
    		int temp = result[i];
    		for(int j=0; j<fac_num; j++){
    			// Swap facility number
    			if(temp != j){
    				result[i] = j;
    				int targetResult = getCurrentResult();
    				int penalty = performPenalty();
    				bool ability = penalty > 0 ? false : true;
    				int cost = targetResult + penalty * alpha;
    				move_p neighmove = move_p(i, j, ability, cost);
    				// Judge tabu list and neighbor path feasible
    				// Tabu enable conditions: Less Penalty, available and cost less, unavailable but cost less than best
    				if(tabu_list[j][i] < penalty || (ability && cost < best_feasible_cost) || (!ability && cost < best_cost)){
    					path.push_back(neighmove);
    				}
    			}
    		}
    		result[i] = temp;
    	}
    	sort(path.begin(), path.end(), sort_move);
    
    	// Find small cost and enable neighbor
    	for(int i=0; i<path.size(); i++){
    		if(path[i].feasible){
    			if(path[i].cost < best_feasible_cost){
    				int origin = result[path[i].src_cus];
    				result[path[i].src_cus] = path[i].dst_fac;
    				for(int i=0; i<fea_result.size(); i++)
    					fea_result[i] = result[i];
    				best_feasible_cost = path[i].cost;
    				result[path[i].src_cus] = origin;
    			}
    			break;
    		}
    	}
    	// Update best solution and tabu list
    	if(path[0].cost < best_cost)
    		best_cost = path[0].cost;
    
    	tabu_list[path[0].dst_fac][path[0].src_cus] = iteration + beta;
    
    	result[path[0].src_cus] = path[0].dst_fac;
    
    	if(path[0].feasible){
    		alpha /= (1+epsilon);
    	}else {
    		alpha *= (1+epsilon);
    	}
    }
    
    int main(){
    	for(int i=1; i<=71; i++){
    		string targetName = "p" + to_string(i);
    		string resultFile = "../result/Tabu/" + targetName;
    		ofstream out(resultFile.c_str());
    
    		Tabu tb;
    		string targetFile = "../testData/" + targetName;
    
    		tb.readFile(targetFile);
    
    		int result = tb.performTabuSearch();
    
    	    for(int i=0; i<tb.fac_num; i++){
    	    	tb.fac_open[i] = false;
    	    }
    	    for(int i=0; i<tb.fac_num; i++){
    	    	tb.fac_open[tb.fea_result[i]] = true;
    	    }
    
    	    out << result << "\n";
    	    for(int i=0; i<tb.fac_num; i++){
    	    	out << tb.fac_open[i] << " ";
    	    }
    	    out << "\n";
    	    for(int i=0; i<tb.cus_num; i++){
    	    	out << tb.result[i] << " ";
    	    }
    		out << "\n";
    	}
    }
    

    结构分析:

    • 此处复用了之前贪心算法的文件读取函数,以及计算贪心解作为禁忌搜索的初始解。
    • 类内部提供了很多工具函数,包括惩罚值的计算函数performPenality(),以及计算当前状态序列的总体开销,以便于在搜索过程中进行最优查询,getNeighborResult()搜索邻域转移状态集合中的最优可行路径,同时根据当前迭代次序与整体禁忌表长度,进行禁忌条目更新。

    禁忌搜索算法结果:

    img

    ​分析:相比于贪心算法,禁忌搜索算法求解结果有些许提升,但所需时间更多,禁忌搜索的结果很大程度上取决于迭代次数,以及具体邻域移动规则的设定,禁忌破解与禁忌表长度的最佳选取,此处实现的禁忌搜索仍有很大的提升空间。

    禁忌搜索算法具体样例结果:

    p1

     9256
     0 1 1 1 1 0 1 0 1 0 
     8 2 1 6 3 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 4 6 4 2 5 1 5 0 5 2 6 0 3 4 	4 4 3 0 4 1 8 1 5 7 0 4 0 4 0 
    

    p2

    7942
    0 1 1 1 1 0 1 0 1 0 
    8 2 1 6 3 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 4 6 4 2 5 1 5 0 5 2 6 0 3 4 4 4 3 0 4 1 8 1 5 7 0 4 0 4 0 
    

    p3

    9942
    0 1 1 1 1 0 1 0 1 0 
    8 2 1 6 3 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 4 6 4 2 5 1 5 0 5 2 6 0 3 4 4 4 3 0 4 1 8 1 5 7 0 4 0 4 0 
    

    p4

    11942
    0 1 1 1 1 0 1 0 1 0 
    8 2 1 6 3 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 4 6 4 2 5 1 5 0 5 2 6 0 3 4 4 4 3 0 4 1 8 1 5 7 0 4 0 4 0 
    

    p5

    9169
    0 1 1 1 1 0 1 0 1 0 
    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 0 
    

    p6

    7855
    0 1 1 1 1 0 1 0 1 0 
    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 0 
    

    p7

    9855
    0 1 1 1 1 0 1 0 1 0 
    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 0 
    

    p8

    11855
    0 1 1 1 1 0 1 0 1 0 
    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 0 
    

    p9

    9040
    0 1 1 1 1 0 1 0 1 0 
    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
    0 1 1 1 1 0 1 0 1 0 
    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
    0 1 1 1 1 0 1 0 1 0 
    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
    0 1 1 1 1 0 1 0 1 0 
    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

    8863
    0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 
    16 12 10 10 1 15 17 13 15 17 15 19 1 6 13 3 15 10 17 9 12 15 15 19 6 17 16 17 1 17 13 15 13 16 3 10 3 19 19 13 6 16 15 16 3 15 12 10 19 9 
    

    p14

    7435
    0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 
    16 12 10 10 1 1 17 13 12 17 15 19 1 6 13 3 15 10 17 9 12 15 15 19 6 17 16 17 1 17 13 15 19 16 3 10 3 19 19 13 6 16 15 16 17 15 12 10 19 9 
    

    p15

    9635
    0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 
    16 12 10 10 1 1 17 13 12 17 15 19 1 6 13 3 15 10 17 9 12 15 15 19 6 17 16 17 1 17 13 15 19 16 3 10 3 19 19 13 6 16 15 16 17 15 12 10 19 9 
    

    p16

    11835
    0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 
    16 12 10 10 1 1 17 13 12 17 15 19 1 6 13 3 15 10 17 9 12 15 15 19 6 17 16 17 1 17 13 15 19 16 3 10 3 19 19 13 6 16 15 16 17 15 12 10 19 9 
    

    p17

    8863
    0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 
    16 12 10 10 1 1 17 13 12 17 15 19 1 10 13 3 15 10 17 9 12 15 15 19 6 17 16 17 1 17 13 15 19 16 3 10 8 19 19 13 6 16 15 16 8 15 12 10 19 9 
    

    p18

    7435
    0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 
    16 12 10 10 1 12 17 13 12 17 15 19 1 6 13 3 15 10 17 9 12 15 15 19 6 17 16 17 1 17 13 15 13 16 3 10 3 19 19 13 6 16 15 16 3 15 15 10 19 9 
    

    p19

    9635
    0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 
    16 12 10 10 1 12 17 13 12 17 15 19 1 6 13 3 15 10 17 9 12 15 15 19 6 17 16 17 1 17 13 15 13 16 3 10 3 19 19 13 6 16 15 16 3 15 15 10 19 9 
    

    p20

    11835
    0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 
    16 12 10 10 1 15 17 13 12 17 15 19 19 6 13 3 15 10 17 9 12 15 15 19 6 17 16 17 1 17 13 15 13 16 3 10 17 19 19 13 6 16 15 16 9 15 12 10 19 9 
    

    p21

    8863
    0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 
    16 14 10 10 1 12 17 13 14 17 15 19 1 6 13 3 15 10 17 9 12 15 15 19 6 17 16 17 1 17 13 15 13 16 3 10 17 19 19 13 6 16 16 16 14 15 14 10 19 9 
    

    p22

    7435
    0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 
    16 12 10 10 1 12 17 13 8 17 15 19 1 6 13 3 15 10 17 9 12 15 15 19 6 17 16 17 1 17 13 15 13 16 3 10 8 19 19 13 6 16 16 16 8 15 12 10 19 9 
    

    p23

    9635
    0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 
    16 12 10 10 1 12 17 13 13 17 15 19 1 6 13 3 15 10 17 9 12 15 15 19 6 17 16 17 1 17 13 15 13 16 3 10 17 19 19 13 6 16 16 16 1 15 12 10 19 9 
    

    p24

    11835
    0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 
    16 12 10 10 1 12 17 13 13 17 15 19 1 6 13 3 15 10 17 9 12 15 15 19 6 17 16 17 1 17 13 15 13 16 3 10 17 19 19 13 6 16 16 16 1 15 12 10 19 9 
    

    p25

    13866
    1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 20 14 20 5 2 24 14 17 24 8 8 20 3 14 14 17 5 11 2 0 5 3 5 8 2 24 5 24 5 25 20 25 20 20 24 15 11 14 0 14 15 13 24 14 3 13 11 8 25 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 20 11 17 24 8 24 20 14 24 20 7 20 17 2 17 17 7 20 5 2 24 2 11 7 24 2 3 25 13 8 17 17 25 2 25 7 11 14 8 14 14 2 11 11 25 24 24 24 24 5 8 25 13 8 17 5 24 0 7 0 11 24 11 8 14 7 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p26

    11847
    1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 
    20 11 20 2 20 5 2 24 14 17 5 8 8 20 19 14 14 17 5 11 2 0 5 17 5 8 19 24 5 24 5 25 20 25 20 20 24 15 0 14 0 14 15 8 24 14 11 20 11 8 5 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 24 24 20 20 11 0 24 8 24 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 2 11 0 24 2 17 25 20 8 17 17 25 2 25 7 11 14 8 14 14 2 11 11 25 24 24 24 24 5 8 25 20 8 11 5 24 0 25 0 11 24 11 8 14 7 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p27

    14941
    1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 20 14 20 5 2 24 14 17 5 8 8 20 3 14 14 17 5 11 2 0 5 3 5 8 2 24 5 24 5 25 13 25 20 20 24 15 0 14 0 14 15 8 24 14 11 13 11 8 5 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 20 11 17 24 8 24 20 14 24 20 7 20 17 2 17 17 7 20 5 2 24 17 11 0 24 2 17 25 13 8 2 17 25 2 25 7 11 14 8 14 14 2 11 11 25 24 24 24 24 5 8 25 13 8 11 5 24 0 25 0 11 24 11 8 14 7 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p28

    18435
    1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 20 14 20 5 2 24 14 17 5 20 8 20 3 14 14 17 5 11 2 0 5 3 5 8 2 24 5 24 5 25 13 25 20 20 24 15 0 14 0 14 15 8 24 14 11 13 11 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 20 11 17 24 8 24 20 14 24 20 7 20 17 2 17 17 7 20 5 2 24 17 11 7 24 2 3 25 13 8 0 17 25 2 29 0 11 14 8 14 14 2 11 11 25 24 24 24 24 5 8 25 13 13 25 5 24 0 29 0 11 24 5 8 14 7 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p29

    13664
    1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 13 2 20 5 2 24 2 17 24 8 8 20 17 14 14 17 5 11 2 0 5 17 5 8 2 24 5 24 5 25 13 25 20 20 24 15 11 14 0 14 15 8 24 14 0 13 11 8 29 14 14 5 13 20 17 29 0 14 0 5 20 11 11 11 24 0 24 24 20 13 11 17 24 8 26 20 14 24 20 0 20 17 2 17 17 0 20 5 2 24 17 11 17 5 2 0 25 13 8 17 17 25 2 29 17 11 14 8 14 14 2 11 11 25 24 15 24 5 5 8 25 13 8 0 5 26 0 11 0 11 24 25 8 14 0 29 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p30

    12142
    1 0 1 0 0 1 0 0 1 1 0 1 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 13 2 20 5 2 24 2 17 24 8 8 20 2 14 14 17 5 11 2 0 5 17 5 8 2 24 5 24 5 25 13 25 20 20 24 15 0 14 0 14 15 8 24 14 11 13 11 8 29 14 14 5 13 20 17 29 0 14 0 5 20 11 11 11 9 0 15 9 20 13 11 17 24 8 9 20 14 24 20 0 20 17 17 17 17 0 20 5 2 24 17 11 17 24 2 2 25 8 8 17 17 25 2 29 17 11 14 8 14 14 2 11 11 25 24 24 24 24 5 8 25 13 8 17 5 9 0 25 0 11 24 11 8 14 0 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p31

    15434
    1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 13 2 20 5 2 24 14 17 9 8 8 20 3 14 14 17 5 11 2 0 5 3 5 8 2 24 5 24 5 25 13 25 20 20 24 15 11 14 0 14 15 8 24 14 0 13 11 8 29 14 14 5 13 20 17 25 0 14 0 5 20 11 11 11 9 0 5 24 20 13 11 17 24 8 9 20 17 24 20 0 20 17 2 17 17 17 20 5 2 24 17 11 17 9 2 25 25 8 8 17 17 25 2 29 17 11 14 8 14 14 2 11 11 25 24 24 24 24 5 8 25 13 8 0 5 9 0 11 0 11 24 9 8 14 0 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p32

    17741
    1 0 1 0 0 1 0 0 1 1 0 1 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 13 2 20 5 2 9 2 17 24 8 8 20 17 14 14 17 5 11 2 0 5 17 9 8 2 24 5 24 5 25 13 25 20 20 24 15 11 14 0 14 15 8 24 14 0 13 11 8 29 14 14 5 13 20 17 25 0 14 0 5 20 11 11 11 9 0 25 24 20 13 11 17 24 8 9 20 14 24 20 0 20 17 2 17 17 0 20 5 2 24 17 11 17 5 2 29 29 13 8 17 17 25 2 29 17 11 14 8 14 14 2 11 11 25 24 24 24 24 5 8 25 13 8 0 5 9 0 11 0 11 24 5 8 14 0 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p33

    12990
    1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 20 2 20 5 2 24 14 17 5 20 8 20 2 14 14 17 5 11 2 0 5 17 5 8 2 24 5 24 5 25 13 25 20 20 24 15 0 14 0 14 15 13 24 14 11 13 11 8 5 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 20 11 17 24 8 24 20 14 24 20 0 20 17 17 17 17 0 20 5 2 24 17 11 17 24 2 0 25 13 8 17 17 25 2 25 17 11 14 8 14 14 2 11 11 25 24 24 24 24 5 8 25 13 20 11 5 24 0 11 0 11 24 11 8 14 0 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p34

    13608
    1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 
    20 11 20 2 20 5 2 24 14 17 24 8 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 20 25 20 20 24 15 0 14 0 14 15 8 24 14 17 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 24 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 3 25 18 8 17 17 25 2 29 17 11 14 8 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

    14432
    1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 20 2 20 5 2 24 14 17 24 8 8 20 3 14 14 17 5 11 14 0 5 3 5 8 2 24 5 24 5 25 13 25 20 20 24 15 17 14 0 14 15 2 24 14 0 13 11 8 5 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 20 11 17 24 8 24 20 14 24 20 17 13 17 17 17 17 0 20 5 2 24 17 11 17 24 2 25 25 20 8 17 17 25 2 25 17 11 14 8 14 14 2 11 11 5 24 24 24 24 5 8 25 13 8 17 5 24 0 25 0 11 24 11 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p36

    16335
    1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 13 2 20 5 2 24 14 17 24 8 8 20 2 14 14 17 5 11 2 0 5 17 5 8 2 24 5 24 5 25 13 25 20 20 24 15 17 14 0 14 15 2 24 14 11 13 11 8 5 14 14 5 20 20 17 0 0 14 0 5 20 11 11 11 24 0 5 24 20 20 11 17 24 8 24 20 14 24 20 0 20 17 17 17 17 0 20 5 2 24 17 11 17 24 2 25 25 13 8 17 17 25 2 25 17 11 14 8 14 14 2 11 11 5 24 24 24 24 5 8 25 13 8 17 5 24 0 25 0 11 24 11 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p37

    12397
    1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 20 2 20 5 2 24 14 17 5 20 8 20 2 14 14 17 5 11 2 0 5 17 5 8 2 24 5 24 5 25 20 25 20 20 24 15 0 14 0 14 15 20 24 14 0 20 11 8 5 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 20 11 17 24 8 24 20 14 24 20 0 20 17 17 17 17 0 20 5 2 24 17 11 17 24 2 25 25 20 8 17 17 25 2 25 17 11 14 8 14 14 2 11 11 0 24 24 24 24 5 8 25 20 20 11 5 24 0 11 0 11 24 11 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p38

    11237
    1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 20 2 20 5 2 24 14 17 5 20 8 20 17 14 14 17 5 11 2 0 5 17 5 8 2 24 5 24 5 25 20 25 20 20 24 15 0 14 0 14 15 20 24 14 11 20 11 8 5 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 20 11 17 24 8 24 20 14 24 20 17 20 17 17 17 17 0 20 5 2 24 17 11 17 24 2 25 25 20 8 17 17 25 2 25 17 11 14 8 14 14 2 11 11 0 24 24 24 24 5 8 25 20 8 11 5 24 0 25 0 11 24 11 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p39

    13437
    1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 20 2 20 5 2 24 14 17 24 8 8 20 2 14 14 17 5 11 2 11 5 17 5 8 2 24 5 24 25 25 20 25 20 20 24 15 0 14 0 14 15 20 24 14 11 20 11 8 5 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 20 11 17 24 8 24 20 14 24 20 17 20 17 17 17 17 0 20 5 2 24 17 11 17 24 2 25 25 20 8 17 17 25 2 25 17 11 14 8 14 14 2 11 11 5 24 24 24 24 5 8 25 20 8 11 5 24 0 0 0 11 24 11 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p40

    16335
    1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
    20 11 20 2 20 5 2 24 14 17 24 8 8 20 2 14 14 17 5 11 2 0 5 17 5 8 2 24 5 24 5 25 13 25 20 20 24 15 17 14 0 14 15 2 24 14 11 13 11 8 5 14 14 5 20 20 17 0 0 14 0 5 20 11 11 11 24 0 5 24 20 20 11 17 24 8 24 20 14 24 20 0 20 17 17 17 17 0 20 5 2 24 17 11 17 24 2 25 25 13 8 17 17 25 2 25 17 11 14 8 14 14 2 11 11 5 24 24 24 24 5 8 25 13 8 17 5 24 0 25 0 11 24 11 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p41

    7103
    0 1 0 1 1 1 1 1 1 1 
    5 6 4 1 7 9 3 7 8 8 4 6 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 2 2 2 5 7 2 9 7 9 9 9 9 9 2 
    

    p42

    9482
    1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1 1 1 0 
    12 10 11 9 15 18 16 3 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 12 9 14 8 19 15 15 16 17 7 13 13 5 2 14 14 14 11 11 3 3 11 3 0 15 19 6 10 18 19 19 19 18 18 19 19 19 
    

    p43

    10227
    0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 0 1 
    4 19 18 24 25 22 26 21 27 29 24 23 13 9 18 11 21 11 12 21 25 26 22 22 17 13 29 6 29 4 5 24 2 13 19 22 25 12 21 11 4 12 28 23 5 25 26 17 17 11 21 9 9 18 6 6 19 22 2 5 5 27 1 29 27 28 1 27 28 29 
    

    p44

    7134
    1 0 0 0 1 0 1 0 0 0 
    4 4 4 4 4 4 4 4 6 0 0 0 0 0 0 0 1 1 1 7 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 0 1 1 2 8 7 5 3 7 7 6 5 5 8 8 7 7 9 5 5 5 9 3 0 6 6 8 6 5 4 9 9 7 7 8 6 6 5 8 7 9 9 9 9 9 6 5 7 5 
    

    p45

    9167
    1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 1 1 1 1 6 6 6 6 2 2 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 18 7 15 16 1 13 11 16 18 16 14 15 10 9 12 9 15 17 13 13 11 12 7 10 18 12 13 17 14 17 17 17 10 7 
    

    p46

    8535
    0 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    10 10 10 10 10 10 10 1 1 1 1 11 11 11 11 2 2 3 2 3 2 6 6 6 6 6 6 7 7 7 7 9 9 9 10 2 3 24 24 28 29 12 15 12 24 11 18 27 29 28 29 27 13 29 24 26 13 18 18 18 12 15 28 26 26 13 26 13 15 12 
    

    p47

    6491
    1 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 2 0 1 2 1 1 1 1 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 6 8 8 8 8 6 8 8 8 9 6 9 9 9 0 9 9 
    

    p48

    9044
    1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 1 0 1 1 1 2 3 2 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 10 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

    9122
    0 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    1 1 1 2 1 2 2 2 3 5 3 5 3 6 6 6 7 7 7 7 7 7 9 10 9 10 10 12 12 12 15 12 13 15 15 15 16 16 17 16 17 16 18 19 18 19 18 19 22 18 23 18 1 22 23 23 22 25 26 26 25 26 25 26 28 28 28 28 28 28 
    

    p50

    9655
    1 0 1 1 0 1 1 1 0 1 
    3 6 3 0 2 2 5 5 3 7 7 4 1 9 9 2 9 2 5 3 6 0 0 4 0 6 7 4 4 7 7 7 3 3 3 5 9 9 0 6 0 9 9 9 5 5 5 5 5 3 3 5 6 0 0 0 6 6 1 2 9 7 7 7 3 3 0 4 7 7 3 6 6 0 0 4 4 3 3 4 3 5 2 2 2 2 1 7 2 7 9 1 2 2 1 2 1 9 1 9 
    

    p51

    10532
    0 1 1 1 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 
    15 6 19 10 12 13 5 16 15 1 5 3 6 13 6 13 12 16 2 15 0 0 10 14 14 14 1 3 19 7 1 1 17 19 15 5 13 13 10 0 0 13 13 13 16 5 5 5 5 17 15 2 0 14 14 10 6 6 18 12 13 5 1 5 15 15 10 3 7 7 15 0 0 0 10 19 19 19 19 3 19 5 16 12 13 13 6 5 12 1 13 13 13 18 18 13 13 18 18 13 
    

    p52

    9588
    0 0 0 1 1 0 0 1 0 0 
    7 7 7 7 7 7 7 7 3 4 4 4 3 4 4 4 4 8 8 8 8 3 3 8 3 9 9 9 9 9 9 9 9 9 6 6 6 6 6 6 6 6 6 6 7 7 4 8 8 5 5 3 4 6 7 5 3 3 3 4 6 9 5 5 3 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 5 5 9 1 5 1 3 4 3 7 
    

    p53

    10361
    0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 
    5 5 5 5 5 5 5 5 19 19 19 7 7 7 7 7 7 12 13 13 12 13 12 13 12 9 9 9 9 9 9 9 9 2 18 18 18 18 18 18 18 18 18 18 5 5 7 12 12 2 15 1 7 18 5 15 3 3 1 6 18 2 15 13 3 13 2 18 6 5 17 18 6 3 3 15 3 6 6 2 18 19 13 15 15 3 1 6 15 19 15 2 17 17 2 17 1 6 1 5 
    

    p54

    9546
    0 0 1 0 0 0 0 1 0 0 
    7 7 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 6 8 8 8 8 8 8 3 3 6 6 6 6 6 6 6 6 6 5 5 6 5 5 5 6 6 0 0 6 0 5 7 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 9 4 9 9 9 9 9 9 9 
    

    p55

    11152
    0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 
    17 17 16 17 16 4 4 4 4 4 4 8 2 8 8 8 2 2 8 12 6 12 12 6 12 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 7 7 7 7 11 11 9 11 11 11 11 7 11 9 13 11 9 11 17 13 9 13 9 9 13 15 15 15 15 15 15 15 5 15 5 18 18 18 18 17 18 18 18 18 
    

    p56

    23882
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 14 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 24 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 
    

    p68

    23882
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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
    1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 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 4 2 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. 随机局部搜索算法Random-Local-Search以局部搜索算法为基础,将搜索状态设定为设备开启/关闭序列,即每台设备的0-1状态序列。RLS算法以随机状态作为初始解,针对于当前状态设定设备的Open表与Close表,进行最优领域可行状态搜索,直到迭代深度。

    • 此处针对于不同状态,建立贪心函数对每个设备状态序列进行Greedy Assign,总是选择对于当前状态的贪心分配策略,计算该状态的对应开销,用于状态优劣性比较。
    • RLS依赖于随机性进行局部搜索,可以一定程度上避免之前的贪心算法,以及禁忌搜索陷入局部最优的困境,但缺点是运行时间长,随机次数高,结果波动性大。

    随机局部搜索算法代码:

    /*
    * RandomLocalSearch.h -- Use random local search to solve CFLP
    */
    #ifndef RANDOM_LOCAL_SEARCH_H
    
    #define RANDOM_LOCAL_SEARCH_H
    
    #include <iostream>
    
    #include <vector>
    
    #include <fstream>
    
    #include <algorithm>
    
    #include <string>
    
    #include <cstdio>
    
    #include <ctime>
    
    #include <cmath>
    
    #include <windows.h>
    
    using namespace std;
    
    class RLS{
    public:
    	RLS(){
    		bestCost = (double)INT_MAX;
    		tempCost = 0;
    	}
    	void readFile(string filePath);
    	int performRandomLocalSearch();
    
    	// Random Search tools methods
    	vector<bool> randomStartState();
    	vector<bool> chooseBetterNeighbor(vector<bool>& curr_state);
    	// Cost calculating for facility state
    	double calculateCostForState(vector<bool>& state);
    	// Greedy assign customers to state, decide state available or not
    	bool greedyAssignCustomer(vector<bool>& state);
    	void calcluateCost();
    
    	int fac_num, cus_num;
    	// State vector
    	vector<bool> fac_open;
    	// Result vector
    	vector<int> result;
    
    private:
    	double bestCost, tempCost;
    	vector<bool> bestState;
    	vector<int> usedCapacity;
    	// Info vectors
    	vector<int> capacity;
    	vector<int> open_cost;
    	vector<int> demand;
    	vector<vector<int>> assign_cost; 
    
    };
    
    #endif
    
    #include "RandomLocalSearch.h"
    
    void RLS::readFile(string filePath){
    	ifstream in(filePath.c_str());
    	in >> fac_num >> cus_num;
    	// Read variables in order
    	for(int i=0; i<fac_num; i++){
    		int temp_cap, temp_cost;
    		in >> temp_cap >> temp_cost;
    		capacity.push_back(temp_cap);
    		open_cost.push_back(temp_cost);
    	}
    
    	for(int i=0; i<cus_num; i++){
    		float temp_demand;
    		in >> temp_demand;
    		demand.push_back((int)temp_demand);
    	}
    
    	for(int i=0; i<fac_num; i++){
    		vector<int> temp;
    		for(int j=0; j<cus_num; j++){
    			float ass_cost;
    			in >> ass_cost;
    			temp.push_back((int)ass_cost);
    		}
    		assign_cost.push_back(temp);
    	}
    
    	// Init State
    	for(int i=0; i<fac_num; i++){
    		fac_open.push_back(false);
    	}
    
    	for(int i=0; i<cus_num; i++){
    		result.push_back(-1);
    	}
    }
    
    int RLS::performRandomLocalSearch(){
    	int searchTime = 100;
    
    	for(int i=0; i<searchTime; i++){
    		vector<bool> startState = randomStartState();
    		// Start Random Search
    		bool endFlag = false;
    		double curr_cost = tempCost;
    		while(!endFlag){
    			vector<bool> nextState = chooseBetterNeighbor(startState);
    			if(curr_cost <= tempCost){
    				endFlag = true;
    			}else {
    				startState = nextState;
    				curr_cost = tempCost;
    			}
    		}
    		calculateCostForState(startState);
    		if(tempCost < bestCost){
    			bestCost = tempCost;
    			bestState = startState;
    		}
    	}
    	calculateCostForState(bestState);
    	return bestCost;
    }
    
    // Random Search tools methods
    vector<bool> RLS::randomStartState(){
    	vector<bool> result;
    	srand((int)time(0));
    
    	for(int i=0; i<fac_num; i++){
    		int rand_result = rand() % 10;
    		if(rand_result > 5){
    			result.push_back(true);
    		}else {
    			result.push_back(false);
    		}
    	}
    	return result;
    }
    
    vector<bool> RLS::chooseBetterNeighbor(vector<bool>& curr_state){
    	vector<bool> bestNext = curr_state;
    	double best_cost = tempCost;
    
    	vector<int> open;
    	vector<int> close;
    
    	for (int i = 0; i < fac_num; i++) {
            if (curr_state[i]) {
                open.push_back(i);
            } else {
                close.push_back(i);
            }
        }
    
        vector<bool> next;
        double nextCost = 0;
        // close a open facility
        for (int i : open) {
            next = curr_state;
            next[i] = false;
            nextCost = calculateCostForState(next);
            if (nextCost < best_cost) {
                best_cost = nextCost;
                bestNext = next;
            }
        }
    
        // open a closed facility
        for (int i : close) {
            next = curr_state;
            next[i] = true;
            nextCost = calculateCostForState(next);
            if (nextCost < best_cost) {
                best_cost = nextCost;
                bestNext = next;
            }
        }
    
        // close a open facility and open a closed facility
        for (int i : open) {
            next = curr_state;
            next[i] = false;
            for (int j : close) {
                next[j] = true;
                nextCost = calculateCostForState(next);
                if (nextCost < best_cost) {
                    best_cost = nextCost;
                    bestNext = next;
                }
            }
        }
        return bestNext;
    }
    
    // Cost calculating for facility state
    double RLS::calculateCostForState(vector<bool>& state){
    	bool success = greedyAssignCustomer(state);
    	if(success){
    		calcluateCost();
    		return tempCost;
    	}else {
    		return (double)INT_MAX;
    	}
    }
    
    // Greedy assign customers to state, decide state available or not
    bool RLS::greedyAssignCustomer(vector<bool>& state){
    	usedCapacity.clear();
    	for(int i=0; i<fac_num; i++){
    		usedCapacity.push_back(0);
    		fac_open[i] = false;
    	}
    
    	for (int j = 0; j < cus_num; j++) {
            int whichFacility = -1;
            for (int i = 0; i < fac_num; i++) {
                if (state[i]) {
                    if (capacity[i] >= demand[j] + usedCapacity[i]) {
                        whichFacility = i;
                        break;
                    }
                }
            }
    
            if (whichFacility == -1) {
                return false;
            }
    
            for (int i = 0; i < fac_num; i++) {
                if (state[i]) {
                    if (usedCapacity[i] + demand[j] <= capacity[i]
                            && assign_cost[i][j] < assign_cost[whichFacility][j]) {
                        whichFacility = i;
                    }
                }
            }
    
            result[j] = whichFacility;
            usedCapacity[whichFacility] += demand[j];
            fac_open[whichFacility] = true;
        }
    
        return true;
    }
    
    void RLS::calcluateCost(){
    	int openCost = 0, serveCost = 0;
    	for(int i=0; i<fac_num; i++){
    		if(fac_open[i]){
    			openCost += open_cost[i];
    		}
    	}
    
    	for(int i=0; i<cus_num; i++){
    		serveCost += assign_cost[result[i]][i];
    	}
    
    	tempCost = openCost + serveCost;
    }
    
    int main(){
    	string details = "../result/RLS/all.txt";
    	ofstream outP(details.c_str());
    
    	for(int i=1; i<=71; i++){
    		string targetName = "p" + to_string(i);
    
    		RLS rls;
    		string targetFile = "../testData/" + targetName;
    
    		rls.readFile(targetFile);
    
    		int result = rls.performRandomLocalSearch();
    
    		outP << targetName << "\n```\n";
    		outP << result << "\n";
    	    for(int i=0; i<rls.fac_num; i++){
    	    	outP << rls.fac_open[i] << " ";
    	    }
    	    outP << "\n";
    	    for(int i=0; i<rls.cus_num; i++){
    	    	outP << rls.result[i] << " ";
    	    }
    		outP << "\n```\n";
    	}
    
    	return 0;
    }
    

    结构分析:

    • 此处的随机局部搜索的主体为迭代循环,每次循环开始之前随机初始状态,然后结合函数chooseBestNeighbor()选择开销最小的当前状态邻域,进行开销比较,更新当前最优状态。 ​

    随机局部搜索结果:

    img

    分析:随机局部搜索算法消耗较多时间,运行结果比贪心算法与禁忌搜索算法要好挺多,主要原因在于迭代过程的初始随机状态,可以很大程度上避免过早陷入局部最优,避免一叶障目

    随机局部搜索具体样例结果:

    ​p1

    9413
    0 0 0 0 1 0 1 0 0 0 
    4 4 6 6 6 4 4 4 4 6 4 4 4 4 4 6 6 6 6 6 3 4 9 4 2 5 1 5 0 5 2 5 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 3 
    

    p2

    8255
    0 0 0 0 1 0 1 0 0 0 
    4 4 6 6 6 4 4 4 4 6 4 4 4 4 4 6 6 6 6 6 3 4 9 4 2 5 1 5 0 5 2 5 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 3 
    

    p3

    10055
    0 0 0 0 1 0 1 0 0 0 
    4 4 6 6 6 4 4 4 4 6 4 4 4 4 4 6 6 6 6 6 3 4 9 4 2 5 1 5 0 5 2 5 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 3 
    

    p4

    11855
    0 0 0 0 1 0 1 0 0 0 
    4 4 6 6 6 4 4 4 4 6 4 4 4 4 4 6 6 6 6 6 3 4 9 4 2 5 1 5 0 5 2 5 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 3 
    

    p5

    9348
    0 0 0 0 1 0 1 0 0 0 
    4 4 6 6 6 4 4 4 4 6 4 6 6 2 8 3 4 0 9 7 3 8 9 4 2 5 1 5 0 5 2 5 0 3 9 4 4 3 0 4 1 8 1 5 7 0 2 0 7 1 
    

    p6

    8190
    0 0 0 0 1 0 1 0 0 0 
    4 4 6 6 6 4 4 4 4 6 4 6 6 2 8 3 4 0 9 7 3 8 9 4 2 5 1 5 0 5 2 5 0 3 9 4 4 3 0 4 1 8 1 5 7 0 2 0 7 1 
    

    p7

    9990
    0 0 0 0 1 0 1 0 0 0 
    4 4 6 6 6 4 4 4 4 6 4 6 6 2 8 3 4 0 9 7 3 8 9 4 2 5 1 5 0 5 2 5 0 3 9 4 4 3 0 4 1 8 1 5 7 0 2 0 7 1 
    

    p8

    11790
    0 0 0 0 1 0 1 0 0 0 
    4 4 6 6 6 4 4 4 4 6 4 6 6 2 8 3 4 0 9 7 3 8 9 4 2 5 1 5 0 5 2 5 0 3 9 4 4 3 0 4 1 8 1 5 7 0 2 0 7 1 
    

    p9

    9013
    0 0 0 0 1 0 1 0 0 0 
    4 4 6 6 6 4 4 4 4 6 4 4 4 4 4 6 6 6 6 7 3 8 9 4 2 5 1 5 0 5 2 5 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 0 
    

    p10

    7855
    0 0 0 0 1 0 1 0 0 0 
    4 4 6 6 6 4 4 4 4 6 4 4 4 4 4 6 6 6 6 7 3 8 9 4 2 5 1 5 0 5 2 5 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 0 
    

    p11

    9655
    0 0 0 0 1 0 1 0 0 0 
    4 4 6 6 6 4 4 4 4 6 4 4 4 4 4 6 6 6 6 7 3 8 9 4 2 5 1 5 0 5 2 5 0 3 9 4 4 3 0 4 1 8 1 5 7 0 4 0 4 0 
    

    p12

    11455
    0 0 0 0 1 0 1 0 0 0 
    4 4 6 6 6 4 4 4 4 6 4 4 4 4 4 6 6 6 6 7 3 8 6 4 5 5 1 5 0 5 9 6 0 3 9 4 4 3 0 4 1 8 1 5 7 0 9 0 7 0 
    

    p13

    11719
    0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 
    18 18 18 18 19 18 19 18 18 19 18 19 19 18 2 19 2 19 19 19 19 2 2 2 2 2 16 17 1 17 13 7 2 16 3 10 11 1 1 13 6 0 5 0 8 5 14 10 2 9 
    

    p14

    9121
    0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 
    18 18 18 18 19 18 19 18 18 19 18 19 19 18 2 19 2 19 19 19 19 2 2 2 2 2 16 17 1 17 13 7 2 16 3 10 11 1 1 13 6 0 5 0 8 5 14 10 2 9 
    

    p15

    12921
    0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 
    18 18 18 18 19 18 19 18 18 19 18 19 19 18 2 19 2 19 19 19 19 2 2 2 2 2 16 17 1 17 13 7 2 16 3 10 11 1 1 13 6 0 5 0 8 5 14 10 2 9 
    

    p16

    16721
    0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 
    18 18 18 18 19 18 19 18 18 19 18 19 19 18 2 19 2 19 19 19 19 2 2 2 2 2 16 17 1 17 13 7 2 16 3 10 11 1 1 13 6 0 5 0 8 5 14 10 2 9 
    

    p17

    10315
    1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 0 
    0 1 7 7 1 18 3 18 14 4 7 4 1 6 2 3 5 7 4 9 14 5 7 2 6 4 0 3 1 4 2 7 2 0 3 6 3 1 1 2 6 0 5 0 8 5 14 6 2 9 
    

    p18

    8013
    1 1 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 
    0 1 10 10 1 18 17 18 3 17 7 1 1 6 2 3 7 10 17 6 18 18 7 2 6 17 0 17 1 17 2 7 2 0 3 10 3 1 1 2 6 0 0 7 3 18 7 10 2 6 
    

    p19

    12209
    0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 
    7 3 10 10 18 18 17 18 3 17 7 2 18 6 2 3 7 10 17 9 18 18 7 2 6 17 7 17 3 17 2 7 2 10 3 10 3 18 2 18 6 10 6 6 3 2 6 9 9 9 
    

    p20

    13809
    0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 
    7 3 10 10 18 18 17 18 3 17 7 2 18 6 2 3 7 10 17 9 18 18 7 2 6 17 7 17 3 17 2 7 2 10 3 10 3 18 2 18 6 10 6 6 3 2 6 9 9 9 
    

    p21

    11380
    0 1 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 
    7 1 10 10 1 13 3 13 3 4 7 4 1 10 13 3 7 10 4 10 1 7 7 19 10 4 7 3 1 4 13 7 13 7 3 10 3 19 19 13 10 13 13 1 3 19 1 3 19 1 
    

    p22

    8152
    1 0 1 1 1 1 1 1 0 0 1 0 0 1 0 0 0 0 0 1 
    0 3 10 10 19 13 3 13 3 4 7 4 19 6 13 3 5 10 4 6 7 5 7 19 6 4 0 3 3 4 13 7 2 0 3 10 3 19 19 13 6 0 5 0 3 5 7 10 19 6 
    
    

    p23

    11584
    1 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 
    0 1 0 14 1 1 1 2 14 11 5 1 1 14 2 11 5 14 1 8 14 5 5 2 8 1 0 1 11 11 2 14 2 0 11 14 11 2 2 2 14 0 5 0 8 5 14 8 11 8 
    

    p24

    12984
    1 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 
    0 1 0 14 1 1 1 2 14 11 5 1 1 14 2 11 5 14 1 8 14 5 5 2 8 1 0 1 11 11 2 14 2 0 11 14 11 2 2 2 14 0 5 0 8 5 14 8 11 8 
    

    p25

    15852
    1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 
    20 11 20 2 20 5 2 9 14 0 9 8 8 20 3 14 14 0 5 11 2 0 5 3 5 8 2 5 5 9 5 11 6 11 20 20 5 15 0 14 0 14 15 8 5 14 0 20 11 8 5 14 14 5 20 20 2 11 0 14 0 5 20 11 11 11 9 0 5 9 20 6 11 0 9 8 9 20 14 9 20 7 20 0 2 0 2 4 20 5 2 9 7 11 7 5 2 2 11 20 8 7 14 11 14 5 7 11 14 28 14 1 0 11 11 11 5 15 5 5 5 8 11 20 8 0 11 9 0 11 0 11 9 9 8 14 7 11 20 0 0 8 20 14 8 11 11 11 0 11 
    

    p26

    13477
    1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 
    20 11 20 2 20 5 2 9 14 0 9 16 8 20 3 14 14 0 5 11 2 0 5 3 5 8 19 24 5 24 5 11 6 11 20 20 24 24 0 14 0 14 24 8 24 14 0 20 11 8 5 14 14 5 20 20 2 11 0 14 0 5 20 11 11 11 9 0 5 9 20 6 11 0 24 8 9 20 14 24 20 7 20 0 19 0 2 4 20 5 2 24 7 11 7 5 2 2 11 16 8 7 14 11 2 5 7 11 14 8 14 14 0 11 11 11 24 24 24 24 5 8 11 20 16 0 5 9 0 12 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 11 11 5 0 5 
    

    p27

    17977
    1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 
    13 11 13 2 13 5 2 24 14 0 24 16 8 8 3 14 14 0 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 8 8 24 24 0 14 0 14 24 8 24 14 0 13 11 8 5 14 14 5 13 13 2 11 0 14 0 5 8 11 11 11 24 0 5 24 13 6 11 0 24 8 24 8 14 24 13 7 13 0 19 0 2 4 8 5 2 24 7 11 7 5 2 2 25 16 8 7 14 25 2 25 7 11 14 8 14 1 0 11 11 25 24 24 24 24 5 8 25 13 16 0 5 24 0 25 0 11 24 5 8 14 7 5 13 0 0 8 13 14 8 25 25 5 0 5 
    

    p28

    21271
    1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 
    20 11 13 2 20 5 2 9 14 0 9 16 8 20 3 14 14 0 5 11 2 0 5 3 5 8 19 24 5 24 5 11 6 11 20 20 24 24 0 14 0 14 24 8 24 14 0 13 27 8 5 14 14 5 13 20 2 11 0 14 0 5 20 11 11 11 9 0 5 9 20 6 11 0 24 8 9 20 14 24 20 7 13 0 19 0 2 4 20 5 2 24 7 11 7 5 2 2 27 16 8 7 14 11 2 5 7 11 14 8 14 1 0 11 11 27 24 24 24 24 5 8 11 13 16 0 5 9 0 27 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 27 11 5 0 5 
    

    p29

    17076
    1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 0 1 0 0 0 1 0 
    20 11 13 2 20 5 2 9 14 17 9 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 11 6 11 20 20 24 15 0 14 0 14 15 8 24 14 0 13 11 8 5 14 14 5 13 20 17 11 0 14 0 5 20 11 11 11 9 0 5 9 20 6 11 17 24 8 9 20 14 24 20 7 13 17 17 17 17 4 20 5 2 24 17 11 17 5 2 2 11 16 8 17 17 11 2 5 17 11 14 28 14 1 2 11 11 0 24 24 24 24 5 8 5 13 16 0 5 9 0 12 0 0 24 9 8 14 7 24 20 17 0 8 20 14 8 0 0 0 2 5 
    

    p30

    14475
    1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 0 
    20 11 13 2 20 5 2 9 14 17 9 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 2 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 8 24 14 0 13 11 8 5 14 14 5 13 20 17 11 0 14 0 5 20 11 11 11 9 0 5 9 20 6 11 17 24 8 9 20 14 24 20 7 13 17 17 17 17 4 20 5 2 24 17 11 17 5 2 2 25 16 8 17 17 25 2 25 17 11 14 28 14 1 2 11 11 25 24 24 24 24 5 8 25 13 16 0 5 9 0 12 0 11 24 5 8 14 7 25 20 17 0 8 20 14 8 25 25 11 2 24 
    

    p31

    17887
    1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 
    20 11 13 2 20 5 2 9 14 17 9 8 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 11 6 11 20 20 24 24 0 14 0 14 24 8 24 14 0 13 27 8 5 14 14 5 13 20 17 11 0 14 0 5 20 11 11 11 9 0 5 9 20 6 11 17 24 8 26 20 14 24 20 7 13 17 17 17 17 7 20 5 2 24 17 11 17 5 2 2 27 13 8 17 17 11 2 5 17 11 14 8 14 1 2 11 11 27 24 24 24 24 5 8 11 13 8 0 5 9 0 12 0 11 5 9 8 14 7 27 20 17 0 8 20 14 8 27 0 0 2 5 
    

    p32

    23188
    1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 
    20 11 13 2 20 5 2 5 14 17 5 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 2 5 5 5 5 11 6 11 20 20 5 15 0 14 0 14 15 8 5 14 0 13 27 8 29 14 14 5 13 20 17 11 0 14 0 5 20 11 11 11 5 0 26 29 20 6 11 17 15 8 26 20 14 29 20 0 13 17 17 17 17 4 20 29 2 15 17 11 17 29 2 2 29 16 8 17 17 11 2 29 17 11 14 8 14 1 2 11 11 27 11 15 11 0 0 8 27 13 16 0 0 26 0 29 0 27 0 29 8 14 17 29 20 17 0 8 20 14 8 27 17 27 2 27 
    

    p33

    15418
    1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 1 
    20 11 20 2 20 5 2 24 14 17 24 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 2 24 5 24 5 11 6 11 20 20 24 15 0 14 0 14 15 8 24 14 0 20 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 17 17 17 4 20 5 2 24 17 11 17 5 2 2 29 16 8 17 17 11 2 29 17 11 14 8 14 1 2 11 11 27 24 24 24 24 5 8 11 20 16 0 5 24 0 29 0 11 24 5 8 14 7 5 20 17 0 8 20 14 8 27 11 5 2 5 
    

    p34

    14505
    1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 0 1 1 1 0 0 1 
    20 11 13 2 20 5 2 9 14 17 9 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 0 14 0 14 15 8 24 14 0 13 11 8 29 14 14 5 13 20 17 11 0 14 0 5 20 11 11 11 9 0 5 9 20 6 11 17 24 8 26 20 14 24 20 7 13 17 17 17 17 4 20 5 2 24 17 11 17 5 2 2 25 16 8 17 17 25 2 29 17 11 14 8 14 14 2 11 11 25 24 24 24 24 5 8 25 13 16 0 5 9 0 12 0 11 24 5 8 14 7 5 20 17 0 8 20 14 8 25 25 5 2 5 
    

    p35

    17289
    0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 
    13 11 13 2 13 5 2 24 14 17 22 8 8 8 3 14 14 17 5 11 2 4 5 3 5 8 2 24 5 24 5 11 6 11 8 8 24 24 23 14 17 14 24 8 24 14 4 13 11 8 5 14 14 5 13 13 17 11 11 14 17 5 8 11 11 11 22 17 5 22 13 6 11 17 24 8 22 8 14 24 13 17 13 17 17 17 17 4 8 5 2 24 17 11 17 5 2 2 11 18 8 17 17 11 2 5 17 11 14 8 14 14 2 11 11 11 24 24 24 24 5 8 11 13 18 4 5 24 11 12 17 11 24 5 8 14 17 5 13 17 17 8 13 14 8 11 11 5 2 5 
    

    p36

    21260
    1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    13 11 13 2 13 5 2 9 14 0 9 8 8 8 3 14 14 0 5 11 2 0 5 3 5 8 2 5 5 9 5 11 6 11 8 8 5 15 0 14 0 14 15 8 5 14 0 13 11 8 5 14 14 5 13 13 2 11 0 14 0 5 8 11 11 11 9 0 5 9 13 6 11 0 9 8 9 8 14 9 13 7 13 0 2 0 2 4 8 5 2 9 7 11 7 5 2 2 11 13 8 7 14 11 2 5 7 11 14 8 14 1 2 11 11 11 5 15 5 5 5 8 11 13 8 0 5 9 0 12 0 11 5 9 8 14 7 11 13 0 0 8 13 14 8 11 11 0 2 0 
    

    p37

    13705
    1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 1 0 1 1 0 0 0 0 
    20 11 20 14 20 11 14 24 14 0 22 16 20 20 0 14 14 0 25 11 14 0 22 0 22 20 0 24 24 24 25 25 20 25 20 20 24 24 0 14 0 14 24 16 24 14 0 20 11 14 25 14 14 11 20 20 14 11 0 14 0 24 20 11 11 11 22 0 22 22 20 20 11 0 24 20 22 20 14 24 20 0 20 0 0 0 0 0 20 25 14 24 0 11 0 24 14 14 21 16 16 0 14 25 14 25 0 11 14 14 14 14 0 11 11 21 24 24 24 24 11 16 25 20 16 0 25 24 0 21 0 11 24 21 20 14 0 25 20 0 0 20 20 14 20 25 25 11 0 24 
    

    p38

    12651
    1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 1 0 1 1 0 0 0 0 
    20 11 20 14 20 11 14 24 14 0 22 16 20 20 0 14 14 0 25 11 14 0 22 0 22 20 0 24 24 24 25 25 20 25 20 20 24 24 0 14 0 14 24 16 24 14 0 20 11 14 25 14 14 11 20 20 14 11 0 14 0 24 20 11 11 11 22 0 22 22 20 20 11 0 24 20 22 20 14 24 20 0 20 0 0 0 0 0 20 25 14 24 0 11 0 24 14 14 21 16 16 0 14 25 14 25 0 11 14 14 14 14 0 11 11 21 24 24 24 24 11 16 25 20 16 0 25 24 0 21 0 11 24 21 20 14 0 25 20 0 0 20 20 14 20 25 25 11 0 24 
    

    p39

    17155
    1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1 1 
    20 0 20 2 20 5 2 5 28 17 5 20 28 20 3 2 17 17 5 0 2 0 5 3 5 20 2 5 5 5 5 5 20 29 20 20 5 5 0 2 0 20 5 10 5 17 0 20 0 28 29 28 17 5 20 20 17 0 0 17 0 5 20 0 0 0 5 0 5 5 20 20 5 17 5 20 5 20 2 5 20 0 20 17 17 17 17 4 20 5 2 5 17 0 17 5 2 2 29 18 28 17 17 0 2 29 17 0 28 28 17 2 2 0 0 29 5 5 5 0 0 28 0 20 18 0 0 29 0 29 0 0 0 29 28 17 17 29 20 17 0 28 20 17 20 29 0 0 2 0 
    

    p40

    16888
    1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1 
    20 0 20 17 20 5 19 5 28 17 22 20 28 20 17 28 17 17 5 0 19 0 5 17 5 20 19 5 5 22 5 5 20 29 20 20 5 5 0 17 0 20 5 28 5 17 0 20 0 28 29 28 17 5 20 20 17 0 0 17 0 5 20 0 0 0 22 0 5 22 20 20 5 17 5 20 22 20 19 5 20 0 20 17 17 17 17 0 20 5 17 5 17 0 17 5 17 19 29 20 28 17 17 0 19 29 17 0 28 28 17 19 17 0 0 29 5 5 5 5 5 28 5 20 20 0 5 22 0 29 0 0 5 29 28 17 17 29 20 17 0 28 20 0 20 29 0 0 0 0 
    

    p41

    6953
    1 0 1 0 1 0 1 1 1 0 
    0 6 4 6 7 7 7 7 8 8 4 6 2 6 2 7 7 8 0 6 6 6 4 4 6 4 4 4 8 8 0 0 0 0 7 2 2 6 6 2 2 7 7 7 7 4 0 7 6 4 4 6 6 6 2 7 2 8 0 7 0 0 6 0 0 6 6 6 4 4 0 4 4 4 7 7 2 2 6 7 7 2 2 7 7 7 2 2 7 2 
    

    p42

    6721
    1 1 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 
    11 8 11 5 15 19 1 11 17 1 11 8 6 19 6 15 0 17 8 5 5 11 5 8 8 8 11 17 17 11 1 19 6 8 5 19 6 0 0 1 1 11 17 8 11 5 19 19 15 15 1 17 1 17 17 5 17 5 5 5 11 11 11 11 11 11 0 15 19 6 19 15 19 19 19 19 19 19 19 19 
    

    p43

    6719
    0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 
    1 21 15 23 25 20 25 21 1 1 23 23 25 9 15 15 21 15 21 21 25 9 20 20 20 2 1 15 1 1 1 2 2 2 21 9 25 1 21 15 1 21 23 23 23 25 9 20 9 15 20 25 9 15 15 15 21 20 2 23 23 23 23 1 1 23 23 2 23 2 
    

    p44

    7620
    0 1 0 1 0 0 0 0 0 1 
    3 3 3 3 3 3 3 3 1 1 1 1 9 9 9 9 9 9 9 3 3 9 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 4 6 8 8 8 8 7 5 3 7 7 6 5 5 8 8 7 7 8 5 5 5 3 3 0 6 6 2 1 5 4 7 5 7 7 8 6 6 5 2 7 7 7 3 8 7 6 5 7 5 
    

    p45

    7563
    1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 
    0 0 0 0 0 0 0 6 6 6 6 6 6 6 6 2 2 2 2 2 2 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 0 0 2 2 11 8 13 17 19 7 19 19 8 13 11 19 13 19 5 6 10 10 2 2 0 17 13 13 8 11 7 10 19 2 13 17 17 17 8 17 10 7 
    

    p46

    7907
    0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 
    10 10 10 10 10 10 10 22 22 22 22 22 22 22 22 14 14 14 14 14 27 6 6 6 6 6 6 8 8 8 8 8 27 27 10 14 27 6 27 22 22 22 22 22 14 27 27 27 27 22 10 27 27 22 6 27 27 22 27 6 22 22 22 22 6 6 6 6 10 22 
    

    p47

    6832
    0 0 1 0 1 0 0 0 0 0 
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 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 0 9 9 9 9 2 2 2 9 2 
    

    p48

    7041
    0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 1 1 
    19 19 4 4 4 4 4 4 4 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 11 11 4 11 11 11 4 11 4 11 4 11 11 11 11 11 11 11 17 11 11 4 11 11 14 14 11 14 11 17 14 14 14 14 17 17 17 17 17 17 17 17 18 18 19 18 19 19 19 
    

    p49

    6944
    0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 1 0 1 0 1 1 0 
    2 2 2 2 2 2 2 2 4 4 4 4 4 14 14 2 14 14 2 2 14 2 11 11 11 11 11 14 14 19 17 17 17 19 17 11 17 17 17 17 17 17 18 19 18 19 18 19 23 18 23 18 2 23 23 23 23 25 25 25 25 25 25 25 27 27 28 27 28 28 
    

    p50

    10402
    0 0 0 0 0 0 0 0 1 1 
    8 9 8 9 9 9 8 9 8 8 8 8 9 9 9 8 9 2 5 3 0 0 0 4 0 0 7 4 4 7 7 7 3 3 3 5 1 1 0 6 0 1 1 1 5 5 5 5 5 3 3 5 6 0 0 0 6 6 2 2 2 7 7 7 3 3 6 4 8 7 3 6 6 0 6 4 4 3 3 4 3 5 2 2 2 2 6 7 2 7 2 2 2 2 2 2 2 2 2 2 
    

    p51

    9977
    0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 1 1 
    17 10 19 10 16 18 16 16 19 8 8 14 18 18 10 18 16 16 16 19 10 10 10 14 14 14 9 19 19 19 8 19 17 19 19 16 18 18 10 10 10 18 18 18 16 16 16 16 16 17 19 8 10 14 14 10 10 10 18 16 18 8 8 8 19 19 10 19 9 17 19 10 10 10 10 19 19 19 19 19 19 16 16 16 18 18 18 8 16 8 18 18 18 18 18 18 18 18 18 18 
    

    p52

    11355
    1 0 1 1 1 0 0 0 0 0 
    4 4 4 4 4 4 4 4 3 4 4 4 3 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 4 4 4 3 4 0 0 4 4 2 2 0 4 4 4 4 2 0 0 0 0 0 0 2 2 2 2 2 4 4 0 0 2 2 7 1 6 0 5 5 5 0 5 7 1 0 1 1 1 1 5 1 7 7 0 7 
    

    p53

    10408
    1 1 1 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 0 
    5 5 5 5 5 5 5 5 1 7 7 7 7 7 7 7 7 12 12 12 12 3 3 12 3 9 9 9 9 9 9 9 9 2 18 18 18 18 18 18 18 18 18 18 5 5 7 12 3 2 2 3 7 18 5 2 3 3 1 6 18 2 2 3 0 3 2 5 6 5 18 18 6 3 3 2 3 6 6 2 18 1 3 2 2 3 1 6 2 1 2 2 2 2 2 18 1 6 1 16 
    

    p54

    9950
    0 1 0 0 0 1 1 1 0 0 
    7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 7 1 1 1 1 1 7 1 1 7 6 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 6 6 5 5 5 5 5 5 5 5 5 5 5 7 7 5 5 6 5 5 5 6 6 0 0 0 0 0 9 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 9 4 9 4 4 2 4 2 2 
    

    p55

    10128
    0 1 0 1 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 
    17 17 16 17 16 4 4 4 8 8 8 8 8 8 4 17 8 6 6 12 1 12 12 6 12 12 12 6 6 6 6 14 14 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 14 7 7 6 7 7 7 7 7 7 7 7 7 7 13 7 3 7 3 7 7 13 13 7 13 13 17 13 13 13 13 13 13 15 15 15 15 15 15 15 15 15 15 17 17 17 17 17 17 17 17 17 
    

    p56

    22599
    1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 
    18 19 21 27 2 12 21 27 22 28 4 28 10 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 3 21 19 14 24 16 24 16 8 6 25 9 18 7 29 0 7 8 3 25 5 14 28 25 18 12 19 9 5 10 20 5 8 16 10 0 9 25 29 10 6 5 27 7 28 6 25 25 2 3 28 6 0 28 28 21 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 14 8 26 25 28 19 26 16 2 12 26 0 28 24 25 20 1 9 3 3 28 10 12 22 12 25 25 5 24 21 27 25 24 0 10 0 8 28 2 16 3 3 1 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 10 0 21 2 21 6 4 7 12 7 21 20 19 
    

    p57

    29619
    1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 
    18 19 21 22 2 12 21 0 22 0 4 19 13 1 19 18 1 10 22 0 18 16 5 24 10 18 24 19 29 2 19 19 4 16 18 6 8 8 24 16 18 9 6 4 8 19 13 21 19 10 24 16 24 16 8 6 11 9 18 25 29 0 18 8 13 11 5 19 19 25 18 12 19 9 5 13 10 5 8 16 10 0 9 25 29 13 6 5 24 25 11 6 25 25 2 3 11 6 0 11 19 21 25 18 4 0 4 24 22 3 6 4 18 12 12 8 11 25 0 8 9 11 0 6 9 16 2 11 4 0 11 24 25 10 1 9 3 3 11 10 12 22 11 11 25 5 24 21 18 25 24 0 10 0 8 11 2 16 3 13 13 24 10 2 5 22 5 4 3 21 1 8 19 10 4 2 2 10 29 13 5 21 2 19 12 8 11 10 0 21 2 21 6 4 25 12 25 21 13 6 
    

    p58

    42659
    1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 
    7 19 2 27 2 12 15 27 27 27 4 19 10 1 19 7 1 10 27 0 27 24 5 24 10 27 27 19 29 2 19 19 4 24 27 6 8 8 24 15 7 9 6 4 8 19 3 2 19 10 24 24 24 15 8 6 11 9 27 7 29 0 7 8 3 11 5 19 19 12 7 12 19 9 5 10 10 5 8 24 10 0 9 7 29 10 6 5 27 7 11 6 7 11 2 3 11 6 0 11 19 15 12 7 4 0 4 24 27 3 6 4 27 12 12 8 11 7 0 8 9 11 0 6 9 15 2 11 4 0 11 24 11 10 1 9 3 3 11 10 12 24 11 11 11 5 24 15 24 7 0 0 10 0 8 12 2 15 3 3 1 0 5 2 5 2 5 4 3 15 1 8 19 8 4 2 24 10 29 8 5 15 2 19 12 8 12 5 5 15 5 15 6 4 6 6 7 15 3 6 
    

    p59

    34876
    1 1 1 0 1 1 1 1 0 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 1 1 0 1 
    18 6 21 27 2 6 21 27 22 27 4 6 13 1 6 18 1 20 22 0 18 21 5 24 10 18 27 6 29 2 6 26 4 21 27 6 20 20 24 21 18 20 6 4 20 26 13 21 6 20 24 24 24 21 20 6 11 26 18 7 29 0 7 20 13 11 5 10 6 11 18 6 6 20 5 13 20 5 20 24 10 0 26 7 29 13 6 5 27 7 11 4 7 11 2 13 11 11 0 11 0 21 11 18 4 0 4 24 22 13 26 4 27 11 11 20 11 7 0 20 26 11 0 4 26 21 2 18 26 0 11 24 7 20 1 26 1 13 0 10 7 22 27 7 7 5 24 21 27 7 24 0 10 0 13 27 2 21 13 13 13 27 10 24 5 27 5 4 1 21 1 10 6 10 26 2 24 10 29 10 5 21 2 11 7 13 18 10 0 21 2 2 4 4 18 4 7 2 13 26 
    

    p60

    22148
    1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 0 1 1 1 1 1 0 0 1 0 
    7 19 21 22 2 6 15 28 22 28 4 28 10 1 28 7 1 10 22 0 7 16 5 24 10 7 24 19 4 2 19 19 4 16 28 6 8 8 24 16 7 9 6 4 8 19 3 21 19 10 24 16 24 16 8 6 25 9 22 7 4 0 7 8 3 25 5 19 28 25 7 6 19 9 23 23 10 23 8 16 10 0 9 25 4 10 6 5 24 7 28 6 25 25 2 3 28 6 0 28 28 15 25 7 4 0 4 24 22 3 19 4 22 6 6 8 28 7 0 8 9 25 28 19 9 16 2 28 19 0 28 24 25 10 23 9 3 3 28 10 6 22 28 25 25 5 24 15 22 25 24 0 23 0 8 28 2 15 3 3 1 0 10 24 5 24 5 4 3 21 1 8 19 10 4 2 0 10 4 10 5 21 2 19 6 8 28 23 0 21 2 21 6 4 7 6 7 15 10 19 
    

    p61

    27843
    1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 1 1 1 0 0 1 0 
    7 19 21 22 2 6 21 28 22 28 4 28 23 1 28 7 1 14 22 0 7 16 5 24 23 7 24 19 4 2 19 19 4 16 28 6 14 9 24 16 7 9 6 4 9 19 3 21 19 14 24 16 24 16 9 6 25 9 22 7 4 0 7 9 3 25 5 14 28 25 7 6 19 9 23 23 14 23 9 16 23 0 9 25 4 23 6 5 24 7 28 6 25 25 2 3 28 6 0 28 28 21 25 7 4 0 4 24 22 3 19 4 22 6 6 9 28 7 14 9 9 25 28 19 9 16 2 28 19 0 28 24 25 14 23 9 3 3 28 14 6 22 28 25 25 5 24 21 22 25 24 0 23 0 3 28 2 16 3 3 1 0 23 24 5 24 5 4 3 21 1 14 19 14 4 2 0 14 4 14 5 21 2 19 6 9 28 23 0 21 2 21 6 4 7 6 7 21 23 19 
    

    p62

    38665
    0 0 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 1 0 
    27 28 2 27 2 11 15 27 27 28 4 28 10 23 28 11 23 10 27 27 27 24 23 24 10 27 27 14 4 2 4 4 4 24 27 4 14 9 24 15 11 9 11 4 9 4 10 2 14 14 24 24 24 15 9 11 11 9 27 11 4 2 11 9 10 11 23 14 28 11 27 11 4 9 23 23 10 23 9 24 10 2 9 11 4 10 4 2 27 11 28 4 11 11 2 23 11 11 2 28 28 15 11 27 4 24 4 24 27 23 14 4 27 11 28 9 28 27 14 9 9 28 28 4 9 15 2 28 4 28 28 24 28 10 23 9 23 10 28 10 28 27 28 28 28 2 24 15 27 4 24 14 23 24 10 14 2 15 10 23 23 24 10 24 23 24 23 9 23 15 23 10 28 14 9 2 24 10 9 10 2 15 2 14 14 9 14 23 24 2 2 2 14 4 14 14 27 15 10 9 
    

    p63

    30636
    1 0 1 1 1 1 1 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 
    18 19 2 24 2 12 2 0 18 17 4 17 3 3 19 18 3 9 24 0 18 24 5 24 5 18 24 19 4 2 19 19 4 24 18 6 9 9 24 24 18 9 6 4 9 19 3 2 19 17 24 24 24 24 9 6 11 9 18 25 4 0 18 9 3 11 5 17 19 25 18 12 19 9 5 5 9 5 9 24 5 0 9 25 4 3 6 5 24 25 17 6 25 25 2 3 11 6 0 17 17 2 25 18 4 0 4 24 24 3 19 4 18 12 12 9 11 25 17 9 9 11 17 19 9 24 2 11 19 17 11 24 25 9 5 9 3 3 17 17 12 18 11 11 25 5 24 2 18 25 24 17 5 0 3 11 2 2 3 3 3 0 5 2 5 18 5 4 3 2 5 9 19 17 4 2 0 17 4 17 5 2 2 19 12 9 11 5 0 2 2 24 6 4 25 12 25 5 17 19 
    

    p64

    22199
    1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 1 
    7 19 2 27 2 12 15 27 27 27 4 19 10 1 19 7 1 10 27 0 27 16 5 24 10 27 27 19 29 2 19 19 4 16 27 6 8 8 24 16 7 9 6 4 8 19 3 2 19 10 24 16 24 16 8 6 11 9 27 7 29 0 7 8 3 11 5 19 19 12 7 12 19 9 5 10 10 5 8 16 10 0 9 7 29 10 6 5 27 7 11 6 7 11 2 3 11 6 0 11 19 15 12 7 4 0 4 24 27 3 19 4 27 12 12 8 11 7 0 8 9 11 0 19 9 16 2 11 19 0 11 24 11 10 1 9 3 3 11 10 12 27 11 11 11 5 24 15 27 7 24 0 10 0 8 11 2 15 3 3 1 27 10 24 5 27 5 4 3 15 1 8 19 10 4 2 0 10 29 10 5 15 2 19 12 8 11 10 0 2 2 2 6 4 7 12 7 15 10 19 
    

    p65

    28114
    0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 1 1 1 0 0 1 0 0 
    7 12 21 27 21 12 21 27 22 27 4 12 10 1 12 7 1 10 22 27 27 16 23 24 10 27 27 10 4 21 4 4 4 16 27 12 8 8 24 16 7 9 12 4 8 4 3 21 4 10 24 16 24 16 8 12 7 9 22 7 4 24 7 8 3 12 23 10 12 12 7 12 4 9 23 23 10 23 8 16 10 23 9 7 4 10 4 23 27 7 27 4 7 7 24 3 27 12 10 12 10 21 12 7 4 24 4 24 22 3 4 4 27 12 12 8 27 7 10 8 9 12 27 4 9 16 21 12 4 10 27 24 12 10 23 9 3 3 27 10 12 22 12 12 7 23 24 21 27 7 24 10 23 24 8 12 21 16 3 3 1 27 10 24 23 27 23 4 3 21 1 8 12 10 4 21 24 10 4 10 23 21 21 12 12 8 12 23 27 21 21 21 4 4 7 4 7 21 10 12 
    

    p66

    36600
    0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 0 0 
    7 19 21 27 21 11 21 27 22 17 19 17 13 1 19 7 1 13 22 27 27 21 1 27 13 27 27 19 19 21 19 19 19 21 27 19 9 9 27 21 7 9 19 9 9 19 13 21 19 17 27 22 21 21 9 19 11 9 22 7 9 17 7 9 13 11 17 17 19 25 7 11 19 9 13 13 13 17 9 22 13 17 9 25 19 13 19 21 27 7 17 19 25 25 17 13 11 11 17 17 17 21 25 7 19 17 19 27 22 13 19 19 27 11 11 9 11 7 17 9 9 11 17 19 9 21 21 11 19 17 11 21 25 13 1 9 1 13 17 17 11 22 11 11 25 17 27 21 27 25 27 17 13 17 13 11 21 21 13 13 13 27 13 21 13 27 1 19 1 21 1 13 19 17 9 21 27 13 9 13 21 21 21 19 11 9 11 13 17 21 17 27 11 11 7 11 7 1 13 17 
    

    p67

    31638
    0 0 1 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 1 1 0 1 0 0 0 1 1 
    18 14 21 22 2 28 21 28 22 28 29 28 13 13 28 18 13 10 22 24 18 24 2 24 10 18 24 14 29 2 28 14 29 21 28 28 8 8 24 21 18 8 28 29 8 14 13 21 14 14 24 24 24 21 8 28 18 8 18 7 29 2 7 8 13 28 2 14 28 7 7 28 28 8 10 10 10 10 8 24 10 10 8 7 29 13 29 2 24 7 28 28 7 7 2 13 28 28 2 28 28 21 7 18 29 24 29 24 22 13 14 29 18 14 18 8 24 7 14 8 14 18 14 14 14 21 2 18 29 24 7 24 7 10 13 8 13 13 24 10 7 22 7 7 7 2 24 21 22 7 24 14 10 2 8 18 2 21 13 13 13 24 10 24 2 18 2 29 13 21 13 8 14 14 29 2 2 10 29 10 2 21 21 29 7 8 18 10 10 21 2 21 29 29 7 29 7 21 10 29 
    

    p68

    22002
    1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 1 1 
    7 6 21 27 2 12 21 27 22 28 4 28 10 3 28 7 3 10 22 0 27 16 5 24 10 27 27 28 29 2 6 26 4 16 27 6 8 8 24 16 7 9 6 4 8 26 3 21 6 10 24 16 24 16 8 6 11 9 22 7 29 0 7 8 3 11 5 28 28 12 7 12 6 9 5 10 10 5 8 16 10 0 9 7 29 10 6 5 27 7 28 6 7 11 2 3 11 6 0 28 28 21 12 7 4 0 4 24 22 3 26 4 27 12 12 8 28 7 0 8 26 11 28 6 26 16 2 11 26 0 28 24 11 10 5 9 3 3 28 10 12 22 11 11 11 5 24 21 27 7 24 0 10 0 8 11 2 16 3 3 3 27 10 24 5 27 5 4 3 21 5 8 28 10 26 2 0 10 29 10 5 21 2 6 12 8 11 10 0 21 2 21 6 4 7 12 7 21 8 6 
    
    

    p69

    27778
    1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 1 
    18 19 21 27 2 11 21 27 18 28 29 28 13 13 28 18 3 13 27 0 18 16 5 0 13 18 27 19 29 2 19 19 26 16 27 19 8 8 16 16 18 9 19 26 8 19 13 21 19 19 0 16 2 16 8 19 11 9 18 25 29 0 18 8 13 11 5 19 28 25 18 11 19 9 5 13 8 5 8 16 13 0 9 25 29 13 19 5 27 25 28 19 25 25 2 3 11 11 0 28 28 21 25 18 29 0 29 27 27 3 19 29 27 11 11 8 28 25 0 8 26 11 28 19 26 16 2 11 26 0 28 21 25 8 5 9 3 3 28 13 11 27 11 11 25 5 16 21 27 25 27 0 5 0 8 11 2 16 3 13 13 27 13 2 5 27 5 29 3 21 5 8 19 8 26 2 0 13 29 13 5 21 2 19 11 8 28 13 0 21 2 21 19 29 25 11 25 21 8 19 
    

    p70

    37827
    1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 0 0 1 1 1 1 0 
    27 19 21 27 21 12 15 27 27 28 26 28 10 1 28 27 1 10 27 0 27 16 1 0 10 27 27 19 26 21 19 19 26 16 27 12 8 8 16 16 25 8 12 26 8 19 8 21 19 10 0 16 21 16 8 12 25 8 27 25 26 0 25 8 8 25 0 17 28 25 25 12 19 8 10 10 10 10 8 16 10 0 26 25 26 10 19 0 27 25 28 19 25 25 0 1 28 12 0 28 28 15 25 25 26 0 26 27 27 1 19 26 27 12 12 8 28 25 17 8 26 25 17 19 26 16 21 12 26 17 28 21 25 10 1 8 1 8 28 10 12 27 12 25 12 0 16 15 27 12 27 17 10 0 8 28 21 15 8 1 1 27 10 0 10 27 1 26 1 21 1 8 19 10 26 21 0 8 26 8 21 21 21 19 12 8 28 10 0 21 21 21 19 19 12 12 12 15 17 19 
    

    p71

    29846
    0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 
    7 19 21 22 2 12 21 28 22 28 29 28 13 13 28 7 13 10 22 28 7 21 23 2 10 7 22 19 29 2 19 19 26 21 28 12 8 8 21 21 7 8 12 26 8 19 13 21 19 10 2 22 2 21 8 12 7 8 22 7 29 2 7 8 13 12 23 19 28 12 7 12 19 8 23 23 10 23 8 22 10 2 26 7 29 13 19 2 22 7 28 19 7 7 2 13 28 12 2 28 28 21 12 7 29 2 29 21 22 13 19 29 22 12 12 8 28 7 28 8 26 12 28 19 26 21 2 12 26 10 28 21 12 10 23 8 13 13 19 10 12 22 12 12 7 2 21 21 22 7 2 10 23 2 8 12 2 21 13 13 13 22 10 21 23 22 23 29 13 21 23 8 19 10 26 21 21 10 29 10 2 21 21 19 12 8 19 23 21 21 2 21 19 29 7 19 7 23 10 19