1. 程式人生 > >分支限界法---旅行售貨員問題

分支限界法---旅行售貨員問題

 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()