【问题标题】:A* 3D Path-finding - UnityA* 3D 寻路 - Unity
【发布时间】:2015-04-29 21:35:06
【问题描述】:

我一直在玩 Unity,我已经实现了 A* 算法,用于在 2D 方形节点网格上进行一些路径查找。从那以后,我将寻路扩展到了一个 3D 节点网格,所以我基本上有一个 2D 网格节点作为地面,另一个 2D 网格节点在它上面充当天空。

为此的计划是使用 A* 创建机场和航空旅行。到目前为止,我的两个网格通过机场连接在一起。例如,当我在机场节点的地面网格上搜索相邻节点时,我还将天空网格中的相邻节点添加到列表中。这允许从机场“起飞”到天空中的相邻节点。同样,当在天空中时,我搜索相邻节点,如果相邻的地面节点之一是机场,我将其添加到邻居列表中。这允许飞机从空中“降落”到机场。

到目前为止,我有与地面旅行的各种地形相关的移动成本,而我的空中旅行目前为 0,但是在往返天空的“起飞”和“着陆”运动期间有很大的移动成本。这是希望在天空中创造一条更快的路径,这很值得,但是为了平衡会增加很大的一次移动成本,所以在两个机场之间走4个节点是没有意义的。

这一切都很好。如果乘坐飞机的旅行成本低于他必须在地面上行走的旅行成本,那么这个人会选择乘坐飞机。然而,我的问题是,有时地面路径,以及与之相关的任何成本的路径有时会在机场上选择,而很明显,这样做比乘坐飞机要覆盖更多的地面节点。

我有一种感觉,这可能是由于对目标的路径搜索,而不是机场,机场可能在另一个方向,因此机场不是任何被搜索节点的邻居节点,因此甚至没有考虑,即使它可能是一个更快的路径解决方案。

这听起来像是我遇到的问题吗?如果我想做这样的事情,我是否使用了错误类型的算法?我能做些什么来帮助附近的机场始终接受检查,或者给予他们更多的关注?我想我可以以较低的移动成本或其他方式添加通往它们的道路......

感谢您的帮助!

【问题讨论】:

    标签: c# unity3d artificial-intelligence path-finding


    【解决方案1】:

    您可以通过修改启发式方法获得您想要的结果。例如,如果您根据从该节点到最近机场的距离来减少该节点的启发式值,您将偏向 A* 算法来搜索前往机场的路径。

    例如,假设您正在使用特定的启发式算法,例如曼哈顿。所以在计算任何节点的启发式值时,取较小的:

    1. 到目标节点的曼哈顿距离
    2. 曼哈顿到最近机场的距离 + 飞往距离目标最近的机场的成本 + 从目的地机场到目标的曼哈顿距离。

    建议谨慎行事。当这些路径不是正确的最短路径时,调整启发式以使算法偏向于测试某些路径可能最终会给您带来糟糕的结果。这就是野兽的本性。

    【讨论】:

    • 我认为这种启发式方法应该提供接近最优的解决方案。它会偏向于搜索最近的机场,但如果机场不容易到达,它最终会选择更好的陆路路线,因为一旦机场路径变得太长,这些节点将优先考虑。但是,如果附近的机场无法进入,那么它会失败,地面路径会停留在该机场附近,但是稍微远一点的不同机场仍然会比地面路径更好。您可以通过检查多个机场来进一步扩展此功能,这将导致它搜索替代方案。
    • 是的,您可以搜索多个机场并连接到目标节点附近的其他多个机场。这可能会减慢算法的速度,因为它可能会花时间探索最终导致死胡同的机场路径。这里需要进行微妙的平衡操作,需要进行大量的经验测试,以确定更复杂的启发式算法是否会表现得可以接受。
    【解决方案2】:

    其他几个答案表明 A* 是一种启发式方法,因此并不总是能给出最佳结果。这是不正确的。 A* 使用启发式,但它本身不是启发式。它总是会给出最佳结果。

    假设,也就是说,您正确使用它。您传递给 A* must never overestimate the cost of reaching the destination 的启发式。因此,如果附近有一个机场以 50 的成本到达您的目的地,而您的启发式方法显示成本约为 100,则 A* 将无法正常工作。鉴于你给出的描述,我认为这是最有可能的罪魁祸首。

    (是的,这意味着您可以将启发式设置为始终为 0。在这种情况下,A* 会演变为 Dijkstra's algorithm

    【讨论】:

      【解决方案3】:

      A* 基于启发式。因此,除非仔细选择启发式算法以具有某些可接受性质量,否则不能保证产生全局最优解。没有那个 A* 会放松成一种产生局部最优解的形式(因此sometimes在你的帖子中)。

      如果您希望您的算法始终找到有保证的最佳路径,那么您可以考虑改进启发式算法或使用不同的算法。

      【讨论】:

      • 是的,我认为可能是这种情况,但我希望有某种我没有想到的解决方案可以帮助解决这个问题。我考虑将 dijkstra 的算法作为替代方案,但我宁愿保留我的启发式方法。
      • 嗯,基本上这些都是你的选择。保持启发式并接受副作用(对于良好的启发式和偶尔失败的近乎最佳的解决方案)或转移到 Dijkstra 或 Bellman Ford 或其他有保证的最佳路径查找器并接受性能影响
      • 什么!?如果使用正确,A* 保证找到最佳解决方案。这个答案是完全错误的。
      • @BlueRaja-DannyPflughoeft - 是的,你是对的,通过使用良好的启发式 A* 将提供有保证的最佳解决方案。我在想轻松的版本..我将删除答案
      猜你喜欢
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多