a算發:在bfs演算法中,若對每個狀態n都設定估價函式f(n)=g(n)+h(n),並且每次從開啟列表中選節點
進行擴充套件時,都選取f值最小的節點,則該搜尋演算法為啟發式搜尋演算法,又稱a演算法。
g(n):從起始狀態到當前狀態n的代價。
h(n):從當前狀態n到目標狀態的估計代價。、
a演算法的例子——八數碼
2 6 3 1 2 3
1 8 -----> 8 4
7 4 5 7 6 5
定義估價函式f(n)=g(n)+h(n)初始節點
g(n):為從初始節點到當前節點的步數。
h(n):為當前節點「不在位」的方塊數。
h計算舉例
2 6 3 1 2 3
1 8 ------> 8 4
7 4 5 7 6 5
2,6,1,8,4,5 都不在位,因此h=6
a*演算法
a演算法中的估價函式若選取不當,則可能找不到解,或找到的解也
不是最優。因此,需要對估價函式做一些限制,使算發確保找到
最優解(步數,即狀態轉移次數最少的解)。a*演算法即為估價函式
做了特定限制,且確保找到最優解的a演算法。
a* 演算法 f*(n)=g*(n)+h*(n)
f*(n):從初始節點s0出發,經過節點n到達目標節點的最小步數(真實值)
g*(n):從s0出發,到達n的最少步數(真實值)
h*(n):從n出發,到達目標節點的最少步數(真實值)
估價函式f(n)則是f*(n)的估計值
a*演算法 f(n)=g(n)+h(n),且滿足以下限制: g(n)是從s0到n的真實步數(未必是最優的),因此g(n)>0且g(n)>=g*(n)
h(n)是從n到目標的估計步數,估計總是過於樂觀的 即h(n)<=h*(n) 且h(n)相容,則a演算法就轉變為a*演算法。
a*演算法 h(n)的相容:如果h函式對任意狀態s1和s2還滿足:h(s1)<=h(s2)+c(s1,s2)
c(s1,s2)是s1轉移到s2的步數,則稱h是相容的。h相容能確保隨著一步步往前走,f遞增,這樣a*能高效找到最優解。
h相容=> g(s1)+h(s1)<=g(s1)+h(s2)+c(s1,s2)=g(s2)+h(s2)=>f(s1)<=f(s2) 即f是遞增的。
a*演算法的搜尋效率很大程度上取決於估價函式h(n),一般說來,在滿足h(n)<=h*(n)的前提下,h(n)的值越大越好
八數碼問題:
方案一:h(n)為不在位的數字個數
方案二:h(n)為不在位的數字到其該呆的位置的曼哈頓距離和
後者優於前者
a*演算法解決八數碼問題
hdu oj 1043 題解:
poj :1376 1324 1084 2449 1475
A 演算法(啟發式搜尋)
a 演算法,a a star 演算法是一種靜態路網中求解最短路徑最有效的直接搜尋方法,也是解決許多搜尋問題的有效演算法。演算法中的距離估算值與實際值越接近,最終搜尋速度越快。別稱 啟發式搜尋 表示式 f n g n h n f n g n h n f n g n h n 公式表示為 f n g n ...
演算法 搜尋演算法 盲目搜尋和啟發式搜尋
對乙個圖進行搜尋意味著按照某種特定的順序依次訪問其頂點。在所有搜尋方式中,廣度優先演算法和深度優先搜尋演算法都十分重要,因為它們提供了一套系統地訪問圖資料結構的方法。我們著重講解廣度優先搜尋演算法。具體例子可看以下文章 廣度和深度解析 深度優先搜尋演算法 簡稱dfs 是一種用於遍歷或搜尋樹或圖的演算...
啟發式演算法和元啟發式演算法
是一種基於直觀或經驗構造的演算法,在可接受的花費 指計算時間 計算空間等 給出待解決優化問題的每一例項的乙個可行解,該可行解與與最優解的偏離程度一般不可以事先預計。啟發式演算法是一種技術,這種演算法可以在可接受的計算費用內找到最好的解,但不一定能保證所得到解的可行性及最優性,甚至大多數情況下無法闡述...