• 沒有找到結果。

二、D++演算法

2.1 Dijkstra 演算法

由於本研究提出的D++演算法是由Dijkstra演算法改良而成的,故本 節中將先介紹Dijkstra演算法的基本理論。Dijkstra演算法是由Edsger Wybe Dijkstra[2]於1959年提出的一個最短路徑演算法,也是目前公認求解最短 路徑的高效經典演算法之一。例如Cheng等人[42]曾採用Dijkstra演算法,

求解規劃任意三次元曲面兩點間最短路徑的問題。Dijkstra演算法可以保 證求出某一節點到其他所有節點的最短路徑。目前最常用的最短路徑演 算法-A*演算法,其實也是由Dijkstra演算法衍生而來。Dijkstra演算法與 A*演算法的優缺點在於:Dijkstra演算法具有最佳答案的保證性,但搜尋 的空間與時間複雜度卻很大;反之,A*演算法的空間與時間複雜度相對 於Dijkstra演算法要小很多,但卻不能保證搜尋出的答案為最佳的。

Dijkstra 演算法的主要特點是以起始點為中心向外一層一層擴展,直 到擴展到終點為止,所以 Dijkstra 演算法能夠求得最短路徑的最佳答案。

Dijkstra 演算法一般對於節點的紀錄有兩種方式,一種用永久和臨時標號 方式,一種是用 OPEN、CLOSE 表方式,在本篇論文中採用 OPEN、CLOSE 表的方式。其搜尋過程簡介如下所述:

10

1. 建立兩個節點紀錄-OPEN 與 CLOSE。OPEN 表紀錄所有已生成 而未選取過的節點,CLOSED 表中記錄已選取過的節點。

2. 計算起點的目標函數值,並把它放入 OPEN 表中等待檢查。

3. 從 OPEN 表中找出目標函數最小的節點,找出這個節點的所有子 節點,並計算這些子節點的目標函數值。

A. 若子節點已經在 OPEN 表中了,比較子節點新舊目標函數 值,保留目標函數值較小的子節點資料。

B. 若子節點已經在 CLOSE 表中了,比較子節點新舊目標函數 值。若子節點的新目標函數值較小,更新子節點資料並重新 加入 OPEN 表中。

C. 不在 OPEN 表也不在 CLOSE 表中,則直接將子節點加入 OPEN 表中。

4. 重複第 3 步。直到挑選的節點為終點則完成搜尋;或是 OPEN 表 裡沒有節點則表示沒有路徑可以到終點。

上述的節點資料包括:(1)節點的座標(2)節點的父節點座標:因為等到搜 尋結束時,可以從終點回溯父節點到起點以得到路徑。(3)節點的目標函 數值:每個節點的目標函數值為從父節點累加,所以當父節點改變時,

節點可能會有不一樣的目標函數值。下面我們將舉一個簡單的例子示範 Dijkstra 演算法。如圖七為一個 3×3 的 2D 網格圖,每個網格到鄰近網格 的距離均為 1。欲求S點到 G 點的最短路徑,以 Dijkstra 演算法求解的步 驟如下。在下列參考範例中的(Aa,B),A 表示節點編號,a 表示 A 的父節 點編號,B 表示節點 A 目前的目標函數值:

11

S 1 4

2 3 6

5 7 G

圖七、使用 Dijkstra 演算法的 3×3 地圖

1. 挑選:(S,0)

子節點:(1S,1),(2S,1),(3S,1) OPEN 表:(1S,1),(2S,1),(3S,1) CLOSE 表:(S,0)

2. 挑選:(1S,1)

子節點:(S1,1),(21,2),(31,2),(41,2),(61,2) OPEN 表:(2S,1),(3S,1),(41,2),(61,2) CLOSE 表:(S,0),(1S,1)

3. 挑選:(2S,1)

子節點:(S2,2),(12,2),(32,2),(52,2),(72,2) OPEN 表:(3S,1),(41,2),(52,2),(61,2),(72,2) CLOSE 表:(S,0),(1S,1),(2S,1)

4. 挑選:(3S,1)

子節點:(S3,2),(13,2),(23,2),(43,2),(53,2),(63,2),(73,2),(G3,2) OPEN 表:(41,2),(52,2),(61,2),(72,2),(G3,2)

12

13

14

圖九、Dijkstra 演算法無障礙範例 (來源:Amit's A* Pages[6])

圖十、Dijkstra 演算法具障礙物範例 (來源:Amit's A* Pages[6])

15 2.2 D++演算法之理論

由於Dijkstra演算法屬於一次性搜尋的全域路徑規劃法。因此對於大 型的地圖或環境,Dijkstra演算法需要許多搜尋時間去計算最短路徑,才 能令機器人開始移動。另外Dijkstra演算法還需要事先獲得環境中所有的 資訊,所以它無法在未知的環境中使用。為了克服這些限制,我們參考 了如使用超音波感測器的環境感測路徑規劃方法[43]-[45],在Dijkstra演 算法中加入了的「偵測範圍」概念;如此可使原來的Dijkstra演算法只需 搜尋區域環境即可[46]。D++演算法中的偵測範圍類似於一個被感測器偵 測到的區域,每次只需讓機器人在偵測範圍中搜尋一個最接近終點的中 繼點,並相中繼點前進。僅搜尋偵測範圍內的中繼點可讓機器人在極短 的時間內即可決定下一步移動的方向與位置。透過這樣的方法,機器人 可以一步一步地逐漸靠近並抵達終點。圖十一描述了D++演算法的概念流 程圖,而圖十二則說明了本篇論文中所用到的圖例。如圖十一中之概念 流程所示,流程中每次循環迴圈的計算時間將會非常短,這是因為每次 搜尋的範圍(即偵測範圍)為有限的小型空間。因此機器人可迅速第一次完 成搜尋並開始移動,而無原本Dijkstra演算法常有的等待時間。另外,機 器人只需附近的環境資訊即可開始搜尋路徑,而不需要事先取得環境中 所有的資訊。

16

圖十一、D++演算法之簡易流程圖

圖十二、本研究所用到之圖例說明

17

在圖十一的D++演算法簡易流程中,其步驟二包含了兩個主要執行函 式:(1) GET_DETECTIVE_RANGE() 和 (2) GET_NEXT_MOVE()。其中 第一個函式 GET_DETECTIVE_RANGE()的執行目的為使用Dijkstra演算 法,從目前位置不停擴張子節點範圍到所設定的偵測範圍大小。至於第 二個執行函式GET_NEXT_MOVE()則是搜尋偵測範圍內,最接近終點的 中繼點並獲得從目前位置到中繼點的路徑,進而獲得下一步移動的方向 與位置。執行函式GET_DETECTIVE_RANGE() 的程式條列如下:

Function: GET_DETECTIVE_RANGE()

18

相關文件