【发布时间】:2018-11-24 01:30:35
【问题描述】:
我正在尝试实现 Yen 提出的 Bellman-Ford 算法的优化,以及 Bannister & Eppstein 在 python 中提出的随机加速。
我正在阅读 Bannister 和 Eppstein 关于该主题的论文,可以在 here 找到该论文。
我已经能够成功实现原始的 Bellman-Ford 算法,该算法包括提前终止算法(当顶点距离没有变化时退出),以及 Yen 对算法的第一次改进(算法 3 in论文)。
但是,我在实施 Yen 的第二次改进和 Bannister-Eppstein 随机改进(论文中的算法 4 和 5)时遇到了一些麻烦。
论文中给出的Yen第二次改进的伪代码是
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]) 和边 ([source,destination,weight]) 的列表属性
编辑:论文中有关算法的一些额外信息:
“作为 Yen 观察到,还可以改进算法 不同的方式,通过更仔细地选择放松的顺序 外循环的每次迭代中的边,以便两个正确 每次迭代都可以保证松弛,除了可能的 最后的。具体来说,从顶点开始任意编号 源顶点,令 G+ 为由来自的边形成的子图 一个编号较低的顶点到一个编号较高的顶点,并设 G− 为 由从较高编号顶点到的边形成的子图 编号较低的顶点。那么 G+ 和 G- 都是有向无环的 图,顶点的编号是拓扑编号 G+ 和 G− 的拓扑编号的倒数。每个 Yen 算法的迭代处理这两个子图中的每一个 拓扑顺序。”
【问题讨论】:
标签: python algorithm bellman-ford