2. 一、 前言:
為何選擇 A* Algorithm 做為這次的 Term Project 題目?其實原本是想介紹有
關遊戲方面的演算法,想想覺得即時戰略的遊戲,為何遊戲角色會知道我要
怎走才是最短的路徑?(雖然有些還是在繞路…),是如何避開那些障礙物找
到正確的路徑?也因此在上網查了相關資訊後決定研究最小路徑的演算法
A* Algorithm。
二、 A* Algorithm 介紹:
1. A* Algorithm 一個重要的核心就是開啟列表 (Open List)和關閉列表
開啟列表 關閉列表
(Closed List)的使用。開啟列表存放著你目前節點可能接下來會經過的節
點,如:
A B C
D E F
G H I
若以 E 做為起始點,把 A~I 都加入到開啟列表中(因為 A, B, C, D, F, G, H, I 為 E
的相鄰節點),並把 E 指定為父節點。若相鄰節點中有不可通過的節點(例如:
父節點
樹林、牆壁、湖泊…等),則不將其存入開啟列表中。關閉列表則存放已經走
過的路徑,不需要再次的檢查。
2. A* Algorithm 其中一個最重要的核心部分就是在其路徑評估路徑評估的公式 其公
,
路徑評估
式為:F= G + H,G 代表從起點,沿著產生的路徑,移動到你所相鄰節點 相鄰節點
的移動代價;H 為從所選擇的相鄰節點移動到所指定終點 終點的移動代價,
終點
又稱為錯誤嘗試錯誤嘗試(Heuristic)的方法,因為此路徑的做法為猜測的方法,在
錯誤嘗試
移動的過程中會碰到不同的障礙物(例如:樹林、牆壁、湖泊…等),所以
我們對於路徑的長度只能猜測,但這大多都是錯誤的路徑長度;F 則為 G
和 H 的和。H 的計算方式有許多種,比較常用的方法有:
曼哈頓法
A. 曼哈頓法 (Manhattan Method):此方法計算目前節點到終點節點之
間水瓶和垂直的方格總數和,並將其和 * 10 (對角線方格並不在此
討論中),並忽略所有的障礙物,因此此結果為一估計值,而非其實
際值。(這有點像是在城市間的街角行進,對角線將被視為建築物而
無法穿越)。
3. B. Diagonal Shortcut Method:此方法會計算兩點 x 軸和 y 軸的實際距
離,若 x 軸的距離 > y 軸的距離,則將 H 計算為:H = 14 * y 軸距離
+ 10 * (x 軸距離 – y 軸距離);若 x 軸距離 < y 軸距離,則將 H 計算
為 H = 14 * x 軸距離 + 10 * (y 軸距離 – x 軸距離)。
其他還有不同的方法,不過在此我們就不多做討論。
有了以上的準備,接下來我們就可以介紹 A* Algorithm 是怎麼算出最短路徑
的。
A* Algorthm 的 Pseudo Code 如下:
Add START to OPEN list
while OPEN not empty
get node n from OPEN that has the lowest f(n)
if n is GOAL then return path
move n to CLOSED
for each n' = CanMove(n, direction)
g(n') = g(n) + 1
calculate h(n')
if n' in OPEN list and new n' is not better, continue
if n' in CLOSED list and new n' is not better, continue
remove any n' from OPEN and CLOSED
add n as n's parent
add n' to OPEN
end for
4. end while
if we get to here, then there is No Solution
我們將舉個例子來實做 A* Algorithm:
靛色 --- 起始節點
藍色 --- 父節點
橘色 --- 障礙物
紅色 --- 終點
綠色 --- 列入開始列表中 (起始節點和終點不包含在內)
紫色 --- 列入關閉列表中 (起始節點和終點不包含在內)
Figure 1
考慮 Figure1,若將 A3 設為起始點,E7 設為終點,A6, B5, B6, C4, C5, C6, D3,
D4, D5, D6 設為牆壁(障礙物),G 值水平和垂直設為 10,對角線設為 14;H
值的算法我們使用曼哈頓法(Manhattan Method);F 為 G 和 H 的和,則利用
A* Algorithm 算出最小路徑的方法為:
1. 首先將 A3 加入開始列表中 並設為父節點 將其鄰近點 A2, A4, B2, B3, B4
, ,
一併加入到開始列表中,並計算出:
A2 的 G 為 10,H 為 90 => F = 100
A4 的 G 為 10,H 為 70 => F = 80
B2 的 G 為 14,H 為 80 => F = 94
B3 的 G 為 10,H 為 70 => F = 80
5. B4 的 G 為 14,H 為 60=> F = 74
並將其各點指向父節點(如 Figure 2)
Figure 2
我們選擇 F 值為最低的做為下一點,因此我們選擇 B4。
將設為父節點(如 Figure 3),並將 A3 從開始列表中刪除,加入到關閉列表中。
B4 的相鄰節點 B3, A4 已在開始列表中;又因為在此我們不考慮可以直接由
對角線繞過牆腳的方法,所以 A5, C3 不做考慮。C4, B5 為牆壁,也不做考慮。
因此我們計算出:
A5 的 G 為 28,H 為 60 => F = 88
(注意:在此新的節點的 G 值為以父節點為起點,將父節點的 G 值再加上
再加上對
再加上
父節點相鄰節點的路徑代價)
並將其各點指向父節點。