我试图实现Yen提出的Bellman算法的优化,以及Bannister & Eppstein在python中提出的随机加速比。
我正在阅读班尼斯特和埃普斯坦关于这个主题的论文,这篇文章可以找到这里。
我已经成功地实现了原有的Bellman算法,该算法包括算法的早期终止(在顶点距离不变时退出),以及Yen对算法的第一次改进(本文的算法3)。
然而,我在实现Yen的第二个改进和Bannister随机改进(本文的算法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的算法(算法5)的伪代码与上面的完全相同,对于第一行期望如下:
1. number the vertices randomly such that all permutations with s first are equally likely我觉得第1行和第(4,8)行的语言令人困惑。
“任意/随机地给顶点编号”是什么意思?
按数字顺序迭代顶点是什么意思?
关于我的代码的一些附加信息:我的算法以Graph作为参数,它具有顶点(0,n)和边(源、目的地、权重)的列表属性。
编辑:论文中关于算法的一些额外信息:
“正如Yen观察到的那样,也有可能以一种不同的方式改进该算法,方法是更谨慎地选择在外部循环的每一次迭代中放松边缘的顺序,以便确保除可能的最后一次迭代外,每次迭代都有两次正确的松弛。具体来说,对从源顶点开始的顶点进行任意编号,设G+是由由较低编号顶点到较高编号顶点的边形成的子图,并设G−是由从高编号顶点到低编号顶点的边形成的子图。G+和G−都是有向无圈图,顶点的编号是G+的拓扑编号,G−的拓扑编号是相反的。Yen算法的每一次迭代按拓扑顺序处理这两个子图。“
发布于 2018-11-24 02:22:50
使用Fisher--Yates来洗牌除s以外的顶点。例如,你可能有顶点s,a,b,c,d,e,f,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。G+中的边从一个较低的编号顶点转到一个较高的顶点,例如c->b。G-中的边从一个较高的编号顶点转到一个较低的顶点。
https://stackoverflow.com/questions/53454427
复制相似问题