优化多个目标的A *寻路

时间:2012-02-28 21:44:41

标签: c++ optimization path-finding

我想将一些单位从一个地方搬到另一个地方。当我移动2或3个单位时没有问题,但是当我尝试移动20或30时需要花费很多时间...通常,单位移动几乎相同的路径,所以我不需要计算20次...我以为我会从第一个单位开始,然后只是“添加”其余单位的路径(我的意思是如果我们称之为第一单位的路径P,那就是(单位n - > P开始)单位n)的+ P +(P结束 - >单位n目标)...它工作得很好,但在某些情况下它会产生非常奇怪的事情,对于expamle,当第二单位刚好接近目标时,它必须去第一个单元开始然后回到目标......我怎样才能优化它?也许将单位分成小组然后移动小组是一个好主意?我没有更好的想法...

Thanx寻求任何帮助,抱歉我的英文不好,抱歉很长,难以阅读的文字...

3 个答案:

答案 0 :(得分:3)

一个有前景的解决方案是路径缓存

特别是,由有序的节点序列X_0到X_n组成的最短路径P有很多有用的信息。

最重要的是,对于任何i> = 0且i< j< = n,从X_i到X_j的最短路径是路径中节点P的子序列。

这为您提供了大量可以重复使用的数据(实际上是n ^ 2个数据)。

但是,如果您的地图不变,预先计算all-pairs shortest path可能更实际。这是一种(非常)简单的算法,但需要O(n ^ 3)时间。

尽管如此,您的A *实现可能更有意义地维护最近路径的哈希表。

答案 1 :(得分:3)

我找到了以下帮助。

  1. 如前所述使用路径缓存。如果您的地图是动态的并且强制缓存经常清除,这可能无法获得回报。

  2. 使用群组。将一组单元视为一个单元,将其指定为一个单元并为其找到路径。其他单位可以跟随领导者的脚步,通过一些小路径找到那些脚步(因此单位似乎也避开了主路径中的障碍物)。挑选彼此相邻的单位,以及从下属到领导者的路径应该非常小。

  3. 权衡互动的准确性。不要一次计算所有路径,随着时间的推移将它们展开。对需要路径的单元使用优先级队列,弹出一些,计算它们的路径。您甚至可以让您的路径查找代码也是一个时间限制。我在结合分组和路径缓存时做到了这一点,我的实现中的这种变化对我来说是最大的收获。

答案 2 :(得分:2)

一些想法:

  1. 在所有搜索的公共点开始搜索:目标位置。
  2. 使用所有单位的最小距离作为A *启发式,这是一种可接受的启发式算法,可产生最佳路径。使用大量单位计算可能会有点慢,你可能需要在这里做一些技巧
  3. 找到第一个单元后不要重新开始搜索,只需继续搜索,直到找到所有单元
  4. 您需要反转所有“允许移动”检查的方向,因为这是向后搜索,但除此之外它可能正常工作。除了计划在移动单位开始时的确切路径在没有必要的情况下做太多的工作,只要路径看起来不是非常愚蠢,玩家就不会介意。一旦您考虑其他单位阻挡路径,这些确切的路径经常会变得无效。