A*算法

參考結構之法 算法之道

問題描述

從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隊列都彈完了,看來沒有找到路徑
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章