启发式算法

启发函数h(n)告诉A *从任何顶点n到目标的最小成本的估计。 选择一个好的启发式函数很重要。

A*对启发式函数的使用

启发式可以用来控制A *的行为。

  • 一种极端情况,如果h(n)是0,则只有g(n)起作用,此时A*演变成Dijkstra算法,这保证能找到最短路径。

  • 如果h(n)经常都比从n移动到目标的实际代价小(或者相等),则A*保证能找到一条最短路径。h(n)越小,A*扩展的结点越多,运行就得越慢。

  • 如果h(n)精确地等于从n移动到目标的代价,则A*将会仅仅寻找最佳路径而不扩展别的任何结点,这会运行得非常快。尽管这不可能在所有情况下发生,你仍可以在一些特殊情况下让它们精确地相等(译者:指让h(n)精确地等于实际值)。只要提供完美的信息,A*会运行得很完美,认识这一点很好。

  • 如果h(n)有时比从n移动到目标的实际代价高,则A*不能保证找到一条最短路径,但它运行得更快。

  • 另一种极端情况,如果h(n)比g(n)大很多,则只有h(n)起作用,A*演变成BFS算法。

所以我们得到一个很有趣的情况,那就是我们可以决定我们想要从A*中获得什么。理想情况下(注:原文为At exactly the right point),我们想最快地得到最短路径。如果我们的目标太低,我们仍会得到最短路径,不过速度变慢了;如果我们的目标太高,那我们就放弃了最短路径,但A*运行得更快。

在游戏中,A*的这个特性非常有用。例如,你会发现在某些情况下,你希望得到一条好的路径("good" path)而不是一条完美的路径("perfect" path)。为了权衡g(n)和h(n),你可以修改任意一个。

:在学术上,如果启发式函数值是对实际代价的低估,A*算法被称为简单的A算法(原文为simply A)。然而,我继续称之为A*,因为在实现上是一样的,并且在游戏编程领域并不区别A和A*。

速度还是精确度?

A*改变它自己行为的能力基于启发式代价函数,启发式函数在游戏中非常有用。在速度和精确度之间取得折衷将会让你的游戏运行得更快。在很多游戏中,你并不真正需要得到最好的路径,仅需要近似的就足够了。而你需要什么则取决于游戏中发生着什么,或者运行游戏的机器有多快。

假设你的游戏有两种类型的平地和山地,平地的运动费用为1,山地的运动费用为3,A *将沿着平地土地搜索三倍远的山地。 这是因为沿着平坦的地形有一条可以绕山的道路。 把两个邻接点之间的评估距离设为1.5可以加速A*的搜索过程。 A *将会比较3到1.5,并不会像3比1那样差。它不像山区那样不满意,所以不会花太多时间试图找到一个办法。 或者,您可以通过减少搜索山脉路径的数量来加快A *的搜索,告诉A *,山地的运动成本为2而不是3。现在,它将在平坦的地形上搜索两倍远的山地一样。 任何一种方法都放弃理想的途径来获得更快的东西。

速度和精度之间的选择不一定是静态的。 您可以根据CPU速度,用于路径搜索的时间片数,地图上物体(units)的数量,物体的重要性,组大小,难度级别或任何其他因素动态选择。 使权衡动态的一种方法是构建一个启发式函数,其假设运行一个网格空间的最小成本为1,然后建立一个代价函数(cost function)用于测量(scales):

g'(n) = 1 + alpha * (g(n) - 1)

  如果alpha是0,则改进后的代价函数的值总是1。这种情况下,地形代价被完全忽略,A*工作变成简单地判断一个网格可否通过。如果alpha是1,则最初的代价函数将起作用,然后你得到了A*的所有优点。你可以设置alpha的值为0到1的任意值。

你也可以考虑对启发式函数的返回值做选择:绝对最小代价或者期望最小代价。例如,如果你的地图大部分地形是代价为2的草地,其它一些地方是代价为1的道路,那么你可以考虑让启发式函数不考虑道路,而只返回2*距离。

速度和精确度之间的选择并不是全局的。在地图上的某些区域,精确度是重要的,你可以基于此进行动态选择。例如,假设我们可能在某点停止重新计算路径或者改变方向,则在接近当前位置的地方,选择一条好的路径则是更重要的,因此为何要对后续路径的精确度感到厌烦?或者,对于在地图上的一个安全区域,最短路径也许并不十分重要,但是当从一个敌人的村庄逃跑时,安全和速度是最重要的。(译者注:译者认为这里指的是,在安全区域,可以考虑不寻找精确的最短路径而取近似路径,因此寻路快;但在危险区域,逃跑的安全性和逃跑速度是重要的,即路径的精确度是重要的,因此可以多花点时间用于寻找精确路径。)

衡量单位

A*计算f(n) = g(n) + h(n)。为了对这两个值进行相加,这两个值必须使用相同的衡量单位。如果g(n)用小时来衡量而h(n)用米来衡量,那么A*将会认为g或者h太大或者太小,因而你将不能得到正确的路径,同时你的A*算法将运行得更慢。

精确的启发式函数

如果你的启发式函数精确地等于实际最佳路径(optimal path),如下一部分的图中所示,你会看到此时A*扩展的结点将非常少。A*算法内部发生的事情是:在每一结点它都计算f(n) = g(n) + h(n)。当h(n)精确地和g(n)匹配(译者注:原文为match)时,f(n)的值在沿着该路径时将不会改变。不在正确路径(right path)上的所有结点的f值均大于正确路径上的f值(译者注:正确路径在这里应该是指最短路径)。如果已经有较低f值的结点,A*将不考虑f值较高的结点,因此它肯定不会偏离最短路径。

1.在粗网格的顶部安装粗网格。 预先计算任何一对粗网格位置之间的最短路径。

2.预先计算任何一对航路点之间的最短路径。 这是粗网格方法的概括。

然后添加一个启发函数h’用于评估从任意位置到达邻近导航点(waypoints)的代价。(如果愿意,后者也可以通过预计算得到。)最终的启发式函数可以是:

h(n) = h'(n, w1) + distance(w1, w2) + h'(w2, goal)

  或者如果你希望一个更好但是更昂贵的启发式函数,则分别用靠近结点和目标的所有的w1,w2对对上式进行求值。(译者注:原文为or if you want a better but more expensive heuristic, evaluate the above with all pairs w1, w2 that are close to the node and the goal, respectively.)

线性精确启发式算法

在特殊情况下,你可以不通过预计算而让启发式函数很精确。如果你有一个不存在障碍物和slow地形,那么从初始点到目标的最短路径应该是一条直线。

  如果你正使用简单的启发式函数(我们不知道地图上的障碍物),则它应该和精确的启发式函数相符合(译者注:原文为match)。如果不是这样,则你会遇到衡量单位的问题,或者你所选择的启发函数类型的问题。

网格地图中的启发式算法

转载于:https://www.cnblogs.com/dannierdeshenghuo/p/6582609.html

Heuristic function相关推荐

  1. Heuristic Search之Greedy Best First Search

    Greedy Best-First Search example Whats wrong with GBFS Compare to Uniform-Cost Search 参考资料 CodeGBFS ...

  2. Heuristic (computer science)

    In mathematical optimization and computer science, heuristic (from Greek εὑρίσκω "I find, disco ...

  3. 游戏开发基础:A*算法(转)

    转自:http://www.codeguru.com/csharp/csharp/cs_misc/designtechniques/article.php/c12527/ A-Star (A*) Im ...

  4. 理解和配置 Linux 下的 OOM Killer

    原文:http://www.vpsee.com/2013/10/how-to-configure-the-linux-oom-killer/ 最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有 ...

  5. 理解和配置Out of memory: Kill process

    转自:爱开源 理解 OOM killer 最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有位客户抱怨 VPS 经常死机,登陆到终端看了一下,都是常见的 Out of memory 问题.这通 ...

  6. 一些重要的算法The Most Important Algorithms

    下面是一些比较重要的算法,原文罗列了32个,但我觉得有很多是数论里的,和计算机的不相干,所以没有选取.下面的这些,有的我们经常在用,有的基本不用.有的很常见,有的很偏.不过了解一下也是好事.也欢迎你留 ...

  7. 机器人学习--路径规划--A*算法实现

    参考网址:https://www.redblobgames.com/pathfinding/a-star/implementation.html 扩展:https://www.redblobgames ...

  8. Something about Giraffe (II)

    先解決老師留的幾個問題再說吧,23333 XD. Giraffe 是一個將 Deep Reinforcement Learning 和 Neural Network 结合到一起的Chess AI 程式 ...

  9. 【数据结构与算法】【算法思想】 A *搜索算法

    算法解析 这是一个非常典型的搜索问题. 人物的起点就是他当下所在的位置,终点就是鼠标点击的位置. 我们需要在地图中,找一条从起点到终点的路径. 这条路径要绕过地图中所有障碍物,并且看起来要是一种非常聪 ...

  10. A*搜索算法--游戏寻路

    文章目录 1. 算法解析 2. 总结 仙剑奇侠传这类MMRPG游戏中,有人物角色 自动寻路功能.当人物处于游戏地图中某位置时,点击另一个相对较远的位置,人物就会自动地绕过障碍物走过去.这个功能是怎么实 ...

最新文章

  1. day44前端开发1之html基础
  2. 指数哥伦布编码 java_H.264学习笔记6——指数哥伦布编码
  3. 92. Reverse Linked List II
  4. java 输入人名_Java 读取控制台输入
  5. 2.4一元多项式的表示及相加,含cpp算法
  6. oracle高压水位线,Oracle 高水位线详解(HWM)
  7. Matter-JS constraint 约束
  8. 图解深度学习的笔记:1.MP模型,感知器,BP下的多层感知器
  9. 7.26 1004度度熊的午饭时光 百度之星题解
  10. Myeclipse项目内容没有报错但是项目上面却有红色叉叉
  11. Python open()函数详解:打开指定文件
  12. i78565U和i710510U的区别 i78565U和i710510U参数配置对比哪个好
  13. 神农班和我的2020年总结
  14. aviary 图片编辑器
  15. WPS制作的电子签名有法律效力吗
  16. 2. C语言 -- 打印
  17. 完美移除ESXI 7.0默认120G虚拟闪存,并支持自由调整,释放被占用的磁盘空间
  18. TMS28335 XINTF
  19. 完美解决OneNote for Windows 10无法同步问题
  20. 计算机网络个人简历范文,计算机网络个人简历范文

热门文章

  1. U3D Shader
  2. 从零开始使用最前沿技术 Kube-VIP 搭建一个高可用的 Kubernetes 集群
  3. HLG 1506 屠夫和狙击手【判断点在线段上+线段与圆相交】
  4. 15_微信小程序-BLE低功耗蓝牙开发-读写特征值
  5. 2022-2027年中国智能服务机器人行业发展监测及投资战略研究报告
  6. win7首次使用计算机,首次安装win7系统如何进行硬盘分区
  7. 留给19371213看的
  8. WordPiece 和 BPE 的区别
  9. 地图历史大反转!GISer如何查看历史影像
  10. 2021中国低/无代码平台投融资趋势报告: 融资规模近15亿,估值近70亿,马太效应将愈演愈烈...