關(guān)于尋路算法的一些思考(5):處理移動中的障礙物

本文由 伯樂在線 - xxmen 翻譯钞速,黃利民 校稿荐虐。未經(jīng)許可踏枣,禁止轉(zhuǎn)載昌屉!
英文出處:theory.stanford.edu。歡迎加入翻譯組茵瀑。

本系列:


一個尋路算法會計算出一條繞過靜止障礙物的路徑怠益,但如果障礙物會移動呢?當一個單位移動到達某特定點時瘾婿,原來的障礙物可能不在那點了,或者在那點上出現(xiàn)了新的障礙物烤咧。如果路線可以繞過典型的障礙物偏陪,那么只要使用單獨的避障算法來配合你的尋路算法。尋路算法會尋找到期望的路徑煮嫌,并且在沿著路徑的同時繞過障礙物笛谦。但是如果障礙物可以移動,進而導(dǎo)致路徑不停地發(fā)生顯著改變昌阿,就應(yīng)考慮使用尋路算法來避障饥脑。

重新計算路徑

我們希望游戲世界隨著時間改變。一條一段時間之前發(fā)現(xiàn)的路徑懦冰,可能不再是現(xiàn)在的最優(yōu)路徑灶轰。用新的信息更新舊路徑是值得的。下面列出的是一些用來判斷決定是否需要重新計算路徑的標準:

  • 每N步一次:這樣保證用來計算路徑的信息不會舊于N步刷钢。
  • 當額外的CPU時間可用時:這樣可以實現(xiàn)路徑質(zhì)量的動態(tài)調(diào)整笋颤。即使使用了更多的游戲單位,或者是在一臺較慢的電腦上運行游戲内地,每個游戲單位的CPU使用率都可以降低伴澄。
  • 當游戲單位轉(zhuǎn)彎或者通過一個關(guān)鍵路徑點的時候赋除。
  • 當游戲單位附近的世界發(fā)生改變的時候。

重新計算路線的主要缺點在于有很多路徑信息被丟棄了非凌。例如举农,如果路徑長100步,并且每十步進行一次重新計算敞嗡,那么路徑的總步數(shù)是100+90+80+70+60+50+40+30+20+10 = 550颁糟。對于一個長M步的路徑,總共大概進行了M^2步計算秸妥。因此滚停,如果你想要得到很多條長路徑,重新計算路線并不是一個好主意粥惧。重復(fù)使用路線信息键畴,而非丟棄,這樣會是更好的辦法突雪。

路徑剪接

當一條路徑需要被重新計算時起惕,意味著世界正在改變。給定一個變化中的世界咏删,地圖上的鄰近部分比遠處的部分更好了解惹想。我們可以遵循一個局部修正策略:找到附近的一條好路徑,并且假定較遠的路徑直到我們靠近它了才需要重新計算督函。我們可以僅僅重新計算路徑的前M步嘀粱,而不是整條路徑:

  1. 設(shè)p[1]..p[N] 是路徑剩余部分(N步)
  2. 計算一條從p[1]到p[M]新路徑
  3. 剪接新路徑到舊路徑中,通過移除p[1]..p[M]然后插入新路徑到這些空位置上辰狡。

因為p[1]和p[M]相距不到M步锋叨,所以新路線不太可能長。不幸的是宛篇,像新路徑又長又不是非常好的情況娃磺,也有可能發(fā)生。上圖展示了這樣一個情況叫倍。原始的紅色路徑是1-2-3-4偷卧,棕色區(qū)域是障礙。如果我們到達2然后發(fā)現(xiàn)從2到3的路徑被阻擋了吆倦,路徑剪接會用綠色的路徑2-5-3來替換2-3听诸,導(dǎo)致這個單位循著路徑1-2-5-3-4移動。我們可以看到這并不是一個好的路徑逼庞,藍色路徑1-2-5-4是更好的選擇蛇更。

不好的路徑經(jīng)常可以通過計算新路徑的長度來判斷。如果它明顯比M長派任,它就可能是不好的路徑砸逊。一個簡單的解決方法,給尋路算法添加一個上限(最大路徑長度)掌逛。如果找不到一條短的路徑师逸,這個算法返回一個錯誤代碼,在這種情況下豆混,使用重新計算路線而不是路線剪接來得到一條像1-2-5-4這樣的路徑篓像。

對于沒有涉及到這類情況的例子,對于一條N步的路徑皿伺,路線剪接會計算2N到3N路徑步數(shù)员辩,取決于一條新路徑進行剪接插入的頻繁程度。這是一個相對低的代價鸵鸥,使得算法能對世界的改變作出反應(yīng)奠滑。意想不到的是,這個花費的代價大小取決于M妒穴,也就是進行剪接的路徑步數(shù)宋税。M控制一個反饋和路徑質(zhì)量的平衡,而不是CPU時間的影響讼油。如果M的值較大杰赛,單位的移動將不會快速地對地圖的改變作出反饋。如果M太小矮台,被剪接的路徑可能太短乏屯,以至于不能得到可以繞過障礙的替換路徑:更不優(yōu)的路徑(例如1-2-5-3-4)可能會被找到,嘗試M的不同取值和不同的剪接標準(例如每隔3/4 M步)瘦赫,來看看怎樣做最適合你的地圖瓶珊。

路徑剪接比重新計算路徑明顯地快了許多,但它對于路徑的重大改變并不能很好地應(yīng)對耸彪。不過很多這種情況可以容易地發(fā)現(xiàn),并直接使用重新計算路徑來代替路徑剪接忘苛。它同樣有幾個可以調(diào)整的變量蝉娜,比如M和進行新路徑的尋找的時間,所以它可以被調(diào)整為適合不同的情況(即使是在運行的時候)扎唾。但是路徑剪接并不能處理游戲單位需要確定位置進而來互相穿過的情況召川。

監(jiān)視地圖的改變

選擇重新計算全部或部分路徑在特定的時間間隔,是對地圖的改變來觸發(fā)重新計算胸遇。地圖可以分成不同的區(qū)域荧呐,每個游戲單位可以在特定的區(qū)域表現(xiàn)出興趣。(所有包括部分路徑的區(qū)域都可能是感興趣的,或者僅僅是鄰近的包含部分路徑的區(qū)域)無論障礙進入或離開某個區(qū)域倍阐,那個區(qū)域就標記為已經(jīng)改變概疆,然后所有對那個區(qū)域感興趣的游戲單位都會被通知,所以路徑可以在考慮障礙發(fā)生變化這一前提下被重新計算峰搪。

這一技術(shù)有很多可能的變化岔冀。例如,我們可以僅僅在特定的時間間隔通知游戲單位而不是立即通知概耻。并且多次改變可以被組合成一次通知使套,所以不再需要過多的進行重新計算路徑。另一個變化是讓游戲單位來查詢地區(qū)的狀態(tài)鞠柄,而不是讓地區(qū)來通知游戲單位侦高。

監(jiān)視地圖的改變,避免了游戲單位在障礙物沒有發(fā)生變化的時候進行重新計算厌杜,因此當你有很大地區(qū)不會經(jīng)常發(fā)生改變的時候奉呛,可以考慮使用這種方法。

預(yù)測障礙物移動

如果障礙物的移動可以被預(yù)測期奔,那就可以在進行尋路時把未來的障礙物位置納入考慮侧馅。像A這類算法有一個代價函數(shù),來決定通過地圖上某點的困難程度呐萌。A可以被修改成實時更新到達一點所需要的時間(由當前的路徑長度決定)馁痴,這個時間也可以被傳入代價函數(shù)中。代價函數(shù)就可以把時間納入考慮肺孤,然后就可以使用在那個時刻的障礙物預(yù)測位置罗晕,來決定那個地圖位置是否無法通過。但是這個修改并不完美赠堵,因為它不會考慮在某個點等待障礙物離開路徑的可能性小渊,另外A*并不是設(shè)計用來區(qū)分相同路線上的路徑,而是時間不同的點茫叭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酬屉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子揍愁,更是在濱河造成了極大的恐慌呐萨,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莽囤,死亡現(xiàn)場離奇詭異谬擦,居然都是意外死亡,警方通過查閱死者的電腦和手機朽缎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門惨远,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谜悟,“玉大人,你說我怎么就攤上這事北秽∑闲遥” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵羡儿,是天一觀的道長礼患。 經(jīng)常有香客問我,道長掠归,這世上最難降的妖魔是什么缅叠? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮虏冻,結(jié)果婚禮上肤粱,老公的妹妹穿的比我還像新娘。我一直安慰自己厨相,他們只是感情好领曼,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛮穿,像睡著了一般庶骄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上践磅,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天单刁,我揣著相機與錄音,去河邊找鬼府适。 笑死羔飞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的檐春。 我是一名探鬼主播逻淌,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疟暖!你這毒婦竟也來了卡儒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤俐巴,失蹤者是張志新(化名)和其女友劉穎朋贬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窜骄,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年摆屯,在試婚紗的時候發(fā)現(xiàn)自己被綠了邻遏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糠亩。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖准验,靈堂內(nèi)的尸體忽然破棺而出赎线,到底是詐尸還是另有隱情,我是刑警寧澤糊饱,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布垂寥,位于F島的核電站,受9級特大地震影響另锋,放射性物質(zhì)發(fā)生泄漏滞项。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一夭坪、第九天 我趴在偏房一處隱蔽的房頂上張望文判。 院中可真熱鬧,春花似錦室梅、人聲如沸戏仓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赏殃。三九已至,卻和暖如春间涵,著一層夾襖步出監(jiān)牢的瞬間仁热,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工浑厚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留股耽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓钳幅,卻偏偏與公主長得像物蝙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子敢艰,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容