遊戲人工智能之A *尋路算法(適合初學者)

引言:小生今日分享的是尋路系統中常用的A*尋路算法,在此特別感謝Siki學院的老師們。
如果大神發現錯誤,請評論告知!再次感謝!
開發版本:unity 2017.1.1f1
適合人羣:Unity有一定基礎的童鞋
開啓學習之旅吧!

尋路:尋找最短路徑並避開障礙物
首先將地圖虛擬化,將地圖劃分爲一個一個的小方塊,這樣可以用二維數組來表示地圖。如下所示,綠色塊(A)是起點,紅色塊(B)是終點,中間藍色塊是障礙物,白色塊是空地。
先羅列出所有的步驟,等會按照例子一步一步分析

1 尋路步驟:

步驟1.從起點A開始,把A作爲一個等待檢查的方格,放入到“開啓列表”中,開啓列表就是一個存放等待檢車方格的列表
步驟2.尋找起點A周圍可以到達的方格(最多八個),將它們放入到“開啓列表”,並設置它們的父方格爲A
步驟3.從“開啓列表”中刪除點A,並將A放入到“關閉列表”中,“關閉列表”存放的是不再需要檢查的方格
步驟4.計算每個方格的F值
F=G+H:
G 表示從起點A移動到指定方格的移動消耗,我們假設橫向移動一個格子消耗10,斜向移動一個格子消耗14(具體值可以根據情況修改)
H 表示從指定的方格移動到目標B點的預計消耗,我們假設H的計算方法,忽略障礙物,只可以縱橫向計算
步驟5.從“開啓列表”中選擇F值最低的方格C,將其從“開啓列表”中刪除,放入到“關閉列表”中
步驟6.檢查C所有臨近並且可達的方格(障礙物和“關閉列表”中的方格不考慮),如果這些方格還不在“開啓列表”中的話,將它們加入到開啓列表,並且計算這些方格的F值,並設置父方格爲C。
步驟7.如果某相鄰的方格D已經在“開啓列表”,計算新的路徑從A到達方格D(即經過C的路徑),G值是否更低一點,如果新的G值更低,則修改父方格爲方格C,重新計算F值,H值不需要改變,因爲方格到達目標點的預計消耗是固定的。但如果新的G值比較高,則說明新的路徑消耗更高,則值不做改變。
步驟8.繼續從“開啓列表”中找出F值最小的,從“開啓列表”中刪除,添加到“關閉列表”,再繼續找出周圍可以到達的方塊,如此循環
步驟9.當“開啓列表”中出現目標方塊B時,說明路徑已經找到。除了起始方塊A,每一個曾經或者現在還在“開啓列表”中的方塊,都存在一個“父方格”,可以從目標點B通過父方格索引到起始方塊,這就是路徑。

2 案例分析:

步驟1,2,3:方塊A已經放入到“關閉列表”,周圍臨近的8個方格(沒有障礙物)已經放入到“開啓列表”
步驟4:計算F=G+H
以方格C爲例
爲了方便統計,將左上角數字記爲F值,左下角爲G值,右下角爲H值,則如下所示:(箭頭的起點爲該方格的父方格)
步驟5,6:我們發現C的F值最小,將其從“開啓列表”中移除,加入到“關閉列表”中。C右邊三個是障礙物不考慮,左邊起始方塊A已經加入到“關閉列表”,不考慮。則候選的方塊也只有上下四個:,而且也已經存在“開啓列表”中。
步驟7:從開啓列表中找出F最小的,我們發現上下兩個同爲54,取哪個都可以,選擇上面的方格D。
重新計算G值,路徑A-C-D 計算G值爲20,比原來的A-D路徑的G值14要大,則值不變,方格D的父方格不變。
步驟8:跳到步驟5開始,選擇F值最小的D,將其從“開啓列表”中移除,加入到“關閉列表”中。將周圍可達方格加入到“開啓列表”並計算F值
我們規定如果上下左右有障礙物,則對應的右上,右下,左上,左下不可到達,所以方格D右上角不可到達。將可到達的方格E1,E2加入“開啓列表”,計算F值,然後再比較到達周圍方格的G值是否存在更小值,最後發現 “開啓列表”裏F最小的方格是E3方格,然後再次跳到步驟5,繼續執行。。。
步驟9:當循環15遍後,如下圖所示(圖畫得快吐了,其中打叉的方格表示在“關閉列表”中),目標方塊B出現在“開啓列表”中,結束循環!
通過目標點B的父方格索引到起始方塊A,這就是路徑,如下所示:

本篇主要介紹A*尋路算法的思路,下一篇,將會在Unity中實現尋路算法!
博客寫之不易,喜歡的,記得點贊收藏,關注我哦!


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