C# A*3D路径查找-统一

C# A*3D路径查找-统一,c#,unity3d,artificial-intelligence,path-finding,C#,Unity3d,Artificial Intelligence,Path Finding,我一直在Unity中玩,我已经实现了A*算法,用于在2D方形节点网格上查找路径。从那时起,我将路径查找扩展到了3D节点网格,因此我基本上有一个2D网格节点用于地面,在其顶部有另一个2D网格节点用作天空 这项计划的目的是建立机场,并使用*。到目前为止,我的两个网格通过机场连接在一起。例如,当我在机场节点的地面网格上搜索相邻节点时,我还将天空网格中的相邻节点添加到列表中。这允许从机场“起飞”到天空中的相邻节点。同样,在天空中,我搜索相邻节点,如果其中一个相邻地面节点是机场,我会将其添加到邻居列表中。

我一直在Unity中玩,我已经实现了A*算法,用于在2D方形节点网格上查找路径。从那时起,我将路径查找扩展到了3D节点网格,因此我基本上有一个2D网格节点用于地面,在其顶部有另一个2D网格节点用作天空

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

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

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

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

这听起来像是我的问题吗?如果我想做这样的事情,我是否使用了错误的算法类型?我能做些什么来帮助附近的机场,或者经常检查,或者给予他们更多的关注?我想我可以增加一条通往他们的道路,以降低交通成本或其他什么


谢谢你的帮助

A*基于启发式。因此,除非仔细选择具有一定可容许性的启发式,否则不能保证产生全局最优解。没有这一点,A*被放松成一种产生局部最优解的形式(因此有时在你的帖子中会出现这种情况)


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

您可以通过修改启发式算法来获得想要的结果。例如,如果根据某个节点到最近机场的距离减少该节点的启发式值,则会使a*算法偏向于搜索通往机场的路径

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

  • 到目标节点的曼哈顿距离
  • 曼哈顿到最近机场的距离+飞往离目标最近机场的费用+从目的地机场到目标的曼哈顿距离

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

    其他几个答案都指出A*是一种启发式,因此不会总是给出最佳结果。这是不正确的。A*使用启发式,但它本身不是启发式。它将始终给出最佳结果

    假设,也就是说,您正确地使用了它。您传递给A*的启发式。因此,如果附近有一个机场到达你的目的地,费用为50英镑,而你的启发式算法说费用约为100英镑,那么a*将无法正常工作。根据你的描述,我认为这是最有可能的罪魁祸首


    (是的,这意味着您可以将启发式设置为始终为0。在这种情况下,A*将退化为)

    是的,我认为可能是这样,但我希望有某种我没有想到的解决方案可以帮助解决这个问题。我认为dijkstra的算法是另一种选择,但我宁愿保留我的启发式算法。基本上,这些都是你的选择。保持启发式并带着副作用生活(好的启发式和偶尔失败的接近最优的解决方案),或者转向Dijkstra或Bellman Ford或其他具有保证的最优性的寻径者,并接受性能影响是什么!?如果使用正确,A*保证找到最佳解决方案。这个答案是完全错误的。@BlueRaja DannyPflughoeft-是的,你是对的,通过使用一个好的启发式a*将给出一个有保证的最佳解决方案。我在想轻松的版本。。我将删除答案,我认为这个启发式应该给出接近最优的解决方案。它会倾向于搜索最近的机场,但如果机场不容易到达,它最终会选择更好的陆路路线,因为一旦机场路径过长,这些节点将优先考虑。但是,如果无法到达附近的机场,地面路径将保持在该机场附近,但是稍微远一点的另一个机场仍然比地面路径更好。您可以通过检查多个机场来进一步扩展此功能,这将导致它搜索备选机场。是的,您可以搜索多个机场以及与目标节点附近的其他多个机场的连接。这可能会减慢算法的速度,因为它可能会花时间探索最终导致失败的机场路径