【问题标题】:How to manage a "no-path" scenario with A*如何使用 A* 管理“无路径”场景
【发布时间】:2020-09-09 13:22:39
【问题描述】:

我在没有权重的 2D 网格上有带有 A* 脚本的 AI。使用这些 AI 管理“无路径”情况的理想或典型方式是什么,例如AI 在哪里被无法行走的瓷砖挡住了它们的最终目标?我可以看到打开列表的上限,但这似乎是任意的——毕竟通往目标的路径可能很长——但是解决这个问题的典型方法是什么?

【问题讨论】:

    标签: c# unity3d graph a-star


    【解决方案1】:

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

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

    从最差到最好列出。

    1. 设置硬限制 - 这是最简单的解决方案,也是最糟糕的解决方案。因为您不知道问题出在哪里,也不知道该路径是否可以步行,而且如果您达到路径限制,您很难决定该怎么做。
    2. A* 从头到尾一次完成 - 这样做“不应该”提高算法的性能,如果路径符合,您就有答案。但如果他们不这样做,您可以跟踪起点和终点之间最近点的位置,并将其设置为“临时目的地”。然后从那里再试一次(您可以保存已经获得的路径并从那里扩展它)。这种方法的缺点是在某些极端情况下您可能会走错路。
    3. 用于图形路径点寻路的低质量 A* - 如果您知道某些地方的路线很长,可能需要很长时间才能找到路线,您可以分块世界地图 - 并计算路线基于例如:32x32 或 64x64 等块作为 A* 中的单个节点。创建一个算法来检查这个块是否是可步行的。然后,不要使用 A* 制作整个路线,而是使用 Dijkstra 的算法,该算法将使用预定义的航路点(最好在运行时之前生成)来预先确定路径,然后使用 A* 在块内移动,以另一个块中的可步行网格元素为目标。这样您就知道如何进入与目的地相同的区块,并且从那里发现区块内没有路径的惩罚是最小的,因为您要检查的区域非常有限。

    【讨论】:

      【解决方案2】:

      如果两个图块之间从来没有任何可步行的路径,则它们没有理由成为同一个图的一部分。如果地图是静态的,您可以使用 Djikstra 将地图预处理为保证在所有图块之间具有有效路径的部分。

      如果地图是完全动态的,您可能必须设置节点数量的硬性上限。

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

      对于诸如节点被 NPC 阻塞之类的问题,需要另一种解决方案,例如在寻路期间忽略它们并在发生冲突时处理它们。

      【讨论】:

        猜你喜欢
        • 2016-03-30
        • 1970-01-01
        • 1970-01-01
        • 2017-12-29
        • 1970-01-01
        • 2014-03-03
        • 2022-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多