Astar尋路算法

A* (ASTAR) 算法

簡介
...

 

步驟

1. 將開始節點放入開放列表(開始節點的F和G值都視爲0);

2.重複一下步驟,直到結束條件滿足

i. 在開放列表中查找具有最小F值的節點,並把查找到的節點作爲當前節點;

ii.把當前節點從開放列表刪除, 加入到封閉列表;

iii.對當前節點相鄰的每一個節點依次執行以下步驟:

1. 如果該相鄰節點不可通行或者該相鄰節點已經在封閉列表,則什麼操作也不執行,繼續檢驗下一個節點;

2. 如果該相鄰節點不在開放列表,則將該節點添加到開放列表中, 並將該相鄰節點的父節點設爲當前節點,同時保存該相鄰節點的G和F值;

3. 如果該相鄰節點開放列表, 判斷若經由當前節點到達該相鄰節點的G值是否小於原來保存的G值,

若小於,則將該相鄰節點的父節點設爲當前節點,並重新設置該相鄰節點的G和F值.

iv. 循環結束條件:

終點節點被加入到開放列表作爲待檢驗節點時, 表示路徑被找到,此時應終止循環;

或者開放列表爲空,表明已無可以添加的新節點,而已檢驗的節點中沒有終點節點則意味着路徑無法被找到,此時也結束循環;

3. 從終點節點開始沿父節點遍歷, 並保存整個遍歷到的節點座標,遍歷所得的節點就是最後得到的路徑;

 

關鍵值計算

F = G+H

G=從起點A到一個給定點的距離。

H=從給定點到終點的估計值。這種方式常叫做試探,有幾種計算方法:(使用其中一個即可)

//曼哈頓估價法
private function manhattan(node:Node):Number
{
    return Math.abs(node.x - _endNode.x) * _straightCost + Math.abs(node.y + _endNode.y) * _straightCost;
}
  
//幾何估價法
private function euclidian(node:Node):Number
{
    var dx:Number=node.x - _endNode.x;
    var dy:Number=node.y - _endNode.y;
    return Math.sqrt(dx * dx + dy * dy) * _straightCost;
}
  
//對角線估價法
private function diagonal(node:Node):Number
{
    var dx:Number=Math.abs(node.x - _endNode.x);
    var dy:Number=Math.abs(node.y - _endNode.y);
    var diag:Number=Math.min(dx, dy);
    var straight:Number=dx + dy;
    return _diagCost * diag + _straightCost * (straight - 2 * diag);
}

 

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