【问题标题】:Can Bellman Ford Algorithm have any arbitary order of edges?贝尔曼福特算法可以有任意的边顺序吗?
【发布时间】:2017-06-05 02:44:22
【问题描述】:

我刚刚开始学习新算法,但是当我在极客的极客上阅读 bellman ford 算法时我被卡住了:- http://www.geeksforgeeks.org/dynamic-programming-set-23-bellman-ford-algorithm/

上面写着-

算法以自下而上的方式计算最短路径。它首先 计算最短路径的最短距离 至多在路径中的一个边缘。然后,它计算最短路径 最多 2 条边,以此类推。

外循环第i次迭代后,计算出最多有i条边的最短路径。可以有最大值 |V| – 任何简单路径中的 1 条边,这就是外循环运行 |v| 的原因– 1 次。这个想法是,假设没有负权重循环,如果我们计算了最多有 i 个边的最短路径,那么对所有边的迭代保证给出最多有 (i+1) 条边的最短路径。

让我们通过以下示例图了解算法。图片来源于此。

让给定的源顶点为 0。将所有距离初始化为无限,除了到源本身的距离。图中的顶点总数为 5,因此所有边必须处理 4 次。

在下面的例子中,如果边的顺序是 - (AB),(BE),(ED),(DC),(AC),(BC),(DB),(BD) 那么只有一次迭代它将计算最短路径,甚至 2-3 条边与“它首先计算 最多有一条边的最短路径的最短距离 在路径中。然后,它计算最多有 2 条边的最短路径, 等等。外循环第i次迭代后,最短路径 最多计算 i 边缘“所以在改变顺序 边缘这个陈述将被证明是错误的。

让我们通过以下示例图了解算法。图片来源于此。

让给定的源顶点为 0。将所有距离初始化为无限,除了到源本身的距离。图中的顶点总数为 5,因此所有边必须处理 4 次。

让所有边按以下顺序处理:(B,E), (D,B), (B,D), (A,B), (A,C), (D,C), (B ,C), (E,D)。第一次处理所有边缘时,我们得到以下距离。第一行显示初始距离。第二行显示处理边缘 (B,E)、(D,B)、(B,D) 和 (A,B) 时的距离。第三行显示处理 (A,C) 时的距离。第四行显示何时处理 (D,C)、(B,C) 和 (E,D)。

第一次迭代保证给出最多 1 条边长的所有最短路径。第二次处理所有边时,我们得到以下距离(最后一行显示最终值)。

第二次迭代保证给出最多 2 条边长的所有最短路径。该算法再处理所有边 2 次。第二次迭代后距离最小化,因此第三次和第四次迭代不会更新距离。

【问题讨论】:

  • 虽然问题的呈现非常简洁和详细,但要理解实际问题是什么有点困难。此外,在上面的第一个黄色块中,我认为边缘 BDDB 丢失了。
  • 是的,您更确切地说是在哪里卡住了? :)
  • 谢谢我错过了BD和DB,现在我更正了。我的问题是我观看了 bellman ford 的几个视频,并在各个网站上进行了研究,我们可以以任何随机顺序获取边缘,但这里据说 - 在第一次迭代中,它会给出最多 1 个边缘的最短路径,依此类推。只有当边缘有一定的顺序时,这似乎才是正确的。

标签: algorithm graph dynamic-programming shortest-path bellman-ford


【解决方案1】:

您在评论中引用的表格行

第四行显示处理 (D,C)、(B,C) 和 (E,D) 的时间。

不正确。这意味着存在一条从AC 的路径,长度为2,最多包含一条边——但是这样的路径不存在。

【讨论】:

    【解决方案2】:

    是的,无论边缘的处理顺序如何,bellman ford 都能正常工作。事实上,这就是你必须进行n-1 迭代的原因。如果您知道,边的最佳顺序是什么 - 只需一次迭代就足够了。

    考虑下图(所有边的权重1):

     (1) --> (2) --> (3) --> (4) 
    

    如果您按1->22->33->4 的顺序处理边缘。您将在一次迭代中找到从14 的最短路径。对于按3->42->31->2 排序的边,您将必须执行所有3 迭代。

    但是,n-1 迭代是最坏的情况,无论以何种顺序处理边缘(如果没有负循环)。

    【讨论】:

      【解决方案3】:

      没错。放松的顺序无关紧要。

      例如,

      有 3 个节点,因此可以进行两次松弛迭代。如果松弛从节点 b 开始向后发生,然后到节点 a,第一次迭代将产生 b:infinity,a:2。然后第二次迭代是 b:5,a:2。在第一次迭代中 b 不能被更新,因为只使用了一条边,所以只有离它有一条边的 a 节点可以被更新。第二次迭代是从源到任何地方都使用了两条边,因此最终可以更新 b。在第一次迭代中,b 根本无法更新,因为 a 还没有准备好。

      那我们看一下前向更新怎么样?在第一次迭代中,它将是 a:2 和 b:5。第二次迭代是 a:2 和 b:5。展望未来,让所有连续节点都准备好​​更新距离,因此更多迭代不会改变值。但是有人可能想知道,如果我为 101 个节点进行 100 次迭代,并且我正在进行前向更新,那会怎样。是否有可能在第一次迭代中更新了所有内容,并且直到第 99 次迭代都没有变化,突然间有一个节点在第 100 次迭代时距离减小了?不,不可能,因为前向更新不会在第一次迭代后引起变化,除非有负循环。

      您可以在此处阅读有关贝尔曼福特的更多信息:https://medium.com/@logicdevildotcom/dynamic-programming-applied-to-graphs-f33b6b8a8247

      【讨论】:

        【解决方案4】:

        sample graph

        在这个有向加权图中,假设我们将按以下顺序放松边: (u,v)、(s,u) 和 (s,v)。这里的来源是“s”。因此,在 Bellman Ford 算法的初始化步骤中,我们有 d(s)=0,d(u)=d(v)=∞。因为这里我们总共有 3 个顶点,所以算法应该有 3-1=2 次迭代,以产生顶点到源的最短距离。在迭代的每一步中,我们需要对每条边 (u,v) 执行松弛步骤,以检查 d(u) + w(u,v)

        第一次迭代后: d(u)=3, d(v)=7 第二次迭代后: d(u)=3, d(v)=5

        因此,如您所见,第一次迭代不能保证给出所有最长为 1 条边长的最短路径。因为在这个例子中,我们只有在第 2 次迭代之后才能得到 1 个边长节点“v”的最短距离。但是,如果我们在图表中强制执行三角不等式,那么该陈述将是正确的。

        现在回到您最初的问题,是的,Bellman Ford 算法可以以任意顺序放松边缘,正如上面@ead 很好地回答的那样。但在最后的迭代步骤结束时,该算法将为您提供每个节点与源节点的最短距离。

        【讨论】:

          猜你喜欢
          • 2021-07-30
          • 1970-01-01
          • 1970-01-01
          • 2018-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多