Hybrid Astar 算法剖析和实现(三)
在學習資料滿天飛的大環境下,知識變得非常零散,體系化的知識并不多,這就導致很多人每天都努力學習到感動自己,最終卻收效甚微,甚至放棄學習。我的使命就是過濾掉大量的無效信息,將知識體系化,以短平快的方式直達問題本質,把大家從大海撈針的痛苦中解脫出來。
文章目錄
- 0 前言
- 1 迭代搜索的核心流程
- 1.1 遍歷
- 1.2 三個集合
- 1.3 終止條件
- 1.4 cost和優先級
- 1.5 路徑回溯
- 2 總結
0 前言
本篇承接上篇,繼續分析Hybrid Astar迭代搜索的核心流程。
1 迭代搜索的核心流程
1.1 遍歷
迭代搜索的最終目標是找到一條從起點到終點的最短無碰撞可行使路徑。
我們的思路就是一步步向前探索,迭代著向前找可行使路徑,把所有的路徑都遍歷一遍,直到走到終點為止。
最樸素的遍歷思想就是基于起始點狀態先找它周邊的狀態節點,有碰撞的丟掉,沒有碰撞的先都記錄下來,本次迭代結束。下一次的遍歷當然不能再基于起始點了,而是基于上次迭代/記錄下來的/起始點周邊的/無碰撞節點中的/一個(好繞),給它們起個名字吧——邊界節點。本次基于邊界節點進行遍歷之后,又會產生一個新的邊界節點,那這個老的邊界節點怎么處理呢?此時這個老的邊界節點已經不再是邊界節點了,而是——界內的節點了,將這一點想明白很重要,因為這是遍歷的 核心思想。
接下去的行為就是重復上面的動作——再基于一個邊界節點,將它周邊的無碰撞節點放入邊界節點的集合,而將自己放入界內節點的集合——就這樣迭代著向前擴張。
下面舉兩個例子,大家就非常清楚這個過程了。
一個是領土擴張的例子。歷代皇帝在進行領土擴張時,都是從內向外一點點攻打城池完成的。新打下來的城池作為疆域,也就是我們上面提到的邊界點(此時叫邊疆點是不是更貼切呢),等大軍繼續向前擴張時,會派人駐守之前打下來的城池,此時這個城池已經交接給守軍了,當然不能再叫邊疆點,而是自己的疆土了,改個名字叫疆內點不過分吧?既然,有了邊疆點、疆內點、那剩下的就是疆外點了,這是再自然不過的了。因此,大軍擴張領土的過程就是急先鋒將邊疆點不斷向外推進的動態過程。
再講一個小朋友都能理解的例子——狗熊掰棒子的例子。只不過這個狗熊是21世紀的狗熊,聰明了一點,帶了裝玉米的袋子。對應我們前面提到的遍歷過程,裝到袋子里的玉米就是 界內點 ,拿在手里的就是 邊界點 ,長在玉米桿上的玉米就是 界外點 。
1.2 三個集合
從上文的遍歷過程中,我們接觸到了三類點:邊界點、界內點和界外點。用數學語言描述就是三個集合。也就是業界內經常提的OpenSet(或OpenList)和CloseSet(或OpenList),分別對應了邊界點和界內點。有人可能就問了,那界外點呢?界外點對應的集合是 OpenSet∪CloseSetOpenSet\,\cup\,CloseSetOpenSet∪CloseSet 的補集。
這三個集合非常重要,后面代碼的實現都是圍繞這三個集合進行的。
1.3 終止條件
Astar的終止條件只有一個,就是一旦發現邊界點是目標點立即結束遍歷。
相比之下,Hybrid Astar的終止條件就比較復雜一些,現將其羅列如下:
- 發現邊界點和目標點狀態向量差距在可接受范圍內時結束遍歷。
- 發現從當前邊界點可以直接構造一條連接目標點的無碰撞R-S曲線時結束遍歷。
- OpenSet中的點超過一定量級仍無法完成搜索時結束遍歷。
- 超時結束遍歷。
1.4 cost和優先級
廣度優先搜索算法沒有cost的概念——認為走任何路徑消耗是相等的。但真實情況往往不是這樣,山路和水路和平地顯然是不同的,車輛前進和后退肯定也是不同的。為了更好的描述選擇不同路徑帶來的損耗,引入cost的概念。
廣度優先搜索算法 + cost(only g) => Dijkstra算法。Dijkstra算法中 fcost(n)=gstart(n)f_{cost}(n) = g_{start}(n)fcost?(n)=gstart?(n) ,也就是說僅僅計算當前節點到起始點的cost。
Dijkstra算法 + cost(plus h) => (Hybrid) Astar算法。(Hybrid)Astar算法只是將Dijkstra算法中的cost公式改進了一下 fcost(n)=gstar(n)+hend(n)f_{cost}(n) = g_{star}(n) + h_{end}(n)fcost?(n)=gstar?(n)+hend?(n) ,計算cost時不僅僅只考慮當前節點到起點走過的距離,而且加入了啟發項——考慮當前節點到終點 可能 要走的距離。加上啟發項的本質是另搜索過程使用到了終點信息,可以一眼看到終點,而不是蒙著眼睛亂轉。好處是可以提升搜索效率,更快地搜索到終點。
為什么可以提升效率呢?回答了這個問題也就搞清楚了(Hybrid)Astar算法提升搜索效率的 核心思想 。
(Hybrid)Astar算法提升搜索效率的 核心思想 就是 基于優先級調度 。對操作系統比較熟悉的同學對此肯定有強烈的親切感了~~
設計一個優先級隊列,將OpenSet中的狀態節點交給該優先級隊列管理,節點對應的cost值作為該節點的優先級,cost值越小,優先級越高,也就意味著先被調度。先被調度就意味著先探索該節點周邊的節點。
(Hybrid)Astar算法計算cost值時加入了啟發項,這就意味著距離終點近的邊界點會在遍歷時被優先遍歷,而且它臨近的節點(子節點)在加入該優先級隊列時也是有機會排到上輪遍歷,甚至是上輪、上上輪就加入該優先級隊列的子節點的前面(打破了論資排輩,Dijkstra算法就打破了)。因此,(Hybrid)Astar可以朝著目標快速前進。
總結一下就是:
- Dijkstra基于優先級調度打破了“論資排輩”,新的子節點可以憑“能力(cost越小代表能力越強)晉升”。
- (Hybrid)Astar引入啟發項,相當于引入的“目標管理機制”,朝目標前進的子節點更容易得到“晉升”。
1.5 路徑回溯
我們最終的目的是要獲取一條從起點到終點的路徑,因此在遍歷結束后(前提是正常結束)需要回溯出一條路徑。
如果在遍歷時記錄下每個狀態節點是由哪個邊界節點遍歷而來的就很容易從終點回溯出一條指向起點的路徑,然后在將該路徑reverse就是從起點到終點的路徑了。
這個過程描述起來看著挺復雜的,代碼實現是比較簡單的,詳細流程我們在下一篇的代碼實現中再進一步說明。
2 總結
本篇主要介紹了Hybrid Astar算法迭代搜索的核心流程和兩個核心思想。當然,只看文字說明是無法完全吃透該算法的,還是需要結合代碼來理解每一個細節。下一篇我們就對該算法的搜索流程進行代碼實現和講解。
恭喜你又堅持看完了一篇博客,又進步了一點點!如果感覺還不錯就點個贊再走吧,你的點贊和關注將是我持續輸出的噠噠噠動力~~
總結
以上是生活随笔為你收集整理的Hybrid Astar 算法剖析和实现(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java学生管理系统项目实训报告
- 下一篇: java excel模板中列表_java