Bellman-Ford算法证明了正确性

时间:2015-06-11 21:19:02

标签: algorithm time-complexity correctness proof-of-correctness

我试图了解贝尔曼 - 福特算法,但我仍然坚持正确性的证明。 我使用过Wikipedia,但我根本无法理解这个证据。我在Youtube上找不到任何有用的东西。 希望你们中的任何人都能简单解释一下。此页面"Bellman-ford correctness can we do better"未回答我的问题。

谢谢。

2 个答案:

答案 0 :(得分:0)

尝试使用此链接查看THE BELLMAN-FORD算法主题:https://class.coursera.org/algo2-003/lecture/preview

答案 1 :(得分:0)

让我们从一个没有负循环的图的动态规划的角度来看问题。

enter image description here

我们可以将动态规划的记忆表可视化如下:

enter image description here

列代表节点,行代表更新步骤(节点 0 是源节点),从一个步骤中的一个框指向下一步中另一个框的箭头是 min 更新(步骤 0 是初始化)。

我们从所有最短路径中选择一条路径并说明为什么它是正确的。让我们选择 0 -> 3 -> 2 -> 4 -> 5。它是从 0 到 5 的最短路径,否则我们可以选择任何其他路径。我们可以通过归约来证明正确性。初始是源0,很明显,0和自身的距离应该是0,最短的。我们假设 0 -> 3 -> 2 是 0 和 2 之间的最短路径,我们将证明 0 -> 3 -> 2 -> 4 是第三次迭代后 0 和 4 之间的最短路径。< /p>

首先,我们证明在第三次迭代后,节点 4 必须固定/收紧。如果节点 4 不固定,则意味着除了 0 -> 3 -> 2 -> 4 之外,至少有一条路径可以到达 4,并且该路径应该比 0 -> 3 -> 2 -> 4 短,即与我们的假设相矛盾,即 0 -> 3 -> 2 -> 4 -> 5 是 0 和 5 之间的最短路径。那么在第三次迭代之后,2 和 4 应该连接起来。

第二,我们证明松弛应该是最短的。它不能越来越大,因为它是唯一的最短路径。


让我们看一个负循环图。

enter image description here

这是它的记忆表:

enter image description here

我们来证明,在|V|的迭代中,这里|V|是顶点数6,不应该停止更新。

我们假设更新停止(并且存在负循环)。让我们看看循环 3 -> 2 -> 4 -> 5 -> 3。

dist(2) <= dist(3) + w(3, 2)
dist(4) <= dist(2) + w(2, 4)
dist(5) <= dist(4) + w(4, 5)
dist(3) <= dist(5) + w(5, 3)

我们可以从上面的四个不等式中将左边和右边相加得到以下不等式:

dist(2) + dist(4) + dist(5) + dist(3) <= dist(3) + dist(2) + dist(4) + dist(5) + w(3, 2) + w(2, 4) + w(4, 5) + w(5, 3)

我们减去两边的距离,得到:
w(3, 2) + w(2, 4) + w(4, 5) + w(5, 3) >= 0,这与我们的说法相矛盾,即 3 -> 2 -> 4 -> 5 -> 3负循环。

所以我们确信在 |V| 的步骤以及在那一步之后更新永远不会停止。

我的代码位于 Gist

参考:

  1. dynamic programming - bellman-ford algorithm
  2. Lecture 14: Bellman-Ford Algorithm