A*搜索算法


本文轉自: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM