啟發式搜索
【這一章在某些地方筆者自己也沒完全弄清楚,比如在遞歸最優搜索處沒有找到一個很好的例子來理解,比如如何選擇啟發式函數等等一系列的問題,希望有大神能指明講解。所以本章重要的只是介紹A*算法流程和簡單優化並介紹引出一些改進的A*
使用評估函數
除了搜索過程不是從開始節點統一向外擴展外,本章描述的搜索過程有點像廣度優先搜索,不同的是,它會優先順着有啟發性和具有特定信息的節點搜索下去,這些節點可能是到達目標的最好路徑。我們稱這個過程為最優(best-first)或啟發式搜索。下面是其基本思想。
我們常常可以為最優搜索制定好評估函數。如在8數碼問題中,可以用不正確位置的數字個數作為狀態描述好壞的一個度量,將這個標准應用於8數碼問題中。如下圖所示。
下,可以看到搜索相當直接的朝着目標進行。
這個例子提出了兩個重要的問題。
-
我們如何為最優搜索決定評估函數?
-
最優搜索的特性是什么?他能找到到達目標節點的好路徑么?
一個通用的圖搜索算法
為了更准確地解釋本章的啟發式搜索過程,這里提出一個通用的圖搜索算法,它允許各種用戶,進行定制。我們把這個算法叫做圖搜索。下面是它的定義:
這個算法可以用開執行最優搜索、廣度優先搜索或深度優先搜索。在廣度優先搜索中,新節點只要放在OPEN的尾部即可(先進先出,FIFO),節點不用重排。在深度優先搜索中,新節點放在OPEN的開始(后進后處,LIFO)。在最優(啟發式)搜索中,按節點的啟發式方法來重排OPEN。
1. 算法A*
因為動作是可逆的,即任何節點n的每一個后繼都可以使n作為它的一個后繼。在建立8數碼搜索樹中忽略了這些循環。因此我們將算法的第六步改為:
則最后完整的A*算法如下:
2. 迭代加深的A*
在上一章,講過廣度優先搜索的存儲需求會隨着搜索空間中目標深度的增加呈指數遞增。盡管好的啟發式搜索減少了分支因子,但啟發式搜索還是有如一樣的缺點。在上一章中介紹的迭代加深搜索,不但允許我們找到最小代價路徑,而且存儲需求隨着深度增加呈線性增長。由此提出的迭代加深A*(IDA*)方法能獲得同啟發式搜索相似的好處。通過使用IDA*算法並行實現能獲得更高的效率。
3. 遞歸最優搜索
【此處筆者也沒看懂,希望大牛能給出一些實例進行講解,這里直接將網上找到的資料原文po出來,希望有大神指點!】
啟發式函數和搜索效率
搜索效率的一個度量是有效分支因子B,他描述了一個搜索過程朝着目標前進的激烈程度。假設搜索找到了一個長為d的路徑,生成了N個節點,那么B就是有以下屬性的樹上每個節點的后繼個數。
-
數中每個非樹葉節點都有B個后繼
-
數中的樹葉節點的深度均為d
-
數中的節點總數是N
因此,B和路徑長度d以及生成的總結點數N之間有下列關系:
歸納一下,有三個重要因素影響算法A*的效率:
-
被發現的路徑的代價(長度)
-
在發現路徑中被擴展的節點數
-
計算h估計的計算量
選擇適當的啟發式函數可以讓我們平衡這些因素以最大化搜索效率。