a*演算法,分支限界演算法。如有錯誤歡迎指正。
為了便於描述,搜尋演算法適用解決在一張有權無向圖中,找到從原點到終點的最短路徑。
wait_arr陣列存放待擴充套件的節點。
初始化:把初始節點root
加入到wait_arr
陣列中
while( wait_arr陣列不為空
)if( 還存在子節點 )
子節點加入到wait_arr
中。注:由於每個子節點都保留了它的父親節點,所以很容易逆推出到達該子節點的路徑path
深度優先和廣度優先的區別,從上面的通式中可以解釋為紅字部分的不同:
深度優先搜尋:鄰接子節點加入wait_arr
陣列的最左邊,所以每次擴充套件的節點都是新的節點。
廣度優先搜尋:鄰接子節點加入wait_arr
陣列的最右邊,所以每次擴充套件的節點都是老一輩的節點。
a*演算法實際上是模擬這麼乙個過程,在廣場上,有一些遮擋物,人要從
b點越過遮擋物到達出口
e點,應該怎麼做呢?人每一次可以選擇向前,向後,向左,向右四種走法。但是人比較聰明,每一次選擇自己記憶中直線距離離
e點最近的那個方向邁步,如果不行再回溯試其他的方向。這就是
a*演算法。
a*演算法和之前的樸素的搜尋演算法有什麼區別和聯絡呢?
估價函式
f(n) = h(n) + g(n);
其中f(n)
是代表當前節點
n的估計代價,
g(n)
是從源節點到當前節點的已知代價,
h(n)
是當前節點到目標節點的估計代價。
a*演算法的通式:
a*演算法的通式 1:
wait_arr陣列存放待擴充套件的節點。
初始化:把初始節點root
加入到wait_arr
陣列中
while( wait_arr陣列不為空
)else if( 子節點在
open
表中 ) else else else
把取出節點擴充套件出可擴充套件的鄰接子節點
for( 遍歷篩選每個鄰接子節點 )
搜尋演算法總結
搜尋演算法,是一種在狀態空間中尋找特定的目標狀態及到達目標狀態的途徑的系統方法。常見的題目如 搜尋是計算機求解問題的最基本方法,適用面很廣,沒有向動態規劃那樣對狀態有最優化原理和無後效性的約束。而針對具體問題,特別是運用了某種智慧型化的優化手段,也許會帶來某些具體的約束。相關題目 poj 3278 ...
ACM搜尋演算法總結
一 回溯演算法 回溯演算法是所有搜尋演算法中最為基本的一種演算法,其採用了一種 走不通就掉頭 思想作為其控制結構,其相當於採用了先根遍歷的方法來構造解答樹,可用於找解或所有解以及最優解。評價 回溯演算法對空間的消耗較少,當其與分枝定界法一起使用時,對於所求解在解答樹中層較深的問題 有較好的效果。但應...
acm搜尋演算法總結
近期也是學習了搜尋演算法,搜尋被稱為通用解法 雖然啥題都可以解但是也有很大的弊端就是時間!概念 狀態對問題在某一時刻進展情況的數學描述或者是數學抽象。狀態轉移 每乙個狀態都是乙個可能的解,狀態的轉移就是問題從乙個狀態轉移到另乙個狀態,這樣就可以進行搜尋的一步步延伸直到找到需要的解。廣度優先搜尋 一層...