尋路算法筆記

尋路算法筆記


一、A*尋路算法(循環啓發):

* 最小代價:假設起點到節點n的代價爲g(n),節點n到終點的代價爲f(n),求f(n)=g(n)+h(n)爲最小值時的路徑。

* A星算法(A* search algorithm):計算最小代價的一種算法。

* 任意路徑總是相等的估計代價:有一種情況下,從起點經過任意路徑到達節點n的代價是相等的(例如四方向的矩形地圖)。此時可以估算起點到所有節點的代價。

* 不可通過節點(障礙物)。地圖上有不允許通過的區塊。

* 待查列表(open set)、已查列表(closed set)、最小代價節點:

(1) 已知條件:一個矩形網格、起始節點、終止節點和一些不可通過節點。

(2) 初始狀態:已查列表爲空集,待查列表只有起始節點。

(3) 算法:首先找到與起始節點相鄰但不在已查列表中的所有節點,加入待查列表,然後分別計算待查列表中每個節點的總代價f(n)=g(n)+h(n)(此處h(n)不考慮不可通過節點,用直線距離算出),最小值f(n)的節點成爲下一輪計算的起始節點,其餘的節點從待查節點中取出,加入已查列表中。如此循環,直至本輪計算的起始節點爲終點節點(h(n)爲0)。

* 啓發(heuristic)函數:計算h(n)的函數(不考慮不可通過節點)。在上面的算法中,h(n)就是直線距離。不同的啓發函數會影響搜索速度。

* 曼哈頓啓發函數(Manhattan heruristic):不考慮對角移動,只能橫向和縱向移動。對於四方向直角地圖,代價爲行差加列差。運算快,但需要訪問較多節點,路線不自然。

* 歐幾里得啓發函數(Euclidian heuristic):直線距離(勾股定理)。路徑自然,訪問節點較少。

* 對角啓發函數(Diagonal heuristic):先水平移動,再對角移動。路線不自然,但訪問節點最少。


二、限定最大距離(步數)的四方向直角地圖尋路算法(遞歸):

* 確定可移動的範圍和範圍內每個點的剩餘距離(步數)(限定起點,但不限定終點):假設函數爲FindDistance(x,y,n),其中(x,y)爲目的地,n爲剩餘的可以移動距離。從起點開始嘗試向四個方向移動,如果沒有障礙物,則執行FindDistance(x,y-1,n-1)或FindDistance(x,y+1,n-1)或者FindDistance(x-1,y,n-1)或FindDistance(x+1,y,n-1)。如此遞歸,直至參數n爲0。每次執行FindDistance,把參數n記錄在(x,y)節點中(如果已經記錄過,則只保留最小值)。

* 從終點逆推回起點以確定路徑(限定終點)。通過上面的計算可以判斷終點是否在可移動範圍內以及到起點的最小距離(步數),所以接下來需要計算路徑(從終點逆推回起點)。在確定範圍的計算中可以知道終點(x,y)的步數n是一個較小值(小於等於起點的剩餘步數),假設函數爲MoveCharacter(x,y,n),則其四鄰居中必有一個記錄了剩餘步數n+1的(MoveCharacter(x,y-1,n+1)或MoveCharacter(x,y+1,n+1)或MoveCharacter(x-1,y,n+1)或MoveCharacter(x+1,y,n+1)),任選一個可移動的方向即可。如此遞歸,直至n=0(回到起點)。


三、佈雷森漢姆直線算法(Bresenham line algorithm)

* Bresenham算法原意是指示如何用像素點繪畫斜線(畫線算法)。

(待補充)


四、參考資料:

1. 《Flash ActionScript 3.0動畫高級教程》(《AdvancED ActionScript 3.0 Animation》)

   http://www.apress.com/9781430216087

2. A*搜尋算法wiki

   http://zh.wikipedia.org/wiki/A*%E6%90%9C%E5%AF%BB%E7%AE%97%E6%B3%95

3. 《Visual C++角色扮演遊戲程序設計》

4. 《Windows遊戲編程》


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