簡體   English   中英

解讀Dijkstra的算法

[英]Interpreting Dijkstra's Algorithm

圖形

我理解如何找到Dijkstra算法所解釋的從開始到結束的最短路徑,我不明白的是解釋。 在這里,從圖片中的圖表,從A到E添加到我的已知集合的順序是A,C,B,D,F,H,G,E我得不到的是,如何獲得從A到A的路徑E如圖所示(數學方面)

每個節點都有一個父節點。 當你到達'E' ,你只需看看它的父母,依此類推,直到找到'A' 這樣您就可以按相反的順序找到列表。 將列表反轉以查找從'A''E'的路徑。

如果您按順序追加,您的父母列表將為'E' 'G' 'H' 'F' 'B' 'A'

注意:“父節點”是表的“路徑”列中指示的節點

考慮包含要遍歷的路徑的最小優先級隊列,其中路徑在隊列上的優先級是遍歷從根到包括該邊的路徑中的邊的成本。 在算法的每個步驟中,從隊列中彈出最低成本路徑,並考慮其每個事件邊緣,使用該事件邊緣擴展路徑,並按優先級順序將新路徑推回到隊列中。 重復,直到第一條路徑到達目的地。

例如:

  1. 從空隊列<>
  2. 然后,從根A ,將所有事件邊緣( A->BA->CA->D為成本2,1和4)放入隊列並按優先級排序: <(A->C,1),(A->B,2),(A->D,4)>
  3. 從隊列前面彈出最小優先級路徑A->C ,然后考慮事件到路徑C末尾的邊緣,並將這些路徑推回隊列(保持優先級順序): <(A->B,2),(A->D,4),(A->C->A,10),(A->C->E,12)>
  4. 重復,彈出最小優先級路徑A->B off並擴展具有入射邊緣的路徑: <(A->D,4),(A->B->F,4),(A->B->C,7),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
  5. 繼續......彈出A->D並推動更多的入射邊緣: <(A->B->F,4),(A->D->C,6),(A->B->C,7),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
  6. 彈出A->B->F並推動更多的入射邊緣: <(A->D->C,6),(A->B->C,7),(A->B->F->H,7),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
  7. pop A->D->C - 但是,我們已經以較低的成本路徑到達C ,因此可以忽略它。
  8. 彈出A->B->C並忽略它。
  9. 彈出A->B->F->H並推動更多的入射邊緣: <(A->B->F->H->G,8),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
  10. 彈出A->B->F->H並推動更多的入射邊緣: <(A->B->F->H->G->F,10),(A->C->A,10),(A->B->F->H->G->E,11),(A->B->E,12),(A->C->E,12)>
  11. 彈出A->B->F->H->G->F並忽略它。
  12. 彈出A->C->A並忽略它。
  13. 彈出A->B->F->H->G->E ,我們達到了目標(成本為11)!

從起始節點開始,在將圖形遍歷到可用節點時進行累積權重計算。 將從一個節點到相鄰節點的累積權重與任何先前結果(即,到該節點的可能遍歷)進行比較。 然后選擇具有最低累積權重的路線作為“贏家”。 重復該過程,直到找到從開始到終端節點的路徑並評估為最低累積權重。

所以在示例中您已經顯示:

  • ACE = 12
  • ADCE = 17
  • ABE = 12

ABFHGE是從開始到結束時剩余的唯一路徑(在有向圖內),最低累積權重為11(也是最長路徑)。

當你從頭開始計算時,一些路徑最初可能看起來更短(AC),但隨着算法的進展,這些選擇被放棄,因為探索了從A到E的所有路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM