如何使用A *

问题描述

我在没有权重的2D网格上具有带有A *脚本的AI。用这些AI管理“无路径”情况的理想或典型方法是什么? AI被无法行走的方块挡住了最终目标?我可以看到打开列表的上限,但这似乎是任意的-毕竟到目标的路径可能很长-但是实现此目标的典型方法是什么?

解决方法

通常,A *应该限制应执行的迭代次数。您可以使用“默认限制”,因为您可以使用多种策略对此进行测试。

TLDR :使用Divide and conquer简化较小问题的解决方案以获得最佳结果,并将A *限制在有限的空间或迭代量内。

从最坏到最好列出。

  1. 设置硬限制-这是最简单的解决方案,而最糟糕的是解决方案。因为您不知道问题出在哪里,或者路径是否可走,并且很难确定如果达到路径限制应该采取的措施。
  2. 一次从头到尾的A * -这样做“不应”提高算法的性能,并且如果路径满足,您将得到答案。但是,如果没有,您可以跟踪到起点和终点之间最近的位置,并将其设置为“临时目的地”。然后从那里重试(您可以保存已经获得的路径并从那里扩展它)。这种方法的缺点是,在某些情况下您可能会走错路。
  3. 用于图途寻路的低质量A * -如果您知道某些地方的路线较长,可能需要很长时间才能找到路线,因此可以对世界地图进行分块-并将基于32x32或64x64等块的路由计算为A *中的单个节点。创建一种算法,检查该块是否可步行。然后,使用Dijkstra的算法而不是使用A *来绘制整个路线,该算法将使用预定义的路点(最好是在运行时之前生成)来预先确定路径,然后使用A *在将以可步行网格元素为目标的块内移动。这样,您就知道如何进入与目的地相同的区块,并且从那里发现区块内部没有路径的代价很小,因为您要检查的区域非常有限。
,

如果两个图块之间从来没有任何可行走的路径,则没有理由使它们成为同一图形的一部分。如果地图是静态的,则可以使用Djikstra将地图预处理为可保证所有图块之间具有有效路径的部分。

如果地图是完全动态的,则可能必须设置硬上限,以保证节点数。

如果仅特定节点可以被阻止/取消阻止,则可能需要多级策略。即在该图中为每个部分创建一个节点并运行初步路径查找。

对于诸如被NPC阻塞的节点之类的事情,还需要另一种解决方案,例如通过在寻路过程中忽略它们并在发生冲突时进行处理。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...