如何使用A *算法找到所有最短路径?

时间:2012-05-24 13:30:02

标签: algorithm shortest-path a-star

我知道A *算法可以找到最短的路径。但我工作中的问题是我需要找到所有最短的路径。更确切地说,可能存在几条最短路径,但我需要在顺时针方向优先选择一条最短路径。

如果我可以获得所有最短的路径,我可以得到我想要的那个(顺时针优先)。

3 个答案:

答案 0 :(得分:5)

使用 A * 算法的是完成最佳。这意味着如果路径存在,它将找到解决方案的路径,但也保证首先找到最短路径。

这是因为启发函数A *使用必须是admissible heuristic; that is, it must not overestimate the distance to the goal.

这反过来确保一旦找到解决方案的路径,知道在搜索的其余部分中没有比这个路径更短的路径空间。

假设第一个解决方案的距离是 d(问题)。现在,我的最后一个声明实际上意味着,如果你继续找到第一个解决方案 d(问题),并找到另一个解决方案, d2(问题)有两个可能性:

  • d2(问题) = d(问题):您希望保留该项,因为您希望 all 成为最佳路径。此外,所有新路径都可以等于或大于 d2 = d
  • d2(问题)> d(问题):现在,我上面写的同样有效:没有路径更短 d2 了。并且, d2 已经比您正在寻找的解决方案更长。因此,您可以放弃 d2 并完成搜索
  • 注意 没有第三个选项 d2(问题)永远不会短于最佳 d(问题) 您已找到,因为这是该算法的基本属性之一。

因此,总结一下:在您找到第一个最佳解决方案后,您就会继续前进,并接受所有相同距离的解决方案。距离较远(较长)的第一条路径,您将丢弃并停止搜索。


我刚看到问题的“顺时针”部分。您可以通过以某种方式将顺时针 -ness插入到您的启发式或成本函数中来避免搜索所有最佳解决方案。例如。我一直在使用的一个技巧是:你的成本为整数,从0到 inf 。然后,添加顺时针组件,它可以从区间 [0,1)中获得实际值。通过这种方式,无论前面的地方是a > b,它都将保持不变,但如果顺时针方向的组件不同,则a == b关系可能会发生变化。

如果您不明确要使用数值,可以比较的另一种方法是使成本为值。如果该对的第一个组件的两个路径成本不同,那么您只需比较它们。如果第一个组件相同,则只比较成对中的第二个值。

那就是说,我不知道是否会建议你修改费用或启发式功能(或两者兼而有之)。此外,我不确定这个精确的技巧是否适用于您的问题,但我相信如果您只是稍微玩一下,您应该能够通过修改其中一个功能来将算法推向最顺时针的解决方案。

答案 1 :(得分:0)

澄清@penelope的意思:“......在找到第一个最佳解决方案后继续......”

从A * 获得一组等效的成本最优路径:

一旦A *找到了最短路径(成本= C *),您可以通过继续从OPEN列表中弹出解决方案来获得等效长度的其他路径,直到遇到成本超过C *的解决方案。 (有一点需要注意,如果您的启发式方法并不完美,您可能需要做一些额外的工作。)请注意,这将为您提供一组最佳路径,但不一定是所有最佳路径的集合路径 - 这取决于您如何设置重复检测。

从A *获得顺时针路径:

至于优先顺时针路径,请考虑在比较方法中使用打破平局来对OPEN列表进行排序。如果两个候选人具有相同的f-cost,则更喜欢顺时针方向的候选者。 (我认为你可以通过查看相对于起点/目标节点的候选人来获得顺时针方向的概念。)如果以这种方式打破中断,顺时针解决方案将被推到OPEN列表的前面,你将会从A *获得最顺时针的解决方案。

答案 2 :(得分:-4)

Dijkstra的算法为您提供所有最短路径。 A *是一个改进的Dijkstra,有额外的约束。改进之处在于您无需访问所有节点。如果你想探索所有的节点(这是必须的,以确保你已经检查了所有最短的路径),那么使用A *是没有意义的,只要坚持通用的祖先