1. 程式人生 > >Best-First-Search演算法

Best-First-Search演算法

縮寫起來是跟廣度優先搜尋一樣的BFS,實際上不同。此BFS按照類似Dijkstra的流程執行,不同的是它能夠評估任意結點到目標點的代價。與選擇離初始結點最近的結點不同的是,它選擇離目標最近的結點。BFS不能保證找到一條最短路徑。然而,它比Dijkstra演算法快的多,因為它用了一個啟發式函式(heuristic function)快速地導向目標結點。

最佳優先搜尋是寬度優先搜尋的擴充套件,基本思想是將節點表按據目標的距離進行排序,再以節點的估計距離為標準選擇待擴充套件的節點。

演算法步驟:

1. 用N表示已經排序的初始結點表(從小到大)

2. 如果N為空集,則退出並給出失敗訊號

3. n取為N的首結點,並在N中刪除結點n,放入已訪問結點列表

4. 如果n為目標結點,則退出並給出成功訊號

5. 否則,將n的後繼結點加到N中,記為N’,對N’中的結點按距目標的估計距離排序,並返回第2步

在搜尋的過程中一般會用到評估函式f(n),表示從初始節點S經過n到達目的節點t的最佳路徑代價f*(n)的估計:

從S到n的最佳代價g*(n)的估計g(n),g(n) ≥ g*(n),即區域性最小≥ 全域性最小

從n到t 的最佳代價h*(n)的估計h(n),若對所有結點n,都有h(n)≤h*(n),則演算法A一定能找到一條到達目標結點的最佳路徑,此時演算法A稱為演算法A*

f(n) = g(n) + h(n)作為f*(n) = g*(n) + h*(n)的估計,估計值越小的點希望越高,應該優先擴充套件,所以可以在此處維持一個優先佇列