以成本找到最快路径,小于或等于指定的路径

时间:2012-11-20 22:14:29

标签: algorithm path

这是我的问题的可视化。

enter image description here

我一直在尝试使用djikstra,但它没有用。

3 个答案:

答案 0 :(得分:2)

正如我所看到的那样,复杂性是Dijkstra的算法丢弃了你需要保留的信息:如果你想要从A到E,

   B
 /   \
A     D - E
 \   /
   C

ABD比ACD短,Dijkstra会忘记ACD有可能(它使用ACD作为从A到D的规范路线)。但是如果ABD的成本高于ACD,并且ABDE高于配额而ACDE低于此值,则现在消除的ACD是正确的。问题在于,Dijkstra的算法假设如果一条路径至少与另一条路径一样长,则它是弱支配的:没有理由偏爱它。在比较的一个维度中,路径是弱有序的:给定任何两条路径,一条弱点支配另一条路径。

但是这里我们有两个比较维度,因此排序不成立:一个路径可以更短,另一个路径更便宜。由于我们只能丢弃主导路径,因此我们必须保留所有尚未超出预算且不受支配的路径。我已经在实施这种方法方面做了一些工作;它看起来可行,但无法找到指数复杂度以下的最坏情况下的参数(尽管正常的性能应该好得多,因为在理智的图形中,大多数路径都占主导地位。)

您也可以像Billiska所说的那样,使用第k个最短路线算法然后继续他们的结果,直到找到低于预算的算法。使用时间O(m + K * n * log(m / n));但除非有人看到K的上限,以确保K在预算下包含一条路径(如果存在),我们需要将K设置为路径的总数,再次产生指数复杂性(尽管再次是一种策略逐步增加K可能会产生合理的平均运行时间,至少如果长度和成本合理相关的话。)

编辑:

复杂(或许致命)我提出的修改的实现是Dijkstra的算法依赖于节点可访问性的排序,这样我们就知道如果我们采用我们拥有最短路径的未探测节点,我们将永远不会找到一条更好的路线(因为已知所有其他路线都更长)。如果最短的路线也很昂贵,那就不用了;即使在探索一个节点之后,我们也必须准备好根据更长但更便宜的路径更新它的路径。我怀疑这会阻止它在最坏的情况下达到多项式时间。

答案 1 :(得分:0)

基本上你需要找到第一个最短路径,检查它是否有效,然后找到第二个最短路径,检查它是否有效,等等......

Dijkstra的算法不适用于此类任务。 只是谷歌搜索这个问题的新定义, 我到达Stack Overflow question on finding kth-shortest-paths. 我还没读过,所以不要问我。 我希望这会有所帮助。

答案 2 :(得分:0)

我认为你可以用Dijkstra做到这一点,但你必须改变计算每一步的试验距离的方式。不仅要考虑距离,还要考虑成本。新的距离应该是2位数(dist, cost),当您选择最小距离时应该选择最小距离distcost <= 6,这就是它。

我希望这是正确的。