日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分支限界发:Dijkstra算法

發布時間:2024/9/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分支限界发:Dijkstra算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從分支限界的角度來看Dijkstra算法:

Dijkstra算法是基于貪心的廣度優先搜索,也可以看成分支限界法,從分支限界的角度來看,Dijkstra算法看起來就更加清晰明了

代碼實現:

# ============================================================================= # 分支限界法,dijkstra算法 # 首先解空間[起點0,頂點1,當點2,...,頂點n-1]看成[起點,剩余n-1個頂點的排列樹] # 下界函數bound()是什么了? # 可以參考貨郎問題:下屆為 已走過的路+未走過的路(未走過的結點的最小出邊和) # 同時我們可以優化下界函數,我們知道起點到最后一個頂點的最短距離,那么他途徑得的頂點 # 都是最短距離,那么我們可以把頂點到起點的最短距離當作下界 # =============================================================================import heapq def dijkstra(graph,start):# 解空間的長度vnum = len(graph)# 優先級隊列pqueue = []# 把起點放入隊列,[頂點到起點的距離,前驅結點,當前結點]heapq.heappush(pqueue,(0.0,None,start))# 有兩個用途:一是用來標記那些頂點已經訪問了,二是用于存儲前驅結點,用于解的追蹤# 在這里為什么可以用它標記已訪問的結點和追蹤解,實際上這種貪心策略,已經保證到底時,就# 可以得到最優解了,一般的限界分支,可能還需要跑到離root很近的結點再往下走,每個結點# 需要記錄前驅結點和已訪問的結點。 paths = {vertex : None for vertex in graph}# depth可以放在活結點里depth = 0# 循環體出口時是解滿了,之前看起來很神奇的出口,現在就看起來很平常了while depth < vnum :# 彈出結點pair = heapq.heappop(pqueue)distance = pair[0]parent = pair[1]vertex = pair[2]# 加入結點已經訪問過了,就直接彈出下一個結點if paths[vertex]:continue# 把該節點到起點的最短距離和前驅結點保存起來,并記錄該節點已經訪問過了paths[vertex] = (parent,distance)# 把該節點的子節點放入優先級隊列,這里進行了剪枝,只放入和當前結點相連的結點# 不相連的結點,認為距離為無窮,沒有必要放入到優先級隊列# 以下是相連的邊的終點頂點,把他們放入優先級隊列edges = graph[vertex]for v in edges:# 加入終結點已經訪問過,就沒有必要加入,這是一個排列樹if paths[v] is None:# 把這個頂點到起點的距離,這個結點,前驅結點加入隊列,# 這個頂點到起點的距離:源節點的最短距離+他們的邊的長度heapq.heappush(pqueue,(distance + graph[vertex][v],vertex,v))# 進入下一層,這個策略由于上面的continue保證了,每次到這兒可以進入下一層了,# 也可以把depth放到活結點里,放到活結點,就必須要注意循環體的退出depth += 1return pathsg = {'A':{'B':1,'C':2},'B':{'A':1,'C':3,'D':4},'C':{'A':2,'B':3,'D':5,'E':6},'D':{'B':4,'C':5,'E':7,'F':8},'E':{'C':6,'D':7,'G':9},'F':{'D':8},'G':{'E':9}}t=dijkstra(g,'A') print(t)runfile('D:/share/test/dijkstra_prune.py', wdir='D:/share/test') {'A': (None, 0.0), 'B': ('A', 1.0), 'C': ('A', 2.0), 'D': ('B', 5.0), 'E': ('C', 8.0), 'F': ('D', 13.0), 'G': ('E', 17.0)}

總結

以上是生活随笔為你收集整理的分支限界发:Dijkstra算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。