1. 程式人生 > >聰明的搜索算法’ A*算法

聰明的搜索算法’ A*算法

str 算法 src 參考 lib 估值 位置 最短路徑 jks

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|)。

技術分享這幅圖中綠色的線代表歐式距離,其他均為曼哈頓距離

技術分享該圖中,F6E2切比雪夫距離為: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*算法