我正在图块地图上实现多代理A *算法。代理仅在X和Y轴上移动。通过在计算路径时检查其他位置,我避免了它们之间的冲突。
除代理必须从不同方向传递同一图块的情况外,此方法都可以正常工作。在这种情况下,最佳解决方案是让一个代理等待另一个代理通过:
另外,如果没有北方走廊,寻路也会失败。
如何实现这种算法?
我正在图块地图上实现多代理A *算法。代理仅在X和Y轴上移动。通过在计算路径时检查其他位置,我避免了它们之间的冲突。
除代理必须从不同方向传递同一图块的情况外,此方法都可以正常工作。在这种情况下,最佳解决方案是让一个代理等待另一个代理通过:
另外,如果没有北方走廊,寻路也会失败。
如何实现这种算法?
Answers:
您可以从让寻路失败开始。如果出现故障,请在将来选择随机时间重试寻路。 一些低级网络协议可以那样工作,而且效果很好。您要做的是一次建立一个路径,并将代理将通过的所有图块标记为已使用。当其他路径失败时,随机计时器重新启动将有助于扩展新路径搜索并消除循环失败。
问题的第二部分可以通过返回两条路径来处理。第一条路径是常规返回,即使它从一个块失败了也是如此。第二条路径是完全忽略所有代理的路径。然后,您可以使用从这两个路径中获得的知识来决定等待还是走长途路途会更好。该决定的启发式方法将需要一些工作,但总比不尝试任何事情要好。
在非常糟糕的情况下,您的座席会被这样的单宽走廊阻塞很多,您可能必须添加安全位置以站立,以便座席可以快速到达并等待其真实路径打开(因此座席不会请稍等,然后遮挡走廊)。
除了解决您的问题,这里还提供了一种提取柠檬并制成柠檬水的方法。
许多年前,我的一个朋友正在研究一个非常著名的FPS,正是这个问题描述了您所描述的问题:一个受约束的区域将有许多具有特定期望位置的AI字符,而寻路算法不断地对其造成冲击彼此。尤其是,玩家会向一个充满敌人的小房间投掷手榴弹,而该地区的AI角色将各自尝试逃跑至出口,但彼此相撞,最终暂停,转身,打别人,转身,等等。这看起来非常不现实。
尝试建立一种更好的寻路算法,如果计算预算紧张,该算法可以成功运行。因此,我的朋友没有解决寻路问题,而是向AI添加了非常便宜的支票:如果AI在很短的时间内两次撞入另一个AI,请停止尝试寻找出口,然后躲起来。所以现在发生的是,PC炸了手榴弹,看到一堆敌人冲向出口。那些互相撞的人转过身,看起来他们意识到自己无法逃脱,于是他们在炸毁之前就躲了起来,遮住了头。这既逼真又令玩家满意。
有没有类似的方法可以消除产生冲突的算法的弊端并将其转化为优势?
我通常会发现,针对其他本地化场景,最好使用其他形式的路径查找来增强A *路径。避免单元通常是其中之一,尤其是在有多个代理同时移动并因此产生动态阻止程序的世界中。
通常,边缘跟踪技术可以解决此问题。当您沿路径行驶时,遇到的障碍物不是原始路径计算的一部分,您基本上会选择一个方向(顺时针或逆时针),并尝试在该方向上绕过障碍物来遍历。如果不能,请等待阻止程序自行解决(尽管这可能导致死锁)。
您还可以实现单位协同合作的能力;也就是说,一个单元可以要求另一个单元略微移开,以便它可以“挤过”阻塞单元。但是,这在基于图块的游戏中效果不佳,在这种情况下,您只能进行基于图块的移动,因为您仍然可以像示例一样在单宽走廊中陷入僵局。在这种情况下,您可以让各个单元互相询问“切换位置”,这在大多数情况下都可以解决问题。有时候,这会导致单位越过对方。
在讨论游戏中的寻路时,“避免单位”是一个相当普遍的话题,为此,有很多热门话题。特别是,您可能想在Supreme Commander 2中使用的“流场”寻路上检查这个问题。RTS通常会遇到很多这个问题,并以各种有趣的方式解决它。
如果您有一个基于转弯/基于刻度的移动系统,则可以创建一个3D图形,其中每个过渡都将座席移动到将来的地图外观中。然后,让每个代理声明他们将来在该位置上将要使用的图块,并将其标记为不可访问。然后,每个座席都有一个额外的选项:“ẅ”到下一个刻度线,作为在图表中过渡的第三种方法。这在您的系统上将更加困难,但是比随机等待会给您更好的结果。如果您允许2个座席进行bt沟通,甚至更好,如果其中一个最短路径通过该座席,则其中一个会发送一条消息“我想通过您”,
当使用像A *这样的算法时,您在处理成本启发法方面拥有最大的自由度。
在这种特殊情况下,您可以调整试探法,以增加将一个特工靠近另一个特工的移动成本,问题是您可能最终都试图走上一条路线,最终可能会摆动路径之间的来回切换取决于它们的确切时间。
另一种可能性是跟踪代理商预期的路线并沿其他代理商预期的路径向上调整成本。这有效地允许代理在有限的程度上彼此协调。这里的主要问题是,如果所有路由都被阻止,则无论哪个代理最后移动,路径查找都可能继续失败。
在只有一条路径的情况下,路径查找将失败或者它们将彼此前进直到死锁。
如果这些都不足够好,那么在计算成本时也需要开始跟踪时间。第二个座席的成本应该是第一个座席获得清算所花费的时间加上正常的遍历成本,这样,您的座席就可以正确地决定何时等待而不是走另一条路。
使时间一致可能会花费更多的精力,因此大多数人都愿意调整关卡的布局和成本值,直到情况变得足够好为止。
通常,我会建议您使用转向行为来解决路径跟随过程中的此类问题。而且您仍然可以从中受益匪浅,以获取分组行为的灵感。但是不幸的是,它实际上并不直接适用于基于简单图块的运动。
由于您在大多数情况下都已经可以避免工作中的碰撞,因此请专注于这一特殊情况。我想您每次代理人要搬家时都要重新做寻路,否则我看不到他们对搬家中其他人的反应。其次,我想这些特工彼此友好。
您建议一位特工等待另一位特工,我建议您这样做。为代理提供一种访问其他路径的方法,搜索您自己路径的第一个图块,该图块不属于其他路径,然后转到那里。此技术可能存在以下问题:
您如何确定是否有其他代理可以接受的其他方式?如果有足够的空间来绕过他,您就不想等待其他特工。当考虑使用其他代理时,寻路失败是您要解决的情况的明确标志,但是在您提出的示例中,不会出现寻路失败。但是,您可以(通过一些计算)确定替代路径A *是否使您绕过另一个特工绕了一圈,或者使用了完全不同的路径(如北部走廊)。
我不知道一个座席在一次回合/一次行动中可以走多远,但是如果这还不够远,或者如果所有座席都在平行移动,则两个座席都将决定在路径的另一端等待。可以通过向其他座席发信号通知您释放他的路径来解决此问题。