游戲中的A*尋路及Javascript實現(xiàn)(梁王的開發(fā)筆記)

前言

本文希望讀者預先擁有廣度優(yōu)先搜索(BFS)的知識旺罢,如果寫過廣搜解迷宮的題就更好了氏淑。

什么是尋路算法

當我們給定一個地圖和終點起點的時候,我怎么找到一條最短(或者按情況最優(yōu))的路到達終點纤房,這就是尋路算法要解決的基本問題。尋路算法有很多暮现,暴力點的廣度優(yōu)先搜索或者dijkstra。這篇文章主要是介紹A*尋路并對比它和廣度優(yōu)先搜索的優(yōu)勢在哪里痢毒。

A*

A*算法送矩,也可以叫Astar。我們先用一些偽代碼解釋一下其算法哪替。

A*偽代碼

A*算法使用兩個狀態(tài)表栋荸,分別是Open表和Closed表。這里Open表由待考查的節(jié)點組成凭舶,而Closed表由已經(jīng)考查過的節(jié)點組成晌块。那么什么樣的節(jié)點才算是“已考查過”的節(jié)點呢?對于一個節(jié)點來說帅霜,當算法已經(jīng)檢查過與它相鄰的所有節(jié)點匆背,并計算出了這些節(jié)點的f,g和h值(后面會解釋)身冀,并把它們放入Open表中以待考查钝尸,那么這個節(jié)點就是“已考查過”的節(jié)點。

開始的時候搂根,Closed表為空珍促,而Open表里面只有起始節(jié)點。每次迭代中剩愧,A*算法將Open表中具有最小代價值(即f值最小)的節(jié)點取出進行檢查猪叙,如果這個節(jié)點不是目標節(jié)點,那么考慮該節(jié)點的所有4個相鄰節(jié)點(如果是八方向的話就是相鄰的8個節(jié)點)仁卷。

這里可以看出A和BFS的不同穴翩,這里取的是Open表中具有最小代價值的節(jié)點,所以一般A的實現(xiàn)都會依賴優(yōu)先隊列锦积,這里就已經(jīng)可以看出A*的啟發(fā)式搜索了芒帕。而BFS只是按隊列的先進先出取的節(jié)點,我們也可以稱之為盲目搜索丰介。

然后對于每個節(jié)點按下列規(guī)則處理:

  1. 如果它即不在Open表中背蟆,也不在Closed表中,則將它加入Open表中基矮。
  2. 如果它已經(jīng)在Open表中淆储,并且新的路徑具有更低的代價值冠场,則更新它的信息家浇。
  3. 如果它已經(jīng)在Closed表中,那么檢測新的路徑是否具有更低的代價值碴裙。如果是钢悲,那么將它從Closed表中移出加入Open表点额。如果不是的話就忽略。

重復上述步驟直到達到目標節(jié)點莺琳,如果Open表空了還沒達到目標節(jié)點就說明沒有可達路徑还棱。

A*核心概念介紹

估值函數(shù)

上面也點了一下,A*是啟發(fā)式搜索惭等,那么什么是啟發(fā)式搜索珍手?啟發(fā)式搜索和盲目搜索的區(qū)別是什么?

讀者可以想象一下這個場景辞做,我以前上學的時候為了趕時間喜歡騎單車去教室琳要,下課之后我到停車場的時候完全記不住我的單車究竟放在哪里了,這個時候我只能一輛一輛隨緣的"盲目"搜索秤茅。

如果我單車上有一個信號發(fā)射器稚补,我可以知道單車距離我還有多少米,那么這個時候我只需要向各個方向嘗試走幾步框喳,然后往距離縮減的方向前進就行了课幕,這就是啟發(fā)式。

估值函數(shù)其實就是這個告訴我單車離我現(xiàn)在多遠的一個東西五垮,當然乍惊,實際情況下我們肯定無法得到一個準確的“距離“,所以這個才叫“估值“函數(shù)拼余,值是一個估計值污桦。
A算法之所以效率高是因為它是啟發(fā)式的搜索算法,因此匙监,A算法的執(zhí)行效率高低在非常大的程度上是依賴于估值函數(shù)的凡橱,估值函數(shù)構造的越準確,則A*搜索的時間越短亭姥。

估值函數(shù)的計算

之前偽代碼的時候我們出現(xiàn)了幾個神奇的變量f稼钩,g還有h,這些都是每個節(jié)點的屬性达罗,現(xiàn)在我們來介紹一下它們坝撑。
g: 從起始節(jié)點到當前節(jié)點的代價。
h: 從當前節(jié)點到目標節(jié)點的"估計代價"
f=g+h: f是對經(jīng)過當前節(jié)點的這條路徑的代價的一個最好的估計值粮揉,f的值越小巡李,就認為這個經(jīng)過這個節(jié)點的路徑越好。

實踐(Javascript)

(如果有時間再補這一部分吧扶认,還有A*的解釋想畫幾個示意圖)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末侨拦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辐宾,更是在濱河造成了極大的恐慌狱从,老刑警劉巖膨蛮,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異季研,居然都是意外死亡敞葛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門与涡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惹谐,“玉大人,你說我怎么就攤上這事驼卖〔虮牵” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵款慨,是天一觀的道長儒飒。 經(jīng)常有香客問我,道長檩奠,這世上最難降的妖魔是什么桩了? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮埠戳,結果婚禮上井誉,老公的妹妹穿的比我還像新娘。我一直安慰自己整胃,他們只是感情好颗圣,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屁使,像睡著了一般在岂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛮寂,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天蔽午,我揣著相機與錄音,去河邊找鬼酬蹋。 笑死及老,一個胖子當著我的面吹牛,可吹牛的內容都是我干的范抓。 我是一名探鬼主播骄恶,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匕垫!你這毒婦竟也來了僧鲁?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悔捶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體单芜,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡蜕该,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了洲鸠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堂淡。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扒腕,靈堂內的尸體忽然破棺而出绢淀,到底是詐尸還是另有隱情,我是刑警寧澤瘾腰,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布皆的,位于F島的核電站,受9級特大地震影響蹋盆,放射性物質發(fā)生泄漏费薄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一栖雾、第九天 我趴在偏房一處隱蔽的房頂上張望楞抡。 院中可真熱鬧,春花似錦析藕、人聲如沸召廷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竞慢。三九已至,卻和暖如春治泥,著一層夾襖步出監(jiān)牢的瞬間梗顺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工车摄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寺谤,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓吮播,卻偏偏與公主長得像变屁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子意狠,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容