k 條最短路徑問題在條件的限制上可分為兩類:(1)不允許迴圈(Simple Path) 與(2) 允許迴圈(Looping Path)。如圖 2.1 所示:
O D
(a) 不允許迴圈路徑 (b) 允許迴圈路徑
圖 2.1 允許迴圈與不允許迴圈路徑
不允許迴圈路徑表示該路徑上,同一個節點只能被訪問一次,以 Yen(1971)的解法 為代表,之後的 Lawler(1976) , Katoh(1982),Hadjiconstantinou and Christofides (1999), Pascoal (2005) 皆沿續其想法進行研究。允許迴圈路徑則是允許重複訪問同一個點。
Martins (1984), Azevedo(1993), Eppstein(1998)的研究皆屬於這個範圍。無論是否允許迴 圈產生,Azevedo (1993)將 k 條最短路徑的相關研究,根據其演算核心分為三類。(1)最 佳原則產生法(Principle of Optimality Method)、(2)循序產生法(Iterative Method)、(3)網路 擴大法(Network Enlargement Method),以下分別加以介紹:
2.1.1 最佳原則產生法
由 Yen(1971)提出,核心觀念為第 k 條路徑必由第 j 條路徑分叉出來( j = 1..k-1 )。其演算流程概述如下:首先產生第一條最短路徑,沿此路徑上每一個點都 分別產生一條新的最短路徑連到終點,與分岔點以前的路徑相連結即可獲得一條新 的路徑,將這所有的路徑放入候選區,選出其中最小成本的即為次短路徑。再仿照 此方法將第二條最短路徑的所有節點再分叉出一條路徑,與第一條最短路徑所分叉 出的路徑混合比較,取出其中最短的做為第三條路徑。如此執行 k 次即可得到 k 條 最短路徑。
Lawler(1976)的作法與 Yen 類似,他將連接該起迄點的所有路徑視為一個集 合,第一次運算時利用最短路徑將整個最短路徑集合分割成數個子集合,切割方式 乃是以該路徑上的每一個點做為切割點,所有由該路徑所分岔產生的路徑,皆視為 同一個子集合,這些子集合內最短的路徑即為次短路徑。下一次再利用該次短路徑 將產出該路徑的子集合再分割為多個子集合,此時除了已選出的路徑外,所有的子
6
-集合內的最短路徑,即為第三條最短路徑。其演算法示意圖如圖 2.2:
圖 2.2 Lawler 演算法示意圖
圖 2.1.a 中,S0,1是所有的路徑,P(S0,1)則是整個集合內的最短路徑,假設該路 徑上共有四個點,由於終點無法產生分岔路徑,因此 P(S0,1)將整個集合切成
S1,1 ,S1,2 ,S1,3 三個集合,如圖 2.1.b 所示,切割方式與 Yen 的做法相同,從 P(S0,1)上
第一個點分叉得來的所有路徑,屬於 S1,1,第二個點分叉得來的所有路徑,屬於 S1,2, 第三個點分叉得來的所有路徑,屬於 S1,3。這三個集合內的最短路徑分別為 P(S1,1), P(S1,2), P(S1,3),而其中最短的路徑就是第二條最短路徑。此分法與 Yen 的方法類似,
只是解釋的觀點不同。
Katoh(1982)針對 Yen 的演算法進行改進,在 Yen 的方法中,每一次的運算k 產生的候選路徑數量,等於第 k-1 運算所得的路徑的總節點數。因此 Katoh 演算法 的核心概念在於減少可行解的量。於每次的運算中將該次應產生的候選路徑利用一 個虛擬點 Vd(Pk)分為三個集合,在 Vd(Pk)點前所分叉的路徑集合、在 Vd(Pk)點分叉的路 徑、以及在 Vd(Pk)點後分叉的路徑集合,從中選擇最成本最小的做為候選路徑。透 過這個想法,理論上每次運算只會產生三條候選路徑,但實際上每一個集合內的路 徑選擇也同樣必須花費大量運算時間,只是節省了理論上的計算複雜度。
2.1.2 循序產生法
Shier(1976)提出不少類似的矩陣運算方法求解一對多的 k 條最短路徑,在此僅 就常被引用的雙向掃描法(Double-Sweep Method)做說明。此法先產生所需要的 k 條 路徑做為起始值的向量元素個數,再以特別定義的矩陣運算求解,如此可得所需的 k 條最短路徑。其演算步驟如下:
1. 首先定義一個距離矩陣 D,此矩陣中的每一個值 Dij表示節點 i 到節點 j 的最短距離。定義兩個矩陣 L 與 U,這兩個矩陣將會在每次的運算(sweeps) 中被使用。
D=[ Dij ]
L=[ Lij ], where Lij = Dij for i>j; Lij =∞ for i≦j
[1+2,1+3,1+6,4+2,4+3,4+6,8+1,8+3,8+6]中取出前 3 小的元素,即為 [3,4,6]。另外在 Backward Sweep 中,計算順序是由Ekn, Ekn-1, Ekn-2, …, Ek1,
8
-中,將所有 ni在路網中的前置點連接至 ni’。此時若 ni的前一點 n(i-1)同樣擁 有虛擬對應點時,也需連結 n(i-1)’至 ni’。(加入 4’、7’,並連接 3’至 4’、6 至 4’、4’至 7’)
5. 求解起點到終點虛擬對應點的最短路徑,即為第 2 條最短路徑。(求解 1 到 7’的最短路徑,可得 1,2,3,6,4’,7’,第二條最短路徑即為 1,2,3,6,4,7,如圖 2.2.b)
圖 2.3 網路擴大法示意圖 (a) 原始的網路圖(b)下一迴圈的網路圖
於先前回顧的文獻中,主要都是集中在 k 條最短路徑演算法的探討上,重點在於減 少運算時間、記憶體空間等。但由於這些演算法的運算時間皆為多項式時間,即使網路 擴大或是需要求解的 k 值數量增加,皆可在合理時間內求得結果。就實務上而言,隨著 硬體等級、運算能力的提昇,上述演算法的運算時間差距並不顯著。
然而在實務應用上,由於上述的演算法得到的結果皆為 k 條最短路徑的最佳解,也 就是所有路徑中,路徑長度為前 k 短的路徑。若要以提供替代道路為目的,將遭遇替代 道路的重疊度過大,易造成用路人參考時的困擾。因此在下一節中將就 k 條差異路徑的 相關文獻進行回顧。