分支限界法---旅行售货员问题

2018-12-24 09:05:44来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

 1 N: int = 4
 2 MAX_WEIGHT: int = 4000
 3 NO_PATH: int = -1
 4 City_Graph = [[int('0')] * (N+1) for _ in range(N+1)]  # 初始化dp
 5 x = [int('0') * (N+1) for _ in range(N+1)]  # 保存第i步便利的城市
 6 isIn = [int('0') * (N+1) for _ in range(N+1)]  # 保存城市i是否已加入路径
 7 bestx = [int('0') * (N+1) for _ in range(N+1)]  # 最优路径
 8 
 9 
10 def Travel_Backtrack(t: int):
11     global bestw, cw
12     if t > N:  # 走完了,输出结果
13         for i in range(1, N+1):  # 输出当前路径
14             print(x[i], end=" ")
15         print()
16         if cw < bestw:
17             for i in range(1, N + 1):
18                 bestx[i] = x[i]
19             bestw = cw
20         return
21     else:
22         for j in range(1, N+1):
23             if City_Graph[x[t - 1]][j] != NO_PATH and (not isIn[j]):  # 能到而且没有加入到路径中
24                 isIn[j] = 1
25                 x[t] = j
26                 cw = cw + City_Graph[x[t - 1]][j]
27                 Travel_Backtrack(t+1)
28                 isIn[j] = 0
29                 x[t] = 0
30                 cw = cw - City_Graph[x[t - 1]][j]
31 
32 
33 if __name__ == '__main__':
34     City_Graph[1][1] = NO_PATH
35     City_Graph[1][2] = 30
36     City_Graph[1][3] = 6
37     City_Graph[1][4] = 4
38 
39     City_Graph[2][1] = 30
40     City_Graph[2][2] = NO_PATH
41     City_Graph[2][3] = 5
42     City_Graph[2][4] = 10
43 
44     City_Graph[3][1] = 6
45     City_Graph[3][2] = 5
46     City_Graph[3][3] = NO_PATH
47     City_Graph[3][4] = 20
48 
49     City_Graph[4][1] = 4
50     City_Graph[4][2] = 10
51     City_Graph[4][3] = 20
52     City_Graph[4][4] = NO_PATH
53     # print(City_Graph)
54     for i in range(1, N+1):
55         x[i] = 0
56         bestx[i] = 0
57         isIn[i] = 0
58     x[1] = 1  # 第一步走城市1
59     isIn[1] = 1  # 第一个城市加入路径
60     bestw = MAX_WEIGHT  # 最优路径总权值
61     cw = 0  # 当前路径总权值
62 
63     Travel_Backtrack(2)  # 从第二步开始选择城市
64     print("最优值为", bestw)
65     print("最优解为:")
66     for i in range(1, N+1):
67         print(bestx[i], end=" ")
68     print()

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Kasaraju算法--强连通图遍历及其python实现

下一篇:python之约束, 异常处理, md5