我正在尝试实现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算法的迭代处理了以下两个子图的每个 拓扑顺序。”
答案 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-的边从编号较高的顶点到较低的顶点。