本文轉自:http://blog.csdn.net/v_JULY_v
文章只為學習記錄,不用做其他用途。
-------------------------------------------------------------------------------------------------------------------------------------------------------
引言
1968年,的一篇論文,“P. E. Hart, N. J. Nilsson, and B. Raphael. A formal basis for the heuristic determination of minimum cost paths in graphs. IEEE Trans. Syst. Sci. and Cybernetics, SSC-4(2):100-107, 1968”。從此,一種精巧、高效的算法------A*算法橫空出世了,並在相關領域得到了廣泛的應用。
A*搜尋算法
A*搜尋算法,俗稱A星算法,作為啟發式搜索算法中的一種,這是一種在圖形平面上,有多個節點的路徑,求出最低通過成本的算法。常用於游戲中的NPC的移動計算,或線上游戲的BOT的移動計算上。該算法像Dijkstra算法一樣,可以找到一條最短路徑;也像BFS一樣,進行啟發式的搜索。
A*算法最為核心的部分,就在於它的一個估值函數的設計上:
f(n)=g(n)+h(n)
其中f(n)是每個可能試探點的估值,它有兩部分組成:
一部分,為g(n),它表示從起始搜索點到當前點的代價(通常用某結點在搜索樹中的深度來表示)。
另一部分,即h(n),它表示啟發式搜索中最為重要的一部分,即當前結點到目標結點的估值,
h(n)設計的好壞,直接影響着具有此種啟發式函數的啟發式算法的是否能稱為A*算法。
一種具有f(n)=g(n)+h(n)策略的啟發式算法能成為A*算法的充分條件是:
1、搜索樹上存在着從起始點到終了點的最優路徑。
2、問題域是有限的。
3、所有結點的子結點的搜索代價值>0。
4、h(n)=<h*(n) (h*(n)為實際問題的代價值)。
當此四個條件都滿足時,一個具有f(n)=g(n)+h(n)策略的啟發式算法能成為A*算法,並一定能找到最優解。
A*算法流程:
首先將起始結點S放入OPEN表,CLOSE表置空,算法開始時:
1、如果OPEN表不為空,從表頭取一個結點n,如果為空算法失敗。
2、n是目標解嗎?是,找到一個解(繼續尋找,或終止算法)。
3、將n的所有后繼結點展開,就是從n可以直接關聯的結點(子結點),如果不在CLOSE表中,就將它們放入OPEN表,並把S放入CLOSE表,同時計算每一個后繼結點的估價值f(n),將OPEN表按f(x)排序,最小的放在表頭,重復算法,回到1。
A*算法與廣度、深度優先和Dijkstra 算法的聯系就在於:當g(n)=0時,該算法類似於DFS,當h(n)=0時,該算法類似於BFS。且同時,如果h(n)為0,只需求出g(n),即求出起點到任意頂點n的最短路徑,則轉化為單源最短路徑問題,即Dijkstra算法。這一點,可以通過上面的A*搜索樹的具體過程中將h(n)設為0或將g(n)設為0而得到。
A*尋路算法舉例
鏈接:http://www.cnblogs.com/technology/archive/2011/05/26/2058842.html