[算法设计与分析]工厂选址问题

针对工厂与消费者间的供需问题,采用贪心算法与模拟退火算法优化选址与物流成本,实现资源分配最优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

}

 结果:

 CostTime(us)
p1944097
p2812691
p310126 97
p41212698
p5937592
p6

8061

85
p71006191
p81206185
p9904090
p107726118
p119726 107
p1211726 83
p1312032140
p149180141
p1513180141
p1617180141
p1712032142
p189180144
p1913180144
p2017180140
p2112032141
p229180167
p2313180161
p2417180143
p2519197609
p2616131538
p2721531539
p2826931573
p2919305582
p3016239538
p3121639559
p3227039648
p3319055553
p3415989538
p3526789581
p3626789581
p3719055576
p3815989590
p3921389568
p4026789574
p417226157
p429957333
p4312448290
p447585164
p459848311
p4612639292
p476634164
p489044252
p4912420286
p5010062179
p5111351311
p5210364209
p5312470300
p5410351173
p5511970367
p5623882950
p5732882904
p5853882882
p5939121737
p6029882811
p6132882706
p62538821094
p6339121737
p6423882811
p6532882706
p6653882761
p6739671708
p6823882723
p6932882781
p7053882763
p7139121745

 

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;

}

结果:

 CostTime(us)
p11092266626
p2853671188
p311572162163
p41297177304
p51101888271
p6808162222
p71153376844
p814633139948
p9866369688
p10774665339
p11942975489
p121082971252
p13933896620
p147888130948
p159965114753
p161312995639
p17933893643
p187888100363
p199965116626
p201396294611
p21915094276
p22776888411
p23977793858
p2411418151943
p2513141131994
p2612524135791
p2714890252500
p2818878124553
p2921139169317
p3016086125272
p3121370118990
p3224064140110
p3314763120597
p3412443118697
p3516341126559
p3617941136427
p3711757120002
p3811374144648
p3913048118922
p4014448115868
p41706960079
p426517107561
p436135127865
p4493671145627
p457261106374
p467104145937
p471013398948
p488622103424
p497672116988
p501002770250
p517870113842
p52986582588
p531228292919
p541218965950
p551231794447
p5626851143780
p5736349131670
p5863497155433
p5945004119508
p6023018111365
p6128198135507
p6242618111808
p6332752111601
p6422589129680
p6527358125009
p6637339125157
p6732121146264
p6823367109997
p6929113117123
p7045271173313
p7134119120981

 

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万多,也就是模拟退火并没有真正降低太多的成本,他只是随机地搜索其他情况看看是不是能找到更好的结果。但是在这个实际问题中效果好像并不明显。

所以如果有足够的时间的话,就选择添加模拟退火寻求更优的解,如果时间是个比较严重的问题的话,那就使用启发式贪心算法。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值