A* 算法 C# .net

當前點M:進行計算的點。
開放列表:等待計算的點。
封閉列表:計算過的點。
路徑長度:F=G+H
G=起點移動到當前點的長度。
H=當前點到終點的估算長度。可以簡單理解爲(起點與終點的直線距離,排除障礙物的影響)

先把起點 置爲 當前點M

  1. 找到當前點可直接到達的並且不在關閉列表中的所有點,遍歷所有點K做步驟2。
  2. 點K如果是終點,把終點的父節點置爲當前點。跳出循環執行步驟6。
    點K如果不在開放列表。 則把點K的父節點設置爲當前點M,並且計算F值。
    點K如果在開放列表。則比較F值,如果本次計算的F值比之前的F值小,則更新點K的 F值以及父節點,如果本次計算的F值比之前的F值大則不處理。
  3. 遍歷完成後把當前點M加入到關閉列表中。
  4. 如果開放列表爲空, 則沒有到達終點的路徑
    否則 對開放列表中的點對F值進行排序,置當前點爲開放列表中F值最低的點。執行步驟1
  5. 沿着終點的父節點找到最短路徑。

在格子尋路的時候計算H的值經常使用曼哈頓距離算法。如果可以走斜邊的話這個估算是不準的。應該改良爲 能走斜邊先走斜邊,最後走直線。

自己的見解:
爲什麼要有H值:H值是用來糾正方向的, 如果距離終點越遠的方向H值越大,那麼就會阻礙往相反方向發散計算。
爲什麼A*是最短路徑:在所有開放列表中, 當前計算的點是F值最短的,也就意味着當H值是估算正確的情況下(沒有障礙物)。當前計算的點是路徑最短的。 當前點的下一個運算點是終點,表明H值是估算正確的。也就是最短路徑了。

寫了一份學習的源碼.net c#環境 大家想要學習的話自行下載。
代碼看完了記得回來點個贊哦!
源碼: 點擊下載

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章