C# 如何管理一个;“没有路径”;带有*

C# 如何管理一个;“没有路径”;带有*,c#,unity3d,graph,a-star,C#,Unity3d,Graph,A Star,我有一个二维网格上没有权重的A*脚本的AI。使用这些AI管理“无路径”情况的理想或典型方式是什么,例如AI被不可通行的瓷砖阻挡在其最终目标之外?我可以看到对开放列表进行封顶,但这似乎是任意的——毕竟,到目标的路径可能相当长——但实现这一点的典型方式是什么?通常,a*应该限制它应该执行的迭代次数。没有可以使用的“默认限制”,因为您可以使用多种策略来测试这一点 TLDR:用于简化较小问题的解决方案以获得最佳结果,并将A*限制在有限空间或迭代量内 从最坏到最好列出 设置硬限制-这是最简单的解决方案,最

我有一个二维网格上没有权重的A*脚本的AI。使用这些AI管理“无路径”情况的理想或典型方式是什么,例如AI被不可通行的瓷砖阻挡在其最终目标之外?我可以看到对开放列表进行封顶,但这似乎是任意的——毕竟,到目标的路径可能相当长——但实现这一点的典型方式是什么?

通常,a*应该限制它应该执行的迭代次数。没有可以使用的“默认限制”,因为您可以使用多种策略来测试这一点

TLDR:用于简化较小问题的解决方案以获得最佳结果,并将A*限制在有限空间或迭代量内

从最坏到最好列出

  • 设置硬限制-这是最简单的解决方案,最好也是最坏的解决方案。因为你不知道问题出在哪里,或者路径是否可以行走,如果你达到了路径限制,你很难决定应该怎么做
  • A*一次从开始到结束-这样做“不应该”提高算法的性能,如果路径满足,您就会得到答案。但是如果他们没有,你可以追踪起点和终点之间最近点的位置,并将其设置为“临时目的地”。然后从那里重试(您可以保存已获得的路径并从那里展开)。这种方法的缺点是,在某些边缘情况下,您可能会走错方向
  • 用于图形航路点寻路的低质量A*-如果您知道某些地方有一条很长的路线,可能需要很长时间才能找到一条路线,您可以将世界地图分块-并基于例如:32x32或64x64等计算路线。分块为A*中的单个节点。创建一个检查此块是否可行走的算法。然后,使用Dijkstra算法,使用预定义的航路点(最好在运行前生成)预先确定路径,而不是使用*生成整个路线,然后使用*在块内移动,该块将以另一块中的可行走网格元素为目标。通过这种方式,您知道如何进入与目的地相同的区块,并且从那里发现区块内没有路径的代价最小,因为您要检查的区域非常有限

  • 通常,A*应该对它应该执行的迭代次数有一个限制。没有可以使用的“默认限制”,因为您可以使用多种策略来测试这一点

    TLDR:用于简化较小问题的解决方案以获得最佳结果,并将A*限制在有限空间或迭代量内

    从最坏到最好列出

  • 设置硬限制-这是最简单的解决方案,最好也是最坏的解决方案。因为你不知道问题出在哪里,或者路径是否可以行走,如果你达到了路径限制,你很难决定应该怎么做
  • A*一次从开始到结束-这样做“不应该”提高算法的性能,如果路径满足,您就会得到答案。但是如果他们没有,你可以追踪起点和终点之间最近点的位置,并将其设置为“临时目的地”。然后从那里重试(您可以保存已获得的路径并从那里展开)。这种方法的缺点是,在某些边缘情况下,您可能会走错方向
  • 用于图形航路点寻路的低质量A*-如果您知道某些地方有一条很长的路线,可能需要很长时间才能找到一条路线,您可以将世界地图分块-并基于例如:32x32或64x64等计算路线。分块为A*中的单个节点。创建一个检查此块是否可行走的算法。然后,使用Dijkstra算法,使用预定义的航路点(最好在运行前生成)预先确定路径,而不是使用*生成整个路线,然后使用*在块内移动,该块将以另一块中的可行走网格元素为目标。通过这种方式,您知道如何进入与目的地相同的区块,并且从那里发现区块内没有路径的代价最小,因为您要检查的区域非常有限

  • 如果两个图块之间从来没有任何可行走的路径,那么它们就没有理由成为同一图形的一部分。如果贴图是静态的,则可以使用Djikstra将贴图预处理为确保所有分片之间具有有效路径的部分

    如果贴图是完全动态的,则可能必须设置节点数的硬上限

    如果只能阻止/取消阻止特定节点,则可能需要多级策略。即,为每个部分创建一个节点,并在此图中运行初步路径查找


    对于NPC阻止的节点等问题,需要另一种解决方案,例如在路径查找过程中忽略它们,并在发生冲突时处理冲突。

    如果两个分幅之间从来没有任何可行走的路径,则它们没有理由成为同一图形的一部分。如果贴图是静态的,则可以使用Djikstra将贴图预处理为确保所有分片之间具有有效路径的部分

    如果贴图是完全动态的,则可能必须设置节点数的硬上限

    如果只能阻止/取消阻止特定节点,则可能需要多级策略。即,为每个部分创建一个节点,并在此图中运行初步路径查找

    对于被NPC阻止的节点,需要另一种解决方案,例如在路径查找过程中忽略它们,并在冲突发生时处理冲突