Capacitated Facility Location Problem

Capacitated Facility Location Problem

Suppose there are n facilities and m customers. We wish to choose:
(1) which of the n facilities to open
(2) the assignment of customers to facilities
The objective is to minimize the sum of the opening cost and the assignment cost.
The total demand assigned to a facility must not exceed its capacity.

There are currently 71 data files. The format of these data files is:
|J| |I|
s_1 f_1
s_2 f_2

s_|J| f_|J|
d_1 d_2 d_3 … d_|I|
c_{11} c_{12} c_{13} … c_{1|I|}
c_{21} c_{22} c_{23} … c_{2|I|}
… … … …
c_{|J|1} c_{|J|2} c_{|J|3} … c_{|J||I|}
where:
|J| is the number of potential facility locations;
|I| is the number of customers;
s_j (j=1,…,|J|) is the capacity of facility j;
f_j (j=1,…,|J|) is the fixed cost of opening facility j;
d_i (i=1,…,|I|) is the demand of customer i;
c_{ji} (j=1,…,|J|), (i=1,…,|I|) is the cost of allocating all the demand of customer i to facility j.

算法如下

//测试文件与结果文件的读写
#ifndef _FILE_H_
#define _FILE_H_

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <string.h>
#include <sstream>
using namespace std;

//字符串分割
vector<string> split(const string& str, const string& delim) {
	vector<string> res;
	if("" == str) return res;
	char * strs = new char[str.length() + 1];
	strcpy(strs, str.c_str()); 
	char * d = new char[delim.length() + 1];
	strcpy(d, delim.c_str());
	char *p = strtok(strs, d);
	while(p) {
		string s = p;
		res.push_back(s);
		p = strtok(NULL, d);
	}
	return res;
}

//测试数据获取
void getData(string path, int &fnum, int &cnum, vector<int> &_capacity, vector<int> &_open_cost, vector<int> &_demand, vector<int> &_ass_cost) {
    ifstream in(path);
    if (!in.is_open()) {
        cout << "open error!" << endl;
    }
    string str;
    getline(in, str);
    vector<string> sv;
    sv = split(str, " ");
    int num[2];
    stringstream ss;
    for (int i = 0; i < 2; i++) {
        ss << sv[i];
        ss >> num[i];
        ss.clear();
    }
    int capacity[num[0]], open_cost[num[0]];
    for (int i = 0; i < num[0]; i++) {
        getline(in, str);
        sv = split(str, " ");
        ss << sv[0];
        ss >> capacity[i];
        _capacity.push_back(capacity[i]);
        ss.clear();
        ss << sv[1];
        ss >> open_cost[i];
        _open_cost.push_back(open_cost[i]);
        ss.clear();
    }
    
    int demand[num[1]], flag = (num[1]+9)/10;
    for (int i = 0; i < flag; i++) {
        getline(in, str);
        int pos;
        if((pos = str.find(".")) != string::npos) {
            sv = split(str, ".");
        }
        else {
            sv = split(str, " "); 
        }

        for (int j = 0; j < sv.size(); j++) {
            ss << sv[j];
            ss >> demand[i*10+j];
            _demand.push_back(demand[i*10+j]);
            ss.clear();
        }
    }

    flag = (num[0]*num[1]+9)/10;
    int ass_cost[num[0]*num[1]];
    for (int i = 0; i < flag; i++) {
        getline(in, str);
        int pos;
        if((pos = str.find(".")) != string::npos) {
            sv = split(str, ".");
        }
        else {
            sv = split(str, " "); 
        }
        for (int j = 0; j < sv.size(); j++) {
            ss << sv[j];
            ss >> ass_cost[i*10+j];
            _ass_cost.push_back(ass_cost[i*10+j]);
            ss.clear();
        }
    }

    fnum = num[0];
    cnum = num[1];

    in.close();
}

//67号测试文件读取
void get67Data(string path, int &fnum, int &cnum, vector<int> &_capacity, vector<int> &_open_cost, vector<int> &_demand, vector<int> &_ass_cost) {
    ifstream in(path);
    if (!in.is_open()) {
        cout << "open error!" << endl;
    }
    string str;
    getline(in, str);
    vector<string> sv;
    sv = split(str, " ");
    int num[2];
    stringstream ss;
    for (int i = 0; i < 2; i++) {
        ss << sv[i];
        ss >> num[i];
        ss.clear();
    }
    //cout << num[0] << " " << num[1] << endl;
    int capacity[num[0]], open_cost[num[0]];
    for (int i = 0; i < num[0]; i++) {
        getline(in, str);
        sv = split(str, " ");
        ss << sv[0];
        ss >> capacity[i];
        _capacity.push_back(capacity[i]);
        ss.clear();
        ss << sv[1];
        ss >> open_cost[i];
        _open_cost.push_back(open_cost[i]);
        ss.clear();
    }
    
    int _size = 0;
    int demand[num[1]], flag = 40;
    for (int i = 0; i < flag; i++) {
        getline(in, str);
        int pos;
        if((pos = str.find(".")) != string::npos) {
            sv = split(str, ".");
        }
        else {
            sv = split(str, " "); 
        }

        for (int j = 0; j < sv.size(); j++) {
            ss << sv[j];
            ss >> demand[_size];
            _demand.push_back(demand[_size]);
            _size++;
            ss.clear();
        }
    }

    flag = 1200;
    int ass_cost[num[0]*num[1]];
    _size = 0;
    for (int i = 0; i < flag; i++) {
        getline(in, str);
        int pos;
        if((pos = str.find(".")) != string::npos) {
            sv = split(str, ".");
        }
        else {
            sv = split(str, " "); 
        }
        for (int j = 0; j < sv.size(); j++) {
            ss << sv[j];
            ss >> ass_cost[_size];
            _ass_cost.push_back(ass_cost[_size]);
            _size++;
            ss.clear();
        }
    }

    fnum = num[0];
    cnum = num[1];

    in.close();
}

//两个结果文件写入
void writeData(string str, int flag) {
    if (flag == 0) {
        ofstream out("result/time.txt", ios::app);
        if (out.is_open()) {
            out << str;
            out << "\n";
        }
        out.close();
    }
    else if (flag == 1) {
        ofstream out("result/answer.txt", ios::app);
        if (out.is_open()) {
            out << str;
            out << "\n";
        }
        out.close();
    }
}

#endif
//main.cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <string.h>
#include <sstream>
#include <algorithm>
#include <ctime>
#include "file.h"
#include <windows.h>
using namespace std;
//设施
struct facility {
    int capacity;			//设施容量
    int remain_capacity;		//剩余容量
    int open_cost;			//开启设施的开销
    bool isopen = false;		//设施是否打开
};
//客户开销
struct cost{
    int cost;		//客户开销
    int facility;	//对应的设施
};
//客户
struct customer {
    int demand;				//客户对设施容量的需求
    vector<cost> cost;		//客户开销
    int facilityIndex = 0;	//客户所选择的设施编号(主要用于输出结果)
};
//核心算法
int greedy(int fnum, int cnum, facility fac[], customer cus[]) {
    int min_cost = 0;		//最小开销总和
    for (int i = 0; i < cnum; i++) {	//遍历所有客户
        for (int j = 0; j < fnum; j++) {	//遍历所有的设施
        	//找到最小开销的设施编号
            int facilityIndex = cus[i].cost[j].facility;
            //判断设施容量是否足够
            if (fac[facilityIndex].remain_capacity >= cus[i].demand) {
            	//判断设施是否已经启动
                if (!fac[facilityIndex].isopen) {
                		//未启动则启动设施,并计算启动设施的开销
                    fac[facilityIndex].isopen = true;
                    min_cost += fac[facilityIndex].open_cost;
                }
                //计算开销总和
                min_cost += cus[i].cost[j].cost;
                //剩余容量减小
                fac[facilityIndex].remain_capacity -= cus[i].demand;
                cus[i].facilityIndex = facilityIndex;
                break;	//退出循环
            }
        }
    }
    return min_cost;
}
//用于结构体对比排序
bool compare(const cost &a, const cost &b) {
     return a.cost < b.cost;
}
//int转string
void intToStr(const int &int_temp,string &string_temp) {  
        stringstream stream;  
        stream<<int_temp;  
        string_temp=stream.str();
}

int main() {
    /*string path;
    cout << "please input the file path: ";
    cin >> path;
    string _path = "instances/"+path;*/
    int run = 1;
    //循环测试71个数据样例
    while (run < 72) {
        //获取文件路径
        stringstream ss;
        string temp;
        ss << run;
        ss >> temp;
        ss.clear();
        string path = "instances/p"+temp;
        //获取文件数据
        int fnum;
        int cnum;
        vector<int> capacity;
        vector<int> open_cost;
        vector<int> demand;
        vector<int> ass_cost;
        if (run == 67) {
            get67Data(path, fnum, cnum, capacity, open_cost, demand, ass_cost);
        }
        else { 
            getData(path, fnum, cnum, capacity, open_cost, demand, ass_cost);
        }
        //计时器
        LARGE_INTEGER BegainTime;     
        LARGE_INTEGER EndTime;     
        LARGE_INTEGER Frequency;     
        QueryPerformanceFrequency(&Frequency);     
        QueryPerformanceCounter(&BegainTime);
        //初始化设施
        facility fac[fnum];
        for (int i = 0; i < fnum; i++) {
            fac[i].capacity = capacity[i];
            fac[i].remain_capacity = capacity[i];
            fac[i].open_cost = open_cost[i];
        }
        //初始化顾客
        customer cus[cnum];
        cost _cost;
        for (int i = 0; i < fnum; i++) {
            _cost.facility = i;
            for (int j = 0; j < cnum; j++) {
                cus[j].demand = demand[j];
                _cost.cost = ass_cost[i*cnum+j];
                cus[j].cost.push_back(_cost);
            }
        }
        for (int i = 0; i < cnum; i++) {
            //对顾客在不同设施的花费用小到大进行排序
            sort(cus[i].cost.begin(), cus[i].cost.end(), compare);
        }
        //计算最小花费
        int min = greedy(fnum, cnum, fac, cus);
        QueryPerformanceCounter(&EndTime);
        //输出结果
        temp = "";
        intToStr(run, temp);
        string timestring = "| p" + temp + " | ";
        string result = "";
        cout << "------------------------------" << endl;
        cout << min << endl;
        intToStr(min, temp);
        timestring += temp + " | ";
        result += temp;
        writeData(result, 1);
        result = "";
        for (int i = 0; i < fnum; i++) {
            cout << fac[i].isopen << " ";
            int t = fac[i].isopen;
            intToStr(t, temp);
            result += temp + " ";
        }
        cout << endl;
        writeData(result, 1);
        result = "";
        for (int i = 0; i < cnum; i++) {
            cout << cus[i].facilityIndex << " ";
            intToStr(cus[i].facilityIndex, temp);
            result += temp + " ";
        }
        cout << endl;
        writeData(result, 1);
        double end = (double)( EndTime.QuadPart - BegainTime.QuadPart )/ Frequency.QuadPart;
        cout << "time(second): " << end <<endl;
        ss << end;
        ss >> temp;
        timestring += temp + " |";
        writeData(timestring, 0);
        cout << "------------------------------" << endl;
        run++;
    }
    return 0;
}

运算结果:

时间与结果:
ResultTime(s)
p194400.000134161
p281260.000142591
p3101260.0001151
p4121260.000130128
p593750.000109235
p680610.000111801
p7100610.000109601
p8120610.000119498
p990400.000112167
p1077260.000119498
p1197260.000135627
p12117260.000131595
p13120320.000309742
p1491800.000221035
p15131800.000211505
p16171800.000356295
p17120320.000214437
p1891800.0002258
p19131800.000274553
p20171800.000215537
p21120320.000218103
p2291800.000337601
p23131800.000324038
p24171800.000223234
p25187530.00172209
p26158310.00164952
p27210310.000901369
p28262310.000915665
p29200070.000882308
p30168120.000899169
p31222120.00105899
p32276120.000906867
p33186110.000899903
p34156890.00268248
p35208890.000865813
p36260890.000860314
p37186110.00140539
p38156890.00104579
p39208890.000892571
p40260890.000889272
p4172260.000361794
p4299570.000380488
p43124480.000428508
p4475850.000229833
p4598480.000347865
p46126390.000456733
p4766340.000221035
p4890440.000346032
p49128670.000410913
p50100620.000328437
p51111750.000560469
p52103640.000232765
p53128760.00042191
p54103510.000228733
p55123830.000504385
p56238820.00119865
p57328820.00195156
p58538820.00172723
p59391210.00121111
p60238820.00135993
p61328820.00136543
p62538820.00120158
p63391210.00125033
p64238820.00119572
p65328820.00120195
p66538820.00117152
p67396710.00122321
p68238820.00122137
p69328820.00200325
p70538820.00126096
p71391210.00175105
具体结果:

p1

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

p2

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

p3

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

p4

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

p5

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

p6

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

p7

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

p8

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

p9

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

p10

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

p11

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

p12

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

p13

12032
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9 

p14

9180
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9 

p15

13180
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9 

p16

17180
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9 

p17

12032
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9 

p18

9180
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9 

p19

13180
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9 

p20

17180
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9 

p21

12032
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9 

p22

9180
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9 

p23

13180
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9 

p24

17180
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 12 10 10 1 18 17 13 14 17 15 4 1 6 13 3 15 10 4 9 12 15 15 19 6 17 16 17 1 17 13 7 2 16 3 10 11 19 19 13 6 0 5 0 8 5 14 10 19 9 

p25

18753
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 2 21 18 8 17 14 25 2 29 7 11 14 28 14 1 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 25 25 5 2 5 

p26

15831
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 2 21 18 8 17 14 25 2 29 7 11 14 28 14 1 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 25 25 5 2 5 

p27

21031
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 2 21 18 8 17 14 25 2 29 7 11 14 28 14 1 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 25 25 5 2 5 

p28

26231
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 2 21 18 8 17 14 25 2 29 7 11 14 28 14 1 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 7 5 20 0 0 8 20 14 8 25 25 5 2 5 

p29

20007
1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 8 5 2 24 17 11 17 24 2 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 5 5 8 25 13 18 0 5 9 0 29 0 11 24 5 8 14 17 29 13 17 0 8 13 14 8 25 25 11 2 11 

p30

16812
1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 8 5 2 24 17 11 17 24 2 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 5 5 8 25 13 18 0 5 9 0 29 0 11 24 5 8 14 17 29 13 17 0 8 13 14 8 25 25 11 2 11 

p31

22212
1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 8 5 2 24 17 11 17 24 2 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 5 5 8 25 13 18 0 5 9 0 29 0 11 24 5 8 14 17 29 13 17 0 8 13 14 8 25 25 11 2 11 

p32

27612
1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 8 5 2 24 17 11 17 24 2 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 5 5 8 25 13 18 0 5 9 0 29 0 11 24 5 8 14 17 29 13 17 0 8 13 14 8 25 25 11 2 11 

p33

18611
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 

p34

15689
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 

p35

20889
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 

p36

26089
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 

p37

18611
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 

p38

15689
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 

p39

20889
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 

p40

26089
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 
20 11 20 2 20 5 2 24 14 17 22 16 8 20 3 14 14 17 5 11 2 0 5 3 5 8 19 24 5 24 5 25 6 25 20 20 24 15 0 14 0 14 15 10 24 14 0 13 27 8 29 14 14 5 20 20 17 11 0 14 0 5 20 11 11 11 24 0 5 24 20 6 11 17 24 8 26 20 14 24 20 7 20 17 19 17 17 7 20 5 2 24 17 11 17 24 2 2 21 18 8 17 17 25 2 29 17 11 14 28 14 1 2 11 11 27 24 24 24 24 5 8 25 13 18 0 5 24 0 29 0 11 24 5 8 14 17 5 20 17 0 8 20 14 8 25 25 5 2 5 

p41

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

p42

9957
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
12 10 11 9 15 18 16 3 17 1 11 18 6 10 6 15 0 2 14 14 5 11 9 8 12 8 11 16 17 13 7 19 6 8 14 10 10 0 0 1 1 3 3 16 9 14 8 19 15 15 16 17 7 13 13 5 2 14 14 14 11 11 4 3 11 3 0 15 19 6 10 18 19 19 19 18 18 19 19 19 

p43

12448
1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 15 24 25 22 26 21 27 29 24 23 3 9 18 11 8 15 12 7 25 26 22 20 17 13 29 6 29 4 5 2 2 13 0 22 7 12 21 11 4 12 28 23 5 25 26 17 17 11 21 0 9 18 6 6 19 20 2 29 5 27 1 29 27 28 1 27 28 29 

p44

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

p45

9848
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 0 0 0 0 0 0 1 1 1 1 6 6 6 6 2 2 3 2 3 2 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 0 0 2 3 11 12 18 16 19 7 15 16 8 13 11 16 18 19 14 15 10 9 12 9 15 17 13 13 8 12 7 10 18 12 13 17 14 17 8 16 10 7 

p46

12639
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 
10 0 10 10 10 0 10 1 1 1 1 11 11 11 11 2 2 3 2 3 2 4 4 5 6 6 5 7 7 8 7 8 9 9 10 2 3 17 24 28 29 12 21 22 24 14 18 17 16 28 29 27 13 22 25 26 13 18 18 24 19 15 28 18 26 27 14 13 15 12 

p47

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

p48

9044
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 0 0 0 1 0 1 1 1 2 3 2 2 3 3 4 4 4 5 5 5 5 5 5 6 6 6 6 6 7 7 8 8 8 8 8 8 8 9 9 9 9 10 10 11 10 11 10 12 13 12 13 13 12 13 14 15 12 14 12 0 15 14 14 15 16 16 17 17 17 17 17 17 18 18 19 19 19 19 19 

p49

12867
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 1 1 2 1 2 2 2 3 5 3 5 4 6 6 6 7 7 7 7 7 7 9 10 8 11 10 12 12 14 13 13 13 14 15 15 16 16 17 16 17 16 20 19 18 19 18 20 21 18 21 18 0 22 23 23 22 24 24 26 25 26 25 26 27 27 28 29 28 29 

p50

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

p51

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

p52

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

p53

12876
1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 
5 5 5 5 5 5 5 5 19 19 19 7 7 7 7 7 7 12 12 12 12 13 13 12 3 9 9 9 9 9 9 9 9 15 18 18 18 18 18 18 18 18 18 18 5 5 7 12 13 15 15 4 7 18 5 11 3 3 1 6 18 2 15 13 0 13 2 18 10 5 17 18 6 3 3 15 3 6 6 2 14 19 13 15 15 3 1 6 15 1 2 2 17 17 2 17 1 10 1 16 

p54

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

p55

12383
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
17 17 16 17 16 4 4 4 8 8 8 8 2 8 8 2 2 2 8 12 1 12 12 12 12 12 6 6 6 6 6 14 14 6 6 6 6 6 6 7 19 19 19 7 0 0 0 0 0 0 0 0 7 7 7 7 10 7 7 7 11 11 9 11 3 11 11 7 11 9 9 11 9 11 17 13 9 13 13 13 13 15 15 15 15 15 15 15 5 15 5 18 18 18 18 17 18 18 18 18 

p56

23882
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p57

32882
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p58

53882
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p59

39121
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p60

23882
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p61

32882
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p62

53882
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p63

39121
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p64

23882
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p65

32882
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p66

53882
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p67

39671
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 22 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 15 18 9 6 26 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 19 5 27 7 28 6 25 25 2 3 27 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p68

23882
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p69

32882
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p70

53882
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 

p71

39121
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
18 19 21 27 2 12 15 27 22 28 4 28 13 1 28 18 1 20 22 0 18 16 5 24 10 18 27 19 29 2 19 19 4 16 27 6 20 8 24 16 18 9 6 4 8 19 13 21 19 14 24 16 24 16 8 6 11 9 18 25 29 0 7 8 13 11 5 14 28 25 18 12 19 9 23 23 20 23 8 16 10 0 9 25 29 13 6 5 27 7 28 6 25 25 2 3 11 6 0 28 28 15 25 18 4 0 4 24 22 3 19 4 27 12 12 8 28 7 17 8 26 11 17 19 26 16 2 11 26 17 28 24 25 20 23 9 3 3 28 10 12 22 11 11 25 5 24 15 27 25 24 17 23 0 8 11 2 15 3 13 13 27 10 24 5 27 5 4 3 21 1 20 19 14 26 2 0 10 29 10 5 21 2 19 12 8 28 23 0 21 2 21 6 4 7 12 7 15 10 19 
Here is a basic implementation of CVRP in Python using the Google OR-Tools library: ```python from ortools.constraint_solver import routing_enums_pb2 from ortools.constraint_solver import pywrapcp def create_data_model(): """Stores the data for the problem.""" data = {} data['distance_matrix'] = [ [0, 548, 776, 696, 582, 274, 502, 194, 308, 194, 536, 502], [548, 0, 684, 308, 194, 502, 730, 354, 696, 742, 1084, 594], [776, 684, 0, 992, 878, 502, 274, 810, 468, 742, 400, 1278], [696, 308, 992, 0, 114, 650, 878, 502, 844, 890, 1232, 514], [582, 194, 878, 114, 0, 536, 764, 388, 730, 776, 1118, 400], [274, 502, 502, 650, 536, 0, 228, 308, 194, 240, 582, 810], [502, 730, 274, 878, 764, 228, 0, 536, 194, 468, 354, 1016], [194, 354, 810, 502, 388, 308, 536, 0, 342, 388, 730, 468], [308, 696, 468, 844, 730, 194, 194, 342, 0, 274, 388, 810], [194, 742, 742, 890, 776, 240, 468, 388, 274, 0, 342, 650], [536, 1084, 400, 1232, 1118, 582, 354, 730, 388, 342, 0, 878], [502, 594, 1278, 514, 400, 810, 1016, 468, 810, 650, 878, 0] ] data['num_vehicles'] = 3 data['vehicle_capacities'] = [100, 100, 100] data['depot'] = 0 return data def print_solution(data, manager, routing, solution): """Prints solution on console.""" total_distance = 0 total_load = 0 for vehicle_id in range(data['num_vehicles']): index = routing.Start(vehicle_id) plan_output = 'Route for vehicle {}:\n'.format(vehicle_id) route_distance = 0 route_load = 0 while not routing.IsEnd(index): node_index = manager.IndexToNode(index) route_load += data['demands'][node_index] plan_output += ' {} Load({}) -> '.format(node_index, route_load) previous_index = index index = solution.Value(routing.NextVar(index)) route_distance += routing.GetArcCostForVehicle( previous_index, index, vehicle_id) plan_output += ' {} Load({})\n'.format(manager.IndexToNode(index), route_load) plan_output += 'Distance of the route: {}m\n'.format(route_distance) plan_output += 'Load of the route: {}\n'.format(route_load) print(plan_output) total_distance += route_distance total_load += route_load print('Total distance of all routes: {}m'.format(total_distance)) print('Total load of all routes: {}'.format(total_load)) def main(): """Entry point of the program.""" data = create_data_model() manager = pywrapcp.RoutingIndexManager(len(data['distance_matrix']), data['num_vehicles'], data['depot']) routing = pywrapcp.RoutingModel(manager) def distance_callback(from_index, to_index): """Returns the distance between the two nodes.""" from_node = manager.IndexToNode(from_index) to_node = manager.IndexToNode(to_index) return data['distance_matrix'][from_node][to_node] transit_callback_index = routing.RegisterTransitCallback(distance_callback) routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index) dimension_name = 'Capacity' routing.AddDimension( transit_callback_index, 0, # no slack 100, # vehicle maximum capacities True, # start cumul to zero dimension_name) capacity_dimension = routing.GetDimensionOrDie(dimension_name) for i, demand in enumerate(data['demands']): index = manager.NodeToIndex(i) capacity_dimension.SetDemand(index, demand) for vehicle_id in range(data['num_vehicles']): index = routing.Start(vehicle_id) capacity_dimension.CumulVar(index).SetRange(data['vehicle_capacities'][vehicle_id], data['vehicle_capacities'][vehicle_id]) search_parameters = pywrapcp.DefaultRoutingSearchParameters() search_parameters.first_solution_strategy = ( routing_enums_pb2.FirstSolutionStrategy.PARALLEL_CHEAPEST_INSERTION) solution = routing.SolveWithParameters(search_parameters) if solution: print_solution(data, manager, routing, solution) if __name__ == '__main__': main() ``` Note that this is just a basic implementation and can be modified to suit specific requirements and constraints of individual problem instances.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值