a*分層尋路
panic 2023年7月21日
譯者序:很久沒有翻譯文章了,這次找了這個短一些的。這個文章是偶以前翻譯的《a*尋路初探》的補充,介紹了a*更進一步的,更實用的方法。
以下是翻譯正文:
在我的主題a* pathfinding for beginners中(譯者注:譯文 a*尋路初探)中,我概述了a*演算法,說明了如何建立乙個通用的尋路功能。然而僅建立乙個尋路功能,用途是很有限的。
考慮如下的rpg場景,乙個劍士想找到繞過旁邊牆壁的路:
對於這類地圖,你可以用不同的方式,密度來放置節點。在這個例子中,我們使用高密度網格,如下:
在這個圖中,白色節點是可通過的。沒有節點的地方是不可通過的。這個例子還有一些不同的地方。在這個例子中,你可以「穿越」不可通過區域的拐角。同時,「方格」也不再是方格。因為這是乙個投影視角的例子,我們在y(垂直方向)擁有x(水平方向)兩倍的節點。這使得正確的投影路徑成為可能。
如你所見,用這麼密集的節點網路,我們不僅能尋路繞過旁邊的牆壁,還能在牆壁和旁邊的桶之間找到路徑。我們密集的網格也使得繞過底部不可通過的火把成為可能。這總的說來是精確尋路。
好,在短距離上,那的確很酷,但是如果我們要穿越整個地圖進行尋路,該怎麼辦?使用像這麼密的網格,輕易就會讓你在一條路徑上使用a*的搜尋節點的數量達到10,000+。這幾乎會讓任何pc失去響應。
那麼我們來看另一種選擇。建立乙個低密度的網格,就像下面這樣,如何?
在這個例子裡,節點在等邊菱形的中心。菱形之間通過性的資料沿邊界儲存在同乙個陣列中,在上用小紅點表示。要從乙個圖素移動到它周圍8個圖素上,相鄰的圖素必須是可通過的,並且路徑沒有被擋住。
這個節點網格的密度是先前的72分之一。原來我們需要面對10,000+的節點,而現在,取而代之的是1/72原來的數量,或者說,少於200個。我們的電腦可以輕易處理這個。穿越地圖尋路的問題迎刃而解。
合而為一
那麼,我們用哪種方法呢?兩者!
在給定的搜尋中,你得先在地圖範圍內,用巨集觀尋路的方法。然後切換到微觀尋路,尋找從當前位置到路徑上兩個巨集觀節點以外的路徑。每次你進入乙個巨集觀菱形「方格」,你應該用微觀尋路演算法尋路到兩個巨集觀節點之前。這導致浪費了每次微觀尋路的後半截路徑,但是你有必要這樣做以便路徑看起來足夠好-並且這也不是很嚴重的浪費,因為你的微觀尋路演算法只計算了相關的一小段路徑。一旦你到達了距離目標2-3巨集觀節點的地方,你應該完全切換到微觀尋路演算法,完成到最終位置的尋路。
用這種方法,你將得到更接近現實的快速穿越地圖的尋路以及能穿越角落,木桶等等就像最開始那個微觀尋路例子的效果。有夠酷,哈!
如果你真的有野心,你可以開發3種尋路器,如果你的地圖實在太大,乙個工作在真正的巨集觀層次,乙個在中間層,乙個在微觀層。專家已經為像帝國時代(age of empires)這樣的遊戲設計了這些。這僅僅取決於你的需要。
好,就這些了。像以前一樣,你可以通過這個聯絡我:
現在,祝你好運。
迷宮尋路(A星尋路演算法)
題目 假設我們有乙個7 5大小的迷宮,如下圖所示,綠色格仔表示起點,紅色的格仔表示終點,中間的3個深灰色格仔表示障礙物。請找到一條從起點到終點最短的路徑。解題思路 需要引入兩個集合和乙個公式,如下 具體步驟 把起點放入openlist 檢查openlist中是否有值,如果沒有則無法到達終點,結束尋路...
python尋路 A 尋路演算法 python實現
coding utf 8 import math import cv2 as cv class point object def init self,position,parent self.position position self.parent parent self.f 0 self.g 0...
A 尋路演算法
問題 由於遊戲中尋路出了個小問題 玩家尋路到乙個死角後在那邊不停的來回跑,就是無法越過障礙物,就研究了下a 尋路演算法以解決這個問題 研究了幾天,自己寫了個demo這裡給出總結 原理 a 演算法給出的是權值最優的路徑而不是最短路徑 權值有f g h來表示 啟發式函式如下 f p g p h p h值...