全域性路徑規劃 - 04 A*演算法
演算法簡介
-
A*演算法是一種靜態路網中求解最短路徑最有效的直接搜尋方法。廣泛應用於室內機器人的路徑搜尋、遊戲動畫路徑搜尋等;
-
A*演算法結合了貪心演算法(深度優先)和Dijkstra演算法(廣度優先),是一種啟發式的搜尋演算法;
-
路徑優劣評價公式為:\(f\left(n\right)=g\left(n\right)+h\left(n\right)\),\(g\left(n\right)\)是在狀態空間中從初始狀態到狀態\(n\)的實際代價,\(h\left(n\right)\)是從狀態\(n\)到目標狀態的最佳路徑的估計代價。
-
A*演算法使用了兩個狀態表,分別稱為OpenList
地圖預處理
-
將地圖柵格化,把每一個正方形格子的中央稱為節點;
-
確定柵格屬性,即每一個格子有兩種狀態:可走和不可走;
-
定義兩個列表集合:OpenList和CloseList,OpenList可以儲存節點的g值;
-
確定起始節點和目標節點。
演算法流程
-
初始時,定義起始節點為父節點,移入CloseList中;
-
逐個檢查與父節點i相鄰的周圍的節點\(j\),忽略不可走節點和已經存在於CloseList中的節點:
-
若節點\(j\)不在OpenList中,則將節點\(j\)的父節點記為節點\(i\)
-
若節點\(j\)已經在OpenList中,則檢查這條路徑是否更優,即經由節點\(i\)到達節點\(j\)是否有更小的\(g\)值:計算節點\(i\)到節點\(j\)的距離\(d\),若\(g\left(i\right)+d\)小於OpenList中節點\(j\)儲存的\(g\left(j\right)\),則這條路徑更優,更新OpenList中節點\(j\)儲存的\(g\)值\(g\left(j\right)=g\left(i\right)+d\)
-
-
計算OpenList中所有節點的\(f\)值:\(f\left(n\right)=g\left(n\right)+h\left(n\right)\),從OpenList中取出\(f\)值最小的節點,放到CloseList中,並把它作為新的父節點\(i\);
- 這裡啟發式函式\(h\left(n\right)\)一般用曼哈頓距離或者歐氏距離來替代。
-
重複步驟2和步驟3,不斷重複,直到搜尋到目標節點,完成路徑搜尋。搜尋出路徑的結果可以直接遍歷父節點得到。
程式碼實現
待更新,後續會補到GitHub上