啟發式搜尋演算法(A 演算法)

2021-07-25 22:41:56 字數 1610 閱讀 6266

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 是一種用於遍歷或搜尋樹或圖的演算...

啟發式演算法和元啟發式演算法

是一種基於直觀或經驗構造的演算法,在可接受的花費 指計算時間 計算空間等 給出待解決優化問題的每一例項的乙個可行解,該可行解與與最優解的偏離程度一般不可以事先預計。啟發式演算法是一種技術,這種演算法可以在可接受的計算費用內找到最好的解,但不一定能保證所得到解的可行性及最優性,甚至大多數情況下無法闡述...