最短路徑問題是圖論研究中的一個經典演算法問題, 旨在尋找圖(由結點和路徑組成的)中兩結點之間的最短路徑。 演算法具體的形式包括:
用於解決最短路徑問題的演算法被稱做「最短路徑演算法」, 有時被簡稱作「路徑演算法」。 最常用的路徑演算法有:
Description:
在一個有向圖形 G=(V,E), G 中的每一個邊都有一個比例常數 W(Weight) 與之對應, 如果想求 G 圖形中某一點V0 到其他頂點的最少 W 總和之值, 這類問題就稱為最短路徑問題 (The shortest path problem). 這裡首先討論單點對全部頂點的最短距離, 而一個頂點到多個頂點通常使用 Dijkstra 演算法求得. 接著會在 Dijkstra's algorithm 用到下面的變數:
Dijkstra’s algorithm:
首先來看看這個演算法的 pseudo code:
- DIJKSTRA(G, w, s)
- 1 INITIALIZE-SINGLE-SOURCE(G, s)
- 2 S = ∅
- 3 Q = G.V
- 4 while Q != ∅
- 5 u = EXTRACT-MIN(Q)
- 6 S = S ∪ {u}
- 7 for each vertex v ∈ G.Adj[u ]
- 8 RELAX(u,v, w)
Example:
1. 接著我們來看一個範例, 假設有下面 Graph, 我們要計算從 vertex 0 到每一個 vertex 的最短距離. 所以一開始處理 vertex 0 後 S={"0"} ; Q={"1","2","3","4","5"}. 因為 vertex 3 距離最短 (v.d=10), 故取它當作下一個處理的 vertex
2. 在處理 vertex 3 時, 發現原本 vertex 4 的最短路徑為 ∞ > (到 vertex 3 最短路徑 = 10) + (vertex 3 到 vertex 4 的 cost = 15)=25, 故更新 vertex 4 的最短距離 (v.d=25). 此時 S={"0", "3"} ; Q={"1","2","4","5"}, 因為 vertex 4 距離最短, 故取它當作下一個處理的 vertex:
3. 在處理 vertex 4 時, 發現原本 vertex 1 的最短路徑為 50 > (到 vertex 4 最短路徑 = 25) + (vertex 4 到 vertex 1 的 cost = 20)=45, 故更新 vertex 1 的最短距離 (v.d=45). 此時 S={"0", "3", "4"} ; Q={"1","2","5"}, 因為 vertex 1 與 vertex 2 距離最短, 而我們取 vertex 1 作下一個處理:
4. 在處理 vertex 1 時, 唯一會碰到不屬於集合 S 的 vertex 2 並不會使原先 vertex 2 最短路徑變短 ((45+10=55)>45). 此時 S={"0", "1", "3", "4"} ; Q={"2","5"}, 因為 vertex 2 距離最短, 故取它當作下一個處理的 vertex:
5. 在處理 vertex 2 時並部會碰到任何不屬於集合 S 的 vertex. 故不做任何處理; 同樣的剩下的 vertex5 也是如此. 故此時集合 Q 已經成為空集合並結束整個演算法.
Supplement:
* [ Data Structures with Java ] Section 25.5 : Dijkstra's Minimum-Path Algorithm
* [ 資料結構 小學堂 ] 圖形結構 : 圖形最短路徑 (單點對全部頂點)
* NTU 2013 course - DSA : 4/30 Graph3
沒有留言:
張貼留言