A*算法优化

A算法是游戏中路径搜索的常见算法。Dijkstra是最短路径的经典算法,A算法的思路基本上和Dijkstra算法一致,在Dijkstra算法的基础上增加了启发函数,也就是:

f(n) = g(n) + h(n)

其中,n是路径上某一点,g(n)是从出发点到该点的cost,h(n)是关于该点的启发函数,通常是对从该点到目标花费的一个估计,例如到目标的直线距离或者曼哈顿距离。 A算法每次选择f(n)最小的点,然后更新所有g(n)。
如果你明白Dijkstra算法,那么在这里h(n) = 0 的话,A算法就和Dijkstra算法一样了。
本文不详细讲解A算法,需要详细了解A算法的具体过程的,参见以下两篇文章:

理解A*算法的具体过程
A*算法详解

A*算法优化的关键在于h(n)的选择。 一个启发函数h(n)被称为admissible的,是指h(n)的估计,不会超过节点N到目标的实际花费。
如果h(x)满足以下条件,h(x)被称为单调的(monotone, or consistent)。 对于任意一条边(x,y),
h(x) <= d(x,y) + h(y)
其中d(x,y)是(x,y)的长度

如果满足这个条件,就意味着没有任何节点需要被处理多次,也就是说,在Dijkstra算法中,新加入一个节点会导致已添加节点中cost降低的情况不会存在,也就不需要去更新已添加节点(称为close set)。

如果一个启发函数是单调的,那么该启发函数一定是admissible的。如果该启发函数是admissible的,那么可以证明A*在同类算法中搜寻到最短的路径。

问题出在这里:如果我们更在意的是搜索的时间空间花费,而不是最优结果,那么A*算法就有优化空间。所以我们放松要求,修改我们的启发函数,使得我们搜寻到的路径不会比最佳路径差太多,就是优化算法,称为ε-admissible算法。

有多种ε-admissible算法,在此只举例最简单直接的一种: 加权A*(静态加权)算法。

假如ha(n)是一个admissible的启发函数,我们选取新的启发函数hw(n) = ε ha(n),其中ε>1 作为启发函数。就可以在某种程度上进行优化。 下图1是使用ha(n)作为启发式算法,下图2是使用hw(n)作为启发式算法,其中ε取5.

图1:ha(x)作为启发算法

图2:hn(x)作为启发算法

可以看出,ha(n)可以找到最小路径,但是多了许多无用的搜索;而hw(n)找到的不是最优路径,但是减少了大量无用搜索。
其他的优化算法思路类似都是在于启发函数的选择。详见参考文献。

参考文献:
https://en.wikipedia.org/wiki/A*_search_algorithm#Admissibility_and_optimality https://en.wikipedia.org/wiki/Consistent_heuristic



  • A*绠楁硶浼樺寲
    绛旓細濡傛灉涓涓惎鍙戝嚱鏁版槸鍗曡皟鐨勶紝閭d箞璇ュ惎鍙戝嚱鏁颁竴瀹氭槸admissible鐨勩傚鏋滆鍚彂鍑芥暟鏄痑dmissible鐨勶紝閭d箞鍙互璇佹槑A*鍦ㄥ悓绫荤畻娉曚腑鎼滃鍒版渶鐭殑璺緞銆傞棶棰樺嚭鍦ㄨ繖閲岋細濡傛灉鎴戜滑鏇村湪鎰忕殑鏄悳绱㈢殑鏃堕棿绌洪棿鑺辫垂锛岃屼笉鏄渶浼樼粨鏋滐紝閭d箞A*绠楁硶灏辨湁浼樺寲绌洪棿銆傛墍浠ユ垜浠斁鏉捐姹傦紝淇敼鎴戜滑鐨勫惎鍙戝嚱鏁帮紝浣垮緱鎴戜滑鎼滃鍒扮殑璺緞涓...
  • A*绠楁硶鏄粈涔?
    绛旓細A*绠楁硶鏄A绠楁硶鐨勪竴绉嶆墿灞曞拰浼樺寲銆傞鍏堬紝璁╂垜浠簡瑙d竴涓婣绠楁硶銆侫绠楁硶鏄竴绉嶅浘閬嶅巻绠楁硶锛岀敤浜庡湪鍥句腑鎵惧埌浠庤捣濮嬬偣鍒扮洰鏍囩偣鐨勮矾寰勩傚畠浣跨敤浜嗕竴绉嶅惎鍙戝紡鏂规硶锛岄氳繃璇勪及浠庡綋鍓嶈妭鐐瑰埌鐩爣鑺傜偣鐨勪唬浠锋潵鎸囧鎼滅储銆侫绠楁硶閲囩敤浜嗕竴绉嶅箍搴︿紭鍏堟悳绱㈢殑绛栫暐锛岄愬眰鎵╁睍鑺傜偣锛岀洿鍒版壘鍒扮洰鏍囪妭鐐逛负姝傝孉*绠楁硶鏄疉绠楁硶鐨勬敼...
  • 銆愬璺慉鏄绠楁硶娴呮瀽
    绛旓細- BFS锛堝箍搴︿紭鍏堟悳绱級鏄洸鐩悳绱紝涓嶈冭檻鏈潵璺緞鐨勬垚鏈紝A*鍒欐槸娣卞害浼樺厛鎼滅储鐨浼樺寲锛岄氳繃鍚彂寮忓嚱鏁伴伩鍏嶄簡涓嶅繀瑕佺殑鎺㈢储銆- Dijkstra绠楁硶铏界劧鎵惧埌鐨勬槸鏈鐭矾寰勶紝浣嗘椂闂村鏉傚害杈冮珮銆侫*鍦ㄤ繚璇佽矾寰勬晥鐜囩殑鍚屾椂锛屽姹傜殑鏄洿鐭矾寰勶紝鐗瑰埆鏄綋鐩爣鑺傜偣浣嶇疆淇℃伅鍙敤鏃躲3. A*绠楁硶鐨勪吉浠g爜 A*鐨勬悳绱㈣繃绋嬪涓嬶細...
  • A*绠楁硶浠嬬粛
    绛旓細鐜扮敤A*绠楁硶瀵绘壘鍑轰竴鏉¤嚜A鍒癇鐨勬渶鐭矾寰,姣忎釜鏂规牸鐨勮竟闀夸负10,鍗冲瀭鐩存按骞虫柟鍚戠Щ鍔ㄥ紑閿涓10銆傚洜姝ゆ部瀵硅绉诲姩寮閿绾︾瓑浜14銆傚叿浣撴楠ゅ涓: 浠庤捣鐐 A 寮濮,鎶婂畠鍔犲叆鍒颁竴涓敱鏂规牸缁勬垚鐨刼pen list(寮鏀惧垪琛) 涓,杩欎釜open list鍍忔槸涓涓喘鐗╂竻鍗曘侽pen list閲岀殑鏍煎瓙鏄彲鑳戒細鏄部閫旂粡杩囩殑,涔熸湁鍙兘涓嶇粡杩囥傚洜姝ゅ彲浠ュ皢鍏...
  • A鏄绠楁硶璇﹁В(涓汉璁や负鏈璇︾粏,鏈閫氫織鏄撴噦鐨勪竴涓増鏈)
    绛旓細褰卞搷鍦板浘璁捐锛圛nfluence Mapping锛夊彲寮曞AI閫夋嫨鏇村畨鍏ㄧ殑璺緞锛岄伩鍏嶄笉蹇呰鐨勫啿绐併傛湭鎺㈡祴鍖哄煙鐨勫鐞嗭紝浣垮崟浣嶈涓烘洿鍔犺嚜鐒躲A*绠楁硶铏芥彁渚涚煭璺緞锛屼絾鍙兘涓嶅骞虫粦锛岄氳繃浼樺寲绛栫暐鍙敼杩涜繖涓鐐癸紝灏ゅ叾鍦ㄤ笉瑙勫垯鍦板舰搴旂敤鏃躲傝繘闃跺涔 娣卞叆瀛︿範A*绠楁硶锛屽彲鍙傝冧綔鑰呮彁渚涚殑C++鍜孊litzBasic浠g爜绀轰緥锛屼互鍙夾mit Patel銆丅ryan...
  • A*绠楁硶瀹為檯杩愮敤
    绛旓細A*绠楁硶鍦ㄥ疄闄呭簲鐢ㄤ腑锛屽叾浼颁环鍊煎嚱鏁扮殑閲嶈鎬т笉瑷鑰屽柣銆備竴涓ソ鐨勪及浠峰嚱鏁板簲灏藉彲鑳芥帴杩戝疄闄呮垚鏈紝涓旀弧瓒充箰瑙傛潯浠讹紙鍗冲皬浜庢垨绛変簬瀹為檯鎴愭湰锛夈備互鍑犱綍璺綉涓轰緥锛屼及浠峰糵鍙彇涓よ妭鐐归棿鐨勬鍑犻噷寰楄窛绂伙紝鍗砯 = g(n) + sqrt((dx - nx)^2 + (dy - ny)^2)锛岃繖鏍穎鍦ㄤ繚鎸乬鍊间笉鍙樼殑鎯呭喌涓嬶紝鍙梙鍊硷紙鑺傜偣...
  • 瑙e喅鍗曡捣鐐瑰鍥炶矾鏈鐭矾绾块棶棰樺父鐢ㄧ殑鏂规硶鏄
    绛旓細A*绠楁硶鏄竴绉嶅惎鍙戝紡鎼滅储绠楁硶锛屽彲浠ュ湪澶ц妯″浘涓眰瑙e崟婧愭渶鐭矾寰勩傚湪澶氬洖璺棶棰樹腑锛孉*绠楁硶鍙互閫氳繃瀵瑰惎鍙戝嚱鏁扮殑璁捐鏉ュ垽鏂槸鍚﹂渶瑕佸啀娆¤蛋鍚屼竴鑺傜偣銆4. 鍩轰簬閬椾紶绠楁硶鐨浼樺寲鏂规硶 閬椾紶绠楁硶鏄竴绉嶅熀浜庤繘鍖栬鐨勬悳绱㈢畻娉曪紝鍙互鐢ㄤ簬姹傝В浼樺寲闂銆傚湪澶氬洖璺棶棰樹腑锛屽彲浠ュ皢鍥炶矾浣滀负鏌撹壊浣擄紝璺緞闀垮害浣滀负閫傚簲搴﹀嚱鏁帮紝...
  • 澶ф暟鎹牳蹇绠楁硶鏈夊摢浜?
    绛旓細1銆A* 鎼滅储绠楁硶——鍥惧舰鎼滅储绠楁硶锛屼粠缁欏畾璧风偣鍒扮粰瀹氱粓鐐硅绠楀嚭璺緞銆傚叾涓娇鐢ㄤ簡涓绉嶅惎鍙戝紡鐨勪及绠楋紝涓烘瘡涓妭鐐逛及绠楅氳繃璇ヨ妭鐐圭殑鏈浣宠矾寰勶紝骞朵互涔嬩负鍚勪釜鍦扮偣鎺掑畾娆″簭銆傜畻娉曚互寰楀埌鐨勬搴忚闂繖浜涜妭鐐广傚洜姝わ紝A*鎼滅储绠楁硶鏄渶浣充紭鍏堟悳绱㈢殑鑼冧緥銆2銆侀泦鏉熸悳绱(鍙堝悕瀹氬悜鎼滅储锛孊eam Search)—&m...
  • 璁$畻鏈虹綉缁滅殑鏈鐭矾寰绠楁硶鏈夊摢浜?瀵瑰簲鍝簺鍗忚?
    绛旓細Dijkstra绠楁硶銆A*绠楁硶銆丼PFA绠楁硶銆丅ellman-Ford绠楁硶鍜孎loyd-Warshall绠楁硶锛屾湰鏂囦富瑕佷粙缁嶅叾涓殑涓夌銆傛渶鐭矾寰勯棶棰樻槸鍥捐鐮旂┒涓殑涓涓粡鍏哥畻娉曢棶棰橈紝鏃ㄥ湪瀵绘壘鍥撅紙鐢辩粨鐐瑰拰璺緞缁勬垚鐨勶級涓袱缁撶偣涔嬮棿鐨勬渶鐭矾寰勩傜畻娉曞叿浣撶殑褰㈠紡鍖呮嫭锛氱‘瀹氳捣鐐圭殑鏈鐭矾寰勯棶棰橈細鍗冲凡鐭ヨ捣濮嬬粨鐐癸紝姹傛渶鐭矾寰勭殑闂銆傜‘瀹氱粓鐐圭殑鏈鐭...
  • DL-IAPS & PJSO: 璺緞鍜岄熷害浼樺寲绠楁硶
    绛旓細PJSO鐨勪粙鍏ワ紝浣垮緱閫熷害瑙勫垝鏇村姞鐏垫椿涓旈珮鏁堬紝瀹冨湪浼樺寲閫熷害鏇茬嚎鐨勫悓鏃讹紝鍏奸【浜嗚矾寰勭殑杩炵画鎬у拰杞﹁締鎬ц兘鐨勫钩婊戞с傚姣擧ybrid A*锛孌L-IAPS灞曠幇鍑烘槑鏄剧殑浼樺娍锛屽鍥4.1鎵绀猴紝鏁堢巼鎻愬崌娓呮櫚鍙銆傚湪浠g爜灞傞潰锛岃矾寰勫钩婊戠殑杩囩▼鍦╩odules/planning/open_space/trajectory_smoother/iterative_anchoring_smoother.cc涓睍寮锛...
  • 扩展阅读:算法优化 ... a*算法例题 ... 线代a*怎么求 ... a*算法详解 ... a*怎么读 ... a*算法改进 ... a*算法怎么读 ... a*算法流程图 ... a算法和a*算法的区别 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网