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); }