【问题标题】:Is A* the best pathfinding algorithm?A* 是最好的寻路算法吗?
【发布时间】:2012-03-19 15:31:50
【问题描述】:

通常说A*是解决寻路问题的最佳算法。

在任何情况下 A* 不是 是找到解决方案的最佳算法吗?

A* 与 BFS、DFS、UCS 等相比有多好?

【问题讨论】:

    标签: path-finding a-star depth-first-search breadth-first-search


    【解决方案1】:

    A* 之所以特别,是因为可以通过使用它评估节点的方式和它使用的启发式算法将其转变为其他寻路算法。您可以这样做来模拟 Djikstra 的最佳优先搜索、广度优先搜索和深度优先搜索。

    此外,加快速度通常很容易。例如,如果您将一个可接受的启发式算法乘以一个常数 c,您可以保证生成的节点序列的成本不超过最佳结果的 c 倍。

    例如,以 Ian Davis 的awesome paper 为例(为星际迷航无敌舰队编写)。 A* 与一组分层的航路点一起使用,这会导致路径粗糙。然后,为了平滑路径,他们再次在包含路径上的节点和附近节点的新生成图上运行 A*,以获得更合理的路径。最后,他们运行橡皮筋删除冗余节点。

    因此,A* 并不是万能的解决方案,但它是一个非常通用的工具。

    【讨论】:

    • 值得注意的是,将启发式乘以常数的技巧会使启发式不可接受,因此导致搜索不再是最佳的。
    • 是的,但如上所述,有可证明的界限,这将产生什么样的最佳结果近似值。特别是,对于常数 c,得到的路径不会超过最佳路径的 c 倍。
    【解决方案2】:

    简短的回答是肯定的,在某些情况下 A* 不是解决问题的最佳算法。然而,有许多方法可以评估什么构成了寻找解决方案的最佳算法。

    如果您考虑最佳从单一来源到多个目的地的多次搜索性能,那么您应该考虑使用更合适的方法 (Dijkstra's algorithm )。

    如果您在性能方面考虑最佳,那么在某些特殊情况下,DFS 和 BFS 将显着优于 A*。根据过去的经验,这发生在非常小的、几乎是微不足道的图上,但需要仔细测试和分析才能做出更有力的陈述。

    如果您在path-length方面考虑最佳,即算法产生的最终路径有多长,那么A*等价于任何其他最优搜索算法。

    如果您从完整性的角度考虑最佳,也就是说,如果存在这样的路径,算法是否总是会找到通向目标的路径。如果是这样,则 A* 等效于任何其他完整算法(例如,广度优先搜索)。

    如果您正在考虑最佳图中某些权重为负数的情况,那么您将需要使用特殊算法来解决这些问题(例如例如bellman-ford)

    如果您在 没有启发式方法可用的情况下考虑最佳,那么您必须退回到h(x,y)=0 forall states x and y。在这种情况下,A* 相当于最佳优先搜索。

    如果您在连续配置空间中与运动规划相关的情况下考虑最佳,那么 A* 可能在低维中充分工作,但搜索图的存储开始在高维度变得不切实际,并且使用概率完整算法的需求增加(例如RRT,Bi-RRT,RDT)

    如果您在图部分可观察的情况下考虑最佳,那么您在任何时候都只知道图中所有可能顶点和边的子集,并且您需要更改状态以观察更多图形,然后您需要为此设计的替代算法(例如,Keonig 的 Lifelong Planning A*、LPA* 就是这样做的)。

    如果您正在考虑 最佳 图表随时间变化的情况(当您合并移动障碍物时,这在机器人技术中经常发生),那么您需要一种经过设计的算法为此(例如 Stentz 的 D* 或 Koenig & Likhachev 的 D*-Lite)。

    【讨论】:

    • +1,尽管您对 LPA* 的描述不正确。 LPA* 类似于 A*,但在图 (修改边权重,添加/删除顶点) 之后多次运行,它可以重新计算从开始到结束的最佳路径,速度比再次运行 A*。开始/结束总是在同一个地方;这与 D*-Lite (完全淘汰了 D*) 形成对比,其中“起始节点”(表示移动的机器人,或其他) 是不断变化的沿着重新计算之间的最佳路径移动。 See also.
    【解决方案3】:

    Collaborative Diffusion 是一个简单的替代方案(无需与启发式争论)。

    当您需要针对一个目标任意组的任何成员,不加选择地,它很有效,在这种情况下可以比 A* 更快。它模仿“你越来越暖和/冷”。这分两步进行:

    1. 为每个目标创建热图...如果要跟踪特定目标,请通过仅为该目标创建热图将其视为自己的组。热图是通过选择目标位置/单元格、设置高值气味(比如1.0,如果我们使用浮点数)并使用标准扩散公式在地图上传播气味来创建的。 这种气味随着它从目标扩散而变得越来越弱。一旦气味达到一定的弱点,我们就会停止扩散。
    2. 现在每个代理都使用地图进行爬山,其中代理(如狼 跟踪气味)反复移动到最近的相邻单元格 气味最强的地方。任何已经存在代理的单元格的气味值都会被0.0 覆盖,因为您无法移动到那里。

    它在只有几个进球的足球比赛(两队特工都专门跟踪球和球门柱,只产生 3 个影响图)或 Pacman(类似的,多个特工跟踪 Pac)或有一个代表一组特工质心的组合热图,该图是该军队中每个特工的平均值,因此一支军队可以接近“另一支军队”而不是“另一支军队中的特定单位”。这种普遍性可能会提高性能。

    它最适合地图密集地填充许多移动单元的情况,从而证明每次更新时必须在整个搜索空间中发生的广泛扩散是合理的,尽管计算成本会随着必须更新的地图数量而增加每帧。

    【讨论】:

      【解决方案4】:

      我看到问题很老了,但这个实用的解决方案可能对某人有用。 最近发现very nice open source code written in python

      代码包含下一个寻路算法:

      • A*
      • 迪克斯特拉
      • 最佳优先
      • 双向 A*
      • 广度优先搜索 (BFS)
      • 迭代深度 A* (IDA*)

      更改矩阵大小和值可以让您感受不同寻路算法之间的差异。正如Wikipedia 中提到的那样:“A* 是完整的,如果存在,总会找到解决方案”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多