• 沒有找到結果。

即時動態規劃法

Dk

[ ]

ij =m in

(

Dk1

[ ]

ijDk1

[ ]

ik +Dk1

[ ]

kj

)

演算法步驟:

procedure Floyd((L[1..n,1..n]) array D[l..n,1..n]

D← L //D 儲存各點至其他各點之最短路徑值 for k← l to n do

for i← l to n do for j← l to n do

D[i,j] ← min(D[i,j],D[i,k] + D[k,j]) return

A ● ● C 1 2

3

● B

圖 7.4 最佳化原理

其證明可用反證法:假設軌跡 3 為軌跡 B 到 C 的最佳軌跡,則 3 < 2,那麼 1+3 < 1+2,

結果 A 到 C 的最佳軌跡不是最小,此與事實不合,所以假設不成立。

利用最佳化原理,很容易可導出動態規劃法的遞迴公式,其作法如下所述:

假設現有一道路網,如圖 7.5 所示,

2 1 9 3 7

4 5 8 6

圖 7.5 道路網簡圖

start end

每一道路之加權值,如表 7-1 所示:

表 7-1 動態規劃的資料表 Id weight

1 30

2 40

3 15

4 10

5 5

6 15

7 15

8 20

9 20

此時從起始點出發,會看到編號 1、2、3 之道路,將其放入比較表內,

如表 7-2:

表 7-2 動態規劃法的比較表 Id from weight

1 0 (1)=30 3 0 (3)=15 2 0 (2)=40 4 3 (3)+(4)=25 5 3 (3)+(5)=20 6 5 (5)+(6)=35

7 4 (4)+(7)=40 8 4 (4)+(8)=45

7 1 ×

9 1 end

此時比較表內只有三條路,取其中最小加權值之路三,放入路徑表內(路徑表代表觀 測點之集合),如表 7-3:

表 7-3 動態規劃法的路徑表 Id Heading from

3 1 0

5 -1 3

4 1 3

1 1 0

9 1 1

因此由此觀測點看出,又多出編號 4、5 之道路,將其放入比較表內,此時比較表內 變成四條路(已放入路徑表之道路三,需從比較表內刪去,以避免重複搜尋)。重複 上面動作,直到觀測到終點為止(當比較表內出現兩個相同編號之道路時,需將此兩 筆計錄由比較表內刪去),此時會有比較表、路徑表之結果,此時由路徑表可看出最 佳路徑之走法。方法如下:由接觸到終點之道路 9 開始,找 from 那一欄可發現道路 9 是由道路 1 而來,因此再找路徑表內編號為 1 之記錄,再看 from 那一欄可發現道路 1 是由道路 0 而來,因道路 0 即表起點之開始,因此最佳路徑為由起點開始,經道路 1、

9 到終點。其搜尋過程中,只利用到加法與比對之數學運算,因此計算上非常快,比 起直接搜尋法又減少了許多不必要之搜尋。至於其中如何加快比對之技巧,與減少比 對之次數呢?我們從上述的步驟中可觀察出,每增加一個觀測點後,就必需將更新後 的比較表內所有點做一比較,找出有最小加權值的點,作為下一個觀測點。而我們以

一個理想化的道路網為例,如圖 7.6 所示:

a b c

圖 7.6 理想化的道路網

當我們由觀測點 a 出發,會看到三個點,將其置入比較表內,然後比較此三點,

選出 b 為下一觀測點,於是將 b 由比較表內刪去,再由 b 看到其他二點,再置入比較 表內,於是我們可得知,比較表內是以等差級數(2n+l)的方式增加,因此假設起點到 終點間經過了一百個觀測點,那麼我們比較之次數為[3+(2*100+1)]*100/2=10200 次,但如果我們將每一新觀測點所觀察到之所有的點,視為一個群組,並將此群組依 大小順序排好,然後往後之比較不再對整個比較表,而僅比較每一群組的最小成員,

即可得到下一個觀測點,而因為每一群組僅需做一次排序的動作,而群組的增加是以 等差級數(n)的方式增加,因此比較之次數為 3*100+(1+100)*100/2=5350 次,故其 效率約可提升一倍左右。