Python基于回溯法子集樹(shù)模板解決旅行商問(wèn)題(TSP)實(shí)例
本文實(shí)例講述了Python基于回溯法子集樹(shù)模板解決旅行商問(wèn)題(TSP)。分享給大家供大家參考,具體如下:
問(wèn)題
旅行商問(wèn)題(Traveling Salesman Problem,TSP)是旅行商要到若干個(gè)城市旅行,各城市之間的費(fèi)用是已知的,為了節(jié)省費(fèi)用,旅行商決定從所在城市出發(fā),到每個(gè)城市旅行一次后返回初始城市,問(wèn)他應(yīng)選擇什么樣的路線才能使所走的總費(fèi)用最短?

分析
此問(wèn)題可描述如下:G=(V,E)是帶權(quán)的有向圖,找到包含V中每個(gè)結(jié)點(diǎn)一個(gè)有向環(huán),亦即一條周游路線,使得這個(gè)有向環(huán)上所有邊成本之和最小。
這個(gè)問(wèn)題與前一篇文章http://m.fzitv.net/article/122933.htm的區(qū)別就是,本題是帶權(quán)的圖。只要一點(diǎn)小小的修改即可。
解的長(zhǎng)度是固定的n+1。
對(duì)圖中的每一個(gè)節(jié)點(diǎn),都有自己的鄰接節(jié)點(diǎn)。對(duì)某個(gè)節(jié)點(diǎn)而言,其所有的鄰接節(jié)點(diǎn)構(gòu)成這個(gè)節(jié)點(diǎn)的狀態(tài)空間。當(dāng)路徑到達(dá)這個(gè)節(jié)點(diǎn)時(shí),遍歷其狀態(tài)空間。
最終,一定可以找到最優(yōu)解!
顯然,繼續(xù)套用回溯法子集樹(shù)模板?。?!
代碼
'''旅行商問(wèn)題(Traveling Salesman Problem,TSP)'''
# 用鄰接表表示帶權(quán)圖
n = 5 # 節(jié)點(diǎn)數(shù)
a,b,c,d,e = range(n) # 節(jié)點(diǎn)名稱
graph = [
{b:7, c:6, d:1, e:3},
{a:7, c:3, d:7, e:8},
{a:6, b:3, d:12, e:11},
{a:1, b:7, c:12, e:2},
{a:3, b:8, c:11, d:2}
]
x = [0]*(n+1) # 一個(gè)解(n+1元數(shù)組,長(zhǎng)度固定)
X = [] # 一組解
best_x = [0]*(n+1) # 已找到的最佳解(路徑)
min_cost = 0 # 最小旅費(fèi)
# 沖突檢測(cè)
def conflict(k):
global n,graph,x,best_x,min_cost
# 第k個(gè)節(jié)點(diǎn),是否前面已經(jīng)走過(guò)
if k < n and x[k] in x[:k]:
return True
# 回到出發(fā)節(jié)點(diǎn)
if k == n and x[k] != x[0]:
return True
# 前面部分解的旅費(fèi)之和超出已經(jīng)找到的最小總旅費(fèi)
cost = sum([graph[node1][node2] for node1,node2 in zip(x[:k], x[1:k+1])])
if 0 < min_cost < cost:
return True
return False # 無(wú)沖突
# 旅行商問(wèn)題(TSP)
def tsp(k): # 到達(dá)(解x的)第k個(gè)節(jié)點(diǎn)
global n,a,b,c,d,e,graph,x,X,min_cost,best_x
if k > n: # 解的長(zhǎng)度超出,已走遍n+1個(gè)節(jié)點(diǎn) (若不回到出發(fā)節(jié)點(diǎn),則 k==n)
cost = sum([graph[node1][node2] for node1,node2 in zip(x[:-1], x[1:])]) # 計(jì)算總旅費(fèi)
if min_cost == 0 or cost < min_cost:
best_x = x[:]
min_cost = cost
#print(x)
else:
for node in graph[x[k-1]]: # 遍歷節(jié)點(diǎn)x[k-1]的鄰接節(jié)點(diǎn)(狀態(tài)空間)
x[k] = node
if not conflict(k): # 剪枝
tsp(k+1)
# 測(cè)試
x[0] = c # 出發(fā)節(jié)點(diǎn):路徑x的第一個(gè)節(jié)點(diǎn)(隨便哪個(gè))
tsp(1) # 開(kāi)始處理解x中的第2個(gè)節(jié)點(diǎn)
print(best_x)
print(min_cost)
效果圖

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- python 回溯法模板詳解
- Python基于回溯法子集樹(shù)模板解決選排問(wèn)題示例
- Python基于回溯法子集樹(shù)模板解決全排列問(wèn)題示例
- Python基于回溯法子集樹(shù)模板解決m著色問(wèn)題示例
- Python基于回溯法子集樹(shù)模板實(shí)現(xiàn)圖的遍歷功能示例
- Python基于回溯法子集樹(shù)模板解決取物搭配問(wèn)題實(shí)例
- Python基于回溯法子集樹(shù)模板解決數(shù)字組合問(wèn)題實(shí)例
- Python基于回溯法子集樹(shù)模板解決0-1背包問(wèn)題實(shí)例
- Python基于回溯法子集樹(shù)模板實(shí)現(xiàn)8皇后問(wèn)題
- Python回溯法(Backtracking)的具體使用
相關(guān)文章
Python獲取網(wǎng)段內(nèi)ping通IP的方法
Python中range()與np.arange()的具體使用
python3.7 openpyxl 在excel單元格中寫(xiě)入數(shù)據(jù)實(shí)例
Python爬蟲(chóng)框架Scrapy基本用法入門(mén)教程
Pandas DataFrame 篩選數(shù)據(jù)幾種方法實(shí)現(xiàn)

