我目前正在使用Bellman Ford算法来查找具有负值的最短路径。在找到带有负值的最短路径时,有没有比贝尔曼福特更快的算法?
答案 0 :(得分: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
是“下一个活动”节点集,需要在下一次迭代时检查是否有改进
最初,将所有节点的解决方案设置为+Infinity
,其中seed
的解决方案为0。最初,只有seed
处于“活动”集中。
请注意,在从种子可到达负和循环的情况下,该问题没有“最小路径”,因为您可以通过简单的循环将总数降低到所需的最低值。这就是限制“步数”值的原因。
如果退出循环A
不为空,那么就没有解决最小成本问题的方法(存在负和循环,您可以通过简单循环来降低成本)。