1. 程式人生 > 其它 >啟發式搜尋

啟發式搜尋

啟發式搜尋 A*

從用優先佇列的\(BFS\)開始想,優先佇列的\(BFS\)策略顯然不夠完善,因為我們只在乎當前代價很小,而對於未來的搜尋中,代價可能會更大,而那先當前代價大的在未來的代價中可能很小,所以為了提高搜尋效率,可以對未來產生的代價進行預估,即估價函式,我們仍然維護一個堆,那麼每次從堆中取出的就是“當前代價+未來預估代價”

定義起點為s,終點為t,從起點開始的距離函式\(g(x)\),相當於當前代價,到終點的距離函式\(h(x)\),相當於未來估價,那麼每個點在優先佇列中形式就是\(f(x) = g(x) + h(x)\)\(h(x)\)就是估價函式。

特別像 \(Dijkstra\)

while (q.size()) {
	t = 優先佇列隊頭
	當終點第一次出隊時,break
	for 所有鄰邊
		將鄰邊入隊
}
  1. 處理非負邊權

  2. \(g(state)\)是從當前狀態到目標狀態的最小代價,\(f(state)\)是從當前狀態到目標狀態的估計值,那麼必須滿足:

\[f(state) \,\,\leq\,\, g(state) \]

\(f(state)\)越接近於\(g(state)\),那麼效率越高,如果\(f(state)\),那麼效率就等價於普通的優先佇列\(BFS\)

注意:

1. 在\(Dijkstra\)演算法中,每個點出隊就是最優解。

2. 在普通\(BFS\)
中,每個點入隊就是最優解。

3. 在\(A*\)演算法中,除了終點以外,其他點一定不滿足出隊就是最優解。