搞了N個小時,終于杯具的把A*算法寫出來了,這里只能弱弱的小結一下:
A*算法是一種啟發式算法:
即每次迭代都進行啟發式思考,判斷F值:
我們維護兩個表,我這只用簡單的數組實現。
OPEN表和CLOSE表
OPEN表存儲我們待搜索的節點
CLOSE表存儲已經搜索好的節點,這些節點都是每次啟發時F值最小的。
A為其點
B為終點
F = H + G
G = 從起點A,沿著產生的路徑,移動到網格上指定方格的移動耗費。G = 距離(A) * 偏移量
H = 從網格上那個方格移動到終點B的預估移動耗費。這經常被稱為啟發式的,
??? 可能會讓你有點迷惑。這樣叫的原因是因為它只是個猜測。
??? 我們沒辦法事先知道路徑的長度,因為路上可能存在各種障礙(墻,水,等等)。
??? 雖然本文只提供了一種計算H的方法,但是你可以在網上找到很多其他的方法。
??? H = (列距離(B) + 行距離(B)) * 偏移量
我們選定上一次添加到CLOSE表的節點為當前節點。
然后依次判斷當前節點的四個或八個方向的節點。如果這些節點是障礙,或者已經在CLOSE表中,
則不予考慮,否則將這些節點的父節點設為當前節點,這些節點如果也沒有在OPEN表中,
則加入OPEN表,如果這些節點編號已經出現在OPEN表中,則判斷他們的G值,G值小的留下,G值大的扔掉。
如果G值也相同,保留后出現的。
我們每次把OPEN表F值最小的節點刪去加入到CLOSE表中。
但是如果存在兩個節點的F值相同呢?隨機選一個。
如此反復,直到我們將B點加入CLOSE表。
如何得到我們的路徑呢?從B點依靠父節點向上遍歷就行了。
注意一點。我們要保持OPEN表的有序就對了,顯然我們這里是通過F值來維持OPEN表的次序。
而且每次添加新的節點到OPEN表時都要排序。當然這里是用降序,這樣對于數組來說更好操作。
感謝,網上朋友提供的詳細的資料。