C++ 为多目标优化A*寻路

C++ 为多目标优化A*寻路,c++,optimization,path-finding,C++,Optimization,Path Finding,我想把一些单位从一个地方搬到另一个地方。当我移动2或3个单位时,这没有问题,但当我尝试移动20或30个单位时,需要很多时间。。。一般来说,单位移动几乎相同的路径,所以我不需要计算它20次。。。我想我将从第一个单元开始,然后只“添加”其余单元的路径(我的意思是,如果我们称第一个单元的路径为P,那么对于单元n,它将是(单元n->P开始)+P+(P结束->单元n目标)。。。它工作得很好,但在某些情况下,它会产生非常奇怪的事情,例如,当第二台机组刚好接近目标时,它必须先进入第一台机组启动,然后再返回目标

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

谢谢你的帮助,抱歉我的英语不好,抱歉我的文字太长太难读。

一些想法:

  • 从所有搜索的公共点开始搜索:目标位置
  • 将所有单元上的最小距离用作*启发式,这是一种可接受的启发式,可产生最佳路径。用很多单位计算可能会有点慢,你可能需要在这里做一些技巧
  • 找到第一个单元后不要重新启动搜索,只需继续搜索,直到找到所有单元
  • 您需要反转所有“允许移动”检查的方向,因为这是向后搜索,但除此之外,它可能工作正常。除此之外,在移动单元开始时规划精确的路径是做了太多的工作,而这甚至是不必要的,只要路径看起来不那么愚蠢,玩家就不会介意。当你考虑到其他单位阻塞路径时,这些精确的路径常常变得无效。

    < P> >一些想法:

  • 从所有搜索的公共点开始搜索:目标位置
  • 将所有单元上的最小距离用作*启发式,这是一种可接受的启发式,可产生最佳路径。用很多单位计算可能会有点慢,你可能需要在这里做一些技巧
  • 找到第一个单元后不要重新启动搜索,只需继续搜索,直到找到所有单元
  • 您需要反转所有“允许移动”检查的方向,因为这是向后搜索,但除此之外,它可能工作正常。除此之外,在移动单元开始时规划精确的路径是做了太多的工作,而这甚至是不必要的,只要路径看起来不那么愚蠢,玩家就不会介意。当您考虑到其他单元阻塞路径时,这些精确路径经常失效。

    < P>一个有前途的解决方案是路径缓存。 特别是,由节点X_0到X_n的有序序列组成的最短路径p具有许多有用的信息

    最重要的是,对于任何i>=0和i 特别是,由节点X_0到X_n的有序序列组成的最短路径p具有许多有用的信息


    最重要的是,对于任何i>=0和i
  • 如前所述,使用路径缓存。如果您的地图是动态的,并且强制经常清除缓存,那么这可能不会带来回报

  • 使用组。将一组单元视为一个单元,指定一个单元作为领导者,并为其找到路径。其他单位可以只跟随领导者的足迹,并对这些足迹进行一些次要的路径查找(因此单位看起来也可以避开主路径中的障碍物)。选择彼此相邻的单位,这样才能起作用,从下属到领导的路径应该非常小

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


  • 我发现以下几点有帮助

  • 如前所述,使用路径缓存。如果您的地图是动态的,并且强制经常清除缓存,那么这可能不会带来回报

  • 使用组。将一组单元视为一个单元,指定一个单元作为领导者,并为其找到路径。其他单位可以只跟随领导者的足迹,并对这些足迹进行一些次要的路径查找(因此单位看起来也可以避开主路径中的障碍物)。选择彼此相邻的单位,这样才能起作用,从下属到领导的路径应该非常小

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


  • 为什么要重用第一个单元的路径?@Beata Becouse否则我将不得不计算多次,而第一个…@Beata Becouse寻路速度不是很快,而且需要很多时间:/。我想你不希望20秒的延迟移动100个单位吧?你的A*算法有多优化?它是多层次的(即首先在宏观层面上操作,然后在微观层面上仅通过宏观路径操作)?如果100个单元需要20秒,听起来你有一个非常大的图要搜索,这给了这个优化很大的空间。而且,一旦你优化了这个部分,一个有趣的练习就是避免让每个单元走相同的路径。这样看起来很有趣,如果你的部队有碰撞检测,它会造成巨大的障碍。添加另一个维度——时间——并使每个路径占所有其他路径——通过平衡优化以获得最大吞吐量