對於初學者而言,A*尋路已經是個比較複雜的算法了,爲了便於理解,本文降低了A*算法的難度,規定只能橫豎(四方向)尋路,而無法直接走對角線,使得整個算法更好理解。
簡而言之,A*尋路就是計算從起點經過該點到達終點的路程,並使得總路程達到最小值,因此引入一個公式:
F=G+H;
其中,F是從起點經過該點到達終點的總路程,G是起點到達該點的“已走路程”,H是該點到達終點的“預計路程”。
文本規定只能橫豎(四方向)尋路,那麼設置G=1,那麼如果計算H的值?
由於H是預計路程,則在計算H時將不考慮障礙點,直接計算H到終點的路程,通過行列差來計算得到。
A*算法的核心就是按照這個公式逐步查找,直到查找到終點,算法引入開啓列表和關閉列表,用於存儲被開啓和關閉的節點。
初期,地圖上的節點都是未開啓也未關閉的初始狀態,當檢測到一個節點時,就要將其周圍節點存入開啓列表中,通過計算父節點到各子節點的F值來檢測,選取子節點中F值最小的節點放入關閉列表中,並將該節點的父節點改爲目前的檢測點(即該節點成爲之後節點的父節點),然後開始查找下一個節點,如此循環,直到查找到終點。
本文爲了降低算法難度,因此限制了尋路條件爲四方向,後期可以加入斜方向的查找,即可以八方向尋路。
A*尋路算法的具體實現,詳見代碼。
效果展示
GitHub開源
博文中的A*尋路算法已開源在GitHub上,希望與大家一起分享、改進!