尋路優化(二)——二維地圖上theta*算法的設計探索


這篇文章是基於上一篇文章的研究上進行的,使得路徑更加的平滑和自然,特此記錄。有錯誤歡迎大家批評指正。如需轉載請注明出處,http://www.cnblogs.com/Leonhard-/p/6866070.html,這是對作者最起碼的尊重,謝謝大家。

本文結構如下:

一、Theta*算法、LazyTheta*算法背景介紹

二、Lazy Theta*算法介紹與實現簡述

三、深入思考優化需求

  1.網格中的阻擋判定

  2.效果受A*算法影響

  3.lazy theta* cost的限制

四、總結

 

一、Theta*算法、LazyTheta*算法背景介紹

  在上一篇文章中,考慮的是用A*得到一條“最優”的算法,且盡可能的去防止玩家選擇上的“抖動”。這里“最優”是基於一個前提,那就是必須沿着地圖網格里的格子,一個格子一個格子的跳,像跳棋一樣,也就是說,角色移動的角度只能是45的倍數。一條可能的移動路徑如下:

  這又出現了新問題,假設我們在現實生活中,走路會這么走嗎?這讓我們的尋路顯得非常的僵硬。那最直接的方法就是直接從起點直接走向終點。那此時允許角色往任意角度移動的Theta*算法就派上了用場,而LazyTheta*在Theta*上做了一個性能優化,只對其中的一部分有必要處理的點進行處理。本文的目的就是討論在二維網格地圖上使用lazy theta*算法。

二、Lazy Theta*算法介紹與實現簡述

  theta*算法和lazy theta*算法和A*算法大部分是一樣的,只是theta*類算法比A*多了一個收縮父節點的操作,具體的theta*算法和lazy theta*算法的介紹可以參看這篇blog,這里就不再對重復的內容進行復制粘貼。這里簡單的對實現思路進行一個簡要的描述,如上圖的路徑,我們發現其實不需要記錄A*算法結果的每一個點,只需要記錄起點(s)和終點(d)還有拐角的點(p)三點即可,中間的值就可以通過插值得出。此時,我們把p把的父節點記錄為s,而d的父節點記錄為p。這樣的話,在我們利用A*計算路徑的過程之后,將A*算法得到的路徑節點進行一一的檢測,如果pcurrent、pcurrent->parent和pcurrent->parent->parent三點共線,那么我們直接把pcurrent->parent = pcurrent->parent->parent(A* with post-smoothed paths)。而theta算法,則在此基礎上進一步優化,當我們把節點加入到open隊列時,我們對該節點進行測試,如果pcurrent和pcurrent->parent->parent之間是否存在一條路徑,則把pcurrent->parent = pcurrent->parent->parent並重新設置pcurrent的cost值,如果不存在就什么都不做。而Lazy theta*則是,把節點測試放到了節點從heap里彈出之后,減少了不必要的節點計算。下圖為計算的過程。黑色斜線為中間計算結果,黃色線段為最后的結果,也就是說,在這幅圖里,Lazy theta*的最終結果就是兩個點,起點和終點。

三、深入思考優化需求

  1.網格中的阻擋判定

  在之前的A*算法尋路中,要判定一個格子是否被占用,只需要對MapManager進行一次查詢操作即可,但是現在的移動是任意角度的移動,這需要進一步考慮如何判定任意兩個點之間是否存在一條路徑。以dx>dy >0的情況為例子。

  此時,當我們要判定當X=2時,在地圖上是否能夠通過時,此時我們需要判定(2,1)和(2,2)兩個點的可達性,如果兩點都可達,那么直線上的點在X=2時才可達。(也可以只判定一個點,但是這我們項目里,也可能會出現奇怪的現象,具體情況具體分析。而計算方法則可以通過給出直線方程的隱式方程來快速計算)

  2.效果受A*算法影響

  theta*算法可以優化A*的路徑,但是如果A*算法部分做的不夠好的話,theta*效果會大打折扣。下面以例子說明。

  

  如果A*的尋路結果如棕色線條時,我們期待的theta*優化結果如紅色線條所示,但是,實際上拐角左邊的線上的每一個點的parent都為s點,當進行拐角右邊路線規划時,會計算該條線上每一點與source點的可達性,但是如圖所示,此時的每一條線段是不可達的,所以,這種情況紅色線條的優化不會發生。如果要讓紅色線條被優化的話,需要參照上一篇文章,修改A*的估值函數來實現。

  3.lazy theta* cost的限制

  如果優化線條成立,那么就得給予被優化的節點一個新的cost值。那么這個cost值有什么要求呢?這起碼得符合三角形法則(斜邊不能大於兩邊之和,也不能小於兩邊之差)。否則,在特殊的情況下會出現意想不到的問題,例如下圖,按理說,走的10->20->30是最短的路徑,但是因為優化路徑的奇怪權值,會導致結果按100->200走。

四、總結

  theta*算法可以讓路徑規划先得平滑自然,而且可以實現任意角度朝向的移動,還可以很方便的實現非網格地圖的尋路計算。但是這相比A*算法也會增加額外的計算量,具體使用時,需要在效果和性能中間做一個權衡。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM