【问题标题】:Fastest Algorithm for Shortest Paths with negative values? [closed]负值最短路径的最快算法? [关闭]
【发布时间】:2018-11-17 17:16:10
【问题描述】:

我目前正在使用 Bellman Ford 算法来查找具有负值的最短路径。在寻找负值的最短路径方面,有没有比 Bellman Ford 更快的算法?

【问题讨论】:

  • 我只能给你关于那件事的维基百科文章:en.wikipedia.org/wiki/… 当然,这也需要速度咆哮:ericlippert.com/2012/12/17/performance-rant 并警告:“调试某些东西是编写它的两倍难首先。所以如果你写了一些你最擅长的东西,你将永远无法调试它。”
  • 当您提到 Bellman Ford 并要求更快的解决方案时,您当前的运行时间是多少以及您期望更快的时间
  • @maytham-ɯɐɥʇʎɐɯ 我有一个包含 50 多个顶点的图,每个顶点都有一条边。我所说的更快的意思也是,例如,如果有一种算法可以以不同的方式处理所有这些,从而缩短时间
  • @Nicholas:对于随机生成的具有 50 个顶点权重的随机生成的完全连接的有向图,我的答案中的代码在非退化情况下使用解释 python 大约需要 1-2 毫秒,在退化情况下大约需要 50 毫秒(负和循环)。同一张图上的朴素解决方案的时间约为 50 毫秒。我希望本机代码实现速度快 50-100 倍...

标签: c# algorithm math


【解决方案1】:

一个简单的改进是只检查“活动”节点,而不是像天真的实现那样对所有节点进行迭代。 原因是如果一个节点没有导致其任何邻居的改进并且在上次迭代中没有改变值,则不需要再次重做计算(它仍然不会产生任何改进)。

伪代码(实际上是 Python):

A = set([seed])
steps = 0
while len(A) > 0 and steps < number_of_nodes:
    steps += 1
    NA = set()
    for node in A:
        for nh in neighbours(node):
            x = solution[node] + weight(node, nh) 
            if x < solution[nh]:
                # We found an improvement...
                solution[nh] = x
                pred[nh] = node
                NA.add(nh)
    A = NA

A 是“活动”节点集,在上一步中发现了改进,NA 是“下一个活动”节点集,需要在下一次迭代中检查改进。

最初,除seed 之外的所有节点的解决方案都设置为+Infinity,其中解决方案为0。最初只有seed 在“活动”集中。 请注意,如果从种子可以到达负和循环,则问题没有“最小路径”,因为您可以通过简单的循环获得尽可能低的总数;这就是限制“步数”值的原因。

如果退出循环时A不为空,那么最小成本问题没有解决方案(有一个负和循环,你可以通过简单的循环来降低成本)。

【讨论】:

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