自動尋路演算法(A 演算法)分享

2021-09-02 18:20:42 字數 1512 閱讀 7254

一、為什麼地圖網格化?

位置描述:

滑鼠位置使用畫素座標描述。

地圖位置使用經度緯度描述。

為了方便描述地圖上元素的位置,將地圖網格化。

二、什麼是曼哈頓距離?

曼哈頓距離(manhattan distance):兩點在南北方向上的距離加上在東西方向上的距離,即d(i,j)=|xi-xj|+|yi-yj|。

計算曼哈頓距離時,忽略兩點之間的障礙物。

若有兩點(1,2)和(3,4),則曼哈頓距離 = |3 -1| + |4 - 2| = 4

三、a*演算法涉及的名詞

開啟列表:存放即將進行分析的可達位置。

關閉列表:存放已經分析完畢的可達位置。

估價函式:f(n) = g(n) + h(n)

f(n) 是從初始點經由節點n到目標點的估價函式。

g(n) 是在地圖中從初始節點到n節點的實際代價h(n) 是從n到目標節點最佳路徑的估計代價。

h(n)是估計代價,可以使用曼哈頓距離作為估計代價。

四、a*演算法步驟

1、將起始位置放入開啟列表。

2、獲取開啟列表中f(n) 值(經由點n的估價值)最小的位置,且曼哈頓距離最小,作為當前位置。

3、判斷當前位置是否為終點,若為終點,將終點放入關閉列表並執行第八步。

4、將當前位置從開啟列表中移除,並放入關閉列表。

5、獲取當前位置可達的位置。注意:關閉列表中的位置不可達。

6、將當前位置可達的位置放入開啟列表。

7、若開啟列表不為空,則從第二步繼續迴圈。

8、若終點存在關閉列表,則返回路徑,否則未找到路徑。

五、a*演算法優化

1、地圖粒度沒必要劃分到畫素點。畫素點的劃分粒度對於搜尋來說代價太高。

建議劃分的粒度在不影響使用的情況下取最大值。

2、每次新位置放入開啟列表時,給列表排序(建議選擇快速排序演算法),

這樣每次從開啟列表取位置時,只取第乙個位置即可。

這種方式適用於超大地圖,分支節點多的地圖。

3、可以前進到相鄰的對角線上的位置(8個方向)。建議使用8方向而非4方向。

相鄰對角線上位置的代價建議為1.4。

4、不同位置的損耗。在地圖中,位置有兩種狀態,可通過和不可通過。

但有的可通過位置可能移動代價更高,比如,堵車道路上的位置。

5、對於超級大的地圖尋路,可以把大地圖劃分為n個小區域。先使用a*演算法

在n個小區域裡找到路徑,在路徑上的每個小區域裡再次使用a*演算法找到

最終的路徑。

6、dijkstra(狄克斯特拉)演算法:該演算法與a*演算法區別在於估價函式, dijkstra 演算法

沒有h(n)。dijkstra 演算法每次迭代時選擇的下乙個頂點是標記點之外距離源點最

近的頂點。但由於dijkstra演算法主要計算從源點到其他所有點的最短路徑,所以

演算法的效率較低。

對於多個目標位置,建議採用dijkstra演算法。比如停車場有多個出口,需要找到離

當前位置最近的出口。

-=各種=-尋路演算法演示:

[url]

A 尋路演算法

問題 由於遊戲中尋路出了個小問題 玩家尋路到乙個死角後在那邊不停的來回跑,就是無法越過障礙物,就研究了下a 尋路演算法以解決這個問題 研究了幾天,自己寫了個demo這裡給出總結 原理 a 演算法給出的是權值最優的路徑而不是最短路徑 權值有f g h來表示 啟發式函式如下 f p g p h p h值...

A 尋路演算法

a 演算法是靜態環境下求最短路徑的不二之選,由於是啟發式搜尋,比dijkstra 深搜廣搜要快的多啦。a 也算是我第一次接觸的移動機械人演算法,csdn上的科普文章也不少,但我作為乙個機械的小白,實現出來還是小有成就感滴。今天抽空和大家分享一下原始碼,開發環境win7 64 opengl vs201...

A 尋路演算法

很多遊戲特別是rts,rpg類遊戲,都需要用到尋路。尋路演算法有深度優先搜尋 dfs 廣度優先搜尋 bfs a星演算法等,而a星演算法是一種具備啟發性策略的演算法,效率是幾種演算法中最高的,因此也成為遊戲中最常用的尋路演算法。直入正題 在遊戲設計中,地圖可以劃分為若干大小相同的方塊區域 方格 這些方...