[算法期末项目] Capacitated Facility Location Problem

题目

给定m个工厂和n个用户,每个用户有一定的需求,并将需要被指定(assign)给某一个工厂,但工厂的承载量时有限的,被指定给某一个工厂的用户的需求总和不能超过工厂的容量(capacity).工厂的开启和用户的指定都有花费.现在我们设计一个工厂开启和用户分配的方案,需要最小化工厂开启和用户分配的花费.

思路

算法框架

这题是一个组合优化问题,在不超过工厂容量的情况下,每一个用户都可以分配到不同的工厂,复杂度将是一个指数级别的问题.因此我们不能使用遍历所有情况的方法求得最优解,这启发我们使用启发式的算法,这里我们采用模拟退火(SA)和遗传算法(GA),尝试解决这个问题.
无论我们使用SA还是GA,需要解决的最重要的问题是如何有效的生成可行解的问题.因为SA和GA都已经有了一个完整的计算模型,这个模型讨论的都是在得到新的解以后,如何合理的选取,避免达到局部最优的问题.而如果我们本身就无法有效地产生优良的解,那么无论有多么好的选择算法,都无法使算法达到一个足够好的解.因此这份报告将会把重点放在新解的生成上.

新解产生

生成新解的一个自然的思路是:拿到一个已有的解,如何产生另外一个有可能更好的解呢?这需要我们考虑:在这个有限容量工厂定址问题中,一个"优秀"的解是如何组成的?
显然,这样的一个解将会以工厂为单位构成.直觉告诉我们.最优解应该会有较高的工厂利用率,这样子既可以满足用户的需要,又不会有太多的工厂开启的消耗.试想,如果在某个产生解的过程中,恰好产生了某种分配,这个分配刚好最大限度地利用了工厂的容量,而且花费不会太高,那么,在SA的领域操作和GA的遗传变异过程中尽可能的保留这个大限度利用工厂容量的操作,将会有更大的可能性找到更好的解.

:我们还有其他一些常用的交叉遗传变异等新解产生的办法.比如,reverse:把结果中的一段完全反过来.这在类似TSP等路径求解问题中十分适用.因为在路径求解问题中,最优解的构成单位是一个一个的路径片段.使用这种以一段路径为单位的变异不会破坏解内的良好结构.但是在这个问题中,良好结构并不是以一个序列为单位出现的,更多的是以某个"块"出现:几个被分配到同一工厂的用户可以被称为一个"块".因此,传统的crossover方法直接用到这个新解产生上,效果并不是太好.

解的表示

若用户的个数为n,那么解是一个长度为n的数组,每个元素是一个整数,表示被分配到了哪个工厂.

算法设计

模拟退火

模拟退火最关键的部分是领域操作,我们这里的领域操作是随机在解中随机选择一段,全部重新随机换成另外一个工厂.
但实验发现模拟退火的收敛效果没有遗传算法好,因此我们后面的计算都使用遗传算法.
下图是调整不同参数后模拟退火算法的收敛曲线,事实上效果并不算太好.
在这里插入图片描述

遗传算法

交叉

前面提到,我们在交叉操作中,我们尽可能地要把父代解中同一个工厂内的分配保留到子代,因此我们的交叉算法为:
先在父代一中选取若干个已经被分配用户的工厂,直接传给下一代,并用父代二的数值填满剩余未分配的用户,形成一个子代个体

变异

同样,我们尽可能要保留同一个工厂内的个体,个体中每个用户有一定概率会变异,变异的概率反比于这个用户被分配到工厂的服务用户的数量.当变异在某一个位置发生时,在这个位置的用户会被重新分配给另外一个工厂.

自然选择

这里我们简单地使用k-锦标赛的方法,当一个新个体加入种群后,随机从种群中选取k个个体,这些个体中适应度最低的(使目标函数最大)的一个个体将被抛弃

参数影响

参加交配的个体数在群体中的比例
在这里插入图片描述


种群大小:可以看出,这是对最后收敛结果影响最大的一个参数,种群数量较大,可以取得更好的结果,但种群数量过大,会降低算法的计算速度
在这里插入图片描述


进行k-锦标赛的k.只要新个体打败k个个体中最弱的一个时,就有机会进入种群,所以当k比较大时,种群有更大的概率接受新解,此处当k=5时,明显没有k更大时得到的结果好.
在这里插入图片描述


遗传的比例,决定个体会从父代一遗传多少基因.注意到,这个参数的影响力较弱.
在这里插入图片描述

实验环境

linux ubuntu 18.04, python 3.6
python的计算效率可以说是十分低下,同样的时间,其他同学的C++版本代码能跑几千代,而我的python代码只能跑几百代,二者几乎有数量级上的差异.可以说,python十分不适合处理这种计算密集型的程序.并且囿于效率,下面的计算结果迭代次数仍然较小,还有一定的提升空间.

result table

ResultTime(s)
p110017.019.15
p28952.017.79
p310722.015.28
p412286.017.32
p511047.018.36
p610330.018.83
p711966.018.92
p814447.018.86
p99592.013.09
p108781.012.52
p1110342.012.80
p1212029.013.18
p139678.015.03
p148238.014.15
p1510493.014.29
p1612528.015.60
p179421.014.85
p188085.016.76
p1910410.014.37
p2012796.015.60
p219140.013.41
p228014.012.84
p2310056.014.12
p2412316.015.50
p2519659.033.38
p2616663.034.22
p2718789.033.68
p2825468.035.54
p2923771.035.70
p3020848.035.17
p3126131.041.66
p3229252.038.31
p3318826.030.91
p3416808.030.99
p3519619.032.25
p3623006.031.44
p3717082.029.87
p3815441.029.91
p3916812.029.93
p4021441.030.63
p418359.020.36
p4210573.023.05
p4310858.021.77
p4411893.020.44
p4512498.023.18
p4610587.020.32
p47(数据错误,用p1代替)10107.012.99
p4814490.025.29
p4913155.022.30
p5010277.025.11
p5110984.025.26
p5214905.024.36
p5313790.024.28
p5416081.027.77
p5514764.024.87
p5648678.047.12
p5760529.049.78
p5891007.059.85
p5968945.051.51
p6036832.042.34
p6159319.049.06
p6285350.056.13
p6364216.050.03
p6436318.042.58
p6559000.048.18
p6678571.055.14
p6770452.052.52
p6837823.042.27
p6953152.046.79
p7086008.058.03
p7176949.057.65

detail solution

p1
10017.0
1 0 1 1 0 1 1 1 1 1
5 7 8 2 9 9 5 6 3 2 6 3 0 0 6 9 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 0 3 7 9 3 6 8 5 7 8 2 5 7 0 2 5 6


p2
8952.0
0 0 1 1 1 1 1 1 1 1
5 7 8 2 9 9 5 6 7 2 6 6 4 9 6 4 5 6 3 9 7 6 3 5 6 9 5 7 3 3 3 8 2 4 3 7 9 3 6 4 5 7 8 2 5 7 8 2 4 6


p3
10722.0
1 0 1 1 1 1 1 1 1 1
5 7 8 2 9 9 5 6 7 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 0 3 7 9 3 6 4 5 7 8 8 5 7 0 2 4 6


p4
12286.0
0 0 1 1 1 1 1 1 1 1
5 7 8 2 9 9 5 6 3 2 6 3 4 9 6 4 5 6 7 9 7 6 3 5 6 9 5 9 3 3 3 8 2 4 3 7 9 3 6 4 5 7 8 8 5 7 6 2 4 6


p5
11047.0
1 1 1 1 1 1 1 1 1 1
5 7 8 2 9 9 5 9 3 2 6 6 1 0 6 4 5 0 2 0 7 6 3 6 4 9 5 7 3 3 3 8 5 1 3 7 9 3 4 4 5 7 8 8 1 7 0 2 4 6


p6
10330.0
1 1 1 1 1 1 1 1 1 1
1 7 8 8 1 2 5 0 7 2 6 6 4 4 6 4 5 0 1 9 7 0 3 5 6 2 5 7 0 3 3 8 5 1 3 8 9 1 6 4 5 4 8 8 1 7 0 2 4 6


p7
11966.0
1 1 1 1 1 1 1 1 1 1
4 7 8 2 5 9 5 9 7 2 6 3 4 4 6 4 5 0 7 9 7 6 1 9 8 9 5 7 7 3 3 8 2 1 3 8 9 3 6 4 5 4 8 8 5 7 0 2 4 6


p8
14447.0
1 1 1 1 0 1 1 1 1 1
5 3 8 2 7 9 2 6 7 2 6 6 9 0 6 1 5 0 7 0 7 8 3 9 6 9 6 9 0 0 3 8 2 1 3 8 9 3 5 8 5 7 8 7 1 7 8 9 0 6


p9
9592.0
1 1 0 1 0 1 1 0 1 1
5 5 8 8 9 9 5 9 3 0 6 3 3 0 6 9 5 0 3 9 8 6 3 5 6 9 5 9 0 3 3 8 5 1 3 8 9 3 6 8 5 1 8 8 1 3 0 3 0 6


p10
8781.0
1 0 0 1 1 1 1 1 1 1
5 7 8 8 9 9 5 6 3 0 6 3 4 0 6 4 5 0 7 9 7 6 3 5 6 9 5 7 0 3 3 8 5 0 3 7 9 3 6 4 5 7 8 8 5 7 0 3 4 6


p11
10342.0
0 1 0 1 0 1 1 1 1 1
5 7 8 8 9 9 5 6 3 3 6 3 3 9 6 9 5 6 7 9 7 6 3 5 6 9 5 7 3 3 3 8 5 1 3 7 9 3 6 8 5 7 8 8 1 7 8 3 5 6


p12
12029.0
1 0 1 1 1 1 1 1 0 0
5 7 0 2 7 2 5 6 3 2 6 3 4 0 6 4 5 0 3 7 7 6 3 5 6 2 5 7 3 3 3 0 2 0 3 7 6 3 6 4 5 7 0 2 5 7 0 2 4 6


p13
9678.0
1 1 0 0 1 1 1 0 1 0 0 1 0 1 1 1 0 0 0 1
0 13 1 15 4 14 19 11 5 4 11 5 8 6 15 13 4 13 0 1 15 4 4 14 19 13 15 11 5 6 4 8 6 4 0 8 0 6 11 1 0 13 19 19 6 5 1 14 13 8


p14
8238.0
1 0 0 0 1 1 1 0 1 0 0 0 1 1 1 1 0 1 0 1
0 6 14 15 4 14 12 8 5 4 6 5 8 6 15 13 4 0 12 13 15 4 4 14 19 17 15 19 5 6 4 0 17 4 0 8 0 6 6 15 0 13 19 19 4 5 17 14 13 8


p15
10493.0
1 1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0
0 13 1 18 4 14 18 16 5 4 18 5 15 6 15 13 4 0 16 1 15 14 4 14 14 13 15 16 5 4 1 0 6 4 0 1 0 6 6 16 0 13 16 15 6 4 18 14 13 18


p16
12528.0
1 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 0 0 1 0
0 13 14 18 4 14 3 18 5 4 18 5 15 6 15 13 4 13 0 13 15 4 4 14 14 3 15 18 5 14 15 0 6 4 0 15 5 6 6 18 0 13 3 18 6 5 3 5 13 18


p17
9421.0
1 1 0 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 0
0 6 14 5 8 14 12 8 5 4 12 5 8 12 12 13 4 0 0 1 15 8 4 14 14 13 15 4 5 6 1 0 15 4 0 8 0 6 12 1 0 6 1 8 4 5 12 14 13 8


p18
8085.0
1 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 1
0 6 1 18 7 14 19 19 18 4 18 18 15 6 15 19 4 0 7 1 19 14 4 14 19 17 15 7 17 6 1 0 17 4 0 1 0 6 6 1 0 6 19 17 4 7 19 14 1 7


p19
10410.0
1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 1 0 0 0 0
0 6 1 15 7 14 3 11 5 4 11 5 15 11 15 3 4 7 7 1 15 4 4 14 14 3 4 7 5 6 1 0 6 4 0 15 0 6 11 1 0 6 3 15 6 5 0 14 1 7


p20
12796.0
1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0
0 6 1 1 7 7 3 16 5 4 15 5 15 6 15 3 4 7 7 3 15 16 4 5 5 3 15 7 5 6 1 0 0 4 0 5 0 6 6 1 3 6 16 15 4 7 3 5 15 7


p21
9140.0
1 1 0 0 1 1 1 0 1 0 0 0 1 1 0 1 0 0 0 0
0 6 1 15 4 5 12 8 5 4 6 5 8 12 12 13 4 0 12 1 15 4 4 5 5 13 15 0 5 6 1 0 6 4 0 8 0 6 6 1 0 6 1 15 6 5 0 5 13 8


p22
8014.0
1 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0
0 6 1 18 4 14 3 18 5 4 18 5 15 6 15 3 4 0 0 1 15 14 4 14 14 3 15 3 5 6 1 0 6 4 0 1 0 6 6 1 0 6 3 15 4 5 0 14 1 18


p23
10056.0
1 1 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0
0 13 1 15 4 14 12 14 5 4 12 5 15 12 12 13 4 0 12 1 15 14 4 14 14 13 15 0 5 14 1 0 15 4 0 1 0 15 12 13 0 13 1 5 4 5 12 14 13 15


p24
12316.0
1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1
0 2 2 2 4 5 0 5 5 6 6 5 15 6 15 19 4 0 0 1 15 0 4 5 19 2 15 6 5 19 1 0 4 4 0 5 2 6 6 1 0 6 19 19 4 5 1 5 2 2


p25
19659.0
0 0 1 0 1 0 0 1 1 1 1 0 0 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 0 0
2 20 25 25 16 8 13 10 25 13 8 20 13 10 14 14 16 8 9 13 8 16 9 10 14 10 27 9 8 13 8 24 8 9 14 24 8 24 4 25 4 24 10 10 24 7 20 9 8 7 8 13 8 7 13 10 13 4 25 13 10 13 9 25 13 8 8 8 10 14 8 9 24 10 24 10 8 8 27 9 10 13 10 9 13 14 27 25 14 8 10 13 10 9 4 20 16 8 9 13 4 25 10 9 14 8 8 8 7 13 10 8 9 25 9 10 27 16 25 7 7 20 16 8 13 10 8 8 8 25 10 16 8 25 9 20 8 9 25 25 8 8 10 7 14 8 8 16 7 25


p26
16663.0
0 0 0 0 0 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 0 0 1 0 1 0 0
11 27 27 11 5 22 13 18 25 9 8 20 18 11 5 10 8 8 25 9 8 8 27 25 11 18 20 5 5 9 10 13 10 9 9 22 8 18 18 13 25 25 18 21 13 22 27 9 5 25 22 13 8 9 13 22 20 9 5 5 22 13 8 25 9 8 5 22 9 18 11 13 18 25 5 10 20 16 25 13 11 13 18 9 9 21 18 25 22 25 8 13 18 9 9 20 20 18 21 9 25 13 10 25 22 10 20 9 5 9 22 8 18 5 9 22 27 8 25 13 22 27 9 25 25 18 27 8 5 5 22 20 9 9 9 18 27 8 8 5 8 13 10 18 21 21 8 9 25 25


p27
18789.0
0 0 0 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0
8 10 24 25 8 10 13 8 9 4 4 21 13 25 13 10 16 24 10 13 21 8 9 16 8 27 16 9 9 13 8 13 10 10 4 24 8 16 21 8 8 21 10 10 24 24 16 8 27 13 10 13 8 9 13 24 27 9 10 25 24 13 8 25 9 8 25 9 10 13 8 13 8 25 9 24 16 8 25 13 4 24 8 10 4 24 10 13 9 16 4 21 8 9 4 24 27 8 9 9 4 25 8 9 24 10 13 16 8 5 24 13 8 9 9 24 8 8 25 5 24 16 9 25 13 10 27 8 8 9 10 13 8 9 13 24 13 8 25 8 4 13 24 10 4 8 27 8 5 25


p28
25468.0
0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1
8 18 27 4 8 22 13 18 5 13 22 13 8 10 9 10 27 9 9 5 20 20 9 5 8 5 27 9 5 13 4 13 22 9 13 10 9 8 13 7 4 27 10 9 7 10 8 8 27 7 10 13 8 9 9 8 27 18 4 8 10 16 8 7 9 4 13 22 7 13 20 13 9 10 9 22 20 16 27 13 4 20 10 9 13 8 27 27 9 4 4 13 18 10 9 4 20 9 5 13 8 13 10 9 13 8 20 8 20 5 22 13 9 7 9 29 13 9 7 5 10 18 9 27 13 20 20 5 7 8 10 8 9 5 9 18 27 29 8 5 10 13 8 10 13 10 20 8 8 5


p29
23771.0
1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 0 1 1 0 1 0 1
18 18 29 16 4 4 21 18 7 4 8 22 24 11 5 14 21 24 16 16 21 16 24 7 13 18 27 5 27 13 8 24 8 7 4 14 2 24 7 7 25 5 22 18 14 24 13 16 13 16 8 13 8 7 13 1 0 5 7 7 24 2 8 7 13 8 13 11 18 4 14 22 18 21 14 29 7 8 5 7 2 13 10 9 4 10 9 18 2 13 2 2 8 9 5 4 0 27 7 4 4 13 18 10 4 14 0 9 7 13 22 2 9 25 9 24 16 9 7 5 27 8 9 7 5 14 1 24 6 25 10 2 9 7 9 8 2 16 8 11 8 2 18 21 4 8 13 6 11 5


p30
20848.0
1 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 0
21 18 21 13 9 4 13 18 21 9 20 27 22 21 5 10 0 18 7 4 8 8 9 25 9 18 18 6 8 5 4 2 18 10 4 20 20 18 2 5 13 27 20 7 21 24 7 9 7 4 22 2 8 7 9 21 20 3 13 5 22 16 8 25 9 8 2 20 9 5 20 20 9 6 14 10 7 6 5 7 4 2 22 10 21 3 21 27 9 8 0 2 18 7 4 10 20 22 16 21 20 2 22 25 18 14 20 6 9 9 22 16 6 5 5 10 13 8 7 5 22 8 18 5 9 24 20 27 16 25 22 13 8 7 13 10 27 18 9 9 20 2 22 21 4 18 18 6 21 5


p31
26131.0
1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1
10 13 29 2 16 10 16 8 9 13 4 21 9 7 25 8 2 9 25 16 21 28 8 8 4 1 7 6 28 25 8 13 10 7 1 21 13 9 2 2 0 2 18 14 14 28 14 29 5 7 24 13 8 7 9 20 0 5 2 0 22 16 8 7 9 0 25 10 7 1 4 22 24 21 14 22 27 8 7 7 8 13 10 25 7 14 10 29 21 25 8 13 10 10 14 1 0 10 2 21 25 5 28 21 21 21 13 8 25 7 4 0 29 25 7 8 16 8 5 5 27 0 16 25 25 24 16 5 13 5 10 2 16 25 7 10 2 27 25 16 2 27 22 21 14 22 0 16 25 5


p32
29252.0
0 0 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 1
10 27 7 3 2 24 21 16 7 7 10 13 10 9 21 2 27 10 18 4 24 18 6 4 13 29 13 18 13 5 4 2 18 10 5 2 8 21 4 5 2 2 8 10 7 10 13 8 27 13 4 13 8 9 9 7 27 3 21 25 24 16 8 7 9 2 2 10 9 4 3 27 3 6 3 10 7 16 25 7 2 21 8 10 4 25 13 13 4 16 6 2 10 7 4 10 27 16 18 5 2 2 10 21 24 24 27 16 25 13 24 16 8 25 5 2 8 8 25 13 24 7 6 24 9 7 18 3 5 2 24 16 16 7 13 21 8 24 5 2 21 13 18 9 16 10 3 6 7 7


p33
18826.0
1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0
8 8 24 8 5 24 21 8 21 4 4 22 24 6 16 22 8 24 10 16 6 21 8 10 8 22 13 8 5 16 0 24 10 9 9 24 16 9 21 9 8 13 8 10 21 24 0 8 5 7 10 16 8 7 9 24 8 24 13 9 22 13 8 7 13 2 13 9 7 4 16 22 13 21 13 24 7 8 7 9 4 21 10 9 4 24 8 5 24 9 4 13 8 10 9 10 13 24 2 4 4 4 22 7 4 22 13 8 5 9 24 8 8 7 7 22 16 8 9 5 24 0 16 7 9 24 16 5 7 16 10 13 16 7 7 21 0 6 9 7 8 2 9 7 21 21 16 24 16 9


p34
16808.0
0 1 1 0 1 1 0 1 1 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 0
10 1 13 2 5 8 2 9 10 9 8 8 9 7 5 10 27 18 7 5 8 27 18 9 21 10 1 9 13 9 8 13 10 7 1 8 27 13 9 5 2 13 10 18 4 22 27 9 7 13 24 13 8 7 13 22 27 27 13 5 10 16 8 7 13 8 2 22 10 4 21 22 10 21 1 22 13 8 7 7 2 13 10 10 9 21 10 27 7 8 8 13 8 10 4 21 27 8 10 13 4 4 10 7 13 21 27 8 16 5 10 8 9 5 7 10 27 8 7 1 7 27 9 8 5 18 8 5 7 5 22 13 8 7 7 22 13 27 21 5 4 13 10 9 16 21 13 27 5 7


p35
19619.0
0 1 0 0 1 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0
14 16 13 5 9 8 13 8 21 4 10 11 8 10 11 10 16 24 21 5 11 8 24 7 8 10 13 16 10 7 8 13 11 21 4 8 13 21 24 5 4 24 11 21 1 7 13 16 1 13 24 13 8 7 13 18 10 18 13 11 24 13 8 7 13 4 16 11 7 14 21 13 24 18 8 24 7 16 5 13 4 13 10 7 4 10 16 18 4 16 4 24 10 7 4 14 16 8 4 16 8 24 18 10 16 10 8 9 7 13 24 13 9 7 7 10 16 9 7 5 7 16 8 5 9 18 16 8 13 8 24 16 8 7 7 21 16 16 7 7 11 24 10 18 14 8 13 16 5 11


p36
23006.0
0 0 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0
22 10 13 16 5 8 16 9 10 5 10 13 10 5 5 6 16 16 8 5 24 13 24 7 13 22 3 5 5 5 4 2 10 7 4 6 13 24 5 5 4 13 16 7 3 24 13 6 5 9 10 13 16 7 9 8 3 4 5 4 22 13 8 9 13 4 16 22 7 4 16 22 8 7 5 22 7 6 7 9 4 16 16 10 4 3 13 8 6 13 2 13 8 7 9 6 8 6 9 7 2 4 10 10 22 8 13 8 8 5 22 13 6 5 7 10 13 8 7 9 24 8 6 5 13 24 8 3 5 7 22 13 8 9 7 22 16 16 3 5 4 24 10 7 4 10 13 16 5 13


p37
17082.0
0 0 0 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1
10 13 24 16 16 8 13 16 7 4 20 13 24 7 7 4 16 8 7 7 10 13 9 7 9 29 7 29 13 8 4 13 11 10 4 29 20 29 11 16 13 13 11 9 4 10 7 29 7 7 24 13 8 7 13 4 20 4 13 16 10 16 8 7 13 8 16 20 9 4 11 16 10 4 24 29 16 16 9 7 4 13 10 7 4 20 13 29 16 20 4 13 8 9 4 10 13 16 9 13 4 13 10 9 4 29 20 8 7 11 29 8 8 7 7 24 8 9 7 13 7 8 8 7 7 29 20 16 7 11 10 13 16 7 7 10 8 24 16 11 4 13 10 9 4 7 16 16 8 9


p38
15441.0
0 1 1 0 0 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
10 16 8 13 10 2 13 8 10 9 8 13 8 21 1 21 8 8 21 7 8 16 8 16 13 7 8 8 16 9 2 13 8 7 1 1 8 8 16 16 8 2 9 7 21 10 16 16 1 7 10 2 8 7 13 21 10 8 7 2 10 16 8 7 13 2 16 10 7 1 8 16 16 10 1 10 7 16 7 7 8 2 10 21 1 16 13 18 2 2 2 2 10 10 1 10 2 16 7 16 2 13 10 7 1 10 8 8 7 13 10 7 8 21 13 10 16 9 9 13 10 16 8 8 7 10 8 16 8 2 10 13 16 7 7 10 16 9 7 16 2 13 10 9 21 10 13 8 8 13


p39
16812.0
0 0 1 0 1 0 0 1 1 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
21 16 9 4 7 8 13 8 7 4 4 16 8 21 9 21 16 16 21 16 21 8 8 21 16 21 8 16 7 9 2 2 8 7 21 2 2 16 21 4 2 13 8 21 21 10 13 8 7 7 10 13 8 7 13 21 21 8 7 2 10 13 8 7 9 4 2 8 10 4 16 16 8 9 16 10 7 16 9 7 4 13 8 7 4 8 13 4 9 16 2 2 8 10 4 21 13 8 10 7 4 4 2 7 4 10 8 8 8 13 10 13 16 9 7 8 16 8 9 9 7 16 8 8 13 21 21 9 13 7 10 13 16 7 13 10 13 8 21 8 4 13 10 10 21 10 16 16 7 16


p40
21441.0
0 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0
4 13 4 4 8 8 13 8 7 9 4 9 18 4 8 8 16 16 16 13 21 13 18 7 13 18 16 9 13 13 4 13 18 9 13 18 13 18 4 16 13 4 18 7 4 7 7 9 8 7 4 13 16 7 9 18 8 18 7 9 24 13 8 7 9 4 13 18 7 4 4 16 16 21 13 7 16 16 7 13 4 13 8 7 13 4 16 18 4 4 4 21 8 7 4 4 16 18 16 13 4 4 18 9 9 8 13 9 8 9 24 13 16 7 13 21 8 8 7 9 24 7 16 8 13 8 8 8 8 8 8 13 16 7 13 18 8 9 16 13 4 16 16 18 13 18 16 8 16 13


p41
8359.0
1 0 0 1 1 0 1 1 1 1
0 8 8 3 6 8 4 3 0 3 0 3 7 9 0 6 8 3 4 4 6 6 0 4 6 6 7 6 7 9 4 3 7 3 4 3 3 0 7 7 9 0 9 3 4 0 0 9 0 7 3 3 9 4 3 9 0 7 9 3 6 8 4 4 6 6 4 3 4 3 4 3 8 7 8 0 4 7 3 9 0 4 4 6 9 8 4 6 8 7


p42
10573.0
1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 0 0 0 0 0
6 14 0 13 6 8 13 6 5 6 6 13 0 13 6 0 7 6 1 0 13 13 5 5 14 5 0 8 6 7 0 6 13 5 5 12 5 1 6 13 5 13 6 0 8 7 6 5 6 5 6 5 0 6 14 6 6 13 6 13 12 12 6 13 6 7 12 5 8 5 14 6 6 1 6 13 13 0 0 8


p43
10858.0
1 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0
14 12 25 25 9 0 1 21 27 25 8 28 27 27 27 25 21 21 14 25 28 0 21 14 9 27 8 0 0 14 28 8 1 25 8 14 8 0 0 21 12 0 25 21 21 14 21 25 25 0 8 21 28 27 0 28 27 27 1 1 28 25 21 8 1 25 21 12 0 25


p44
11893.0
1 0 1 1 1 0 1 1 1 0
8 4 2 7 7 2 4 7 7 8 7 2 0 2 0 7 4 8 3 7 6 0 4 4 2 4 4 0 7 6 4 8 3 3 2 3 3 3 2 7 0 2 4 0 7 6 0 2 7 7 2 0 2 7 8 2 2 6 6 0 6 7 6 8 0 2 6 7 7 0 3 0 8 7 6 0 4 4 7 4 4 3 7 6 6 4 4 2 2 3


p45
12498.0
1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 1 0 1 0 1
5 9 4 4 4 0 8 19 19 0 0 0 19 15 0 13 19 5 5 13 15 13 13 15 13 19 19 17 19 19 4 19 17 4 13 15 19 0 0 5 13 0 19 5 8 4 4 14 19 4 13 0 19 4 14 17 0 14 5 14 4 19 15 19 9 4 5 15 15 4 15 13 4 13 4 19 4 19 8 19


p46
10587.0
1 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0
1 19 19 5 19 5 5 19 8 0 21 19 12 0 21 8 5 9 0 21 19 28 0 12 19 0 1 5 12 19 9 12 0 19 19 19 19 0 19 0 12 19 9 19 19 21 5 0 28 19 19 19 19 5 19 8 21 5 27 0 27 28 5 19 21 5 9 0 19 12


p47
10107.0
1 0 1 1 0 1 1 1 1 1
5 7 8 2 9 9 5 6 3 2 6 3 3 0 6 9 5 0 2 9 7 6 3 5 6 9 5 7 0 3 3 8 2 0 3 7 9 3 6 8 5 7 8 2 5 7 0 2 5 6


p48
14490.0
1 1 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 0 0 0
15 5 9 13 5 14 12 0 5 0 14 0 13 13 15 14 1 5 12 9 9 14 5 15 5 0 8 9 1 0 13 15 15 15 9 15 13 13 14 8 13 5 15 5 14 15 8 1 15 13 13 5 8 15 13 12 0 5 14 1 8 1 15 14 5 0 13 5 8 13 12 9 15 15 12 9 8 0 12 5


p49
13155.0
1 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
0 1 21 27 12 1 27 1 14 28 8 14 21 1 9 0 12 5 9 28 1 21 14 12 12 9 21 27 21 0 0 1 21 27 27 0 28 8 21 21 12 9 0 0 28 27 27 8 0 28 9 27 14 0 0 21 5 27 8 9 12 28 12 12 27 1 27 14 1 28


p50
10277.0
1 1 1 0 0 1 1 1 1 1
5 2 7 2 0 2 6 2 6 6 5 2 1 6 1 2 0 2 6 5 5 5 6 6 7 2 8 9 2 8 2 7 6 2 9 0 9 7 0 5 5 1 5 2 0 2 7 5 2 1 5 7 7 5 5 1 2 5 7 5 1 2 7 9 0 7 7 2 6 2 0 7 6 2 5 2 2 6 9 6 0 7 6 2 9 2 8 5 7 5 5 5 6 6 1 7 0 2 2 0


p51
10984.0
1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1
5 5 0 13 16 19 12 5 9 9 0 19 19 8 16 5 5 19 16 8 5 19 16 19 8 16 5 19 16 9 5 19 16 0 16 19 9 19 8 9 5 5 12 17 13 12 5 12 19 9 5 5 17 16 16 5 19 16 19 8 5 16 19 8 17 13 16 19 0 19 5 19 9 13 16 19 9 9 16 16 5 5 19 8 17 0 8 16 19 12 5 5 12 0 16 19 5 12 9 0


p52
14905.0
1 0 1 1 1 1 1 1 1 1
8 2 3 6 6 5 4 9 0 7 5 3 3 8 0 3 6 9 0 5 5 3 3 8 4 4 7 9 9 7 8 2 3 2 6 2 3 3 6 7 8 3 3 8 6 2 7 7 7 7 5 9 3 2 7 5 2 9 4 4 0 3 8 6 3 3 0 0 0 2 7 3 3 8 4 4 7 2 7 7 9 9 3 2 8 5 3 3 2 4 5 9 7 2 9 5 4 9 3 2


p53
13790.0
1 0 0 1 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1
11 3 15 4 11 19 3 14 19 15 19 0 11 19 14 11 3 11 19 14 13 3 11 3 3 4 19 14 19 19 13 0 19 19 19 15 3 11 19 11 19 3 15 4 11 19 11 15 19 15 11 3 11 4 11 19 3 15 3 14 19 0 15 3 3 19 3 15 4 4 19 3 15 0 0 19 3 15 19 4 4 19 14 4 0 11 3 13 11 11 0 19 0 11 19 13 3 11 4 19


p54
16081.0
1 1 1 1 1 1 1 1 0 1
3 2 2 9 2 4 5 7 2 0 2 9 4 2 2 1 6 4 5 0 5 2 3 5 6 1 2 4 5 0 4 2 5 5 3 0 6 4 6 0 3 2 0 9 5 2 4 4 5 0 2 9 2 4 6 4 5 3 5 0 9 9 3 9 5 4 5 3 3 7 4 0 5 3 2 0 4 4 5 0 2 9 3 4 2 0 1 4 5 0 3 2 6 9 3 0 4 4 2 6


p55
14764.0
0 0 1 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0
2 2 2 5 10 4 2 10 6 10 4 5 11 6 7 2 2 2 6 2 7 4 11 6 10 6 3 10 6 10 2 10 7 4 5 6 2 10 7 6 4 5 10 6 5 4 5 6 3 2 2 4 5 5 10 4 2 3 4 4 4 5 4 6 10 2 6 10 3 6 2 5 10 6 6 2 5 2 6 3 7 6 4 5 7 4 5 3 6 11 3 2 4 5 7 5 3 2 3 10


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


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


p58
91007.0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 12 6 13 11 13 2 5 9 3 0 8 2 8 1 14 5 3 13 12 5 8 7 9 10 12 3 1 2 9 14 0 4 14 6 14 6 4 10 5 11 0 6 2 8 14 9 5 2 3 2 5 4 0 8 6 7 6 9 7 4 11 12 8 0 6 3 15 12 10 1 3 5 8 10 2 11 7 15 3 9 4 10 10 2 2 5 12 4 0 9 2 12 1 7 1 15 6 14 0 13 7 8 11 5 3 10 5 11 11 12 5 1 11 3 14 1 0 8 14 1 1 0 13 14 4 13 2 14 0 6 9 9 1 7 13 9 13 10 12 4 12 8 11 5 11 7 0 14 4 7 10 6 10 3 1 15 14 15 3 0 11 13 10 5 2 14 12 8 9 6 12 7 7 8 11 6 4 4 9 0 4 8 4 5 11 6 9 2 12 3 1 14 4 13 9 4 6 8 3


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


p60
36832.0
1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 1 0
14 4 28 8 9 11 8 2 24 5 9 26 11 24 27 2 14 24 10 12 12 14 14 5 14 12 10 20 2 14 4 5 7 14 2 27 0 24 26 28 1 2 26 1 20 5 12 10 0 22 12 2 5 4 16 28 2 5 14 1 14 11 20 14 4 12 5 14 14 10 5 9 27 8 20 9 9 11 0 16 14 5 11 26 22 5 12 14 14 8 9 26 8 11 10 26 11 0 20 9 6 9 28 11 27 7 28 11 7 24 1 26 9 1 28 11 10 12 11 28 26 28 28 28 28 26 4 20 27 4 28 5 28 9 16 4 5 27 14 9 8 8 1 11 27 6 28 8 11 26 8 11 16 16 2 28 5 24 12 7 26 8 28 10 26 26 9 10 16 27 2 14 1 4 12 14 11 10 27 7 20 8 28 26 10 26 4 4 8 20 22 12 28 5 8 10 11 1 27 8


p61
59319.0
1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 1
19 0 0 17 4 21 7 17 14 6 29 3 6 14 3 1 14 19 7 5 12 20 4 14 17 0 5 1 4 14 4 10 7 5 19 0 14 23 14 1 14 0 5 1 7 0 4 24 9 19 14 19 14 4 24 7 5 5 12 5 9 6 14 5 4 3 5 7 24 4 29 6 2 19 7 19 24 17 3 9 5 0 12 17 20 5 12 12 5 4 5 7 9 24 12 14 24 0 12 2 6 9 1 4 14 19 0 19 10 9 7 17 5 0 12 0 19 28 6 9 0 0 10 17 28 14 1 17 5 4 5 2 24 9 24 24 14 12 14 28 9 20 8 9 28 0 9 8 12 9 17 0 5 6 17 19 0 24 12 1 23 9 5 17 0 1 8 4 8 29 14 14 14 17 7 0 17 0 24 23 9 4 5 9 3 0 8 14 9 0 0 0 3 19 8 10 4 17 9 4


p62
85350.0
1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 3 0 8 0 1 4 0 2 0 9 6 5 7 3 3 5 8 8 6 6 4 1 9 1 8 9 7 3 1 3 8 2 3 7 3 6 2 5 8 0 2 9 2 0 10 0 1 2 0 2 8 3 6 2 5 9 5 1 0 2 4 6 10 3 3 1 7 2 7 3 6 1 7 7 8 9 9 5 8 5 0 6 3 7 1 8 7 3 4 4 1 7 8 4 8 2 8 6 0 3 6 2 6 5 2 9 4 9 0 8 8 4 9 10 5 7 5 3 4 3 5 9 6 9 1 4 2 2 1 3 7 9 1 5 0 8 2 0 0 9 3 0 5 2 4 7 1 4 8 6 0 5 8 2 6 5 8 9 10 7 2 2 5 5 0 0 7 1 2 9 3 2 4 4 7 3 9 8 5 0 4 4 5 0 1 3 6 1 6 8 10 7 8 8 6 6 1 9 2


p63
64216.0
1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 1 0 0 1 1
17 8 8 8 28 25 9 2 6 17 15 7 2 29 6 28 18 22 4 5 22 20 20 5 13 8 18 18 4 20 28 1 13 8 24 2 7 19 29 19 7 1 8 1 22 17 3 24 28 13 3 9 29 4 24 4 0 5 8 8 1 18 3 25 4 25 5 28 9 28 5 9 20 25 15 19 9 7 8 2 7 25 8 2 29 5 0 3 4 8 9 4 8 0 29 3 18 29 20 22 2 20 4 4 6 18 22 29 0 29 13 1 29 1 2 0 0 28 5 3 0 4 28 6 1 3 9 9 1 22 0 22 3 5 2 28 4 29 8 3 2 17 1 0 5 0 0 15 0 15 3 1 9 29 4 28 18 28 2 1 29 28 28 15 6 15 25 8 25 0 2 25 1 4 29 7 4 18 8 13 8 25 2 1 22 29 8 28 29 5 24 25 3 8 25 18 4 1 0 8


p64
36318.0
1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0
3 22 1 4 10 3 6 3 6 8 19 6 6 13 2 2 1 2 10 10 13 16 4 5 16 2 10 0 5 2 11 10 7 3 2 11 7 24 19 0 1 5 16 1 10 11 6 10 19 0 3 13 24 6 4 4 5 5 19 7 10 2 13 10 0 24 5 7 24 7 19 24 2 10 22 5 13 7 2 16 19 5 5 7 24 5 6 7 6 10 19 24 0 24 4 13 19 8 0 3 6 22 19 11 6 7 1 11 13 11 5 1 5 7 7 10 19 22 13 7 0 8 10 22 1 5 4 22 8 2 0 10 1 11 24 7 5 5 22 7 6 3 6 22 11 13 1 10 10 0 3 0 5 22 24 24 0 24 19 5 2 8 1 22 6 19 2 10 0 13 22 13 5 5 10 7 2 0 13 4 3 4 10 0 10 11 8 4 5 6 0 2 1 0 8 10 4 1 0 8


p65
59000.0
1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 1 1
11 4 0 4 19 3 6 3 1 5 24 15 0 22 1 2 25 28 7 0 0 0 3 25 25 2 5 22 5 1 6 2 0 5 2 2 5 5 3 0 27 25 11 0 4 5 5 5 11 29 3 2 5 4 2 7 2 5 22 28 24 1 3 5 4 2 25 2 23 7 23 4 2 29 0 15 19 15 2 23 0 0 24 0 22 15 3 2 23 25 18 24 27 11 4 4 15 0 2 15 6 3 27 4 27 6 3 11 7 15 23 23 23 24 3 15 1 11 23 0 27 4 29 3 1 2 11 17 5 2 2 0 7 27 23 4 0 5 11 15 2 3 3 4 3 6 1 11 11 0 8 0 6 0 2 4 0 29 5 6 29 23 28 0 11 6 17 0 2 0 2 2 5 6 11 28 11 0 2 2 7 28 18 0 24 1 3 4 24 29 6 5 0 11 23 5 4 0 27 1


p66
78571.0
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 7 1 1 7 6 6 2 6 4 6 4 7 2 3 2 0 6 4 0 6 7 4 5 6 2 5 7 4 6 0 7 0 2 2 1 1 0 3 3 5 5 3 3 2 3 4 4 0 1 5 3 5 7 2 3 2 6 2 6 3 4 0 6 3 1 3 7 3 2 7 1 2 2 4 2 7 6 0 4 3 1 2 6 4 6 2 5 5 1 0 4 3 2 4 5 0 0 3 3 4 5 5 6 1 2 2 4 1 0 2 5 2 0 4 6 1 4 0 1 1 1 0 1 2 5 3 4 4 2 2 5 5 1 7 6 0 0 4 2 4 1 3 0 6 5 3 5 5 4 1 4 3 4 4 0 3 3 3 1 0 3 3 2 6 7 2 5 5 6 5 1 7 1 3 0 6 0 0 6 5 0 6 1 5 6 6 2 1 7 5 4 1 5 0 0 7 2 5 1


p67
70452.0
1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 0 0 1 1 1 0 1 0 1 1
2 18 19 9 2 4 2 2 1 24 5 17 14 14 4 19 19 4 0 5 17 16 3 5 16 9 5 18 3 2 23 18 7 23 14 3 23 9 5 7 1 19 3 0 9 24 15 4 5 19 3 2 19 4 29 7 29 9 24 7 16 24 8 7 9 28 24 7 17 7 24 9 9 9 5 5 9 4 4 4 14 28 23 3 7 5 19 3 4 4 28 28 4 18 24 5 22 19 24 7 2 23 3 18 9 19 23 23 10 7 7 18 3 19 4 7 24 19 24 15 8 23 24 24 18 3 3 26 5 3 24 5 7 3 17 4 1 18 2 19 2 4 5 26 9 5 15 24 3 28 8 17 5 22 4 9 5 19 2 12 18 17 19 4 2 19 2 5 0 19 29 2 19 9 10 17 17 10 17 23 3 3 9 4 29 4 2 24 14 18 28 0 23 5 23 19 24 3 2 28


p68
37823.0
0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0
19 17 17 8 21 25 10 6 6 25 9 6 8 14 9 2 25 24 24 27 12 14 18 5 17 8 25 22 2 21 6 5 18 14 9 24 7 9 5 10 11 5 12 1 8 5 19 24 19 13 17 20 24 4 21 13 2 5 18 1 17 27 18 25 4 21 27 2 24 11 19 22 13 19 5 19 9 4 2 2 11 5 5 12 12 22 6 2 24 24 9 28 17 27 7 17 24 14 5 7 6 9 19 11 27 7 22 11 10 11 5 1 21 21 28 24 1 8 21 2 20 10 2 22 1 5 21 21 5 21 10 25 13 2 4 13 2 24 12 1 2 22 1 4 6 25 11 8 18 9 25 1 1 27 13 27 5 19 24 5 2 20 19 18 5 13 25 9 22 1 27 13 24 27 7 10 24 25 18 2 9 4 5 22 10 11 27 24 28 10 6 5 24 2 8 10 4 18 27 14


p69
53152.0
0 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1
29 23 27 26 5 5 8 2 5 11 9 4 6 29 2 2 2 29 5 5 17 14 13 5 13 2 18 14 5 2 6 13 14 14 2 27 5 23 26 19 14 5 11 20 9 11 13 5 19 27 2 19 15 4 17 14 4 5 14 29 17 27 17 23 15 27 29 27 27 11 14 5 4 15 5 5 17 11 15 6 5 29 19 26 29 5 15 14 6 5 14 29 5 23 11 22 18 19 13 18 14 22 27 11 26 2 11 23 13 11 25 17 9 22 9 17 19 29 5 2 23 4 29 23 10 5 15 17 27 27 23 13 25 27 27 4 5 23 19 9 2 23 19 11 26 13 28 8 22 23 8 18 29 23 27 27 11 23 19 17 2 4 14 11 27 1 11 10 19 23 2 19 13 5 8 13 2 18 27 4 9 26 19 27 10 1 29 5 5 27 2 10 28 5 8 22 4 14 27 8


p70
86008.0
0 0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 1 1
23 2 23 13 14 14 29 24 14 25 18 4 25 23 13 25 13 10 13 28 29 18 4 4 6 24 28 17 29 25 14 24 2 28 29 25 23 24 23 13 24 2 24 13 14 13 4 4 25 14 2 23 17 29 24 17 2 10 14 18 25 25 4 29 4 29 6 6 25 18 18 18 28 18 23 18 10 10 13 23 17 29 28 24 25 14 17 10 14 24 10 4 4 24 28 4 18 6 25 29 13 28 14 17 17 29 2 25 25 23 2 6 2 6 17 14 4 23 18 29 2 10 10 6 4 13 10 6 17 10 14 14 17 2 2 28 6 24 24 18 23 25 6 25 29 29 2 2 25 2 24 18 29 18 6 29 28 17 13 4 13 10 23 28 14 13 2 18 28 17 14 14 24 14 18 28 28 23 4 4 24 2 2 14 24 13 13 17 14 13 29 29 23 10 17 6 29 24 23 24


p71
76949.0
0 0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 1 1
10 25 14 10 28 2 2 18 6 6 18 6 10 14 23 25 18 14 2 29 24 29 17 2 4 28 13 24 13 2 18 25 18 25 24 4 23 25 2 29 10 25 6 23 14 18 29 6 14 23 10 13 29 13 4 23 14 24 29 2 17 13 13 14 4 25 2 23 28 24 18 29 29 29 6 2 6 10 4 14 29 28 6 25 23 2 14 23 18 25 29 24 14 28 18 18 10 25 4 29 17 23 24 29 28 14 13 10 18 29 24 17 6 24 23 23 4 13 17 25 25 10 28 28 10 4 6 4 14 25 28 25 2 13 17 6 14 10 6 2 2 17 4 13 24 28 17 14 18 4 17 13 14 2 24 14 24 14 4 17 24 24 10 28 23 29 24 28 13 13 13 17 29 18 17 14 24 4 13 17 2 10 14 4 25 18 10 23 18 6 28 24 23 28 25 13 6 29 2 23


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、付费专栏及课程。

余额充值