[期末项目]Capacitated Facility Location Problem工厂选址问题的两种算法

项目要求

在这里插入图片描述

从项目给出的信息中可以略窥一二,按数据划分的行也可以了解到:


工厂的数目n,消费者的数目m


工厂1的最大容量和开厂开销
工厂2的最大容量和开厂开销



工厂n的最大容量和开厂开销


m个消费者的各自需求


所有消费者分别到工厂1的开销
所有消费者分别到工厂2的开销



所有消费者分别到工厂n的开销


总开销=消费者开销+开厂开销
额外要求:单个工厂中各个消费者的需求之和不能超过其最大容量

需要关注的坑:

1.消费者和工厂相关的矩阵中行是工厂,列才是消费者,不能弄混了,贪心算法也是基于这个前提去实现才有价值
2.原数据的格式实在是一言难尽(尤其是文件p26),,,不但数据不规整,一些数字后会多出个小数点,而且在行数和结尾的结束符上也有区别,花了不少时间加条件判断甄别。还好总体不算大问题

具体思路

1.贪心算法

第一个想法就是用局部最优的方法来解,也就是贪心算法。思路也比较清晰:对于每个消费者而言,先选取当前开销最小的工厂,若该消费者的需求小于该工厂的剩余容量,则匹配之;反之,寻找开销第二小的工厂,重复上述过程。我选择按顺序从前往后遍历所有消费者,得到一个相对最优的结果。由上述推论可知结果波动很大,一般都与数据的排布有关,局部最优,但整体来看并不是一种很好的解法
相关代码如下:

import time

allfile = ""
for line in open("p1","r"):                      #相关的数据文件已经放在python文件的目录下
    allfile = allfile + line
str = allfile.split()                            #已经切割好的字符串元组

data = []
for i in range(0, len(str)):
    if len(str[i]) > 10:
        break
    if str[i][-1] == '.':                        #源数据中一些莫名其妙的格式
        data.append(int(str[i][:-1]))
    else:
        data.append(int(str[i]))                 #将所有数据从string转为int类型存在data中

#设置所需的参数
facility_num = data[0]                           #工厂的数目
customer_num = data[1]                           #消费者数目
capacity = []                                    #工厂的容量
opening_cost = []                                #开厂开销
customer_demand = []                             #消费者需求
cost = []                                        #消费者开销

for i in range (0, facility_num):
    capacity.append(data[2 + i * 2])
    opening_cost.append(data[3 + i * 2])

for i in range(facility_num * 2 + 2, facility_num * 2 + customer_num + 2):
    customer_demand.append(data[i])

for i in range(facility_num * 2 + customer_num + 2, len(data)):
    cost.append(data[i])

all_cost = 0                                     #总开销
facility_table = []                              #维持一个工厂的开关表
for i in range(0, facility_num):
    facility_table.append(0)

#开始贪心算法,对消费者进行遍历

starttime = time.time()              #计时开始

for i in range(0, customer_num):
    one_customer_cost = []                       #单个消费者对应的元组
    for j in range(0, facility_num):
        if customer_demand[i] > capacity[j]:     #如果需求大于剩余容量,设置一个极大值导入元组
            one_customer_cost.append(100000)
        else:
            one_customer_cost.append(cost[i + customer_num * j])    #元组输入完毕
    min_index = one_customer_cost.index(min(one_customer_cost))     #在剩余合理的工厂目标中挑选一个最小的代价,返回索引
    facility_table[min_index] = 1                                   #工厂开关打开
    capacity[min_index] = capacity[min_index] - customer_demand[i]  #最大容量减小(减去的是该消费者的需求)
    all_cost = all_cost + cost[i + customer_num * min_index]        #总代价增加

#针对开关表加上开厂开销
for i in range (0, facility_num):
    if facility_table[i] == 1:
        all_cost = all_cost + opening_cost[i]

#计时结束
endtime = time.time()

print(all_cost)

print (endtime - starttime)




结果

ResultTime(s)
p194400.001275162494950258
p281260.001345366225354791
p3101260.0012887105832739415
p4121260.0012878894870118895
p593750.0013170384043143663
p680610.0012981531902874072
p7100610.00129692154589435
p8120610.0012981531902874072
p990400.0013240177225417316
p1077260.0013211438856245705
p1197260.0013178595005764182
p12117260.0016495823904411344
p13120320.002377894774871825
p1491800.002377073678609759
p15131800.0024743735856617155
p16171800.002362704494024065
p17120320.00241361246227062
p1891800.0024025276627330783
p19131800.0023688627159893505
p20171800.0026619940815381105
p21120320.002392674507588566
p2291800.002400885470209002
p23131800.00251132291745354
p24171800.002668152303503424
p25191970.01019965776707793
p26161310.010837649562684126
p27215310.010063355787579113
p28269310.010405752928850369
p29193050.009607647362146157
p30162390.010017374396904796
p31216390.009776793192126682
p32270390.012489695241911375
p33190550.009549760075672237
p34159890.010188572967540416
p35213890.009952097244072478
p36267890.009742307149120943
p37190550.009877788032357782
p38159890.009826469515980207
p39213890.009650754915903281
p40267890.009810458138870382
p4172260.0022530881430415373
p4299570.0036427935665466205
p43124480.004556673706198611
p4475850.002252267046779499
p4598480.003752820465660167
p46126390.0046839436268151236
p4766340.0022025907229260566
p4890440.0035508307851979115
p49124200.004512334508048332
p50100620.0024628782379930714
p51113510.004432277622499425
p52103640.0024645204305172586
p53124700.0043715164991082744
p54103510.002434550416952619
p55119700.004453626125312415
p56238820.01280992278410753
p57328820.013749667456013914
p58538820.01423165096183221
p59391210.014062505131851588
p60238820.013539056264800342
p61328820.013088274416939605
p62538820.0185941354020579
p63391210.013483632267112466
p64238820.013649083163913778
p65328820.013320644659097214
p66538820.0143281297726221
p67396710.016380459879594467
p68238820.014084264182795847
p69328820.014132298314125213
p70538820.015234620045915692
p71391210.01343682978017613

更详细的答案:

p1
9440
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[8, 5, 4, 7, 10, 4, 3, 2, 4, 3]

p2
8126
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[8, 5, 4, 7, 10, 4, 3, 2, 4, 3]

p3
10126
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[8, 5, 4, 7, 10, 4, 3, 2, 4, 3]

p4
12126
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[8, 5, 4, 7, 10, 4, 3, 2, 4, 3]

p5
9375
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[6, 6, 5, 6, 7, 4, 3, 3, 7, 3]

p6
8061
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[6, 6, 5, 6, 7, 4, 3, 3, 7, 3]

p7
10061
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[6, 6, 5, 6, 7, 4, 3, 3, 7, 3]

p8
12061
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[6, 6, 5, 6, 7, 4, 3, 3, 7, 3]

p9
9040
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[7, 5, 4, 6, 9, 4, 3, 2, 7, 3]

p10
7726
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[7, 5, 4, 6, 9, 4, 3, 2, 7, 3]

p11
9726
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[7, 5, 4, 6, 9, 4, 3, 2, 7, 3]

p12
11726
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[7, 5, 4, 6, 9, 4, 3, 2, 7, 3]

p13
12032
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 1, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 4, 2, 4, 3, 5, 1, 4]

p14
9180
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 1, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 4, 2, 4, 3, 5, 1, 4]

p15
13180
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 1, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 4, 2, 4, 3, 5, 1, 4]

p16
17180
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 1, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 4, 2, 4, 3, 5, 1, 4]

p17
12032
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 1, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 4, 2, 4, 3, 5, 1, 4]

p18
9180
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 1, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 4, 2, 4, 3, 5, 1, 4]

p19
13180
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 1, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 4, 2, 4, 3, 5, 1, 4]

p20
17180
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 1, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 4, 2, 4, 3, 5, 1, 4]

p21
12032
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 1, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 4, 2, 4, 3, 5, 1, 4]

p22
9180
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 1, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 4, 2, 4, 3, 5, 1, 4]

p23
13180
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 1, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 4, 2, 4, 3, 5, 1, 4]

p24
17180
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 1, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 4, 2, 4, 3, 5, 1, 4]

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]
[12, 1, 9, 2, 1, 17, 2, 3, 10, 4, 0, 12, 1, 5, 15, 2, 3, 11, 0, 1, 13, 2, 1, 0, 12, 6, 1, 1, 1, 2]

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]
[12, 1, 9, 2, 1, 17, 2, 3, 10, 4, 0, 12, 1, 5, 15, 2, 3, 11, 0, 1, 13, 2, 1, 0, 12, 6, 1, 1, 1, 2]

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]
[12, 1, 9, 2, 1, 17, 2, 3, 10, 4, 0, 12, 1, 5, 15, 2, 3, 11, 0, 1, 13, 2, 1, 0, 12, 6, 1, 1, 1, 2]

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]
[12, 1, 9, 2, 1, 17, 2, 3, 10, 4, 0, 12, 1, 5, 15, 2, 3, 11, 0, 1, 13, 2, 1, 0, 12, 6, 1, 1, 1, 2]

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]
[11, 1, 9, 2, 1, 15, 2, 2, 10, 4, 0, 13, 1, 5, 14, 2, 3, 14, 0, 1, 13, 2, 1, 0, 13, 6, 1, 1, 1, 2]

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]
[11, 1, 9, 2, 1, 15, 2, 2, 10, 4, 0, 13, 1, 5, 14, 2, 3, 14, 0, 1, 13, 2, 1, 0, 13, 6, 1, 1, 1, 2]

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]
[11, 1, 9, 2, 1, 15, 2, 2, 10, 4, 0, 13, 1, 5, 14, 2, 3, 14, 0, 1, 13, 2, 1, 0, 13, 6, 1, 1, 1, 2]

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]
[11, 1, 9, 2, 1, 15, 2, 2, 10, 4, 0, 13, 1, 5, 14, 2, 3, 14, 0, 1, 13, 2, 1, 0, 13, 6, 1, 1, 1, 2]

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]
[11, 1, 9, 2, 1, 17, 2, 2, 10, 4, 0, 12, 1, 5, 14, 2, 3, 14, 0, 1, 13, 2, 1, 0, 12, 6, 1, 1, 1, 2]

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]
[11, 1, 9, 2, 1, 17, 2, 2, 10, 4, 0, 12, 1, 5, 14, 2, 3, 14, 0, 1, 13, 2, 1, 0, 12, 6, 1, 1, 1, 2]

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]
[11, 1, 9, 2, 1, 17, 2, 2, 10, 4, 0, 12, 1, 5, 14, 2, 3, 14, 0, 1, 13, 2, 1, 0, 12, 6, 1, 1, 1, 2]

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]
[11, 1, 9, 2, 1, 17, 2, 2, 10, 4, 0, 12, 1, 5, 14, 2, 3, 14, 0, 1, 13, 2, 1, 0, 12, 6, 1, 1, 1, 2]

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]
[11, 1, 9, 2, 1, 17, 2, 2, 10, 4, 0, 12, 1, 5, 14, 2, 3, 14, 0, 1, 13, 2, 1, 0, 12, 6, 1, 1, 1, 2]

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]
[11, 1, 9, 2, 1, 17, 2, 2, 10, 4, 0, 12, 1, 5, 14, 2, 3, 14, 0, 1, 13, 2, 1, 0, 12, 6, 1, 1, 1, 2]

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]
[11, 1, 9, 2, 1, 17, 2, 2, 10, 4, 0, 12, 1, 5, 14, 2, 3, 14, 0, 1, 13, 2, 1, 0, 12, 6, 1, 1, 1, 2]

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]
[11, 1, 9, 2, 1, 17, 2, 2, 10, 4, 0, 12, 1, 5, 14, 2, 3, 14, 0, 1, 13, 2, 1, 0, 12, 6, 1, 1, 1, 2]

p41
7226
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[10, 6, 11, 6, 9, 8, 14, 12, 7, 7]

p42
9957
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[4, 3, 2, 5, 1, 3, 4, 2, 4, 3, 5, 7, 2, 3, 6, 5, 4, 3, 6, 8]

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]
[2, 2, 3, 1, 2, 3, 3, 2, 1, 2, 0, 3, 3, 2, 0, 2, 0, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 4, 3, 6]

p44
7585
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[9, 6, 9, 10, 10, 10, 8, 11, 7, 10]

p45
9848
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[9, 4, 5, 3, 8, 9, 4, 3, 3, 2, 3, 2, 4, 4, 2, 3, 4, 3, 3, 2]

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]
[2, 4, 5, 3, 2, 2, 2, 3, 2, 2, 6, 4, 2, 3, 2, 2, 1, 2, 4, 1, 0, 1, 2, 0, 3, 1, 2, 2, 3, 2]

p47
6634
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[12, 5, 16, 8, 12, 7, 10, 8, 6, 6]

p48
9044
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[6, 4, 3, 3, 3, 6, 5, 2, 7, 4, 4, 2, 5, 4, 4, 3, 2, 6, 3, 4]

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]
[2, 3, 4, 2, 1, 2, 3, 6, 1, 1, 2, 1, 2, 3, 2, 2, 4, 2, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 0]

p50
10062
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[12, 6, 15, 15, 8, 11, 9, 12, 1, 11]

p51
11351
[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1]
[8, 6, 2, 4, 1, 10, 6, 3, 1, 0, 6, 0, 5, 16, 5, 8, 4, 2, 5, 8]

p52
10364
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 6, 1, 19, 14, 16, 16, 14, 5, 8]

p53
12470
[1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 5, 6, 7, 1, 13, 7, 8, 0, 8, 0, 1, 6, 6, 1, 8, 1, 4, 13, 4]

p54
10351
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[10, 6, 15, 16, 15, 5, 15, 5, 8, 5]

p55
11970
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[8, 1, 4, 1, 3, 2, 11, 12, 7, 5, 0, 8, 6, 5, 2, 8, 2, 5, 8, 2]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 7, 7, 6, 6, 9, 5, 7, 7, 7, 6, 3, 6, 6, 4, 7, 13, 5, 6, 5, 6, 9, 9, 5, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

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]
[8, 3, 8, 6, 8, 7, 7, 6, 9, 5, 7, 8, 7, 6, 3, 5, 7, 4, 8, 12, 5, 6, 4, 6, 9, 8, 4, 9, 11, 4]

2.模拟退火算法

模拟退火算法是通过赋予搜索过程一种时变且最终趋于零的概率突跳性,从而可有效避免陷入局部极小并最终趋于全局最优的串行结构的优化算法。它是贪心算法中的一种,但是它的搜索过程引入了随机因素。在迭代更新可行解时,以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。

简而言之,依然采取对消费者遍历的方式,每一趟迭代随机找到一个解,逐渐接近最后的最优解。最后计算开销。具体步骤如下:

1.初始化:初始温度T,初始解为贪心算法的解,每个T值的迭代次数L=200;
2.对l=1,2,…,L做第3至第6步;
3.产生新解x_new,随机产生消费者与工厂之间的关系;
4.利计算增量Δcost=costx_new−costx,其中最小的cost为优化目标;
5.若Δcost<0则接受x_new作为新的当前解,否则以概率exp(−Δcost/T)接受x_new作为新的当前解;
6.迭代结束时终止算法
7.取a = 0.96,每次令T=T*a让T逐渐减小,然后转第2步。

相关代码如下:

import time
import random
import math

allfile = ""
for line in open("p1","r"):                      #相关的数据文件已经放在python文件的目录下
    allfile = allfile + line
str1 = allfile.split()                            #已经切割好的字符串元组

data = []
for i in range(0, len(str1)):
    if len(str1[i]) > 10:
        break
    if str1[i][-1] == '.':                        #源数据中一些莫名其妙的格式
        data.append(int(str1[i][:-1]))
    else:
        data.append(int(str1[i]))                 #将所有数据从string转为int类型存在data中

#设置所需的参数
facility_num = data[0]                           #工厂的数目
customer_num = data[1]                           #消费者数目
capacity = []                                    #工厂的容量
opening_cost = []                                #开厂开销
customer_demand = []                             #消费者需求
cost = []                                        #消费者开销

for i in range (0, facility_num):
    capacity.append(data[2 + i * 2])
    opening_cost.append(data[3 + i * 2])

for i in range(facility_num * 2 + 2, facility_num * 2 + customer_num + 2):
    customer_demand.append(data[i])

for i in range(facility_num * 2 + customer_num + 2, len(data)):
    cost.append(data[i])

facility_table = []                              #维持一个工厂的开关表
for i in range(0, facility_num):
    facility_table.append(0)

#开始模拟退火算法,对消费者进行遍历

a = 0.96
T = 1000                                     #温度为1000
starttime =  time.clock()              #计时开始
last_cost = 9440
it = 0

while 1:
    if it > 200:
        break
    #更新容量和工厂信息表
    for i in range(0, facility_num):
        capacity.append(data[2 + i * 2])
    facility_table = []
    for i in range(0, facility_num):
        facility_table.append(0)

    current_cost = 0
    for i in range(0, customer_num):
        one_customer_cost = []                       #单个消费者对应的元组
        valid_cost = []
        for j in range(0, facility_num):
            if customer_demand[i] > capacity[j]:     #如果需求大于剩余容量,设置一个极大值导入元组
                one_customer_cost.append(10000)
            else:
                one_customer_cost.append(cost[i + customer_num * j])    #元组输入完毕
                valid_cost.append(cost[i + customer_num * j])
        index = one_customer_cost.index(one_customer_cost[random.randint(0, len(valid_cost) - 1)]) #索引值
        facility_table[index] = 1                                   #工厂开关打开
        capacity[index] = capacity[index] - customer_demand[i]      #最大容量减小(减去的是该消费者的需求)
        current_cost = current_cost + cost[i + customer_num * index]        #总代价增加
    if current_cost <= last_cost:
        last_cost = current_cost
    else:
        rate = random.random()
        if rate < math.exp(-(current_cost - last_cost)/T):
            last_cost = current_cost
    T = T * a
    it = it + 1


#针对开关表加上开厂开销
for i in range (0, facility_num):
    if facility_table[i] == 1:
        last_cost = last_cost + opening_cost[i]

#计时结束
endtime =  time.clock()

print(last_cost)

print (endtime - starttime)

结果

ResultTime(s)
p194400.34176366550508913
p281260.34857548009498446
p3101260.3367344509000856
p4121260.2829920583569536
p593750.331698667524986
p680610.32265921877617254
p7100610.33061030442965
p8120610.32605239907905803
p990400.3144708363029647
p1077260.3296545483806339
p1197260.3430614081472454
p12117260.3386779857523372
p13120320.5558214082786215
p1491800.5339818899008444
p15131800.5415257118083492
p16171800.5369333204147528
p17120320.5079859822446142
p1891800.5445752633255712
p19131800.5757687103205225
p20171800.5458734165158585
p21120320.6022137576320894
p2291800.5100407756403715
p23131800.5248094235575813
p24171800.4979714816846279
p25191972.1844387478610443
p26161312.0849038167838643
p27215311.4866789447927697
p28267731.9061322753234293
p29193052.21977626769052
p30162392.2291379967221836
p31216392.062501847466592
p32267732.1729729596578977
p33190552.090996761596344
p34159892.1222649283511394
p35213892.4185345238134346
p36267732.452577174837664
p37190552.1746188471151626
p38159892.2721962847036323
p39213892.2998072887072993
p40267732.3514238630280033
p4172260.6161719835386634
p42105400.906725517372756
p4379231.1789813315553843
p4475850.604161808513787
p45135180.8692030603899923
p46126961.1256724778386058
p4766340.5923187265782275
p48101240.8427526759527169
p4991231.1399394359397164
p50100620.715002824571144
p51113511.1206699488621297
p52103640.7075435755786259
p53124701.251005432372871
p54103510.7474767711867472
p55119701.2537171027782605
p56238823.004201549572869
p57328823.17177662240411
p58564252.798629015571265
p59391213.439444150674447
p60238823.075291242844145
p61328822.9152066206633833
p62538822.9608304239155814
p63391212.6408927286999386
p64238822.983030403552391
p65328822.835209675141485
p66538822.9013407680862855
p67396712.5932863885230404
p68238822.906108874079962
p69328822.761170193548807
p70538822.9099048020993763
p71391212.7447113189761865

更详细结果:

p1
9440
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[6, 6, 5, 6, 2, 6, 7, 6, 5, 1]

p2
8126
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[8, 7, 5, 5, 9, 3, 4, 2, 6, 1]

p3
10126
[1, 1, 1, 1, 1, 1, 1, 0, 1, 1]
[9, 6, 5, 8, 4, 5, 3, 0, 5, 5]

p4
12126
[1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
[8, 12, 4, 6, 7, 5, 3, 2, 3, 0]

p5
9375
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[6, 6, 5, 5, 5, 3, 5, 6, 5, 4]

p6
8061
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[7, 3, 6, 3, 5, 8, 3, 3, 8, 4]

p7
10061
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[11, 7, 6, 6, 3, 3, 6, 3, 4, 1]

p8
12061
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[7, 10, 5, 3, 7, 6, 6, 2, 3, 1]

p9
9040
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[6, 7, 4, 5, 4, 6, 5, 7, 1, 5]

p10
7726
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[6, 3, 8, 3, 5, 7, 6, 4, 5, 3]

p11
9726
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[4, 6, 11, 8, 5, 2, 6, 4, 3, 1]

p12
11726
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 6, 2, 5, 5, 5, 8, 10, 3, 4]

p13
12032
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 2, 6, 1, 7, 3, 3, 2, 2, 1, 7, 2, 3, 2, 1, 2, 2, 1, 1, 1]

p14
9180
[1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[4, 1, 0, 5, 0, 2, 1, 2, 2, 4, 5, 1, 4, 3, 4, 3, 1, 1, 3, 4]

p15
13180
[1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1]
[2, 3, 0, 5, 1, 3, 2, 1, 4, 2, 8, 4, 3, 1, 1, 4, 0, 1, 4, 1]

p16
17180
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[0, 4, 3, 4, 3, 2, 1, 2, 4, 2, 1, 4, 2, 3, 3, 2, 2, 2, 1, 5]

p17
12032
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
[3, 4, 3, 2, 2, 2, 4, 6, 3, 1, 4, 1, 1, 2, 3, 2, 3, 1, 3, 0]

p18
9180
[1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[7, 1, 4, 0, 2, 1, 2, 2, 4, 3, 2, 3, 4, 2, 1, 1, 5, 1, 3, 2]

p19
13180
[1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1]
[3, 2, 2, 2, 0, 2, 5, 1, 4, 1, 2, 3, 0, 6, 2, 2, 4, 4, 2, 3]

p20
17180
[1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1]
[4, 3, 4, 2, 3, 1, 1, 6, 0, 1, 3, 0, 1, 4, 3, 1, 2, 2, 5, 4]

p21
12032
[1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1]
[1, 1, 1, 2, 3, 0, 4, 5, 4, 1, 2, 6, 3, 7, 1, 3, 1, 4, 0, 1]

p22
9180
[1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1]
[4, 3, 2, 2, 7, 3, 4, 0, 3, 0, 0, 1, 0, 3, 2, 4, 2, 4, 2, 4]

p23
13180
[1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1]
[2, 1, 2, 2, 2, 3, 3, 5, 0, 1, 4, 3, 4, 3, 6, 0, 0, 4, 2, 3]

p24
17180
[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1]
[4, 1, 3, 4, 2, 2, 4, 6, 3, 0, 4, 3, 1, 4, 1, 1, 1, 2, 0, 4]

p25
19197
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[3, 3, 6, 5, 4, 3, 9, 7, 6, 7, 5, 6, 1, 5, 4, 4, 4, 9, 7, 6, 2, 5, 7, 4, 5, 6, 3, 6, 5, 3]

p26
16131
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[12, 8, 4, 11, 6, 4, 3, 5, 7, 5, 9, 4, 6, 3, 2, 4, 3, 4, 8, 5, 5, 5, 1, 6, 3, 4, 5, 3, 3, 2]

p27
21531
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[5, 6, 6, 7, 5, 5, 6, 8, 5, 7, 3, 3, 7, 3, 5, 6, 6, 5, 1, 6, 6, 3, 2, 3, 7, 6, 4, 3, 8, 3]

p28
26773
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 7, 8, 6, 4, 6, 7, 3, 3, 3, 10, 3, 3, 6, 4, 2, 8, 4, 5, 5, 3, 7, 5, 2, 7, 4, 5, 8, 5, 5]

p29
19305
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[8, 8, 4, 5, 10, 6, 3, 6, 3, 6, 5, 6, 5, 7, 4, 3, 6, 2, 5, 4, 7, 2, 3, 7, 5, 5, 6, 4, 4, 1]

p30
16239
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[7, 7, 10, 5, 6, 10, 5, 3, 3, 9, 4, 5, 3, 4, 6, 4, 1, 4, 4, 5, 3, 6, 5, 6, 5, 6, 5, 3, 2, 4]

p31
21639
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[6, 5, 6, 7, 3, 11, 7, 4, 5, 4, 3, 6, 6, 10, 7, 7, 2, 3, 3, 3, 3, 3, 2, 6, 3, 3, 6, 2, 9, 5]

p32
26773
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[9, 8, 5, 1, 6, 7, 4, 7, 5, 8, 2, 7, 3, 6, 3, 3, 5, 7, 5, 1, 5, 6, 5, 6, 4, 2, 4, 5, 4, 7]

p33
19055
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[3, 8, 4, 12, 1, 8, 4, 2, 1, 4, 8, 7, 5, 6, 2, 6, 10, 3, 4, 5, 5, 11, 2, 2, 5, 2, 6, 6, 4, 4]

p34
15989
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[7, 5, 9, 3, 4, 6, 7, 7, 3, 3, 6, 6, 3, 5, 9, 1, 5, 4, 5, 3, 9, 6, 4, 4, 1, 7, 5, 6, 4, 3]

p35
21389
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[7, 6, 7, 3, 3, 5, 7, 3, 7, 8, 6, 2, 4, 3, 8, 5, 6, 2, 2, 3, 8, 6, 2, 3, 7, 7, 4, 6, 3, 7]

p36
26773
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[9, 3, 6, 2, 6, 4, 10, 5, 5, 3, 10, 2, 1, 6, 5, 7, 5, 6, 6, 3, 4, 5, 3, 3, 6, 8, 6, 5, 4, 2]

p37
19055
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[4, 7, 5, 7, 8, 5, 6, 6, 4, 10, 3, 7, 4, 4, 4, 2, 3, 4, 6, 2, 3, 5, 4, 3, 4, 7, 9, 6, 3, 5]

p38
15989
[1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[4, 6, 6, 4, 6, 6, 9, 0, 6, 7, 0, 8, 6, 7, 7, 9, 3, 4, 3, 3, 7, 8, 3, 5, 1, 4, 6, 4, 2, 6]

p39
21389
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[7, 3, 2, 5, 4, 2, 10, 5, 4, 11, 1, 5, 2, 10, 3, 3, 5, 4, 5, 6, 7, 4, 4, 2, 5, 11, 2, 5, 6, 7]

p40
26773
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 4, 5, 7, 10, 7, 6, 10, 3, 12, 4, 5, 5, 8, 6, 5, 2, 4, 4, 5, 4, 3, 1, 4, 4, 6, 2, 6, 2, 4]

p41
7226
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[7, 10, 12, 12, 10, 11, 9, 8, 5, 6]

p42
10540
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
[5, 2, 9, 1, 5, 7, 3, 2, 3, 2, 5, 4, 5, 4, 4, 5, 3, 6, 5, 0]

p43
7923
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 2, 2, 1, 4, 3, 2, 3, 4, 1, 1, 3, 2, 2, 2, 2, 1, 3, 2, 6, 4, 2, 3, 1, 3, 3, 1, 1, 2, 3]

p44
7585
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[9, 11, 12, 7, 10, 10, 12, 9, 7, 3]

p45
13518
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1]
[5, 3, 5, 7, 3, 5, 6, 4, 7, 4, 4, 3, 2, 0, 4, 3, 4, 4, 3, 4]

p46
12696
[1, 1, 1, 1, 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]
[3, 4, 3, 3, 3, 6, 2, 1, 2, 2, 1, 4, 2, 1, 1, 3, 4, 4, 1, 3, 2, 2, 4, 1, 2, 1, 4, 1, 0, 0]

p47
6634
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[8, 13, 5, 11, 7, 12, 15, 10, 6, 3]

p48
10124
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[5, 3, 2, 4, 3, 3, 6, 3, 2, 5, 6, 9, 4, 3, 3, 2, 3, 8, 5, 1]

p49
9123
[1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[5, 2, 2, 4, 7, 3, 1, 2, 0, 2, 0, 5, 0, 6, 1, 3, 1, 2, 2, 1, 2, 2, 5, 1, 1, 1, 3, 2, 1, 3]

p50
10062
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[10, 8, 9, 14, 9, 10, 13, 13, 10, 4]

p51
11351
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[5, 5, 7, 5, 8, 4, 3, 5, 4, 2, 4, 6, 3, 5, 4, 7, 4, 7, 5, 7]

p52
10364
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[16, 6, 10, 12, 15, 11, 10, 11, 6, 3]

p53
12470
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
[6, 4, 2, 3, 5, 4, 8, 6, 7, 2, 5, 8, 12, 6, 4, 3, 1, 11, 3, 0]

p54
10351
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[9, 18, 17, 14, 7, 11, 6, 6, 11, 1]

p55
11970
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
[4, 11, 4, 8, 4, 6, 3, 7, 3, 7, 7, 7, 6, 3, 2, 5, 2, 7, 4, 0]

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]
[5, 7, 6, 5, 5, 10, 15, 5, 10, 4, 8, 9, 7, 8, 4, 6, 8, 8, 8, 3, 7, 6, 12, 6, 4, 3, 4, 5, 6, 6]

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]
[5, 9, 4, 4, 6, 6, 9, 10, 4, 7, 9, 8, 2, 4, 10, 5, 9, 6, 4, 2, 7, 6, 5, 6, 8, 9, 5, 9, 9, 13]

p58
56425
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[5, 7, 10, 8, 5, 6, 3, 8, 10, 6, 7, 4, 4, 7, 10, 7, 12, 7, 9, 7, 3, 7, 8, 8, 6, 8, 5, 4, 2, 7]

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]
[12, 10, 5, 6, 3, 8, 6, 9, 9, 10, 5, 6, 6, 4, 6, 3, 4, 8, 7, 11, 4, 4, 7, 3, 7, 4, 9, 7, 8, 9]

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]
[6, 10, 4, 4, 12, 5, 10, 4, 4, 6, 6, 8, 6, 6, 10, 8, 10, 11, 3, 11, 4, 7, 7, 11, 4, 2, 7, 5, 3, 6]

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]
[10, 4, 8, 7, 8, 7, 4, 2, 5, 9, 8, 5, 12, 4, 8, 5, 5, 7, 8, 7, 10, 4, 6, 10, 4, 6, 4, 8, 7, 8]

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]
[7, 5, 14, 5, 10, 9, 11, 3, 5, 11, 3, 9, 11, 9, 4, 5, 9, 9, 10, 1, 3, 7, 3, 5, 9, 4, 6, 5, 5, 3]

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]
[7, 7, 8, 4, 8, 9, 5, 5, 5, 3, 6, 5, 9, 11, 7, 8, 7, 10, 4, 4, 8, 9, 6, 7, 6, 5, 7, 9, 7, 4]

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]
[5, 7, 10, 5, 6, 5, 5, 9, 7, 9, 5, 8, 6, 5, 6, 10, 5, 10, 7, 7, 3, 3, 6, 6, 6, 5, 7, 9, 10, 8]

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]
[4, 13, 13, 4, 5, 11, 7, 6, 4, 8, 7, 2, 9, 6, 8, 5, 5, 9, 5, 9, 3, 10, 4, 7, 3, 9, 6, 7, 9, 2]

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]
[3, 6, 9, 5, 10, 6, 3, 7, 7, 2, 7, 4, 10, 8, 6, 10, 5, 5, 3, 9, 5, 4, 6, 10, 13, 6, 6, 6, 9, 10]

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]
[6, 8, 5, 6, 6, 10, 8, 9, 9, 9, 6, 6, 5, 5, 6, 8, 8, 6, 5, 5, 5, 4, 11, 9, 6, 8, 6, 8, 4, 3]

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]
[4, 9, 7, 7, 5, 7, 3, 3, 7, 12, 8, 4, 10, 8, 9, 4, 3, 9, 4, 3, 7, 11, 4, 7, 9, 6, 8, 6, 8, 8]

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]
[4, 5, 7, 8, 11, 9, 9, 6, 10, 2, 8, 8, 2, 9, 8, 9, 9, 6, 8, 1, 6, 7, 9, 6, 8, 5, 2, 8, 7, 3]

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]
[11, 2, 6, 6, 13, 8, 5, 8, 14, 5, 3, 7, 5, 10, 7, 7, 7, 2, 4, 4, 5, 10, 5, 7, 7, 10, 4, 4, 5, 9]

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]
[4, 8, 10, 5, 7, 8, 5, 13, 5, 8, 6, 5, 7, 6, 3, 2, 11, 4, 5, 10, 4, 6, 5, 3, 10, 13, 6, 6, 11, 4]


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值