Dijkstra演算法 尋找最優路徑

2021-10-01 22:20:36 字數 2712 閱讀 8627

一般情況下, dijkstra演算法是解決單源最短路徑問題的, 也就是在已知終點時, 求出圖中的每個點到終點的最短距離, 但是一般只記錄距離值, 不會記錄具體的路徑, 即怎麼走能從起點通過最短路徑來到達終點;

思路就是引入乙個path表, 其中path[x]表示, 如果從x節點要到達終點的最短路徑, 在x節點下一步應該怎麼走, 獲得這個path表之後, 我們只需要從起點回溯這個path表, 直到終點位置, 這樣就能找到從起點到終點的最短路徑了; 類似於下面這樣的操作:

nodes =

u = nf

while u!=nt:

u = path[u]

先放一段普通的dijkstra演算法的python實現

def

generatedisarray

(nf, nt, inf=

float

("inf"))

: dis =

dict

((k.getid(

),inf)

for k in net.getnodes())

heap =

# u is the next node to be relaxed

u = nf

dis[u]=0

[0, u]

)while

len(heap)

>0:

pid = p[1]

pdis = p[0]

if dis[pid]

< pdis :

continue

for x in adjacencylist[pid]

:if dis[x]

> dis[pid]

+adjacencylist[pid]

[x]:

dis[x]

= dis[pid]

+adjacencylist[pid]

[x]# 這裡的if判斷是為了處理一些沒有出度的點, 這些點不可能作為中間節點來鬆弛

if adjacencylist.__contains__(x)

==true

:[dis[x]

, x]

)if pid==nt:

print

("good luck!!!!"

)return dis

return dis;

這裡我加了乙個小剪枝, 因為我其實只希望找從節點nf到節點nt的最短路徑, 所以我第一次對nf節點做鬆弛操作的時候, 其實已經可以確定此時已經找到了到nf到nt的最短路了, 後面的迴圈都不需要了;

然後上改進之後的dijkstra演算法:

def

generatedisarray

(nf, nt, inf=

float

("inf"))

: dis =

dict

((k.getid(

),inf)

for k in net.getnodes())

path =

heap =

# u is the next node to be relaxed

u = nf

dis[u]=0

[0, u]

)while

len(heap)

>0:

pid = p[1]

pdis = p[0]

if dis[pid]

< pdis :

continue

for x in adjacencylist[pid]

:if dis[x]

> dis[pid]

+adjacencylist[pid]

[x]:

dis[x]

= dis[pid]

+adjacencylist[pid]

[x] path[x]

= pid

# 這裡的if判斷是為了處理一些沒有出度的點, 這些點不可能作為中間節點來鬆弛

if adjacencylist.__contains__(x)

==true

:[dis[x]

, x]

)if pid==nt:

print

("good luck!!!!"

)return dis, path

return dis, path;

dis = generatedisarray(nf, nt)

edges =

u = net.getnode(nt)

while u.getid(

)!=nf:

for e in u.getincoming():

if e.allows(newvehicletype)

==false

:continue

;#這裡的意思就是從當前節點到下一節點的消耗, 加上下一節點的dis值如果等於當前節點的dis值

#那麼就認為走這個節點是最優的路徑

if e.getlanes()[

0].getlength(

)+dis[e.getfromnode(

).getid()]

==dis[u.getid()]

:str

(e.getid())

) u = e.getfromnode(

)break

Dijkstra最優路徑的演算法

dijkstra最優路徑的演算法 最短路徑演算法 在日常生活中,我們如果需要常常往返a地區和b地區之間,我們最希望知道的可能是從a地區到b地區間的眾多路徑中,那一條路徑的路途最短。最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖 由結點和路徑組成的 中兩結點之間的最短路徑。演算法具體的形式包...

最優路徑之 Dijkstra

求在乙個加權有向無環圖中,從起點到終點的最短路徑 圖中有四個節點,分別為 start,a,b,end 各個節點間的路徑長度如下 start a 6 start b 2 a end 1 b a 3 b end 5 終點 無 答案 最短路徑為 start b a end 6 usr bin env py...

題目 Dijkstra 列舉 路

時間限制 1 sec 記憶體限制 128 mb 題目描述 farmer john 熱衷於散步,每天早上他都要從 1 號倉庫走到 n 號倉庫。farmer john 家的 n 個倉庫被 m 條雙向道路連通起來,每條道路有乙個長度 w。而farmer john 又不喜歡走路,所以他走的是從 1 號倉庫到...