处理移动障碍

寻路算法将计算静止障碍物周围的路径,但是如果障碍物移动会怎么样?

当单元到达特定点时,障碍物可能不再存在,或者可能存在新的障碍物。

如果可以绕过典型的障碍物,请对你的探路者(pathfinder)使用单独的避障算法(转向)。

探路者将找到所需的路径,然后移动对象在跟随它时,绕过障碍物移动。

但是,可移动的障碍物有可能导致路径发生显著的变化,我们需要考虑探路者如何避开障碍物。

 

重新计算路径(Recalculating Paths

随着时间的推移,我们假设游戏世界发生变化。

前段时间发现的路径可能不再是最佳路径。

使用新信息更新旧路径可能是值得的。

下面列出了一些可用于确定何时需要重新计算的标准:

  • 每N步:这保证了用于计算路径的信息不超过 N 步。
  • 每当额外的 CPU 时间可用时:这允许动态调整路径质量;如果部署了多个单元,或者游戏在较慢的计算机上运行时,这​​可以降低每单位的 CPU 使用率。
  • 每当单位转弯或通过航路点时。
  • 每当单位附近的世界发生变化时。

路径重新计算的主要缺点是丢弃了许多路径信息。

例如,如果路径长度为 100 步并且每 10 步重新计算一次,则路径步长总数为 100 + 90 + 80 + 70 + 60 + 50 + 40 + 30 + 20 + 10 = 550。

对于路径在M个步骤中,随时间计算大约 M ^ 2 个路径步长。

因此,如果您希望有很多长路径,那么重新计算路径不是一个好主意。

最好重用路径信息而不是丢弃它。

 

路径拼接(Path Splicing)

当需要重新计算路径时,这意味着世界正在发生变化。

鉴于世界正在发生变化,地图的附近部分比地图的遥远部分更为人所知。

我们可以遵循当地的修复策略:

在附近找到一条好的路径,并假设距离更近的路径不需要重新计算,直到我们接近它为止。

我们可以重新计算路径的前 M 个步骤,而不是重新计算整个路径:

  1. 设 p [1] ... p [N] 为路径的其余部分(N步)
  2. 计算从 p [1] 到 p [M] 的新路径(M <= N)
  3. 通过删除 p [1] ... p [M] 并将新路径插入其位置,将此新路径拼接到旧路径中

 

由于 p [1] 和 p [M] 相距少于 M 步,因此新路径不太可能很长。

不幸的是,可能出现新路径很长且不太好的情况,附图显示了这种情况。

原来的红色路径是 1-2-3-4;棕色区域是障碍。

如果我们达到 2 并且发现从 2 到 3 的路径被阻挡,则路径拼接将用绿色路径 2-5-3 替换 2-3 并将其拼接,导致单元沿路径 1-2-5-3-4 移动。

我们可以看到这不是一条好路;蓝色路径1-2-5-4会更好。

 

通常可以通过查看新路径的长度来检测错误路径。

如果它明显长于 M,那可能会很糟糕。

一个简单的解决方案是为路径查找算法添加限制(最大路径长度)。

如果未找到短路径,则算法返回错误代码;

在这种情况下,使用路径重新计算而不是路径拼接来获取路径,例如1-2-5-4。

对于具有 N 个步骤的路径,如果不涉及这些情况,路径拼接将计算 2N 到 3N 路径步骤,这取决于新路径被拼接的频率。

这对于响应世界变化来说是相当低的成本。

令人惊讶的是,成本与 M(拼接步骤的数量)无关。

M 不影响 CPU 时间,而是控制响应度和路径质量之间的权衡。

如果 M 太高,则单位的移动不会对地图中的变化做出快速响应;

如果 M 太低,拼接的路径可能太短而不能让替换路径干净地绕过障碍物,将找到更多的次优路径(例如 1-2-5-3-4)。

尝试不同的 M 值和不同的拼接标准(例如每 3/4 M 步),以查看适合您地图的内容。

 

路径拼接明显快于路径重新计算,但它不能很好地响应路径中的大幅度变化。

可以检测到许多这样的情况时,改为使用路径重新计算。

它还有一些可以调整的变量,例如 M 和何时找到新路径的选择,因此可以针对不同条件进行调整(即使在运行时)。

路径拼接也不处理必须协调单元以通行的情况。

 

注意地图的变化

以特定间隔重新计算全部或部分路径的替代方法是更改​​地图会触发重新计算。

地图可以划分为区域,每个单位都可以表达对某些地区的兴趣。(包含部分路径的所有区域都可能是有意义的,或者只是包含部分路径的附近区域。)

每当障碍物进入或离开某个区域时,该区域都会被标记为已更改,并且所有对此区域感兴趣的区域都会通知该区域,以便可以重新计算路径以考虑障碍物的变化。

 

该技术的许多变化都是可能的。

例如,不是立即通知单位,而是仅定期通知他们。

许多更改可以分组为一个通知,因此不需要过多的路径重新计算。

另一个例子是该单元轮询区域而不是通知单元的区域。

 

观察地图更改保证了单位在地图上的障碍物不发生变化时避免重新计算,因此,如果您有许多不经常更改的区域,请考虑它。

预测障碍物运动

如果可以预测障碍物移动,则可以考虑用于寻路的障碍物的未来位置。

诸如 A* 之类的算法具有成本函数,该函数确定在地图上移动的开销。

可以修改 A* 以跟踪到达点所需的时间(由当前路径长度确定),并且该时间可以传给成本函数。

然后,成本函数考虑到时间的开销,并且预测障碍物位置,来确定在那个时刻,地图空间是否不可通过。

然而,这种修改并不完美,因为它不会考虑在某一点等待障碍物移开的可能性,并且 A* 不是用来区分沿同一路线的路径,而是在区分通过不同节点的路径。

 

合作寻路 A* 正式确定了这一点,建立了所有其他单位的路径表并将其视为障碍。

另请参阅 Windowed Hierarchical Cooperative A* 算法。

猜你喜欢

转载自www.cnblogs.com/xuuold/p/10397945.html