Python:狄克斯特拉算法解析
狄克斯特拉算法是一種廣泛應用于加權(quán)圖的最短路徑計算問題的算法。它適用于有向無環(huán)正權(quán)重的圖,但不適用于負權(quán)重的圖。本文將為您詳細介紹狄克斯特拉算法的實現(xiàn)步驟。1. 畫出權(quán)重圖首先,我們需要畫出一個帶有權(quán)
狄克斯特拉算法是一種廣泛應用于加權(quán)圖的最短路徑計算問題的算法。它適用于有向無環(huán)正權(quán)重的圖,但不適用于負權(quán)重的圖。本文將為您詳細介紹狄克斯特拉算法的實現(xiàn)步驟。
1. 畫出權(quán)重圖
首先,我們需要畫出一個帶有權(quán)重的圖,即各個點之間的距離及方向。使用Python中的networkx和matplotlib庫可以輕松實現(xiàn)這一步驟,代碼如下:
```
import networkx as nx
import as plt
實例化一個空地圖G
G nx.DiGraph()
添加邊
_edge(0, 1, len80)
_edge(1, 2, len50)
_edge(1, 3, len30)
_edge(3, 2, len10)
_edge(2, 4, len20)
_edge(2, 5, len30)
_edge(4, 5, len10)
_edge(5, 3, len5)
_edge(2, 6, len10)
_edge(4, 6, len10)
_edge(3, 6, len25)
_edge(5, 6, len35)
nx.draw(G,with_labelsTrue)
('狄克斯特拉.png', bbox_inches'tight')
```
運行以上代碼,可以得到一個名為“狄克斯特拉”的加權(quán)有向圖。
2. 編寫狄克斯特拉算法函數(shù)
接下來,我們需要編寫一個狄克斯特拉算法的函數(shù)。該函數(shù)的輸入?yún)?shù)為權(quán)重圖、起點和終點,輸出結(jié)果為最短路徑以及對應的距離。以下是函數(shù)的實現(xiàn)代碼:
```
def Dijkstra(G, start, end):
dist {} 記錄各點到起點的距離
previous {} 記錄前驅(qū)節(jié)點
for v in ():
將所有節(jié)點的距離初始化為無窮大
dist[v] float('inf')
previous[v] 'none'
dist[start] 0
u start
while u ! end:
獲取當前距離起點最近的節(jié)點
u min(dist, key)
dist_u dist[u]
del dist[u]
for u, v in G.edges(u):
if v in dist:
計算經(jīng)過u到達v的長度
alt dist_u G[u][v]['len']
if alt < dist[v]:
dist[v] alt
previous[v] u
print('The shortest path is ' str(alt))
path (end,)
last end
while last ! start:
nxt previous[last]
path (nxt,) 元組相加
last nxt
return path
```
在上面的函數(shù)中,我們先將所有節(jié)點的距離初始化為無窮大,然后選取起點開始遍歷圖,尋找距離其最近的節(jié)點,并更新與它相鄰的節(jié)點的距離。遍歷結(jié)束后,我們可以根據(jù)previous數(shù)據(jù)結(jié)構(gòu)獲取最短路徑。
3. 計算最短路徑
比如,如果我們想要算出從0到6的最短距離及路徑,只需調(diào)用上述函數(shù)并傳入?yún)?shù)即可,代碼如下:
```
rs reversed(Dijkstra(G, 0, 6))
print(tuple(rs))
```
運行以上代碼,可以得到以下結(jié)果:
```
The shortest path is 30
The shortest path is 80
The shortest path is 60
The shortest path is 40
The shortest path is 50
The shortest path is 55
(6, 2, 3, 1, 0)
```
因此,從0到6的最短路徑為(6, 2, 3, 1, 0),距離為55。
總結(jié)
本文為您詳細介紹了狄克斯特拉算法的實現(xiàn)步驟。通過畫出權(quán)重圖、編寫算法函數(shù)以及計算最短路徑,我們可以快速便捷地解決加權(quán)圖的最短路徑計算問題。