即使障碍物在移动,A *还是有效的吗?


30

我刚刚开始学习路径查找,并且一直在研究A *算法,而我主要担心的是,我所看到的所有示例都显示了围绕它进行计算的静态障碍。

如果我有移动障碍物,例如说其他角色,也要四处走动,以确保角色必须找到自己的位置,我假设我必须在每一帧都运行算法,但是我担心这样做会变得很昂贵硬件为每个活动演员处理每个帧。

那么,A *是否仍然足够有效,以便在障碍物也移动时也可以使用,或者还有另一种寻路方法能够更有效地处理障碍物?

Answers:


27

当您需要重新计算带有移动障碍物的路径时,有多种算法比A *快得多。见这里下“简单重新计算”。

但是,您不太可能为他们中的任何一个找到现成的解决方案,因此在99%的情况下,它们对于游戏而言是过大的。使用现有的,经过充分优化的A *解决方案,并使用现有的常见技巧来加快游戏中的寻路速度,可以节省您的时间:

  • 仅在不频繁的间隔内重新计算最佳路径
  • 在多个单位之间共享最佳路径示例
  • 创建一个层次图,因此您只需要重新计算路径的一部分

等。您可以在本网站或Amit的A *页面上找到有关这些技巧的更多信息以及更多信息。


10

是。几乎在每种情况下A *仍然是必经之路。这是你的节点成本计算变得活跃,因此更复杂的计算和跟踪。

如果您已经知道将来移动的障碍物在哪里,您的A *可以在成本函数中考虑障碍物的时间性。

例如:将在4个滴答滴答声中到达此节点,从3号滴答声一直占据到6号滴答声,因此该节点的旅行成本为6-4 = +2个滴答声。那可能仍然是最佳途径。

还必须考虑障碍物的行进方向。

如果您不事先知道,则可以假设没有障碍,并在遇到障碍时重新计算路径,但是您将需要对死锁和活锁进行一些操作。(如果您可以预测障碍物的位置,但同样适用,但是它本身就是避免死锁/活锁的一种,足以满足您的目的。)

僵局是当两者等待对方移动而又没有移动时。

活锁是指当两者(或更重要的是-,这很重要)为了避免对方朝同一方向移动而最终来回移动而没有进展时。

解决活锁可能变得非常复杂,这完全取决于游戏的碰撞规则和机制(例如:它们是否应该战斗并摧毁障碍物?)。

通常会回到让您的移动物体安排节点/路径保留(当它们改变路径或死亡时不要忘记取消),以便其他移动物体可以提前计划。

获得这些信息后,您还可以计划拦截。


19
噢,天哪,“活锁”-您已经描述了我一直在走廊上必须要做的左右左右躲闪的事情。
勇敢的伊森(Ethan The Brave)

2
一个简单的实时/死锁解决方案是在可用选项之间随机选择(例如,不移动的机会为50%,向左移动的机会为50%)。只要每个参与者随机选择,锁的解决机会就不会为零。
Draco18s 17-10-28

@ Draco18s并成倍地增加来回摆动的大小,直到让步为止(我可能刚才已经描述了以太网冲突的解决方法!)
Cort Ammon-恢复Monica的时间为

我想他们可以玩剪刀石头布Petri Dish Prisoner的困境的友好游戏。; P
Draco18s 17-10-29
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.