日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

A star算法优化二

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 A star算法优化二 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?? ? ? 本文目的是對A*尋路算法所生成的路徑進行一些人性化的調整,使其看起來不至于太機械化。關于A*算法的原理與實現,讀者可以閱讀其他資料,這里不再詳細闡述。

如何寫估價函數

? ? ? ? A*尋路算法本質上是一個有方向性的廣度優先搜索算法,它使用一個估價函數,來估測可能的最短路徑,在每一次搜索迭代完成后,選取其鄰接點中最優的一個(即,距離終點最近的一個點),作為下一次迭代的起點。如此反復,直到找到終點。下面先列出估價函數的常規寫法:

? ? ? ? 設i點到起點的價值為S,到終點的估價為E,i點的總估價G等于S+E。S的值是確定的:

[cpp]?view plain?copy
  • S?=?parent.S?+?1(i點是其父節點的水平或垂直方向上的鄰接點)??
  • 或??
  • S?=?parent.S?+?sqrt(2))(i點是其父節點斜方向上的鄰接點)??
  • E點的值需要估算。精確一點的寫法:

    [cpp]?view plain?copy
  • 水平距離:dx?=?abs(ix?-?ex)??
  • 垂直距離:dy?=?abs(iy?-?ey)??
  • 需要斜著走過的距離:v1?=?min(dx,?dy)?*?sqrt(2)??
  • 需要直線走過的距離:v2?=?max(dx,?dy)?-?min(dx,?dy)??
  • E?=??v1?+?v2??
  • 粗略的寫法:

    [cpp]?view plain?copy
  • E?=?abs(ix?-?ex)?+?abs(iy?-?ey)??
  • 如何避免轉向抖動

    ? ? ? ? A*尋路得到的結果是最優的,但不是唯一的,這源于兩點之間最近的路線可能不只一條。那么問題就產生了,兩條最佳路線距離都相等的情況下,哪一條會更好?

    ?? ?

    (紅色是障礙,白色可通行,黑色是搜索路徑)

    ? ? ? ? 如上圖所示,是A* 8方向搜索得到的兩條距離相等的路線,但是左圖的路線在中間位置發生了“拐彎”,要比右圖的路線多一個“拐彎”。如果路線上拐彎太多,人物行走的過程中,會出現頻繁轉向,從而出現“抖動”現象。所以,我們判定右圖路線優于左圖路線。針對這一問題,我們可以通過修改估價函數,來選擇“拐彎”更少的路線。

    ? ? ? ? 拐彎的問題,可以簡化成先盡可能的向一個方向走,然后再考慮轉向。進一步簡化成,點越接近起點或是終點,越優先考慮。我們給E加上一個干擾值factor,

    [cpp]?view plain?copy
  • factor?=?min(abs(ix?-?sx),?abs(ix?-?ex))?+?min(abs(iy?-?sy),?abs(iy?-?ey))??
  • factor?*=?0.01??
  • factor的值不能過大,否則會造成搜索結果不是最短距離,因此適當的給factor乘上一個縮放系數。

    如何遠離障礙物

    ? ? ? ? A*尋路的效果是抄近道,走捷徑。但對于游戲體驗來說,這并不完全是件好事,放著寬闊的馬路不走,非得走懸崖峭壁,一不小心就跌落萬丈深淵,或者卡在巖石邊上。那么,我們該如何避免這些現象呢?同樣,我們可以通過修改估計函數做到。

    ? ? ? ? 我們給每一塊可走區域都加上一個干擾值,越靠近障礙的可走區域,其干擾值越大。干擾值計算方法:

    [cpp]?view plain?copy
  • factor?=?0??
  • for(x?=?-n;?x?<=?n;?++x)??
  • {??
  • ??????for(y?=?-n;?y?<=?n;?++y)??
  • ?????{??
  • ????????if(isObstacle(ix?+?x,?iy?+?y))??
  • ????????{??
  • ????????????factor?+=?n?-?min(abs(x),?abs(y))??
  • ????????}??
  • ?????}??
  • }??
  • ? ? ? ? 我們甚至可以根據地表的材質來增加干擾值,比如山路和沼澤地帶明顯比馬路的干擾值大。

    后記

    ? ? ? ? 總之,我們可以調節估價函數來達到不同的效果。但是,也不能隨意修改,不良的估價函數,會增加搜索成本。

    總結

    以上是生活随笔為你收集整理的A star算法优化二的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。