使用A*算法尋找路徑

使用A*算法首先需要將地圖分成一個個塊,每個塊稱爲一個節點。

算法主要是維護兩張表,openList和closeList。 openList用來保存待考察的節點,closeList用來保存不需要考察的節點。

算法的思想就是不斷考察當前節點的相鄰節點,選出花費最小的節點,從而找出最短路徑。 感覺這個有點像貪婪算法,爲什麼能選出全局最短路徑呢?關鍵在於有個估值算法,即求g值。A*算法不能選出所有的最短路徑,但是選出的路徑能保證是最短的。

每一個節點需要保存自己的上一個節點記作parent, 和兩個權值,記作 h 和 g.

h值記錄當前節點和上一個節點的距離。起點parent爲空,h值等於0,上下左右四個方向的相鄰節點是當前節點的h值 + 1, 左上,左下, 右上,右下一般是當前的h值 + sqrt(2) , 當然在遊戲中,不同的地形,如平地,山地,河流等,可以設置不同的值。

g值預估當前節點到終點的距離。 之所以稱爲預估是因爲我們沒有考慮當前節點與終點是否可達,這個距離我們可以簡單的使用 | x - x1  | + | x - x2 |

當前節點的花費 cost = h + g

算法步驟

  1. 清空openList 和 closeList

  2. 將起點放入openList

  3. 如果openList不爲空,從openList中選一個花費最小的點p。將p從openList中刪除並加入到closeList中。

  4. 考察p節點的相鄰的8個節點,相鄰的節點的parent 等於p, 相鄰節點的h = p.h + 距離。 如果相鄰的節點不在closeList中,且符合路徑條件,則加入openList中。

  5. 如果p節點就是終點, 則返回路徑查找成功。否則繼續3

  6. 返回查找失敗。


路徑查找成功後,包含路徑的所有節點一定都在closeList中, 我們只要從終點開始,沿着parent值,直到parent等於起點,則找到路徑。


附件是我在android平臺的一個演示程序。該demo用篩選法(也是用A * 算法)自動生成聯通的地圖。爲了實現簡單,但是我只考察了4個方向。

下載源碼


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章