AStar算法的原理及应用
在ACM集訓時看到小超同學在寫一個A-Star的尋路算法,于是心癢癢,自己也想寫一個,只是一直沒有時間靜下來好好動動腦筋,近日終于趁周末的時間,把A-Star實現了,可在地圖上尋找較短路徑,也可解任意迷宮。
在計算機中我們將地圖表現為單元格,分可走單元格和不可走單元格。
如果用窮搜找最短路徑當然是可以實現,但代價卻很大。
于是我們必須要讓計算機“有選擇地走”。
若以當前單元格為起點(稱為父單元格,它的周圍有八個方向),下一步走哪呢?
這時就得給下一步的單元格(稱為子單元格)進行“估價”。
“估價”可用估價函數來實現。
入門級的估價函數是這樣的:
終點到目前點的估計代價=終點至當前點的直線距離
于是下一步的代價可以這樣算
代價=起點到當前點的實際步數(通過一個變量累加可以直接得到)+ 終點到目前點的估計代價
然后把估價后的單元格放入“待考察表”
從待考察表中取代價最小的單元格作為起點,對它周圍8個方向的單元格進行估價,然后把它放入“已考察表”。
若對一個單元格估價時,發現它已經在“待考察表”中則比較該單元格原先的估價和當前的估價,保留小的估價,并更新其父單元格屬性。
不斷重復以上過程,直到在“待考察表”中取出的單元格是終點單元格為止,若“待考察表為空”則表示找不到路徑。
到達終點單元格后,通過其“父單元格”屬性,一直找到起點,便構成一條路徑。
原理已經講完了。
根據這個原理,我用C++進行了模擬 (點這里下載演示程序)
我把A-Star的算法封裝成了一個類
使用極其方便
兩個例子:
Enter the map's filename: b.txt Rows=7 Cols=13 . . . . . . . . . . . . . . . . . . . x . . . . . . . . . x x x x . . . . . . . . . . . . x . . . . . . . . . x x x x . . . . . . . . . . . . x . . . . . . . . . . . . . . . . . . . Set the start point ( x , y ): 5 3 Set the end point ( x , y ): 12 3 Steps: 12,3 11,2 10,1 9,0 8,0 7,0 6,0 5,0 4,0 3,1 2,2 3,3 4,3 5,3 Rows=7 Cols=13 . . . . * * * * * * . . . . . . * . . x . . . * . . . . * x x x x . . . . * . . . . * * * x . . . . . * . . . x x x x . . . . . . . . . . . . x . . . . . . . . . . . . . . . . . . . =========================== Enter the map's filename: a.txt Rows=7 Cols=7 . . . . . . . . x x x . . . . . . x . x . . . . x . x . . . . . . x . . . . . . x . . . . . . x . Set the start point ( x , y ): 0 0 Set the end point ( x , y ): 6 6 Steps: 6,6 6,5 6,4 6,3 6,2 5,1 4,0 3,0 2,0 1,0 0,0 Rows=7 Cols=7 * * * * * . . . x x x . * . . . . x . x * . . . x . x * . . . . . x * . . . . . x * . . . . . x *
總結
以上是生活随笔為你收集整理的AStar算法的原理及应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存管理[4]
- 下一篇: 瑞星2008网络版序列号大全