【问题标题】:Does A* always provide shortest path?A* 是否总是提供最短路径?
【发布时间】:2016-10-04 14:27:09
【问题描述】:

我试图了解 A*、统一成本和贪婪搜索算法的工作原理。我知道在所有 3 种算法中探索节点的方式都发生了变化(贪婪将基于启发式值进行探索,A* 基于启发式加距离,统一基于距离)。

我想知道对于给定的来源和目的地,是否应该所有 3 种算法都提供最短路径(仅探索不同数量的城市?)或者它们是否可以提供不同的路径。

我主要是因为实现部分而感到困惑 - 如果您将节点存储在队列中,那么当您即将探索目标节点时,您将拥有最短的路径,但如果您有路径队列(并且这个队列是现在根据启发式 + 距离排序),那么您可能并不总是得到最短路径。

【问题讨论】:

    标签: java algorithm a-star


    【解决方案1】:

    不一定,这取决于您的启发式方法。请参阅this section in Wikipedia 详细说明。

    总而言之,如果启发式可接受(意味着它永远不会高估成本),A* 会给出最佳解决方案。

    【讨论】:

    • 即使启发式是不可接受的,A* 算法也只会在它即将探索目标节点时停止(由于不可接受的启发式,它可能会探索许多不必要的路径),在这种情况下它必须首先探索到达该节点的所有路径,所以它总能找到最短路径,不是吗?
    • @harrythomas 不,作为一个极端的例子,考虑一个正方形网格,一端在左上角,另一端在右下角。我可以进行启发式算法,使算法首先遵循边界,这将导致次优解决方案。
    • 是的,但在这种情况下,当您探索另一条边时,您会找到最短距离并更新它,对吗?或者在 A* 星中你不更新最短距离??想想统一成本搜索找到最短路径的方式(通过用找到的新值更新当前最短值)
    • @harrythomas 在 A* 中,您在找到目标时终止算法。你永远不会“探索另一边”。
    • 因此,在 A* 中,每当您第一次将目的地放入队列中时,您就会终止算法,这与统一成本中当您从队列中取出节点进行探索时终止搜索不同。我说的对吗?
    【解决方案2】:

    事实上,启发式应该是可以接受的,否则 A* 会找到一个次优的解决方案。我认为队列不应该由下一个节点的距离来协调,而是使用启发式方法将最有希望的节点作为下一个节点。 可以这样想:下一个节点可能离当前节点最远,但同时它可能是离目的地最近的节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2013-04-21
      • 2020-10-20
      • 1970-01-01
      相关资源
      最近更新 更多