Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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
塞吉威克/韦恩;BellmanFordSP.java“文件:“怎么做?”;findNegativeCycle“;确保返回负循环?_Java_Graph Algorithm_Bellman Ford - Fatal编程技术网

塞吉威克/韦恩;BellmanFordSP.java“文件:“怎么做?”;findNegativeCycle“;确保返回负循环?

塞吉威克/韦恩;BellmanFordSP.java“文件:“怎么做?”;findNegativeCycle“;确保返回负循环?,java,graph-algorithm,bellman-ford,Java,Graph Algorithm,Bellman Ford,在Bellman-Ford算法()的Sedgewick和Wayne实现中,findNegativeCycle方法使用EdgeWeightedDirectedCycle()在最短路径树(edgeTo数组中的边)中查找有向循环 此外,在检查方法中,断言此定向循环的权重为负。因此,如果启用了Java断言,BellmanFordSP构造函数将在negativeCycle方法返回权重不为负的循环时引发异常 问题:如果最短路径树同时包含零权重循环和负权重循环,如何确保EdgeWeightedDirected

在Bellman-Ford算法()的Sedgewick和Wayne实现中,
findNegativeCycle
方法使用
EdgeWeightedDirectedCycle
()在最短路径树(edgeTo数组中的边)中查找有向循环

此外,在
检查
方法中,断言此定向循环的权重为负。因此,如果启用了Java断言,
BellmanFordSP
构造函数将在
negativeCycle
方法返回权重不为负的循环时引发异常


问题:如果最短路径树同时包含零权重循环和负权重循环,如何确保
EdgeWeightedDirectedCycle
不返回零权重循环(从而导致断言失败)?

链接的Bellman-Ford实施不保证在存在负重量和零重量循环的情况下返回负重量循环

当起始顶点为2时,下图将导致
BellmanFordSP.java
崩溃(带有
AssertionError
),因为找到的循环的权重等于零(命令
java-ea BellmanFordSP.java 2
):

下面是可视化的上图:

该错误最终是由浮点舍入错误引起的

当第二次松弛顶点3时,到该顶点的当前距离等于
-7.430337482745286
。边缘3→6(重量
-4.0
)将导致距离6更新为
-7.430337482745286+-4.0
,使用时 双精度浮点数)等于
-11.430337482745287
(注意结尾数字是7而不是6)。
6松弛时,到7的距离更新为
-16.430337482745287
-11.430337482745287+-5.0
),最终导致顶点7松弛,将距离更新为3
-7.4303374825287
-16.4303374825287+9.0
). 到3的新距离小于先前的
-7.430337482745286
(由于浮点舍入误差),这意味着7→3边替换2边→3最短路径树中的边。这将导致最短路径树不再包含负循环(因为它不再包含2)→3) ,而是零重量循环。

编写一个测试并了解自己不是更容易吗?@AbhijitSarkar我编写了一个属性测试,它成功地生成了导致崩溃的测试数据。请看下面我的回答:“如果→2边缘已更改…算法成功终止“这听起来像是浮点算法问题,而不是算法问题。有关检测-ve权重周期的信息,请参阅。可以在上找到Python impl。@AbhijitSarkar您说得对。原因是浮点舍入错误。我已经添加了一个详细的解释,解释了为什么最终会找到零权重循环,而不是负权重循环。
8
9
0 1 3.0
1 2 -3.430337482745286
2 3 0
3 4 -2
4 5 -5
5 0 0
3 6 -4
6 7 -5
7 3 9