跳轉到內容

交通地理與網路科學/迪傑斯特拉演算法

來自華夏公益教科書,開放的書籍,為開放的世界

迪傑斯特拉演算法是一種廣泛使用的圖搜尋演算法,它解決有非負邊權重的圖的單源最短路徑問題,產生一個最短路徑樹。該演算法由 Edsger W. Dijkstra 於 1956 年開發,適用於有向圖和無向圖。它常用於路由,以及其他需要在加權圖中查詢節點間最短路徑的應用。

有向圖的迪傑斯特拉演算法

[編輯 | 編輯原始碼]

對於前面定義的有向圖 ,迪傑斯特拉演算法可用於計算從源節點 到網路中其他每個節點的最短(旅行時間)路徑。令 的距離矩陣,其中 表示從節點 到節點 的連結的長度(旅行時間)。如果節點 不相連,則 中的對應元素是一個非常大的數字。

令節點集 被分成兩個子集: 表示從 出發的最短路徑已知的節點集,而 的補集。令 表示 中節點的永久標籤向量。節點的永久標籤是從原點節點 出發的最短距離。令 中節點沿最短路徑相鄰的節點集。令 中節點的臨時標籤向量。以下步驟解釋了演算法

  • 初始化: 設定 ,並將一個大數分配給 的所有元素。
  • 節點探索: 查詢與任何父節點 相鄰的所有子節點,這些子節點不在 中,使用距離矩陣 。計算每個子節點 的臨時標籤,方法是將父節點 從向量 中的永久標籤與連結長度 相加。
  • 節點選擇: 選擇具有最小臨時標籤的節點,並將其新增到集合 的末尾,並將其從 中刪除。將相應的父節點 新增到集合 的末尾,並將相應的臨時標籤新增到 。使用更新後的 ,重複步驟 2 和 3,直到 中沒有元素。

要獲得從起點節點 到網路中任何其他節點的最短路徑長度,請找到目標節點在 中的位置,並讀取 中對應位置的元素。要獲得最短路徑本身,請找到目標節點 中的位置,讀取 中相同位置的元素,並重復此過程,直到在 中到達節點 為止(即,反向跟蹤最短路徑直到到達起點)。以這種方式計算出的從起點節點 到目標節點 的最短路徑上的連結被分配到一個集合 中。

上述演算法針對單個起點節點 執行,但為了獲得從每個節點到每個其他節點的最短路徑,以便進行出行分配和交通分配,Dijkstra 演算法應該針對圖 中的每個節點執行。

該演算法的更多細節可以在 [1] 中找到。

參考資料

[edit | edit source]
華夏公益教科書