1. 程式人生 > 其它 >全域性路徑規劃 - 04 A*演算法

全域性路徑規劃 - 04 A*演算法

全域性路徑規劃之A*演算法

演算法簡介

  1. A*演算法是一種靜態路網中求解最短路徑最有效的直接搜尋方法。廣泛應用於室內機器人的路徑搜尋、遊戲動畫路徑搜尋等;

  2. A*演算法結合了貪心演算法(深度優先)和Dijkstra演算法(廣度優先),是一種啟發式的搜尋演算法;

  3. 路徑優劣評價公式為:\(f\left(n\right)=g\left(n\right)+h\left(n\right)\)\(g\left(n\right)\)是在狀態空間中從初始狀態到狀態\(n\)的實際代價,\(h\left(n\right)\)是從狀態\(n\)目標狀態的最佳路徑的估計代價

  4. A*演算法使用了兩個狀態表,分別稱為OpenList

    CloseListOpenList儲存待考察的節點,CloseList儲存已考察過的節點。

地圖預處理

  1. 將地圖柵格化,把每一個正方形格子的中央稱為節點;

  2. 確定柵格屬性,即每一個格子有兩種狀態:可走和不可走;

  3. 定義兩個列表集合:OpenList和CloseList,OpenList可以儲存節點的g值;

  4. 確定起始節點和目標節點。

演算法流程

  1. 初始時,定義起始節點為父節點,移入CloseList中;

  2. 逐個檢查與父節點i相鄰的周圍的節點\(j\),忽略不可走節點和已經存在於CloseList中的節點:

    • 若節點\(j\)不在OpenList中,則將節點\(j\)的父節點記為節點\(i\)

      ,計算節點\(i\)到節點\(j\)的距離\(d\),計算\(g\left(j\right)=g\left(i\right)+d\),並把它們加入到OpenList中成為待考察的物件;

    • 若節點\(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\)

      ,並將節點\(j\)的父節點記為節點\(i\),若這條路徑不是更優,則不進行任何操作;

  3. 計算OpenList中所有節點的\(f\)值:\(f\left(n\right)=g\left(n\right)+h\left(n\right)\),從OpenList中取出\(f\)值最小的節點,放到CloseList中,並把它作為新的父節點\(i\)

    • 這裡啟發式函式\(h\left(n\right)\)一般用曼哈頓距離或者歐氏距離來替代。
  4. 重複步驟2和步驟3,不斷重複,直到搜尋到目標節點,完成路徑搜尋。搜尋出路徑的結果可以直接遍歷父節點得到。

程式碼實現

待更新,後續會補到GitHub上