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