1、问题描述
有m个工厂与n个消费者,每个工厂都有一定的供给能力,每个消费者都有固定的需求。工厂可以供给消费者,工厂到消费者的供给是需要cost的,可以把它想象为工厂向消费者提供物资的传输成本,工厂开设也需要成本,即为工厂的开设成本。现在要求开设工厂满足所有消费者的需求,并且要使运输成本加开设成本最低。
工厂数,消费者数,工厂供给能力,工厂开设成本,各个消费者的需求,工厂到消费者之间的运输成本全部记录在文件中。
2、问题分析
想了一下,这是一个NP难问题,也就是说很难找到全局的最优解,除非遍历。然而面对这么大的数据量遍历是不可能的。只能通过一些启发式算法来找到近似最优解。这里我选用的算法是贪心算法和模拟退火算法。
3、贪心算法
这个问题最先想到的当然是贪心算法。这里贪心比较简单,因为大致看了一下数据,工厂的开设成本和到消费者的运输成本是一个数量级,大概都差不多,然而消费者数远多与工厂数,于是我们只关注工厂到消费者的运输费用。
遍历每一个消费者,该消费者选择距离他最近的能够满足他的需求的工厂。
假设有m个工厂,n个消费者,贪心算法复杂度O(mn)。
代码:
#include <iostream>
#include <fstream>
#include <string>
#include <time.h>
#include <vector>
#include <algorithm>
#include <sstream>
#include <windows.h>
using namespace std;
int fac_num = 0;
int user_num = 0;
vector<int> fac_capa;
vector<int> fac_cost;
//工厂->消费者
vector<vector<int> > user_cost;
vector<int> user_need;
vector<vector<int> > fac_to_user;
//表示工厂此时的供给量
//vector<float> fac_now;
//vector<vector<int> >user_choose;
int total_cost[71] = {0};
long run_time[71] = {0};
void clear_vector(){
fac_num=0;
user_num=0;
fac_capa.clear();
fac_cost.clear();
for(int i=0;i<user_cost.size();i++)
user_cost[i].clear();
user_cost.clear();
user_need.clear();
for(int i=0;i<fac_to_user.size();i++)
fac_to_user[i].clear();
fac_to_user.clear();
}
//载入数据
void load_model(string path)
{
fstream file(path.c_str());
//cout<<path<<endl;
if(!file)
{
cout<<"Error while opening file."<<endl;
return;
}
while(!file.eof())
{
file>>fac_num>>user_num;
for(int i=0;i<fac_num;i++)
{
int temp1 = 0;
int temp2 = 0;
file>>temp1>>temp2;
fac_capa.push_back(temp1);
fac_cost.push_back(temp2);
vector<int> v;
fac_to_user.push_back(v);
}
for(int i=0;i<user_num;i++)
{
float temp = 0;
file>>temp;
user_need.push_back(int(temp));
vector<int> t;
user_cost.push_back(t);
}
for(int i=0;i<fac_num;i++)
{
for(int j=0;j<user_num;j++)
{
float temp = 0;
file>>temp;
user_cost[j].push_back(int(temp));
//cout<<temp<<" ";
}
//cout<<endl;
}
break;
}
file.close();
}
//精确计时函数
class MyTimer{
private:
int _freq;
LARGE_INTEGER _begin;
LARGE_INTEGER _end;
public:
long costTime; // 花费的时间(精确到微秒)
public:
MyTimer(){
LARGE_INTEGER tmp;
QueryPerformanceFrequency(&tmp);
_freq = tmp.QuadPart;
costTime = 0;
}
void Start(){ // 开始计时
QueryPerformanceCounter(&_begin);
}
void End(){ // 结束计时
QueryPerformanceCounter(&_end);
costTime = (long)((_end.QuadPart - _begin.QuadPart) * 1000000 / _freq);
}
void Reset(){ // 计时清0
costTime = 0;
}
};
//第一种方法:每个客户选最小的开销
//n是节点数
void solution1(int n)
{
MyTimer mt;
mt.Start();
//遍历每一个用户
for(int i=0;i<user_num;i++){
//一个用户到各个工厂的距离的副本
int* temp_cost = new int[fac_num];
for(int j=0;j<fac_num;j++)
temp_cost[j] = user_cost[i][j];
//逐个工厂检测是否能满足他的需求
for(int j=0;j<fac_num;j++){
//如果该工厂满足不了他的需求,则到该工厂的距离为99999
if(fac_capa[j]<user_need[i])
temp_cost[j] = 999999;
}
//选取最小开支的工厂,返回下标
int index = min_element(temp_cost,temp_cost+fac_num)-temp_cost;
//如果是新开的工厂则将cost计算进去
if(fac_to_user[index].size()==0)
total_cost[n]+=fac_cost[index];
//工厂容量降低
fac_capa[index]-=user_need[i];
//工厂供给该用户
fac_to_user[index].push_back(i);
//总费用上添加距离耗费
total_cost[n]+=user_cost[i][index];
delete []temp_cost;
}
mt.End();
run_time[n] = mt.costTime;
//run_time[n] = double(duration.count()) * microseconds::period::num / microseconds::period::den;
cout<<"node "<<n+1<<" complish. Cost: "<<total_cost[n]<<" Time: "<<run_time[n]<<"us"<<endl;
}
//获取用户a选择的工厂
int get_index(int a){
for(int i=0;i<fac_num;i++)
{
for(int j=0;j<fac_to_user[i].size();j++)
if(fac_to_user[i][j]==a)
return i;
}
return -1;
}
//保存结果
void save_result(int a)
{
stringstream ss;
ss << a+1;
string s1 = ss.str();
string path = "solutions2/p"+s1+".txt";
fstream file(path.c_str(),ios::in | ios::out | ios::trunc);
if(!file)
{
cout<<"open "<<path<<" Error!"<<endl;
return;
}
file<<total_cost[a]<<endl;
for(int i=0;i<fac_num;i++)
file<<(fac_to_user[i].size()==0?0:1)<<" ";
file<<endl;
for(int i=0;i<user_num;i++)
file<<get_index(i)<<" ";
file<<endl;
file.close();
}
void save_all_node(){
fstream file("solutions2/result.txt",ios::in | ios::out | ios::trunc);
if(!file){
cout<<"Error!"<<endl;
return;
}
file<<" "<<" Cost"<<" Time(us)"<<endl;
for(int i=0;i<71;i++){
stringstream ss;
ss << i+1;
string s1 = ss.str();
file<<"p"<<s1<<" "<<total_cost[i]<<" "<<run_time[i]<<endl;
}
file.close();
}
void save(int a){
stringstream ss;
ss << a+1;
string s1 = ss.str();
string path = "solutions2/blog.txt";
fstream file(path.c_str(), ios::out | ios::app);
if(!file)
{
cout<<"open "<<path<<" Error!"<<endl;
return;
}
file<<"p"<<s1<<endl;
file<<total_cost[a]<<endl;
for(int i=0;i<fac_num;i++)
file<<(fac_to_user[i].size()==0?0:1)<<" ";
file<<endl;
for(int i=0;i<user_num;i++)
file<<get_index(i)<<" ";
file<<endl<<endl;
file.close();
}
int main()
{
for(int a=0;a<71;a++){
stringstream ss;
ss << a+1;
string s1 = ss.str();
string path = "Instances/p"+s1;
load_model(path);
solution1(a);
//save_result(a);
save(a);
clear_vector();
//cout<<"clear"<<endl;
}
int ddd = 0;
for(int i=0;i<71;i++)
ddd+=total_cost[i];
cout<<ddd<<endl;
//save_all_node();
return 0;
}
结果:
Cost | Time(us) | |
p1 | 9440 | 97 |
p2 | 8126 | 91 |
p3 | 10126 | 97 |
p4 | 12126 | 98 |
p5 | 9375 | 92 |
p6 | 8061 | 85 |
p7 | 10061 | 91 |
p8 | 12061 | 85 |
p9 | 9040 | 90 |
p10 | 7726 | 118 |
p11 | 9726 | 107 |
p12 | 11726 | 83 |
p13 | 12032 | 140 |
p14 | 9180 | 141 |
p15 | 13180 | 141 |
p16 | 17180 | 141 |
p17 | 12032 | 142 |
p18 | 9180 | 144 |
p19 | 13180 | 144 |
p20 | 17180 | 140 |
p21 | 12032 | 141 |
p22 | 9180 | 167 |
p23 | 13180 | 161 |
p24 | 17180 | 143 |
p25 | 19197 | 609 |
p26 | 16131 | 538 |
p27 | 21531 | 539 |
p28 | 26931 | 573 |
p29 | 19305 | 582 |
p30 | 16239 | 538 |
p31 | 21639 | 559 |
p32 | 27039 | 648 |
p33 | 19055 | 553 |
p34 | 15989 | 538 |
p35 | 26789 | 581 |
p36 | 26789 | 581 |
p37 | 19055 | 576 |
p38 | 15989 | 590 |
p39 | 21389 | 568 |
p40 | 26789 | 574 |
p41 | 7226 | 157 |
p42 | 9957 | 333 |
p43 | 12448 | 290 |
p44 | 7585 | 164 |
p45 | 9848 | 311 |
p46 | 12639 | 292 |
p47 | 6634 | 164 |
p48 | 9044 | 252 |
p49 | 12420 | 286 |
p50 | 10062 | 179 |
p51 | 11351 | 311 |
p52 | 10364 | 209 |
p53 | 12470 | 300 |
p54 | 10351 | 173 |
p55 | 11970 | 367 |
p56 | 23882 | 950 |
p57 | 32882 | 904 |
p58 | 53882 | 882 |
p59 | 39121 | 737 |
p60 | 29882 | 811 |
p61 | 32882 | 706 |
p62 | 53882 | 1094 |
p63 | 39121 | 737 |
p64 | 23882 | 811 |
p65 | 32882 | 706 |
p66 | 53882 | 761 |
p67 | 39671 | 708 |
p68 | 23882 | 723 |
p69 | 32882 | 781 |
p70 | 53882 | 763 |
p71 | 39121 | 745 |
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
19197
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 14 25 2 29 7 11 14 28 14 1 2 11 11 21 24 24 24 24 5 8 25 13 16 0 5 9 0 12 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 25 25 5 2 5
p26
16131
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 14 25 2 29 7 11 14 28 14 1 2 11 11 21 24 24 24 24 5 8 25 13 16 0 5 9 0 12 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 25 25 5 2 5
p27
21531
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 14 25 2 29 7 11 14 28 14 1 2 11 11 21 24 24 24 24 5 8 25 13 16 0 5 9 0 12 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 25 25 5 2 5
p28
26931
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 14 25 2 29 7 11 14 28 14 1 2 11 11 21 24 24 24 24 5 8 25 13 16 0 5 9 0 12 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 25 25 5 2 5
p29
19305
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 21 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 11 2 24
p30
16239
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 21 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 11 2 24
p31
21639
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 21 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 11 2 24
p32
27039
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 21 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 11 2 24
p33
19055
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 21 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
p34
15989
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 21 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
21389
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 21 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
p36
26789
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 21 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
p37
19055
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 21 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
p38
15989
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 21 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
p39
21389
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 21 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
p40
26789
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
20 11 13 2 20 5 2 9 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 8 24 14 0 13 27 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 21 16 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 21 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
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 5 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 18 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 18 19 19 19
p49
12420
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
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 27 28 28
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
11351
1 1 1 1 1 1 1 1 1 0 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 7 7 15 0 0 0 10 19 19 19 19 3 19 5 16 12 13 13 6 8 12 1 13 13 13 4 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
12470
1 1 1 1 1 1 1 1 0 1 0 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 5 6 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 6 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
11970
1 1 1 1 1 1 1 1 1 1 0 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 6 12 12 12 6 6 6 6 14 14 6 6 6 6 6 6 7 7 19 19 7 0 0 0 0 0 0 0 0 7 7 7 7 7 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 7 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 7 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 7 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 7 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 7 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 7 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 7 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 7 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 7 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 7 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 7 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 7 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 7 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 7 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 7 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 7 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
贪心算法的结果就是这些。然后我算了一下71种情况的总cost,是1360753.
4、模拟退火算法加启发式贪心
原来的贪心肯定是不好的,因为没有考虑工厂的开设费用问题。这里考虑要将工厂的开设费用考虑进去。外层循环还是遍历每一个用户,该用户在选取工厂的时候,原来的评价标准是选择能够容纳他的运输费用最小的工厂,现在的考虑方式是如果工厂是新开的, 该除了到该工厂的运输成本之外,还需要添加一个该工厂的开设成本。从中选取费用最小的工厂,然后发现,比原来的贪心更差。于是又重新考虑这种情况:还有很多用户没有选择工厂的时候,这个时候开设一个新工厂的性价比很高,因为该后面还有很多用户可以选择该工厂。越到后面,开设新工厂的性价比越低,举个极端例子,距离最后一个人最近的是一个新工厂,该工厂开启之后只供给这一个人,不如让这个人稍微多花点运输成本选择已经开启的工厂。和原来的贪心算法的主要区别如下:
int* temp_cost = new int[fac_num];
for(int j=0;j<fac_num;j++)
temp_cost[j] = user_cost[i][j];
for(int j=0;j<fac_num;j++){
if(fac_to_user[j].size()==0)//原来的贪心算法并不考虑工厂开设成本
temp_cost[j] += int(double(fac_cost[j])*i/user_num);
//上面那条语句表示在评估该用户到各个工厂的成本时,如果是新工厂,要加上新工厂开设成本*系数
//系数随着用户i的增大而增大,也就是越到后面越应该注重工厂开设成本
if(fac_capa[j]<user_need[i])
temp_cost[j] = 999999;
}
int index = min_element(temp_cost,temp_cost+fac_num)-temp_cost;
再次之上再添加模拟退火:这里模拟退火的方式是:
从启发式贪心得到的结果开始,初始温度是当前的总cost,结束温度是1e-15,降温速率为0.999,状态转换过程就是随机选取一个用户,将他从a工厂移动到b工厂,重新计算成本。这里保证移动用户的合法性,即总是有其他工厂可以容纳次用户。如果新成本小于当前的全局最优成本,则更新当前的全局最优成本,然后就是模拟退火的标准过程,如果新状态成本更低,则接受新状态,否则以一个概率来接受新状态。
完整代码
#include <iostream>
#include <fstream>
#include <string>
#include <time.h>
#include <vector>
#include <algorithm>
#include <sstream>
#include <windows.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
int fac_num = 0;
int user_num = 0;
vector<int> fac_capa;//
vector<int> fac_cost;
//工厂->消费者
vector<vector<int> > user_cost;
vector<int> user_need;
vector<vector<int> > fac_to_user;//
vector<int> user_choose;//
//表示工厂此时的供给量
int total_cost[71] = {0};
long run_time[71] = {0};
double r = 0.999;//用于控制降温的快慢
double T = 10000;//系统的初始温度
double T_min = 1e-15;//系统的截止温度
void clear_vector(){
fac_num=0;
user_num=0;
fac_capa.clear();
fac_cost.clear();
for(int i=0;i<user_cost.size();i++)
user_cost[i].clear();
user_cost.clear();
user_need.clear();
for(int i=0;i<fac_to_user.size();i++)
fac_to_user[i].clear();
fac_to_user.clear();
user_choose.clear();
}
//载入数据
void load_model(string path)
{
fstream file(path.c_str());
//cout<<path<<endl;
if(!file)
{
cout<<"Error while opening file."<<endl;
return;
}
while(!file.eof())
{
file>>fac_num>>user_num;
for(int i=0;i<fac_num;i++)
{
int temp1 = 0;
int temp2 = 0;
file>>temp1>>temp2;
fac_capa.push_back(temp1);
fac_cost.push_back(temp2);
vector<int> v;
fac_to_user.push_back(v);
}
for(int i=0;i<user_num;i++)
{
float temp = 0;
file>>temp;
user_need.push_back(int(temp));
vector<int> t;
user_cost.push_back(t);
user_choose.push_back(0);
}
for(int i=0;i<fac_num;i++)
{
for(int j=0;j<user_num;j++)
{
float temp = 0;
file>>temp;
user_cost[j].push_back(int(temp));
//cout<<temp<<" ";
}
//cout<<endl;
}
break;
}
file.close();
}
//精确定时器
class MyTimer{
private:
int _freq;
LARGE_INTEGER _begin;
LARGE_INTEGER _end;
public:
long costTime; // 花费的时间(精确到微秒)
public:
MyTimer(){
LARGE_INTEGER tmp;
QueryPerformanceFrequency(&tmp);
_freq = tmp.QuadPart;
costTime = 0;
}
void Start(){ // 开始计时
QueryPerformanceCounter(&_begin);
}
void End(){ // 结束计时
QueryPerformanceCounter(&_end);
costTime = (long)((_end.QuadPart - _begin.QuadPart) * 1000000 / _freq);
}
void Reset(){ // 计时清0
costTime = 0;
}
};
//第一种方法:每个客户选最小的开销
//n是节点数
void solution1(int n)
{
//MyTimer mt;
//mt.Start();
//遍历每一个用户
for(int i=0;i<user_num;i++){
//一个用户到各个工厂的距离的副本
int* temp_cost = new int[fac_num];
for(int j=0;j<fac_num;j++)
temp_cost[j] = user_cost[i][j];
//逐个工厂检测是否能满足他的需求
for(int j=0;j<fac_num;j++){
//如果该工厂满足不了他的需求,则到该工厂的距离为99999
if(fac_capa[j]<user_need[i])
temp_cost[j] = 999999;
}
//选取最小开支的工厂,返回下标
int index = min_element(temp_cost,temp_cost+fac_num)-temp_cost;
//如果是新开的工厂则将cost计算进去
if(fac_to_user[index].size()==0)
total_cost[n]+=fac_cost[index];
//工厂容量降低
fac_capa[index]-=user_need[i];
//工厂供给该用户
fac_to_user[index].push_back(i);
//总费用上添加距离耗费
total_cost[n]+=user_cost[i][index];
user_choose[i] = index;
delete []temp_cost;
}
//mt.End();
//run_time[n] = mt.costTime;
//run_time[n] = double(duration.count()) * microseconds::period::num / microseconds::period::den;
//cout<<"node "<<n+1<<" complish. Cost: "<<total_cost[n]<<" Time: "<<run_time[n]<<"us"<<endl;
}
void solution2(int n){
//MyTimer mt;
//mt.Start();
//遍历每一个用户
for(int i=0;i<user_num;i++){
int* temp_cost = new int[fac_num];
for(int j=0;j<fac_num;j++)
temp_cost[j] = user_cost[i][j];
for(int j=0;j<fac_num;j++){
if(fac_to_user[j].size()==0)
temp_cost[j] += int(double(fac_cost[j])*i/user_num);
//temp_cost[j] += fac_cost[j];
if(fac_capa[j]<user_need[i])
temp_cost[j] = 999999;
}
int index = min_element(temp_cost,temp_cost+fac_num)-temp_cost;
//cout<<"User "<<i<<" choose"<<" "<<index<<", Cost: "<<temp_cost[index]<<", "<<user_cost[i][index]<<endl;
//如果是新开的工厂则将cost计算进去
if(fac_to_user[index].size()==0)
total_cost[n]+=fac_cost[index];
//工厂容量降低
fac_capa[index]-=user_need[i];
//工厂供给该用户
fac_to_user[index].push_back(i);
//总费用上添加距离耗费
total_cost[n]+=user_cost[i][index];
user_choose[i] = index;
delete []temp_cost;
}
//mt.End();
//run_time[n] = mt.costTime;
//run_time[n] = double(duration.count()) * microseconds::period::num / microseconds::period::den;
//cout<<"node "<<n+1<<" complish. Cost: "<<total_cost[n]<<" Time: "<<run_time[n]<<"us"<<endl;
}
void save_result(int a)
{
stringstream ss;
ss << a+1;
string s1 = ss.str();
string path = "solutions3/p"+s1+".txt";
fstream file(path.c_str(),ios::in | ios::out | ios::trunc);
if(!file)
{
cout<<"open "<<path<<" Error!"<<endl;
return;
}
file<<total_cost[a]<<endl;
for(int i=0;i<fac_num;i++)
file<<(fac_to_user[i].size()==0?0:1)<<" ";
file<<endl;
for(int i=0;i<user_num;i++)
file<<user_choose[i]<<" ";
file<<endl;
file.close();
}
void save_all_node(){
fstream file("solutions3/result.txt",ios::in | ios::out | ios::trunc);
if(!file){
cout<<"Error!"<<endl;
return;
}
file<<" "<<" Cost"<<" Time(us)"<<endl;
for(int i=0;i<71;i++){
stringstream ss;
ss << i+1;
string s1 = ss.str();
file<<"p"<<s1<<" "<<total_cost[i]<<" "<<run_time[i]<<endl;
}
file.close();
}
void save(int a){
stringstream ss;
ss << a+1;
string s1 = ss.str();
string path = "solutions3/blog.txt";
fstream file(path.c_str(), ios::out | ios::app);
if(!file)
{
cout<<"open "<<path<<" Error!"<<endl;
return;
}
file<<"p"<<s1<<endl;
file<<total_cost[a]<<endl;
for(int i=0;i<fac_num;i++)
file<<(fac_to_user[i].size()==0?0:1)<<" ";
file<<endl;
for(int i=0;i<user_num;i++)
file<<user_choose[i]<<" ";
file<<endl<<endl;
file.close();
}
//模拟退火算法
void tuihuo(int a){
//首先建立临时变量,退火中的修改在临时变量上进行
int temp_total_cost = total_cost[a];
vector<int> temp_fac_capa(fac_capa);
vector<int> temp_user_choose(user_choose);
vector<vector<int> > temp_fac_to_user;
for(int i=0;i<fac_to_user.size();i++){
vector<int> t(fac_to_user[i]);
temp_fac_to_user.push_back(t);
}
//退火初始温度变更
T = temp_total_cost;
int num = 0;
MyTimer mt;
mt.Start();
cout<<T<<endl;
//开始退火
while(T>T_min){
//随机选取一个用户使他的工厂发生变化
//保证该用户跳转到一个可以容纳他的工厂
num++;
int flag = 0;
int change_user = 0;
srand((unsigned)time(NULL));
while(flag==0){
change_user = rand()%user_num;
for(int i=0;i<fac_num;i++){
if(temp_fac_capa[i]>=user_need[change_user])
flag = 1;
}
}
//cout<<"Change user "<<change_user<<endl;
int change_fac = temp_user_choose[change_user];
while(change_fac==temp_user_choose[change_user])
{
int temp = rand()%fac_num;
if(temp_fac_capa[temp]>=user_need[change_user])
change_fac = temp;
}
//计算跳转之后的新费用
int new_cost = temp_total_cost;
if(temp_fac_to_user[temp_user_choose[change_user]].size()==1) new_cost -= fac_cost[temp_user_choose[change_user]];
if(temp_fac_to_user[change_fac].size()==0) new_cost += fac_cost[change_fac];
new_cost -= user_cost[change_user][temp_user_choose[change_user]];
new_cost += user_cost[change_user][change_fac];
int dE = temp_total_cost - new_cost;
//如果新费用是当前全局最优的,则更新最优解
if(new_cost < total_cost[a]){
//如果找到了更优的解则在全局上进行更新
fac_capa.clear();
user_choose.clear();
fac_to_user.clear();
total_cost[a] = new_cost;
for(int i=0;i<temp_fac_capa.size();i++)
fac_capa.push_back(temp_fac_capa[i]);
for(int i=0;i<temp_user_choose.size();i++)
user_choose.push_back(temp_user_choose[i]);
for(int i=0;i<temp_fac_to_user.size();i++){
vector<int> t(temp_fac_to_user[i]);
fac_to_user.push_back(t);
//cout<<"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl;
}
}
//在临时变量上进行更新,若是较优解,则直接接受
if(dE>=0){
int temp = temp_user_choose[change_user];
temp_user_choose[change_user] = change_fac;
vector<int>::iterator itr = find(temp_fac_to_user[temp].begin(),temp_fac_to_user[temp].end(),change_user);
temp_fac_to_user[temp].erase(itr);
temp_fac_to_user[change_fac].push_back(change_user);
temp_total_cost = new_cost;
}
else{//否则概率性接受
srand((unsigned int)time(NULL));
if(exp(dE/T)>(double)rand() / RAND_MAX){
int temp = temp_user_choose[change_user];
temp_user_choose[change_user] = change_fac;
vector<int>::iterator itr = find(temp_fac_to_user[temp].begin(),temp_fac_to_user[temp].end(),change_user);
temp_fac_to_user[temp].erase(itr);
temp_fac_to_user[change_fac].push_back(change_user);
temp_total_cost = new_cost;
}
}
T = r*T;//更新温度
}
mt.End();
cout<<T<<" "<<num<<endl;
run_time[a]=mt.costTime;
cout<<"node "<<a+1<<" complish. Cost: "<<total_cost[a]<<" Time: "<<run_time[a]<<"us"<<endl;
}
int main()
{
for(int a=0;a<71;a++){
stringstream ss;
ss << a+1;
string s1 = ss.str();
string path = "Instances/p"+s1;
load_model(path);
solution1(a);
//tuihuo(a);
//save_result(a);
//save(a);
clear_vector();
//cout<<"clear"<<endl;
}
int ddd = 0;
for(int i=0;i<71;i++)
ddd+=total_cost[i];
cout<<ddd<<endl;
//save_all_node();
return 0;
}
结果:
Cost | Time(us) | |
p1 | 10922 | 66626 |
p2 | 8536 | 71188 |
p3 | 11572 | 162163 |
p4 | 12971 | 77304 |
p5 | 11018 | 88271 |
p6 | 8081 | 62222 |
p7 | 11533 | 76844 |
p8 | 14633 | 139948 |
p9 | 8663 | 69688 |
p10 | 7746 | 65339 |
p11 | 9429 | 75489 |
p12 | 10829 | 71252 |
p13 | 9338 | 96620 |
p14 | 7888 | 130948 |
p15 | 9965 | 114753 |
p16 | 13129 | 95639 |
p17 | 9338 | 93643 |
p18 | 7888 | 100363 |
p19 | 9965 | 116626 |
p20 | 13962 | 94611 |
p21 | 9150 | 94276 |
p22 | 7768 | 88411 |
p23 | 9777 | 93858 |
p24 | 11418 | 151943 |
p25 | 13141 | 131994 |
p26 | 12524 | 135791 |
p27 | 14890 | 252500 |
p28 | 18878 | 124553 |
p29 | 21139 | 169317 |
p30 | 16086 | 125272 |
p31 | 21370 | 118990 |
p32 | 24064 | 140110 |
p33 | 14763 | 120597 |
p34 | 12443 | 118697 |
p35 | 16341 | 126559 |
p36 | 17941 | 136427 |
p37 | 11757 | 120002 |
p38 | 11374 | 144648 |
p39 | 13048 | 118922 |
p40 | 14448 | 115868 |
p41 | 7069 | 60079 |
p42 | 6517 | 107561 |
p43 | 6135 | 127865 |
p44 | 9367 | 1145627 |
p45 | 7261 | 106374 |
p46 | 7104 | 145937 |
p47 | 10133 | 98948 |
p48 | 8622 | 103424 |
p49 | 7672 | 116988 |
p50 | 10027 | 70250 |
p51 | 7870 | 113842 |
p52 | 9865 | 82588 |
p53 | 12282 | 92919 |
p54 | 12189 | 65950 |
p55 | 12317 | 94447 |
p56 | 26851 | 143780 |
p57 | 36349 | 131670 |
p58 | 63497 | 155433 |
p59 | 45004 | 119508 |
p60 | 23018 | 111365 |
p61 | 28198 | 135507 |
p62 | 42618 | 111808 |
p63 | 32752 | 111601 |
p64 | 22589 | 129680 |
p65 | 27358 | 125009 |
p66 | 37339 | 125157 |
p67 | 32121 | 146264 |
p68 | 23367 | 109997 |
p69 | 29113 | 117123 |
p70 | 45271 | 173313 |
p71 | 34119 | 120981 |
p1
10922
1 1 1 1 1 0 1 0 1 1
8 8 1 6 1 8 2 4 4 1 9 0 0 2 0 0 4 0 9 4 1 4 6 4 2 6 0 6 0 1 2 6 0 0 9 4 4 2 2 4 2 8 2 6 4 2 9 2 4 3
p2
8536
1 1 1 1 1 1 1 1 1 1
8 8 1 6 1 8 2 4 4 1 9 0 0 2 0 0 4 0 9 7 1 4 6 4 2 6 3 5 0 5 2 6 0 3 9 4 4 3 0 4 3 8 3 5 7 0 4 3 4 3
p3
11572
1 1 1 1 1 0 1 0 1 1
8 8 1 6 1 8 2 4 4 1 9 0 0 2 0 0 4 0 9 4 1 4 6 4 2 6 0 6 0 1 2 6 0 0 9 4 4 2 2 4 2 8 2 6 4 2 9 2 4 3
p4
12971
1 1 1 0 1 0 1 0 1 1
8 8 1 6 1 8 2 4 4 1 9 0 0 2 0 0 4 0 9 4 1 4 6 4 2 6 0 6 0 1 2 6 0 0 9 4 4 2 2 4 2 8 2 6 4 2 9 2 4 6
p5
11018
1 1 1 1 1 0 1 0 1 1
8 8 1 6 1 8 2 4 4 1 9 8 0 2 8 0 4 0 9 4 1 8 6 4 2 6 1 1 0 1 2 6 0 0 9 4 2 0 9 4 6 8 1 9 2 3 3 3 9 3
p6
8081
1 1 1 1 1 1 1 1 1 1
8 8 1 6 1 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 8 6 4 2 6 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
11533
1 1 1 1 1 0 1 0 1 1
8 8 1 6 1 8 2 4 4 1 9 8 3 2 8 3 4 8 9 4 3 4 6 4 2 6 1 1 3 1 2 6 3 3 9 9 2 3 1 4 6 3 1 9 4 0 0 0 0 0
p8
14633
0 1 1 1 1 0 1 1 1 1
8 8 1 6 1 8 2 4 4 1 9 8 3 2 8 3 4 8 9 4 3 4 6 4 2 6 1 1 3 1 2 6 3 3 9 9 2 3 1 4 6 3 1 9 4 9 7 6 7 7
p9
8663
1 1 1 0 1 0 1 0 1 1
8 8 1 6 1 8 2 4 4 1 9 8 0 2 8 0 4 0 9 4 1 8 6 4 2 6 1 1 0 1 2 6 0 0 9 4 4 0 0 4 1 8 1 6 4 0 4 0 2 8
p10
7746
1 1 1 1 1 1 1 1 1 1
8 8 1 6 1 8 2 4 4 1 9 8 3 2 8 3 4 0 9 7 3 8 6 4 2 6 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
9429
0 1 1 1 1 0 1 0 1 1
8 8 1 6 1 8 2 4 4 1 9 8 3 2 8 3 4 8 9 4 3 8 6 4 2 6 1 1 8 1 2 6 3 3 9 4 4 3 8 4 1 8 1 6 4 3 4 3 2 3
p12
10829
0 1 1 1 1 0 1 0 1 1
8 8 1 6 1 8 2 4 4 1 9 8 3 2 8 3 4 8 9 4 3 8 6 4 2 6 1 1 8 1 2 6 3 3 9 4 4 3 8 4 1 8 1 6 4 3 4 3 2 3
p13
9338
0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0
16 12 10 10 1 18 17 18 12 17 15 4 1 10 13 12 15 10 4 9 12 15 15 13 9 17 16 17 1 17 13 15 13 16 1 10 17 1 1 13 10 16 15 16 9 13 12 9 4 9
p14
7888
0 1 0 0 1 0 0 0 0 1 1 0 1 1 1 1 1 1 1 1
16 12 10 10 1 18 17 13 14 17 15 4 1 10 13 12 15 10 4 9 12 15 15 19 9 17 16 17 1 17 13 15 13 16 1 10 17 19 19 13 10 16 15 16 9 13 14 14 19 9
p15
9965
0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0
16 12 10 10 1 18 17 18 12 17 15 4 1 10 13 12 15 10 4 9 12 15 15 13 9 17 16 17 1 17 13 15 13 16 1 10 17 1 1 13 10 16 15 16 9 13 12 9 4 9
p16
13129
0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 1 1
16 12 10 10 1 18 17 18 12 17 16 1 1 10 18 12 18 10 17 9 12 18 18 1 9 17 16 17 1 17 18 10 18 16 1 10 12 12 19 19 9 16 16 10 9 19 19 9 19 19
p17
9338
0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0
16 12 10 10 1 18 17 18 12 17 15 4 1 10 13 12 15 10 4 9 12 15 15 13 9 17 16 17 1 17 13 15 13 16 1 10 17 1 1 13 10 16 15 16 9 13 12 9 4 9
p18
7888
0 1 0 0 1 0 0 0 0 1 1 0 1 1 1 1 1 1 1 1
16 12 10 10 1 18 17 13 14 17 15 4 1 10 13 12 15 10 4 9 12 15 15 19 9 17 16 17 1 17 13 15 13 16 1 10 17 19 19 13 10 16 15 16 9 13 14 14 19 9
p19
9965
0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0
16 12 10 10 1 18 17 18 12 17 15 4 1 10 13 12 15 10 4 9 12 15 15 13 9 17 16 17 1 17 13 15 13 16 1 10 17 1 1 13 10 16 15 16 9 13 12 9 4 9
p20
13962
0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 1 1
16 12 10 10 1 18 17 18 12 17 16 1 1 10 18 12 18 10 17 9 12 18 18 1 9 17 16 17 1 17 1 10 18 16 1 10 1 12 12 12 9 16 16 9 9 12 9 9 19 19
p21
9150
0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0
16 12 10 10 1 18 17 18 12 17 15 4 1 10 13 12 15 10 4 9 12 15 15 13 9 17 16 17 1 17 13 15 13 16 1 10 17 1 1 13 10 16 15 16 9 13 12 10 4 9
p22
7768
0 1 0 0 1 0 0 0 0 1 1 0 1 1 1 1 1 1 1 1
16 12 10 10 1 18 17 13 14 17 15 4 1 10 13 12 15 10 4 9 12 15 15 19 9 17 16 17 1 17 13 15 13 16 1 10 17 19 19 13 10 16 15 16 9 13 14 10 19 9
p23
9777
0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0
16 12 10 10 1 18 17 18 12 17 15 4 1 10 13 12 15 10 4 9 12 15 15 13 9 17 16 17 1 17 13 15 13 16 1 10 17 1 1 13 10 16 15 16 9 13 12 10 4 9
p24
11418
0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0
16 12 10 10 1 18 17 18 12 17 16 1 1 10 18 12 18 10 17 9 12 18 18 1 9 17 16 17 1 17 18 10 18 16 1 10 17 1 1 12 10 16 16 16 9 12 12 10 1 9
p25
13141
1 0 1 0 0 1 0 0 0 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 2 17 24 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 24 5 24 5 11 20 11 20 20 24 24 11 14 17 14 24 14 24 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 24 17 5 24 20 20 11 11 24 20 24 20 14 24 20 11 20 0 2 0 2 0 20 5 2 24 0 11 0 5 2 2 11 20 20 0 14 11 14 5 0 11 14 14 14 14 0 11 11 11 24 24 24 24 5 20 11 20 20 0 5 24 0 5 0 11 24 5 20 14 0 5 20 0 0 14 14 14 0 11 11 5 0 24
p26
12524
1 0 1 0 0 1 0 0 1 1 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 9 2 17 9 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 24 5 24 5 11 20 11 20 20 24 24 11 14 17 14 24 14 24 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 9 17 5 9 20 20 11 11 24 20 9 20 14 24 20 11 20 0 2 0 2 0 20 5 2 24 0 11 0 5 2 2 11 20 20 0 14 11 14 5 0 11 14 14 14 14 0 11 11 11 24 24 24 24 5 20 11 20 20 0 5 9 0 5 0 11 24 5 20 14 0 5 20 0 0 14 14 14 8 11 11 5 0 24
p27
14890
1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
20 11 20 2 20 5 2 9 2 17 9 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 5 5 9 5 11 20 11 20 20 5 9 11 14 17 14 9 14 5 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 9 17 5 9 20 20 11 11 9 20 9 20 14 9 20 11 20 0 2 0 2 0 20 5 2 9 0 11 0 5 2 2 11 20 20 0 14 11 14 5 0 11 14 14 14 14 0 11 11 11 5 9 5 5 5 20 11 20 20 0 11 9 0 11 0 11 9 9 20 14 0 11 20 0 0 14 14 14 0 11 11 0 0 0
p28
18878
1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
20 11 20 2 20 5 2 9 2 17 9 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 5 5 9 5 11 20 11 20 20 5 9 11 14 17 14 9 14 5 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 9 17 5 9 20 20 11 11 9 20 9 20 14 9 20 11 20 11 2 11 2 11 20 5 2 9 2 11 2 5 14 2 11 20 20 11 14 11 14 5 11 11 14 14 14 14 14 11 11 11 5 9 5 5 5 20 11 20 20 11 9 9 14 9 0 0 9 9 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0
p29
21139
1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0
20 11 20 2 20 5 2 24 2 17 24 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 24 5 24 5 11 20 11 20 20 24 24 11 14 17 14 24 14 24 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 24 17 5 24 14 6 11 17 24 14 24 14 14 24 6 17 6 17 17 17 2 11 2 5 2 24 2 11 2 5 2 2 11 6 2 2 2 5 5 5 5 5 28 28 0 28 0 0 0 0 0 15 0 0 0 28 0 28 28 0 0 15 0 0 0 4 15 4 28 28 4 4 28 7 11 28 28 7 28 7 7 7 7 7
p30
16086
1 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0
20 11 20 2 20 5 2 9 2 17 9 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 24 5 24 5 11 20 11 20 20 24 24 11 14 17 14 24 14 24 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 9 17 5 9 14 14 11 17 24 14 9 8 2 24 8 17 8 17 17 17 2 11 8 5 2 24 2 11 2 5 2 2 11 8 8 2 2 5 19 5 19 5 8 8 0 2 0 0 0 0 24 24 24 24 5 8 5 8 8 0 0 9 0 0 0 0 9 9 8 8 0 0 8 0 0 8 8 19 19 0 5 25 19 25
p31
21370
1 0 1 0 0 1 0 1 1 1 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 9 2 17 9 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 5 5 9 5 11 20 11 20 20 5 9 11 14 17 14 9 14 5 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 9 17 5 9 14 14 11 17 9 14 9 8 2 9 8 17 8 17 17 17 2 11 8 5 2 9 2 11 2 5 2 2 11 8 8 2 2 5 8 5 8 0 8 8 0 2 0 0 0 0 0 9 0 0 0 8 0 8 8 0 0 9 0 8 0 8 24 24 8 7 7 24 7 7 11 7 7 7 7 5 7 24 7 24
p32
24064
1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0
20 11 20 2 20 5 2 9 2 17 9 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 5 5 9 5 11 20 11 20 20 5 9 11 14 17 14 9 14 5 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 9 17 5 9 14 14 11 17 9 14 9 17 2 9 2 17 2 17 17 17 2 11 2 5 2 9 2 11 2 5 2 11 5 9 5 7 7 11 7 7 7 7 7 7 7 2 7 7 7 7 9 9 7 24 7 24 24 13 13 24 24 24 24 24 0 0 24 24 13 0 0 24 13 0 0 13 13 0 0 0 0 0 0 24
p33
14763
1 0 1 0 0 1 0 0 0 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 2 17 24 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 24 5 24 5 11 20 11 20 20 24 24 11 14 17 14 24 14 24 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 24 17 5 24 20 20 11 17 24 20 24 20 14 24 14 17 14 17 17 17 17 17 20 5 2 24 17 11 17 5 2 2 11 14 14 17 14 11 2 5 11 11 14 14 2 14 2 11 11 11 24 24 24 24 5 2 11 14 2 11 5 5 2 5 0 0 24 5 2 2 0 5 2 0 0 2 2 0 0 0 0 5 0 0
p34
12443
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 20 2 20 5 2 9 2 17 9 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 24 5 24 5 11 20 11 20 20 24 24 11 14 17 14 24 14 24 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 9 17 5 9 20 20 11 17 24 20 9 20 14 24 13 17 13 17 17 17 17 17 20 5 2 24 17 11 17 5 2 2 11 13 13 17 14 11 2 5 11 11 14 14 14 14 2 11 11 11 24 24 24 24 5 13 11 13 13 11 5 9 2 5 0 0 24 5 14 14 0 5 13 0 0 14 13 2 8 0 0 5 2 5
p35
16341
1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
20 11 20 2 20 5 2 9 2 17 9 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 5 5 9 5 11 20 11 20 20 5 9 11 14 17 14 9 14 5 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 9 17 5 9 20 20 11 17 9 20 9 20 14 9 14 17 14 17 17 17 17 17 20 5 2 9 17 11 17 5 2 2 11 14 14 17 14 11 2 5 11 11 14 14 2 14 2 11 11 11 5 9 5 5 5 2 11 14 2 11 5 9 2 9 0 0 5 9 2 2 0 0 2 0 0 2 2 0 0 0 0 0 0 0
p36
17941
1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
20 11 20 2 20 5 2 9 2 17 9 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 5 5 9 5 11 20 11 20 20 5 9 11 14 17 14 9 14 5 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 9 17 5 9 20 20 11 17 9 20 9 20 14 9 14 17 14 17 17 17 17 17 20 5 2 9 17 11 17 5 2 2 11 14 14 17 14 11 2 5 11 11 14 14 2 14 2 11 11 11 5 9 5 5 5 2 11 14 2 11 5 9 2 9 0 0 5 9 2 2 0 0 2 0 0 2 2 0 0 0 0 0 0 0
p37
11757
0 0 1 0 0 1 0 0 0 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 2 17 24 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 24 5 24 5 11 20 11 20 20 24 24 11 14 17 14 24 14 24 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 24 17 5 24 20 20 11 17 24 20 24 20 14 24 20 17 20 17 17 17 17 17 20 5 2 24 17 11 17 5 2 2 11 20 20 17 17 11 2 5 17 11 14 14 14 14 2 11 11 11 24 24 24 24 5 20 11 20 20 11 5 24 11 5 17 11 24 5 20 14 17 5 20 17 17 20 14 14 14 11 11 5 2 5
p38
11374
0 0 1 0 0 1 0 0 0 1 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 9 2 17 9 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 24 5 24 5 11 20 11 20 20 24 24 11 14 17 14 24 14 24 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 9 17 5 9 20 20 11 17 24 20 9 20 14 24 20 17 20 17 17 17 17 17 20 5 2 24 17 11 17 5 2 2 11 20 20 17 17 11 2 5 17 11 14 14 14 14 2 11 11 11 24 24 24 24 5 20 11 20 20 11 5 9 11 5 17 11 24 5 20 14 17 5 20 17 17 20 14 14 14 11 11 5 2 5
p39
13048
0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
20 11 20 2 20 5 2 9 2 17 9 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 5 5 9 5 11 20 11 20 20 5 9 11 14 17 14 9 14 5 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 9 17 5 9 20 20 11 17 9 20 9 20 14 9 20 17 20 17 17 17 17 17 20 5 2 9 17 11 17 5 2 2 11 20 20 17 17 11 2 5 17 11 14 14 14 14 2 11 11 11 5 9 5 5 5 20 11 20 20 11 5 9 11 5 17 11 5 5 20 14 17 5 20 17 17 20 14 14 14 11 11 5 2 5
p40
14448
0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
20 11 20 2 20 5 2 9 2 17 9 20 20 20 17 14 14 17 5 11 2 17 5 17 5 20 2 5 5 9 5 11 20 11 20 20 5 9 11 14 17 14 9 14 5 14 17 20 11 14 5 14 14 5 20 20 17 11 11 14 17 5 20 11 11 11 9 17 5 9 20 20 11 17 9 20 9 20 14 9 20 17 20 17 17 17 17 17 20 5 2 9 17 11 17 5 2 2 11 20 20 17 17 11 2 5 17 11 14 14 14 14 2 11 11 11 5 9 5 5 5 20 11 20 20 11 5 9 11 5 17 11 5 5 20 14 17 5 20 17 17 20 14 14 14 11 11 5 2 5
p41
7069
0 0 0 0 1 1 1 1 1 1
5 6 4 6 7 9 7 7 8 8 4 9 9 6 9 7 7 8 8 6 6 6 4 4 6 5 5 4 8 5 8 4 4 4 7 9 9 6 6 9 9 7 7 7 7 5 5 5 6 4 4 6 6 6 7 7 9 5 8 5 4 5 6 5 4 6 6 6 4 4 4 4 4 4 7 7 7 7 6 5 7 9 7 7 7 7 6 7 7 7
p42
6517
0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 0 1 0
12 10 11 9 15 18 16 13 16 16 11 18 10 10 15 15 15 13 10 10 9 11 9 11 12 12 11 16 16 13 16 18 15 18 10 10 10 15 15 16 16 12 13 16 9 9 18 18 15 15 16 16 16 13 13 9 12 10 10 10 11 11 11 11 11 13 16 15 15 15 10 18 15 18 18 18 18 18 18 18
p43
6135
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0
18 19 15 24 25 22 25 19 1 24 24 1 25 22 18 18 15 15 18 19 25 25 22 22 22 25 1 18 1 18 24 24 24 25 19 22 25 1 15 18 18 1 1 24 24 25 25 22 22 15 19 25 25 18 18 18 19 22 25 24 24 18 24 24 1 24 24 24 24 24
p44
9367
1 1 1 1 1 0 1 0 1 0
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 1 1 1 1 1 8 8 8 8 8 8 2 2 2 2 3 3 3 3 3 3 3 3 3 4 4 8 2 2 2 0 0 3 2 4 6 4 3 8 1 6 6 2 3 4 4 3 3 4 6 6 2 6 4 4 3 3 6 6 2 6 6 4 2 4 3 2 3 2 3 6 4 6 4
p45
7261
1 1 1 0 1 1 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 1 1 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 4 2 1 5 0 2 6 5 2 2 4 0 6 5 5 6 2 2 2 2 6 2 6 2 2 4 2 6 6 4 6 4 5 4 4 4 6 6
p46
7104
1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
10 0 10 10 10 0 10 1 1 1 1 1 1 11 11 2 2 2 2 2 2 5 5 5 5 5 5 8 8 8 8 8 10 10 10 2 2 5 2 1 0 2 2 0 5 2 2 5 0 0 0 5 5 11 2 0 0 11 2 2 2 11 10 0 5 5 5 5 11 11
p47
10133
1 1 1 0 1 0 1 0 1 1
0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 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 9 9 9 9 4 9 9 9 8 8 8 8 8 6 6 6 6 6 6 6 6 6 6
p48
8622
1 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 0 0 0 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 8 8 8 8 8 8 8 8 10 10 10 10 10 10 10 10 8 10 10 10 10 10 10 10 10 2 2 14 14 14 14 14 14 2 14 2 2 14 2 2 2 1 1 1 1 1
p49
7672
1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 3 3 3 3 3 1 1 0 0 0 0 0 0 0 9 9 9 9 9 9 12 12 12 12 12 12 12 0 16 16 16 16 16 16 16 16 16 0 16 16 21 16 21 16 3 21 21 21 21 21 21 3 0 3 3 3 3 3 3 3 3 3
p50
10027
1 0 0 1 0 1 1 1 0 1
3 6 3 0 9 9 5 5 3 7 7 0 9 9 9 9 9 5 5 3 0 0 0 0 0 0 7 3 3 7 7 7 3 3 3 5 9 5 0 6 0 9 9 5 5 5 5 5 5 3 3 5 6 0 0 0 6 6 5 5 5 7 7 7 3 3 6 3 7 7 3 6 6 6 6 3 3 3 3 3 3 7 7 5 6 6 6 7 7 7 5 6 6 6 7 6 7 7 7 7
p51
7870
0 0 0 0 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1
15 6 19 10 12 12 5 16 15 5 5 19 6 13 6 13 12 16 5 15 10 10 10 19 10 10 15 19 19 15 5 15 19 19 15 5 13 13 10 10 10 13 13 13 16 5 5 5 5 15 15 5 10 10 10 10 6 6 13 12 13 5 5 5 15 15 10 19 15 15 15 10 10 10 10 19 19 19 19 19 19 5 16 12 13 13 6 5 12 5 13 13 13 12 6 13 6 12 12 6
p52
9856
0 0 0 1 1 1 1 1 1 1
7 7 7 7 7 7 7 7 3 3 3 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 7 5 3 3 3 4 6 5 5 5 3 5 5 6 4 7 6 6 4 3 3 5 3 4 7 5 6 3 3 5 5 3 3 7 3 4 5 6 6 7 5 7 4 4 4 7
p53
12282
0 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 0 1 0
5 5 5 5 5 5 5 5 1 1 1 7 7 7 7 7 7 12 12 12 12 13 13 12 13 9 9 9 9 9 9 9 9 13 5 5 5 18 18 18 18 18 18 18 5 7 7 12 13 13 13 1 7 18 7 13 1 13 7 7 18 12 13 13 7 7 13 18 7 18 18 18 7 7 7 7 7 7 7 18 18 7 7 18 13 7 7 18 18 7 18 18 18 18 18 18 18 18 18 5
p54
12189
1 1 1 1 0 0 1 1 0 1
9 9 7 7 7 7 7 7 7 7 7 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 6 6 6 6 6 6 6 6 6 6 6 6 6 3 9 9 9 0 0 0 0 0 9 0 0 0 0 0 9 7 7 7 7 7 7 7 7 7 7 7 7 2 7 7 7 1 7 1
p55
12317
0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1 0 0
17 17 16 17 16 17 16 16 17 8 8 8 8 8 2 2 2 2 8 2 2 2 2 2 2 2 2 2 2 2 14 14 14 14 14 2 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 9 9 9 9 9 17 7 7 7 7 7 7 17 17 17 17 17 17 17 17 17 17 17 17 8 16 8 2 16 16 2
p56
26851
0 1 1 0 1 1 0 0 0 1 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 27 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 12 20 20 24 16 18 9 12 4 20 19 13 21 19 20 24 16 24 16 20 12 18 9 18 18 29 2 18 20 13 12 5 19 28 12 18 12 19 9 5 13 20 5 20 16 10 5 9 12 29 13 19 5 27 18 28 19 18 12 2 13 28 12 2 28 28 15 12 27 4 24 4 24 22 13 19 4 27 12 28 20 28 18 28 20 9 12 28 19 9 16 2 28 4 10 28 24 27 20 1 9 1 13 19 10 4 22 27 27 27 5 24 15 27 27 24 10 10 24 20 24 2 15 13 13 13 22 10 2 5 22 5 4 1 21 1 10 28 10 4 2 2 10 29 10 5 21 21 4 4 9 22 13 2 21 21 21 29 29 22 29 22 15 13 9
p57
36349
0 1 1 0 1 1 0 0 0 0 0 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 27 18 16 5 24 20 18 27 19 4 2 19 19 4 16 27 12 20 20 24 16 18 20 12 4 20 19 13 21 19 20 24 16 24 16 20 12 18 20 18 18 4 2 18 20 13 12 5 19 28 12 18 12 19 20 5 13 20 5 20 16 13 5 20 12 4 13 19 5 27 18 28 19 18 12 2 13 28 12 2 28 28 15 12 27 4 24 4 24 22 13 19 4 27 12 28 13 28 18 28 13 19 12 28 4 4 16 2 28 4 2 28 24 27 13 1 13 1 1 19 13 4 22 27 27 27 5 24 15 27 27 24 2 5 24 1 24 2 15 20 1 1 22 5 2 5 22 5 1 1 21 1 1 28 5 21 21 21 21 29 21 2 21 21 29 29 29 22 1 21 21 21 16 29 29 22 29 22 15 16 29
p58
63497
1 1 1 0 1 1 1 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 1 0 0 0 1 0 0
18 19 21 27 2 12 15 27 22 27 4 19 13 1 19 18 1 13 22 27 18 21 2 2 13 18 27 19 4 2 19 19 4 21 27 12 13 13 27 15 18 13 12 4 13 19 13 21 19 19 27 22 2 21 13 12 18 4 18 18 4 2 18 13 13 12 2 19 19 12 18 12 19 13 13 13 1 2 1 22 1 2 19 12 4 1 4 2 27 18 27 4 18 12 21 1 27 12 27 12 12 15 27 27 4 27 4 21 22 13 4 4 22 4 4 1 22 18 21 1 1 12 21 1 1 21 21 22 21 21 22 21 22 15 15 15 15 15 22 15 22 22 15 15 15 5 5 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 23 23 23 23 23 23 23 23 16 16 23 16 16 16 16 16 16 16 16 16 16 16 6 6 16 6 6
p59
45004
0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 1 0 1 1 1
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 13 22 27 18 21 2 24 13 18 27 19 29 2 19 19 4 21 27 12 13 13 24 15 18 13 12 4 13 19 13 21 19 19 24 24 24 21 13 12 18 4 18 18 29 2 18 13 13 12 2 19 28 12 18 12 19 13 13 13 1 2 1 24 1 2 19 12 29 1 19 2 27 18 28 19 18 12 2 1 28 12 2 28 28 15 12 27 4 24 4 24 22 13 19 4 27 12 28 1 28 18 28 1 4 12 28 4 4 21 21 28 4 24 28 24 27 1 1 4 1 21 27 2 27 22 27 27 27 21 24 15 22 22 24 21 21 21 29 22 21 15 28 21 21 22 15 15 21 22 15 29 15 21 15 29 27 29 29 22 29 29 29 23 23 23 23 29 23 23 23 23 23 23 24 22 23 23 25 25 25 23 25 23
p60
23018
0 1 1 0 1 1 0 0 0 1 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 27 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 12 20 20 24 16 18 9 12 4 20 19 13 21 19 20 24 16 24 16 20 12 18 9 18 18 29 2 18 20 13 12 5 19 28 12 18 12 19 9 5 13 20 5 20 16 10 5 9 12 29 13 19 5 27 18 28 19 18 12 2 13 28 12 2 28 28 15 12 18 4 24 4 24 22 13 19 4 27 12 12 20 28 18 28 20 9 12 28 19 9 16 2 12 19 28 28 24 12 20 1 9 1 13 28 10 12 22 12 12 18 5 24 15 27 18 24 28 10 28 20 28 2 15 13 13 13 27 10 24 5 27 5 4 1 21 1 20 19 10 4 2 24 10 29 10 5 21 2 19 28 9 28 10 27 21 2 21 19 4 18 19 18 15 10 19
p61
28198
0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 27 18 16 5 24 20 18 27 19 4 2 19 19 4 16 27 12 20 20 24 16 18 20 12 4 20 19 13 21 19 20 24 16 24 16 20 12 18 20 18 18 4 2 18 20 13 12 5 19 28 12 18 12 19 20 5 13 20 5 20 16 13 5 20 12 4 13 19 5 27 18 28 19 18 12 2 13 28 12 2 28 28 15 12 18 4 24 4 24 22 13 19 4 27 12 12 20 28 18 28 20 20 12 28 19 4 16 2 12 19 28 28 24 12 20 1 20 1 13 28 13 12 22 12 12 18 5 24 15 27 18 24 28 5 28 20 28 2 15 13 13 13 27 13 24 5 27 5 4 1 21 1 13 19 19 4 2 24 13 4 13 5 21 2 19 28 13 28 13 27 21 2 21 19 4 18 19 18 15 13 19
p62
42618
0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0
18 19 21 27 2 12 15 27 22 27 4 19 13 1 19 18 1 13 22 27 18 21 2 2 13 18 27 19 4 2 19 19 4 21 27 12 13 13 27 15 18 13 12 4 13 19 13 21 19 19 27 22 2 21 13 12 18 4 18 18 4 2 18 13 13 12 2 19 19 12 18 12 19 13 13 13 13 2 13 22 13 2 19 12 4 13 19 2 27 18 27 19 18 12 2 13 27 12 2 19 19 15 12 18 4 2 4 27 22 13 19 4 27 12 12 13 27 18 19 1 19 12 27 4 4 21 2 12 4 2 27 21 12 1 1 4 1 1 27 2 12 22 12 12 18 21 27 15 27 18 27 21 1 21 1 18 21 15 13 1 1 18 1 21 1 22 1 4 1 21 1 1 19 4 4 21 21 1 4 1 21 21 21 12 22 21 22 21 21 21 15 15 18 22 22 22 22 15 15 22
p63
32752
0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 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 13 22 27 18 21 2 24 13 18 27 19 29 2 19 19 4 21 27 12 13 13 24 15 18 13 12 4 13 19 13 21 19 19 24 24 24 21 13 12 18 4 18 18 29 2 18 13 13 12 2 19 28 12 18 12 19 13 13 13 13 2 13 24 13 2 19 12 29 13 19 2 27 18 28 19 18 12 2 13 28 12 2 28 28 15 12 18 4 24 4 24 22 13 19 4 27 12 12 13 28 18 28 1 19 12 28 19 4 21 2 12 19 28 28 24 12 1 1 19 1 1 28 19 12 22 12 12 18 2 24 15 27 18 24 28 1 28 1 28 2 15 13 1 1 27 1 24 2 27 1 4 1 21 1 1 28 28 4 2 24 1 29 1 2 21 2 28 18 4 27 1 27 21 2 21 4 4 18 4 18 15 24 28
p64
22589
0 1 1 0 1 1 0 0 0 1 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 27 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 12 20 20 24 16 18 9 12 4 20 19 13 21 19 20 24 16 24 16 20 12 18 9 18 18 29 2 18 20 13 12 5 19 28 12 18 12 19 9 5 13 20 5 20 16 10 5 9 12 29 13 19 5 27 18 28 19 18 12 2 13 28 12 2 28 28 15 12 18 4 24 4 24 22 13 19 4 27 12 12 20 28 18 28 20 9 12 28 19 9 16 2 12 19 28 28 24 12 20 1 9 1 13 28 10 12 22 12 12 12 5 24 15 27 12 24 28 10 28 20 28 2 15 13 13 13 27 10 24 5 27 5 4 1 21 1 20 19 10 4 2 24 10 29 10 5 21 2 19 12 9 28 10 27 21 2 21 19 4 18 12 18 15 10 19
p65
27358
0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 27 18 16 5 24 20 18 27 19 4 2 19 19 4 16 27 12 20 20 24 16 18 20 12 4 20 19 13 21 19 20 24 16 24 16 20 12 18 20 18 18 4 2 18 20 13 12 5 19 28 12 18 12 19 20 5 13 20 5 20 16 13 5 20 12 4 13 19 5 27 18 28 19 18 12 2 13 28 12 2 28 28 15 12 18 4 24 4 24 22 13 19 4 27 12 12 20 28 18 28 20 20 12 28 19 4 16 2 12 19 28 28 24 12 20 1 20 1 13 28 20 12 22 12 12 12 5 24 15 27 12 24 28 5 28 20 28 2 15 13 13 13 27 20 24 5 27 5 4 1 21 1 20 19 20 4 2 24 20 4 13 5 21 2 19 12 20 28 13 27 21 2 21 19 4 18 12 18 15 13 19
p66
37339
0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0
18 19 21 27 2 12 15 27 22 27 4 19 13 1 19 18 1 13 22 27 18 21 2 2 13 18 27 19 4 2 19 19 4 21 27 12 13 13 27 15 18 13 12 4 13 19 13 21 19 19 27 22 2 21 13 12 18 4 18 18 4 2 18 13 13 12 2 19 19 12 18 12 19 13 13 13 13 2 13 22 13 2 19 12 4 13 19 2 27 18 27 19 18 12 2 13 27 12 2 19 19 15 12 18 4 2 4 27 22 13 19 4 27 12 12 13 27 18 19 13 19 12 19 19 4 21 2 12 19 2 27 21 12 13 1 19 1 13 19 13 12 22 12 12 12 2 27 15 27 12 27 2 13 27 13 12 2 15 13 13 1 27 1 2 2 27 1 4 1 21 1 1 19 4 4 2 27 1 4 1 2 21 21 19 12 1 12 1 27 21 2 21 12 4 18 4 18 15 1 4
p67
32121
0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 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 13 22 27 18 21 2 24 13 18 27 19 29 2 19 19 4 21 27 12 13 13 24 15 18 13 19 4 13 19 13 21 19 19 24 24 24 21 13 12 18 19 18 18 29 2 18 13 13 12 2 19 28 12 18 12 19 13 13 13 13 1 13 24 13 2 4 18 29 13 19 2 27 18 28 19 18 12 2 13 27 12 2 28 28 15 12 18 4 24 4 24 22 13 19 4 27 12 12 13 28 18 28 19 19 28 28 19 4 21 2 12 4 28 28 24 12 1 1 4 1 1 28 1 12 22 28 12 18 2 24 15 27 12 24 28 1 27 1 28 2 15 13 1 1 27 1 24 2 27 2 4 1 21 1 1 19 28 4 2 24 28 29 28 2 21 2 12 12 1 12 1 27 21 2 21 4 4 18 4 18 15 24 4
p68
23367
0 1 1 0 1 1 0 0 0 1 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 27 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 12 20 20 24 16 18 9 12 4 20 19 13 21 19 20 24 16 24 16 20 12 18 9 18 18 29 2 18 20 13 12 5 19 28 12 18 12 19 9 5 13 20 5 20 16 10 5 9 12 29 13 19 5 27 18 28 19 18 12 2 13 28 12 2 28 28 15 12 18 4 24 4 24 22 13 19 4 27 12 12 20 28 18 28 20 9 12 28 19 9 16 2 12 19 28 28 24 12 20 1 9 1 13 28 10 12 22 12 12 12 5 24 15 27 12 24 10 10 24 20 27 2 15 13 13 13 27 10 24 5 27 5 4 1 21 1 20 19 10 4 2 24 10 29 10 5 21 2 19 19 9 19 10 27 21 2 21 19 4 18 4 27 15 10 19
p69
29113
0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 27 18 16 5 24 20 18 27 19 4 2 19 19 4 16 27 12 20 20 24 16 18 20 12 4 20 19 13 21 19 20 24 16 24 16 20 12 18 20 18 18 4 2 18 20 13 12 5 19 28 12 18 12 19 20 5 13 20 5 20 16 13 5 20 12 4 13 19 5 27 18 28 19 18 12 2 13 28 12 2 28 28 15 12 18 4 24 4 24 22 13 19 4 27 12 12 20 28 18 28 20 20 12 28 19 4 16 2 12 19 28 28 24 12 20 1 20 1 13 28 20 12 22 12 12 12 5 24 15 27 12 24 19 5 24 13 27 2 15 13 13 13 27 13 24 5 27 5 4 1 21 1 13 19 19 4 2 24 13 4 13 5 21 2 19 19 13 27 5 27 21 2 21 27 4 18 27 27 15 5 28
p70
45271
0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0
18 19 21 27 2 12 15 27 22 27 4 19 13 1 19 18 1 13 22 27 18 21 2 2 13 18 27 19 4 2 19 19 4 21 27 12 13 13 27 15 18 13 12 4 13 19 13 21 19 19 27 22 2 21 13 12 18 4 18 18 4 2 18 13 13 12 2 19 19 12 18 12 19 13 13 13 13 2 13 22 13 2 19 12 4 1 19 2 27 18 27 19 18 12 2 1 27 12 2 19 19 15 12 18 4 2 4 27 22 13 19 4 27 12 12 1 27 18 19 1 19 12 27 4 4 21 2 12 4 27 27 21 12 1 1 4 1 1 27 1 12 22 12 12 12 2 27 15 27 12 27 27 1 27 1 18 2 15 1 1 1 22 1 21 1 22 1 1 1 21 1 27 18 21 21 21 21 21 22 21 21 21 21 22 22 21 22 21 21 21 21 21 22 22 22 22 22 15 21 21
p71
34119
0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 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 13 22 27 18 21 2 24 13 18 27 19 29 2 19 19 4 21 27 12 13 13 24 15 18 13 12 4 13 19 13 21 19 19 24 24 24 21 13 12 18 4 18 18 29 2 18 13 13 12 2 19 28 12 18 12 19 13 13 13 13 2 13 24 13 2 19 12 29 1 19 2 27 18 28 19 18 12 2 1 28 12 2 28 28 15 12 18 4 24 4 24 22 13 19 4 27 12 12 1 28 18 28 1 19 12 28 19 4 21 2 12 19 28 28 24 12 1 1 19 1 1 28 28 12 22 12 12 12 2 24 15 27 12 24 2 1 24 1 27 2 15 1 1 1 27 1 24 2 27 1 4 1 21 1 1 19 4 4 2 24 1 29 4 21 21 21 4 18 1 27 2 27 21 21 21 4 29 27 29 18 15 21 29
5、两种算法的对比
启发式加模拟退火之后,一个一个一眼看不出什么优化,时间也增加了100倍,但是71种情况的总的cost变为了1163711,比原来的算法减少了差不多20万的cost,平均每种情况降低成本2800.效果还是不错的。
在这里模拟退火算法只是随机得寻找其他情况,看看是不是能够降低成本,感觉有一种碰运气的感觉,因为设计的状态转化方式是随机选取一个用户移动到一个随机的工厂。
然后我测试了不模拟退火,直接启发式贪心,发现总耗费118万多,也就是模拟退火并没有真正降低太多的成本,他只是随机地搜索其他情况看看是不是能找到更好的结果。但是在这个实际问题中效果好像并不明显。
所以如果有足够的时间的话,就选择添加模拟退火寻求更优的解,如果时间是个比较严重的问题的话,那就使用启发式贪心算法。