原創 Flex中A star尋路演算法

2021-08-30 20:52:21 字數 1473 閱讀 7376

a*尋路演算法是最常用的尋路演算法了,下面介紹一些概念,及flex中實現的demo

節點(node)

本質上就是方形網格裡的某乙個方格(yujjj注:為什麼不把他們描述為方格?因為在一些時候劃分的節點不一定是方形的,矩形、六角形、或其它任意形狀,本書中只討論方格)。由此可以看出,路徑將會由起點節點,終點節點,還有從起點到終點經過的節點組成。

代價(cost)

這是對節點優劣分級的值。代價小的節點肯定比代價大節點更好。代價由兩部分組成:從起點到達當前點的代價和從這個點到終點的估計代價。代價一般由變數f,g和h,具體如下。

f:特定節點的全部代價。由g+h決定。

g:從起點到當前點的代價。它是確定的,因為你肯定知道從起點到這一點的實際路徑。

h:從當前點到終點的估計代價。是用估價函式(heuristic function)計算的。它只能乙個估算,因為你不知道具體的路線——你將會找出的那一條。

估價函式(heuristic):計算從當前點到終點估計代價的公式。通常有很多這樣的公式,但他們的運算結果,速度等都有差異(yujjj注:估價公式計算的估計值越接近實際值,需要計算的節點越少;估價公式越簡單,每個節點的計算速度越快)。

待考察表(open list)

一組已經估價的節點。表裡代價最小的節點將是下一次的計算的起點。

已考察表(closed list):

從待考察表中取代價最小的節點作為起點,對它周圍8個方向的節點進行估價,然後把它放入「已考察表」。

父節點(parent node):

以乙個點計算周圍節點時,這個點就是其它節點的父節點。當我們到達終點節點,你可以乙個乙個找出父節點直到起點節點。因為父節點總是帶考察表裡的小代價節點,這樣可以確保你找出最佳路線。

現在我們來看以下具體的運算方法:

1. 新增起點節點到待考察表

2. 主迴圈

a. 找到待考察表裡的最小代價的節點,設為當前節點。

b. 如果當前點是終點節點,你已經找到路徑了。跳到第四步。

c. 考察每乙個鄰節點(直角座標網格裡,有8個這樣的節點 )對於每乙個鄰節點:

(1).如果是不能通過的節點,或者已經在帶考察表或已考察表中,跳過,繼續下一節點,否則繼續。

(2).計算它的代價

(3).把當前節點定義為這個點的父節點新增到待考察表

(4).新增當前節點到已考察表

3. 更新待考察表,重複第二步。

4. 你已經到達終點,建立路徑列表並新增終點節點

5. 新增終點節點的父節點到路徑列表

6. 重複新增父節點直到起點節點。路徑列表就由一組節點構成了最佳路徑

**比較多就不貼了,可以參考flash高階動畫教程第四章

附件為測試檔案,紅色為英雄,藍色為通路,黑色為障礙,綠色為測試過的節點,白色為實際路徑

RCP gef智慧型尋路演算法(A star)

本路由繼承自abstactrouter,引數只有editpart 編輯器內容控制器 gridlength 尋路用單元格大小 style floyd,floyd flat,four dir 字符集編碼為gbk,本文只做簡單的 解析,原始碼戳我 如果原始碼不全,可以聯絡本人。演算法實現主要有三 1 as...

演算法 Astar尋路演算法改進

早前寫了一篇 rcp gef智慧型尋路演算法 a star 出現了一點問題。在astar演算法中,預設尋路起點和終點都是n x n的方格,但如果用在路由上,就會出現問題。如果,需要連線的終點並不在方格的四角上,就產生了斜線。於是我們可以對終點附近的點重新做一點兒處理,原始碼如下所示 int size...

在Unity中實現Astar尋路演算法

在遊戲中,從一點到另一點的操作有時需要遊戲系統自動完成,在一些帶有rpg元素的遊戲中,敵人在發現玩家位置後會自動向玩家的位置移動。這些移動的路線是如何自動確定的?本文將介紹尋路演算法中的a 演算法,並在unity中用c 指令碼來實現尋路功能。現在有兩個點 起點a,和終點b,允許向周圍的八個方向移動,...