問題描述
從A點到B點的最短路徑,每段路徑值不小於0。如下圖,從綠色點到紅色點,其中藍色區域不可走。
特點
啓發式的廣度優先搜索
主要結構
起點A, 終點B
father[] //用來記錄父親節點
g[] //用來記錄節點當前的路徑消耗
h[] //啓發式算法,當前節點到終點B的路徑的一個下界,即小於等於真實的路徑
f[]=g[]+h[]
隊列open[] //存儲等待check的點
隊列close[] //存儲已check的點
算法僞代碼
// 初始化
A加入open[]
更新g[A], h[A], f[A]
// 依次彈出open[]中的元素,直到open[]爲空
while open.notEmpty():
x = open.pop_min_f() // 彈出open[]中f值最小的點
if x=B:
return path(x) // 找到路徑, path方法可以根據father數組求得,不詳述
close.insert(x) // 將x節點加入close[]隊列
foreach p in x.neighbors(): //遍歷x的所有後繼或者相鄰節點
if p in close[]: //如果已經在close隊列中,可以不操作
continue
if p in open[]: // 如果p點在open[]隊列中,若g值能更新,則更新
g_temp = g[x] + cost(x, p)
if g_temp < g[p]:
g[p]=g_temp
f[p]=g[p]+h[p]
father[p]=x
else: //如果不在open[]隊列中,加入
open.insert(p)
g[p]=g[x] + cost(x, p)
h[p]=現場計算
f[p]=g[p]+h[p]
father[p]=x
return NOT_FOUND //open隊列都彈完了,看來沒有找到路徑