最近讀到一篇關於《html5實現炮塔防守》的文章,對其中的路徑搜尋演算法有點興趣,稍微探索了一下。
while (open.isempty() == false) else
open.add(neighbour[i]); // 沒有曾經掠過,就作為候選節點加入
}/* 判斷是否到達目標 */
if ((index = contain(open, end.x, end.y)) != -1)
d = open.get(index);
int path = new int[count];
for (int i = count - 1; i >= 0; i--)
return path;
}/* 對open表進行排序(按fn由小到大) */
// 我認為可以不用sort,只是取乙個值而已,
// 也可以在加入open佇列的時候就已經形成了大值排序
collections.sort((open));
}
我認為astar演算法的思想不錯。
對於遍歷,我們想到的可能就是深度優先遍歷和廣度優先遍歷,但是那種教科書式的遍歷方法的搜尋空間太大了。
於是人們想到了縮小範圍的方法,技術總是在不斷改進的驅動下進步的。
astar就是這個思想驅動下誕生的,首先基於原有廣度優先遍歷會隨著層級的遞增可選的next step會越來越多,我們不難想到如何在可選的next step集合中找到乙個最優的next step,所以關鍵點就在於如何定義這個最優評估的方法的問題了。
astar的評估方法就是f=h+g,也就是說評估值等於已經走過的路徑總長度加上未來可能還需要走的路徑總長度。全域性排序後選最優的,也就是最短的。
已經走過的路徑很容易,只要我們把它記錄累加就能得到,所以關鍵點又落到了如何預估未來需要走的路徑總長度。
那未來需要走的路徑總長度又怎麼評估呢?就像乙個人進入乙個沙漠,完全不知道剩下的路到底還有多長,只知道自己已經走了三天三夜,呵呵。
這樣通過比較f值也就是說總路程最短的優先作為next step(雖然只是預估出來的)。
這就像迷茫的尋路過程有了一盞燈指引著你走向終點。而這盞燈其實關鍵點就是那個曼哈頓距離,所以astar演算法是一種啟發式的路徑搜尋演算法。
膜拜了一下這個曼哈頓距離,不經讓我發問:為什麼就曼哈頓距離而不是其他距離?(tb continue..)
基於c 的A star演算法
資料 一 基礎原理 1 從起點開始,向周圍八個方向擴充套件。測試新擴充套件的點的路徑代價,路徑代價由已走的路徑和距離終點的期望加和而成。這個路徑代價是選擇路徑的標準。2 有兩個表open close。close 生成並且考察過的點,存在兩種點。一種是當前選擇的路徑,是最終想要的結果。另一種是考察但沒...
A Star演算法的原理及應用
在acm集訓時看到小超同學在寫乙個a star的尋路演算法,於是心癢癢,自己也想寫乙個,只是一直沒有時間靜下來好好動動腦筋,近日終於趁週末的時間,把a star實現了,可在地圖上尋找較短路徑,也可解任意迷宮。在計算機中我們將地圖表現為單元格,分可走單元格和不可走單元格。如果用窮搜找最短路徑當然是可以...
a star演算法 list,減少遍歷的開銷
上一節,已經把a star基本思想實踐了一下,但是有個問題,就是慢 這一篇,使用list儲存openlist 看上次的 function loop var fvalue openlist 0 f var currenttile null var openlistkey 0 for var key i...