Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.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
Python 在贝尔曼·福特的迭代中,我的头很难受_Python_Algorithm - Fatal编程技术网

Python 在贝尔曼·福特的迭代中,我的头很难受

Python 在贝尔曼·福特的迭代中,我的头很难受,python,algorithm,Python,Algorithm,Bellman-Ford算法向我解释的方式是,它经过n-1(n是节点数)迭代,在每次迭代中更新节点之间的距离。所有图形示例都显示了初始化为无穷大的节点,以及在第一次迭代中更新的与源节点最近的节点,但其余节点保持无穷大,直到发生到达它们的迭代 然而,通过查看算法的代码(如提供的代码),我发现很难理解为什么所有比迭代次数更远的节点都没有用算法更新。例如,如果我在第二次迭代中,并且我有一个节点d,它只能通过路径a-b-c-d到达,那么我读到的示例似乎表明d在第四次迭代之前不会被更新 但代码的主要松弛功

Bellman-Ford算法向我解释的方式是,它经过n-1(n是节点数)迭代,在每次迭代中更新节点之间的距离。所有图形示例都显示了初始化为无穷大的节点,以及在第一次迭代中更新的与源节点最近的节点,但其余节点保持无穷大,直到发生到达它们的迭代

然而,通过查看算法的代码(如提供的代码),我发现很难理解为什么所有比迭代次数更远的节点都没有用算法更新。例如,如果我在第二次迭代中,并且我有一个节点d,它只能通过路径a-b-c-d到达,那么我读到的示例似乎表明d在第四次迭代之前不会被更新

但代码的主要松弛功能是:

def relax(node, neighbour, graph, d, p):
    # If the distance between the node and the neighbour is lower than the one I have now
    if d[neighbour] > d[node] + graph[node][neighbour]:
        # Record this lower distance
        d[neighbour]  = d[node] + graph[node][neighbour]
        p[neighbour] = node
根据提供与前置节点源的权重和距离的信息进行更新。如果算法在每次迭代中对每个节点进行迭代,那么如何阻止d在第一次迭代中正确更新?例如,如果算法按a-b-c-d的顺序在节点上迭代,我不明白为什么算法不存储节点b的距离信息,移动到节点c,存储该节点的距离信息,最后到达d,获得足够的信息来计算第一次迭代中的最短路径

我希望这有点道理

这可能会发生,但不能保证。您只能保证在第k次迭代时,长度最短的路径为
k
,而不是更早

您看到的可视化只是为了解释算法的概念,使用事务性内存模型更清晰、更容易理解。
想想看,如果距离为10的节点在第一次迭代中发生变化,那么使用可视化技术理解算法有多难

关于评论中的问题:

这是否意味着我可以有效地创建一个跟踪 每次迭代的更改数,一旦计数器达到0,I 可以提前退出迭代吗


是的,如果迭代
k
-迭代
k+1
也不能改变任何东西,一切都是最小的,对于
k+2
,也是如此

这可能发生,但不能保证。您只能保证在第k次迭代时,长度最短的路径是
k
,而不是更早。因此,k次迭代实际上只是迭代次数的绝对上限?这是否意味着我可以有效地创建一个工具来跟踪每次迭代的更改数量,并且一旦计数器达到0,我就可以提前退出迭代?@user1427661:是的,这通常是贝尔曼·福特的退出条件之一