A 演算法視覺化詳解與實現

2021-07-10 09:20:50 字數 1693 閱讀 4217

在電腦科學中,a*演算法廣泛應用於尋路和圖的遍歷。最早是於2023年,由peter hart

, nils nilsson

和bertram raphael3人在斯坦福研究院描述了 該演算法。是對dijkstra演算法的一種擴充套件。是一種高效的搜尋演算法。

這是個比較常用的演算法,遊戲中的尋路通常會使用這個演算法,在理解這個演算法之前,先明白幾個概念:

搜尋區域(the search area)

搜尋區域可以劃分為正方形格仔,但不限於此,六邊形,矩形,平行四邊形都可以。因此他們的中心點通常稱為節點(node),而不是方格(squares)。

路徑排序(path sorting)

在沒有任何障礙的地圖上,乙個節點可以有4個方向甚至8個方向移動可能。那麼如何選擇走那個路徑呢,判斷的依據就是這個公式:

f = g + h;

g是起點到指定格仔的移動代價,h是指定格仔到達終點的估算成本,f值則是兩者之和。

假設橫縱走一格的代價為10, 對角線為14,那麼起點往左走一格的g值為10。 

啟發函式(heuristics function)

h值屬於估算成本,不同的估算方法對應不同的結果。選取適合的估算方法需要根據實際場景而定。我們成這種估算函式為啟發函式,例如,允許4個方向走,那麼可以採用曼哈頓距離(manhattan distance), 即橫向和豎向走到終點的距離之和。啟發函式的作用在於,當你把啟發代價設定的比實際代價更大時,那麼搜尋速度會變得更快,但結果可能不是最優的路徑。相反,

啟發代價比實際的小,那麼搜尋變慢,得到乙個最優路徑。這是速度 與最優解之間的權衡

開放列表(open list)

開放列表實際上是乙個待檢測的格仔列表,對應的,我們把檢測過的格仔放入close list中。

以上是a*的關鍵點,尤其是啟發函式,如果沒有啟發函式,則a*就退化成了

dijkstra演算法,是執行效率重要還是找到最佳路徑重要,全靠啟發函式來調節,因此也被歸為啟發式演算法。

a*演算法的具體步驟:

1. 把起點加入openlist

2. 遍歷openlist,找到f值最小的節點,把它作為當前處理的節點,並把該節點加入closelist中

3. 對該節點的8個相鄰格仔進行判斷,

如果格仔是不可抵達的或者在closelist中,則忽略它,否則如下操作:

a. 如果相鄰格仔不在openlist中,把它加入,並將parent設定為該節點和計算f,g,h值

b.如果相鄰格仔已在openlist中,並且新的g值比舊的g值小,則把相鄰格仔的parent設定為該節點,並且重新計算f值。

4. 重複2,3步,直到終點加入了openlist中,表示找到路徑;或者openlist空了,表示沒有路徑。

總結起來,就這麼4步驟,非常簡單。

如果還不是很明白,沒關係,我做了乙個視覺化的過程,你可以直觀地看到是如何一步一步走向終點的。找到終點後,根據parent就可以反推出上乙個節點,反覆如此,就得到了一條路徑了。

我的部落格:

**:

AS2,演算法視覺化 人走迷宮演算法的視覺化實現

as2,演算法視覺化 人走迷宮演算法的視覺化實現 by emilmtthtew 05 10 11 小人在迷宮中尋路是乙個非常經典而有趣的演算法問題,主要用到的堆疊方面的知識還有乙個深度優先搜尋。演算法的細節可以參考我的日誌上的文章 只顯示最正確的搜一條路線的版本 顯示出全部搜尋過程的版本 這裡主要談...

資料視覺化 R語言實現網路視覺化

最近在學習貝葉斯網路,當用k2演算法建立了貝葉斯網路結構之後,用r語言工具可以很清楚地實現網路視覺化。例如,在鐵達尼號資料集中,最後生成的貝葉斯網路結構如下 age,portembarked,numparentschildren,age numparentschildren,passengercla...

演算法 A 尋路 視覺化

如下圖 尋路圖a 使用a 演算法,需要將地圖抽象成乙個個方塊,藍色代表不可以動 牆 黃色為起始點,紅色為目標點。其地圖的二維座標如圖所示,每乙個單位為1公尺 a 的基本公式為 f n g n h n f 初始狀態到目標狀態n的代價估計 起始點到n的代價估計 g 狀態空間中初始狀態到n的實際代價 n為...