啟發式搜尋
阿新 • • 發佈:2021-08-11
啟發式搜尋 A*
從用優先佇列的\(BFS\)開始想,優先佇列的\(BFS\)策略顯然不夠完善,因為我們只在乎當前代價很小,而對於未來的搜尋中,代價可能會更大,而那先當前代價大的在未來的代價中可能很小,所以為了提高搜尋效率,可以對未來產生的代價進行預估,即估價函式,我們仍然維護一個堆,那麼每次從堆中取出的就是“當前代價+未來預估代價”。
定義起點為s
,終點為t
,從起點開始的距離函式\(g(x)\),相當於當前代價,到終點的距離函式\(h(x)\),相當於未來估價,那麼每個點在優先佇列中形式就是\(f(x) = g(x) + h(x)\),\(h(x)\)就是估價函式。
特別像 \(Dijkstra\)
while (q.size()) {
t = 優先佇列隊頭
當終點第一次出隊時,break
for 所有鄰邊
將鄰邊入隊
}
-
處理非負邊權
-
設\(g(state)\)是從當前狀態到目標狀態的最小代價,\(f(state)\)是從當前狀態到目標狀態的估計值,那麼必須滿足:
\(f(state)\)越接近於\(g(state)\),那麼效率越高,如果\(f(state)\),那麼效率就等價於普通的優先佇列\(BFS\)