A 演算法大揭秘

2021-05-13 02:09:46 字數 1388 閱讀 4779

> 24) & 0xff; color: #000000; font-size: medium;">a*演算法大揭秘

原文:  http://www.gamedev.net/reference/articles/article2003.asp

數碼電子書:a*原理講解:   http://www.gotoread.com/s/e/?vo=5548&p=67

《摘自大眾科學》

a* ,讀作 a-star 。它僅僅是乙個啟發式搜尋演算法。就是說在乙個可以被窮舉的有限解空間集中,用比較有效的方法(主要是利用估價函式)求出最優解的演算法。a* 跟尋路演算法沒有太多關係,我們只是借助了這個方法來解決尋路這個問題,正如四則運算對於數學題一樣,它只是乙個基本工具。尋路演算法本身有很多種,我們找到演算法後,借助 a* 這個工具實現這個演算法而已。

一般認為的a*演算法其實依據的是這樣一種演算法:把地圖分成若干個格仔,把起始點的格仔上標作 0 。然後根據將周圍一圈可以通暢的格仔上標為1。然後再把所有標上 1 的格仔周圍可以通達的格仔標為 2 ,當然,如果那些格仔上已經有過數字了(一定比 2 小)就不用標了。

如此反覆迭代下去,我們地圖上的終點只要可以通達,就一定會被標上數字。而這個數字就是理論最短的距離,而標記過的每個格仔都有乙個前導的入口(即它由附近乙個比它小 1 的格仔引導過來)整個標記的過程逆推,也就找到了最短路徑。

這種一步步嘗試的過程,就是一種搜尋過程。如果加上啟發函式,不讓它盲目的尋找,就衍生出很多啟發式搜尋演算法。a* 是其中的一種。之所以加乙個 * 號,是因為它的啟發式函式是有限制的,這個限制確保它能找到絕對最優解,去掉這個限制,就是 a 演算法了。

我們可以看到,把地圖分格仔,給格仔間的路徑乙個權值(前面的例子中,格仔間的距離都是相等的,我們也可以根據地形劃分成不等的距離,即權值,或者定義單向道路,這都是可以的),這是解決尋路問題的關鍵,但都不是 a* 演算法的範疇。

如果你想出某種演算法,比如把地圖劃分成不規則的區域,或者把地圖向量化。依然可以再此基礎上用 a* 演算法這個工具來從中求到最優解。如果想別的方法來尋路,比如擬人的判斷,預設路點等等,甚至按走迷宮的方法一樣,分叉右轉,碰壁回頭,那些可以算是對分格尋路方法的一些改進,卻都不關 a* 什麼事情。

a* 演算法理論上是時間最優的可以得到最優解,不過我們可以通過選擇乙個更好的估價函式,或是減少解空間來提高效能。 a* 演算法最大的缺點就是,空間需求太大。我們可以用一些時間換空間的方法改進。但是如果不存在解(比如在尋路問題中,根本不存在一條通達的路),採用 a* 演算法求解,勢必會窮舉所有的可能。所以一般在遊戲裡,我們一般會採用額外的手法避免這個問題。

ps. 如果用 waypoint 的方法來解決尋路問題,實際上將地圖化成了乙個圖,經典的最短路徑演算法是 dijkstra 演算法

。若是把地圖的阻擋物用凸多邊形描述,有一道 10 年前的 acm 賽題可以參考:cutting corners。

手機CPU大揭秘

cpu 是central processing unit的英文縮寫,一般由邏輯運算單元 控制單元和儲存單元組成。手機cpu簡單來說就是 處理器,所謂 處理器,就是它的核心部分 屬於邏輯部分 手機開機和執行其他工作時候,都是由 處理器下達命令,控制著各個元件工作,當然開機需要晶振提供頻率訊號才能執行,...

Linux free 命令大揭秘

2.buffers cache 解析 3.swap 解析 free是乙個可以為我們提供linux機器可用ram 記憶體 很有價值的乙個常用命令,很多linux新手或者運維人員會誤解它,讓我們一起來揭開它的神秘面紗吧!free的輸出結果如下,預設表示這些數字都是以kb為單位的,如果想輸出可讀的可以加上...

python id 和 is 大揭秘

id object 具有不重疊生命週期的兩個物件可能具有相同的id 不重疊的生命週期 當物件被建立時,python內部機制會為其分配記憶體空間。如果在物件占用記憶體期間,建立另乙個物件,系統又會為新的物件分配新的記憶體空間,那麼它們的生命週期就是重疊的 因為同一時間裡它們都占用著記憶體空間 占用記憶...