Bellman-Ford算法的Yen和Bannister-Eppstein优化

时间:2018-11-24 01:30:36

标签: python algorithm bellman-ford

我正在尝试实现Yen提出的Bellman-Ford算法的优化以及Bannister和Eppstein提出的在python中的随机加速。

我正在关注Bannister&Eppstein关于该主题的论文,该论文可以在here

中找到。

我已经能够成功实现原始的Bellman-Ford算法,该变体包括算法的提前终止(当顶点距离的更改未更改时退出),以及Yen对算法的首次改进(算法3)。本文)。

但是,在执行Yen的第二次即兴创作和Bannister-Eppstein随机改进(本文算法4和5)时,我遇到了一些麻烦。

本文针对日元的第二次改进给出的伪代码为

1. number the vertices arbitrarily, starting with s
2. C ← {s}
3. while C != ∅ do
4.    for each vertex u in numerical order do
5.        if u ∈ C or D[u] has changed since start of iteration then
6.            for each edge uv in graph G+ do
7.                relax(u, v)
8.    for each vertex u in reverse numerical order do
9.        if u ∈ C or D[u] has changed since start of iteration then
10.           for each edge uv in graph G− do
11.               relax(u, v)
12.   C ← {vertices v for which D[v] changed}

Bannister-Eppstein算法的伪代码(算法5)与上面的完全相同,第一行指出:

1. number the vertices randomly such that all permutations with s first are equally likely

我发现第1行和第(4,8)行的语言令人困惑。

“任意/随机地对顶点进行编号”是什么意思?

按数字顺序遍历顶点意味着什么?

有关我的代码的一些其他信息:我的算法将Graph对象作为参数,该对象具有顶点([0,n])和edges [[source,destination,weight])的列表属性

编辑:论文中有关算法的一些额外信息:

  

“作为   日元观察到,也有可能在   通过更仔细地选择放松的顺序不同的方式   外循环每次迭代中的边,以便两个正确   每次迭代都可以保证松弛,除了   持续。具体来说,从   源顶点,令G +为由   编号较低的顶点到编号较高的顶点,令G−为   由从较高编号的顶点到   较低编号的顶点。然后G +和G-都被定向为非循环   图,顶点的编号是拓扑编号   G +和G-的拓扑编号的倒序。每   Yen算法的迭代处理了以下两个子图的每个   拓扑顺序。”

1 个答案:

答案 0 :(得分:2)

使用Fisher--Yates随机播放s以外的顶点。例如,您可能具有顶点s,a,b,c,d,e,f,并随机排列为f,a,c,e,d,b。然后,您可以分配连续的数字s-> 0,f-> 1,a-> 2,c-> 3,e-> 4,d-> 5,b-> 6。数值顺序为s,f,a,c,e,d,b。逆序为b,d,e,c,a,f,s。 G +中的边从编号较低的顶点到较高的顶点,例如c-> b。 G-的边从编号较高的顶点到较低的顶点。