Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有负值的最短路径的最快算法?_C#_Algorithm_Math - Fatal编程技术网

C# 具有负值的最短路径的最快算法?

C# 具有负值的最短路径的最快算法?,c#,algorithm,math,C#,Algorithm,Math,我目前正在使用Bellman-Ford算法来寻找具有负值的最短路径。有没有比Bellman Ford更快的算法可以找到负值最短路径?一个简单的改进是只检查“活动”节点,而不是像原始实现那样迭代所有节点。 原因是,如果一个节点没有导致其任何邻居的改进,并且在上一次迭代中没有更改值,则无需再次进行计算(它仍然不会产生任何改进) 伪代码(实际上是Python): A=set([seed]) 步数=0 当len(A)>0且步数

我目前正在使用Bellman-Ford算法来寻找具有负值的最短路径。有没有比Bellman Ford更快的算法可以找到负值最短路径?

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

伪代码(实际上是Python):

A=set([seed])
步数=0
当len(A)>0且步数<节点数时:
步数+=1
NA=集合()
对于中的节点:
对于邻域中的nh(节点):
x=溶液[节点]+重量(节点,nh)
如果x<溶液[nh]:
#我们发现了一个进步。。。
溶液[nh]=x
pred[nh]=节点
NA.添加(nh)
A=NA
A
是“活动”节点集,在上一步中发现了改进,
NA
是“下一个活动”节点集,需要在下一次迭代中检查改进

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


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

我只能给你维基百科关于这个问题的文章:当然,这也需要快速咆哮:还有一个警告:“调试某些东西比一开始编写它要困难两倍。因此,如果您以最高的技能编写了某些内容,您将永远无法调试它。“当您提到贝尔曼福特并要求更快的解决方案时,您当前的运行时间是多少?您期望的是什么faster@maytham-我有一个包含50多个顶点的图,每个顶点之间都有一条边。我所说的更快,也就是说,如果有一个算法可以以不同的方式处理所有的数据,这会有所改进time@Nicholas:对于随机生成的完全连通有向图,随机生成的权重为50个顶点,我的答案中的代码使用解释python在非退化情况下大约需要1-2ms,在非退化情况下大约需要50ms退化情况(负和循环)。同一个图上的初始解决方案的时间约为50毫秒。我希望本机代码实现速度快50-100倍。。。
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