A*算法是一種啓發式搜索算法,而啓發函數hn直接影響 A*算法的路徑規劃性能。假設當前節點到目標節點的實際代價值爲Hn,當hn < Hn時,搜索節點多,運算效率低,但可搜索到最優路徑;當hn = Hn時,是理想情況,沿最短路徑進行搜索, 且效率最高;當hn > Hn時, 搜索節點少,運算效率高,但通常難以搜索到最優路徑,擴展節點p(x1, y1),終點g(x2,y2),一個柵格移動到相鄰的柵格上的最小代D.。
1.Manhattan距離
h(n)=D*( | x1 - x2|+|y1 - y2| )
對於網格地圖來說, 如果只能四方向(上下左右)移動, 曼哈頓距離(Manhattan distance) 是最合適的啓發函數.
2.Euclidean距離
h(n) =D*sqrt(x1-x22+((y1-y2)2))
如果網格地圖可以八方向(包括斜對角)移動, 使用 切比雪夫距離(Chebyshev distance) 作爲啓發函數比較合適. 如果地圖中允許任意方向移動, 不太建議使用網格 (Grid) 來描述地圖, 可以考慮使用路點(Way Points) 或者 導航網格 (Navigation Meshes) , 此時使用 歐式距離(Euclidean distance) 來作爲啓發函數比較合適。歐式距離因爲有一個 sqrt() 運算, 計算開銷會增大。
3.Octile距離
dx=|x1- x2|
dy=|y1- y2|
k=D*sqrt2-1
h(n)=max(dx, dy) + k * min(dx, dy)
Octile 的核心思想就是假定只能做 45 度角轉彎.
4.Chebyshev距離
dx=|x1- x2|
dy=|y1- y2|
h(n)=D*max(dx,dy)
切比雪夫距離:各座標數值差的最大值