交通地理與網路科學/迪傑斯特拉演算法
外觀
迪傑斯特拉演算法是一種廣泛使用的圖搜尋演算法,它解決有非負邊權重的圖的單源最短路徑問題,產生一個最短路徑樹。該演算法由 Edsger W. Dijkstra 於 1956 年開發,適用於有向圖和無向圖。它常用於路由,以及其他需要在加權圖中查詢節點間最短路徑的應用。
對於前面定義的有向圖 ,迪傑斯特拉演算法可用於計算從源節點 到網路中其他每個節點的最短(旅行時間)路徑。令 為 的距離矩陣,其中 表示從節點 到節點 的連結的長度(旅行時間)。如果節點 和 不相連,則 中的對應元素是一個非常大的數字。
令節點集 被分成兩個子集: 和 。 表示從 出發的最短路徑已知的節點集,而 是 的補集。令 表示 中節點的永久標籤向量。節點的永久標籤是從原點節點 出發的最短距離。令 是 中節點沿最短路徑相鄰的節點集。令 是 中節點的臨時標籤向量。以下步驟解釋了演算法
- 初始化: 設定 ,並將一個大數分配給 的所有元素。
- 節點探索: 查詢與任何父節點 相鄰的所有子節點,這些子節點不在 中,使用距離矩陣 。計算每個子節點 的臨時標籤,方法是將父節點 從向量 中的永久標籤與連結長度 相加。
- 節點選擇: 選擇具有最小臨時標籤的節點,並將其新增到集合 的末尾,並將其從 中刪除。將相應的父節點 新增到集合 的末尾,並將相應的臨時標籤新增到 。使用更新後的 ,重複步驟 2 和 3,直到 中沒有元素。
要獲得從起點節點 到網路中任何其他節點的最短路徑長度,請找到目標節點在 中的位置,並讀取 中對應位置的元素。要獲得最短路徑本身,請找到目標節點 在 中的位置,讀取 中相同位置的元素,並重復此過程,直到在 中到達節點 為止(即,反向跟蹤最短路徑直到到達起點)。以這種方式計算出的從起點節點 到目標節點 的最短路徑上的連結被分配到一個集合 中。
上述演算法針對單個起點節點 執行,但為了獲得從每個節點到每個其他節點的最短路徑,以便進行出行分配和交通分配,Dijkstra 演算法應該針對圖 中的每個節點執行。
該演算法的更多細節可以在 [1] 中找到。
參考資料
[edit | edit source]- ↑ Dijkstra's algorithm http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm