a*(a-star)演算法是一種靜態路網中求解最短路最有效的方法。公式表示為:f(n)=g(n)+h(n),其中f(n)是節點n從初始點到目標點的估價函式,g(n)是在狀態空間中從初始節點到n節點的實際代價,h(n)是從n到目標節點最佳路徑的估計代價。
保證找到最短路徑(
最優解的)條件,關鍵在於估價函式h(n)的選取:
估價值h(n)<= n到目標節點的距離實際值,這種情況下,搜尋的點數多,搜尋範圍大,效率低。但能得到最優解。
如果 估價值》實際值,
搜尋的點數少,搜尋範圍小,效率高,但不能保證得到最優解。
估價值與實際值越接近,估價函式取得就越好。
主要搜尋過程:
建立兩個表,open表儲存所有已生成而未考察的節點,closed表中記錄已訪問過的節點。
遍歷當前節點的各個節點,將n節點放入close中,取n節點的子節點x,->算x的估價值->
while(open!=null)
將n節點插入close表中;
按照估價值將open表中的節點排序; //實際上是比較open表內節點f的大小,從最小路徑的節點向下進行。
啟發式搜尋其實有很多的演算法,比如:區域性擇優搜尋法、最好優先搜尋法等等。
a*演算法是乙個可採納的最好優先演算法
舉乙個例子,其實廣度優先演算法就是a*演算法的特例。其中g(n)是節點所在的層數,h(n)=0,這種h(n)肯定小於h'(n),所以由前述可知廣度優先演算法是一種可採納的。
當然它是一種最臭的a*演算法。
就是有關h(n)啟發函式的資訊性。h(n)的資訊性通俗點說其實就是在估計乙個節點的值時的約束條件,如果資訊越多或約束條件越多則排除的節點就越多,估價函
數越好或說這個演算法越好。
但在遊戲開發中由於實時性的問題,h(n)的資訊越多,它的計
算量就越大,耗費的時間就越多。就應該適當的減小h(n)的資訊,即減小約束條件。但演算法的準確性就差了,這裡就有乙個平衡的問題。
Astar的自我學習
優先佇列就是乙個被賦予了優先順序的佇列,按照過載函式進行最大值或最小值優先。在出隊和提取隊首元素時都是按照優先順序來操作,優先順序最大的元素將進行操作。include include include include using namespace std struct node a 10 struc...
A star 筆記 A星尋路演算法基礎
基礎應用 基礎應用一般為三部分 建立地圖 或者說網格 例項化出 n m的網格,一般使用二維陣列node nodes 每個格仔都是乙個節點node例項,每個節點都有自身基礎資訊和下乙個節點的引用資訊,可以先對不能通過的地方進行標記,也可以在尋路過程中動態標記。位置對映 節點座標通常只會使用整數索引,如...
A star演算法優化二
本文目的是對a 尋路演算法所生成的路徑進行一些人性化的調整,使其看起來不至於太機械化。關於a 演算法的原理與實現,讀者可以閱讀其他資料,這裡不再詳細闡述。a 尋路演算法本質上是乙個有方向性的廣度優先搜尋演算法,它使用乙個估價函式,來估測可能的最短路徑,在每一次搜尋迭代完成後,選取其鄰接點中最優的乙個...