寻路逃亡


61

如您所知,当您想在从A点到B点的二维环境中找到最佳路径时,有很多解决方案。

但是,当对象位于点A并希望尽可能快地远离点B时,如何计算路径?

一些背景信息:我的游戏使用2d环境,该环境不是基于图块的,但具有浮点精度。运动是基于矢量的。通过将游戏世界划分为可行走或不可行走的矩形并在其角外构建图形来完成寻路。我已经有了使用Dijkstras算法工作的点之间的寻路。逃逸算法的用例是,在某些情况下,我的游戏中的角色应该将另一个角色视为危险,然后逃离。

简单的解决方案是将角色沿着威胁的相反方向沿向量方向移动,直到达到“安全”距离,或者角色到达一堵墙然后在恐惧中掩盖。

这种方法的问题在于,演员将被他们容易绕开的小障碍所阻挡。只要沿着墙壁移动不会使他们更接近他们可以做到的威胁,但是当他们首先避免障碍时,它将看起来更聪明:

在此处输入图片说明

我看到的另一个问题是地图几何图形的死角。在某些情况下,存在者必须在一条路径之间进行选择,该路径可以使它现在更快地走开,但最终会被困在死胡同中;或者,这是另一条路径,这意味着它起初不会远离危险(或甚至更近一点),但另一方面,它们将获得更大的长期回报,因为最终他们会走得更远。因此,越来越远的短期回报必须以某种方式对价值越来越远的长期回报

在此处输入图片说明

对于演员应该接受的,接近较小威胁,摆脱较大威胁的情况,还存在另一个评级问题。但是完全忽略所有次要威胁也将是愚蠢的(这就是为什么此图中的参与者竭尽所能避免右上方区域的次要威胁):

在此处输入图片说明

是否有针对此问题的标准解决方案?


8
+1视觉效果很棒的问题。这确实使问题很清楚。
MichaelHouse

Answers:


24

这可能不是最好的解决方案,但对我来说,为该游戏创建逃离的AI很有用。

步骤1.将Dijkstra的算法转换为A *。只需添加一种启发式方法即可,这很简单,该方法可测量到目标的最小距离。在为节点评分时,此启发式方法会添加到到目前为止的行进距离中。无论如何,您都应该进行此更改,因为它会大大提高您的路径查找器。

步骤2.创建启发式的变体,而不是估计与目标的距离,而是测量距危险的距离并取反该值。这永远不会达到目标(因为没有目标),因此您需要在某个点终止搜索,也许是在特定的迭代次数之后,达到特定的距离之后或在处理了所有可能的路线之后。该解决方案有效地创建了一个路径查找器,该路径查找器在给定限制下找到了最佳的逃生路线。


1
请注意,仅使用距离危险的直线距离之类的东西作为步骤2中的启发式方法通常不会提供可接受的启发式方法。当然,这并不意味着您无论如何都不能尝试使用它,但是它可能不会生成最佳的转义路径。为了获得针对此“反向A *”的实际允许的启发式方法,我认为您需要使用正常的A * / Dijkstra来计算每个正方形与危险之间的实际距离。
Ilmari Karonen

+1我认为这会为您带来最大的收益。
MichaelHouse

33

如果您真的希望演员们对逃离很机灵,那么简单的Dijkstra / A *寻路将不会成功。原因是,为了找到与敌人的最佳逃生路线,演员还需要考虑敌人在追击中将如何移动。

以下MS Paint图应说明一种特殊情况,其中仅使用静态寻路以最大化与敌人的距离将导致次优结果:

演员在P形迷宫中逃离敌人的示意图

此处,绿点正从红点逃逸,并有两种选择的路径。沿着右手边的路径可以使它离红点的当前位置更远,但最终会将绿点陷在死角。相反,最佳策略是让绿点一直围绕圆运行,并尝试使其与红点相对。

为了正确地找到这种逃避策略,您需要一个对抗搜索算法(例如minimax搜索)或其改进功能(例如alpha-beta修剪)。这样的算法,适用于具有足够搜索深度的上述情况,将正确推断出将死角路径移至右侧将不可避免地导致捕获,而停留在圆圈上不会(只要绿点可以超出重做)。

当然,如果每种类型都有多个参与者,则所有这些参与者都需要计划自己的策略-分别计划,或者如果参与者进行合作,则一起制定计划。这样的多角色追逐/逃避策略可能会变得异常复杂。例如,逃亡演员的一种可能策略是试图通过将敌人引向更具诱惑力的目标来分散敌人的注意力。当然,这会影响另一个目标的最佳策略,依此类推...

在实践中,您可能无法使用大量代理实时执行非常深入的搜索,因此您将不得不非常依赖启发式方法。这些启发式方法的选择将决定演员的“心理”-他们的行为有多聪明,他们对不同策略的关注程度如何,他们有多合作或独立等等。


7

您已经找到了路径,因此可以将问题减少到选择一个好的目的地。

如果在地图上有绝对安全的目的地(例如,威胁无法跟随您的演员通过的出口),请选择一个或多个附近的目的地,并找出哪个路径成本最低。

如果您逃离的演员有装备精良的朋友,或者地图上包含该演员可以躲避但威胁没有的危险,请在这样的朋友或危险附近选择一个空旷的地方,并对此进行寻路。

如果您逃离的演员比威胁也可能感兴趣的其他演员快,请选择一个指向其他演员的方向,但要超越该范围,然后寻找到这一点:“我不必超越熊市,我只需要胜过你。”

没有逃脱,杀死或分散威胁的可能性,您的演员注定要死,对吗?因此,选择一个任意点跑到那里,如果您到达那里,而威胁仍在跟踪您,该死的是什么:转身战斗。


7

由于在许多情况下指定合适的目标位置可能很棘手,因此以下基于2D占用栅格图的方法可能值得考虑。通常将其称为“值迭代”,并与梯度下降/上升结合使用,它给出了一种简单且相当有效(取决于实现方式)的路径规划算法。由于其简单性,它在移动机器人技术中是众所周知的,特别是在室内环境中导航的“简单机器人”。如上所述,这种方法提供了一种寻找远离起始位置的路径的方法,而无需如下明确指定目标位置。请注意,可以选择指定目标位置(如果有)。而且,方法/算法构成了广度优先搜索,

在二进制情况下,2D占用网格图对于占用的网格单元是一个,而在其他位置为零。请注意,此占用率值也可以在[0,1]范围内连续,我将回到下面的值。给定的网格单元g i的值为V(g i

基本版本

  1. 假设网格单元g 0包含起始位置。设置V(g 0)= 0,并将g 0放入FIFO队列中。
  2. 从队列中取出下一个网格单元g i
  3. 对于所有的邻居Ĵ
    • 如果g j没有被占用并且以前没有被访问过:
      • V(g j)= V(g i)+1
      • g j标记为已访问。
      • g j添加到FIFO队列中。
  4. 如果尚未达到给定的距离阈值,则继续执行(2.),否则继续进行(5.)。
  5. 通过遵循从g 0开始的最陡峭的坡度上升来获得路径。

关于步骤4的注释

  • 如上所述,步骤(4.)需要跟踪所覆盖的最大距离,为清楚/简洁起见,在上面的描述中已将其省略。
  • 如果给出了目标位置,则在达到目标位置后立即停止迭代,即作为步骤(3.)的一部分进行处理/访问。
  • 当然,当然也可以简单地处理整个网格图,即继续进行直到所有(免费)网格单元都已被处理/访问。限制因素显然是网格图的大小及其分辨率。

扩展和进一步的评论

更新方程V(g j)= V(g i)+1留有足够的空间通过缩小V(g j来应用各种其他启发式方法或添加成分,以减少某些路径选项的值。大多数(如果不是全部)这样的修改可以很好地使用带有[0,1]的连续值的网格图进行一般地合并,这实际上构成了初始二进制网格图的预处理步骤。例如,沿着障碍物边界添加从1到0的过渡,会导致“角色”最好保持避开障碍物。可以例如通过模糊,加权膨胀或类似方式从二进制版本生成这种网格图。将威胁和敌人添加为具有较大模糊半径的障碍物,会对靠近这些障碍物的路径造成不利影响。也可以在整个网格图上使用扩散过程,如下所示:

V(g j)=(1 /(N + 1))×[V(g j)+ sum(V(g i))]

其中“ sum ”是指所有相邻网格单元的和。例如,代替创建二进制映射,初始(整数)值可以与威胁的大小成比例,并且障碍物表示“较小”的威胁。在应用扩散过程之后,应/必须将网格值缩放为[0,1],并将障碍,威胁和敌人所占据的像元设置/强制为1。否则,更新方程式的缩放可能不能按需工作。

此一般方案/方法有多种变体。障碍物等可能具有较小的值,而自由网格像元具有较大的值,这取决于目标,可能在最后一步需要进行梯度下降。无论如何,恕我直言,该方法出奇的通用性,易于实施且可能相当快(取决于网格图大小/分辨率)。最后,与许多未采用特定目标位置的路径规划算法一样,很明显有陷入死胡同的风险。在某种程度上,可能可以在最后一步之前应用专用的后处理步骤,以降低这种风险。

这是另一个带有Java脚本(?)插图的简短描述,尽管该插图不适用于我的浏览器:(

http://www.cs.ubc.ca/~poole/demos/mdp/vi.html

可以在下本书中找到有关计划的更多详细信息。在第2章第2.3.1节“最佳固定长度计划”中专门讨论了值迭代。

http://planning.cs.uiuc.edu/

希望对您有所帮助,德里克。


3

专注于掠食者怎么样?让我们在“捕食者”的位置上以适当的密度进行360度射线投射。我们可以提供避难所样品。并选择最佳避难所。

情况1

情况2


0

他们在《星际迷航》在线版中针对动物群的一种方法是,选择一个开放的方向,然后朝着某个特定的距离快速消灭这些动物,然后朝它们前进。但这主要是为牧群提供的精美的衍生动画,您应该避免攻击自己,而不适合实际的战斗暴徒。

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.