‘聪明的搜索算法’ A*算法
A*算法
????是一種啟發式的搜索算法。
??? 了解BFS、DFS或者Dijkstra算法的人應該知道。這些算法都是一種向四周盲目式搜索的方法。
?
啟發式搜索:
??? 啟發式搜索就是在狀態空間中的搜索對每一個搜索的位置進行評估,得到最好的位置,再從這個位置進行搜索直到目標。這樣可以省略大量無畏的搜索路徑,提到了效率。在啟發式搜索中,對位置的估價是十分重要的。不同的估價可以有不同的效果。因此,A*算法的關鍵就在于如何建立這個啟發函數。
???公式表示為:f(n)=g(n)+h(n),
f(n)?是從初始點經由節點n到目標點的估價函數,
?g(n)?是在狀態空間中從初始節點到n節點的實際代價,
?h(n)?是從n到目標節點最佳路徑的估計代價。
?
A* 算法與廣度、深度優先和 Dijkstra 算法的聯系:
???1、g(n) = 0 時:該算法類似于DFS。
??? 2、h(n) = 0 時:該算法類似于BFS。
??? 3、如果h(0) = 0,只需求出g(n)(即起點到任意點n的最短路徑)時,則轉化成單源最短路徑問題。
?
A*算法淺析:
A*算法與其他搜索路徑的算法的最大區別在于其估計函數的設計,也就是公式:f(n)=g(n)+h(n)中h(n)的設計。
一般計算h(n)的方法有下面幾種:
1、曼哈頓距離:?|x1-x2| + |y1-y2|。
2、歐式距離:??兩點之間的直線距離。
3、切比雪夫距離:max(|x2-x1|,|y2-y1|)。
?這幅圖中綠色的線代表歐式距離,其他均為曼哈頓距離。
該圖中,F6到E2的切比雪夫距離為:4
?
接下來的分析中,我們的h(n)為曼哈頓距離,g(n)為歐式路徑。
假設我們需要搜索的情況如下:
綠色為起始點,紅色為目標,藍色為障礙物,黑色為可通行路徑。
?
F的值是G和H的和。第一步搜索的結果可以在下面的圖表中看到。F,G和H的評分被寫在每個方格里。正如在緊挨起始格右側的方格所表示的,F被打印在左上角,G在左下角,H則在右下角。
?
?
接下來我們來講講A*算法的流程:
1,把起始格添加到開啟列表。
2,重復如下的工作:
????? a) 尋找開啟列表中F值最低(最佳估值)的格子,把它切換到關閉列表。
????? b)?對相鄰的格中的每一個格子進行判斷
????????? * 如果它不可通過或者已經在關閉列表中,略過它。反之如下。
????????? * 如果它不在開啟列表中,把它添加進去。把當前格作為這一格的父節點。記錄這一格的F,G,和H值。
????????? * 如果它已經在開啟列表中,用G值為參考檢查新的路徑是否更好。更低的G值意味著更好的路徑。如果是這樣,就把這一格的父節點改成當前格,并且重新計算這一格的G和F值。如果你保持你的開啟列表按F值排序,改變之后你可能需要重新對開啟列表排序。
????? c)?停止,當你
????????? * 把目標格添加進了關閉列表(注解),這時候路徑被找到,或者
????????? * 沒有找到目標格,開啟列表已經空了。這時候,路徑不存在。
3.保存路徑。從目標格開始,沿著每一格的父節點移動直到回到起始格。這就是你的路徑。
?
下篇文章,我將使用A*算法解決一個經典的八數碼問題。
from:?http://blog.csdn.net/cyh_24/article/details/8018752
總結
以上是生活随笔為你收集整理的‘聪明的搜索算法’ A*算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL的红与黑--rb_tree红黑树
- 下一篇: 并行编程中的“锁”难题