啟發式搜尋

2022-07-17 04:03:12 字數 2737 閱讀 1406

啟發式搜尋

啟發式搜尋就是在狀態空間中的搜尋對每乙個搜尋的位置進行評估,得到最好的位置,再從這個位置進行搜尋直到目標。這樣可以省略大量無謂的搜尋路徑,提高了效率。在啟發式搜尋中,對位置的估價是十分重要的。採用了不同的估價可以有不同的效果。

在啟發式搜尋中,我們每次找到當前「最有希望是最短路徑」的狀態進行擴充套件。對於每個狀態的我們用函式f來估計它是否有希望。f包含兩個部分:

f = g + h
g:就是普通寬度優先搜尋中的從起始狀態到當前狀態的代價,

h:是乙個估計的值,表示從當前狀態到目標狀態估計的代價。

h是由我們自己設計的,h函式設計的好壞決定了啟發式演算法的效率。h值越大,演算法執行越快。

但是在設計評估函式時,需要注意乙個很重要的性質:評估函式的值一定要小於等於實際當前狀態到目標狀態的代價

否則雖然你的程式執行速度加快,但是可能在搜尋過程中漏掉了最優解。相對的,只要評估函式的值小於等於實際當前狀態到目標狀態的代價,就一定能找到最優解

f:評估值和狀態值的總和。

同時在啟發式搜尋中將原來的乙個佇列變成了兩個佇列:openlist和closelist。

在openlist中的狀態,其f值還可能發生變化。而在closelist中的狀態,其f值一定不會再發生改變。

整個搜尋解的流程變為:

計算初始狀態的f值,並將其加入openlist

從openlist中取出f值最小的狀態u,並將u加入closelist。若u為目標狀態,結束搜尋;

對u進行擴充套件,假設其擴充套件的狀態為v:若v未出現過,計算v的f值並加入openlist;若v在openlist中,更新v的f值,取較小的乙個;若v在closelist中,拋棄該狀態。

若openlist為空,結束搜尋。否則回到2。

利用這個方法可以避免搜尋一些明顯會遠離目標狀態的狀態,從而縮小搜尋空間,早一步搜尋到目標結果。

在啟發式搜尋中,最重要的是評估函式的選取,乙個好的評估函式能夠更快的趨近於目標狀態。

啟發式搜尋在某些情況下並不一定好用,一方面取決於評估函式的選取,另乙個方面由於在選取狀態時也會有額外的開銷。而快速趨近目標結果所減少的時間,能否彌補這一部分開銷也是非常關鍵的。

所以根據題目選取合適的搜尋方法才是最重要的。

問題:八數碼求解的步數

偽**:

search(status):

start.status =status

start.g = 0

//實際步數

start.h =evaluate(start.status)

start.f = start.g +start.h

openlist.insert(start)

while (!openlist.isempty())

u =openlist.getminfstatus()

closelist.insert(u)

for v

isu.neighborstatus

if (v

inopenlist) then

//更新v的f值

if (v.f > v.h + u.g + 1

) then

v.f = v.h + u.g + 1

end if

else if (v

incloselist)

continue

else

v.g = u.g + 1

v.h =evaluate(v.status)

v.f = v.g +v.h

openlist.insert(v)

end if

end for

end while

原始碼:

#include #include 

#include

#include

#include

#include

using

namespace

std;

struct

node

};node start;

int hash[15]; //

hash[i] 存 i! 1~9

int pos[2]= ,,,,,,,,}; //

0~8 的目標位置的座標

int to[4][2]=;

bool vis[500000

];

//判斷不可能的狀況

bool

check()

} }

if(cnt%2

)

return

false

;

return

true

; }

//康托

intsolve(node a)

ans = ans+hash[i*3+j]*cnt;

} }

return

ans;

} //

得到 h值 ,曼哈頓距離之和

intget_h(node a)

} return

ans;

}int

bfs()

} } int

main()}}

if(!check())

else cout

} return

0;

}

view code

啟發式搜尋

啟發式搜尋 heuristically search 又稱為有資訊搜尋 informed search 它是利用問題擁有的啟發資訊來引導搜尋,達到減少搜尋範圍 降低問題複雜度的目的,這種利用啟發資訊的搜尋過程稱為啟發式搜尋。例題 八數碼問題 運用優先佇列,根據目前已經確定的位置算出目前的價值,並匯入...

ACM 啟發式搜尋

開篇 這篇文章介紹找最短路徑的一種演算法,它的字我比較喜歡 啟發式搜尋。這是用一般的搜素方法,類似窮舉的效果 下面的圖是用a 搜素的效果,也就是本文要介紹的演算法。可以看出,用a 演算法減少了許多計算量,它的效率有了顯著的提高。下面將為你解答上圖中的演算法是如何實現的。正文 搜尋區域介紹 圖中左邊的...

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 ...