首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bellman算法的Yen's &Bannister优化

Bellman算法的Yen's &Bannister优化
EN

Stack Overflow用户
提问于 2018-11-24 01:30:35
回答 1查看 514关注 0票数 3

我试图实现Yen提出的Bellman算法的优化,以及Bannister & Eppstein在python中提出的随机加速比。

我正在阅读班尼斯特和埃普斯坦关于这个主题的论文,这篇文章可以找到这里

我已经成功地实现了原有的Bellman算法,该算法包括算法的早期终止(在顶点距离不变时退出),以及Yen对算法的第一次改进(本文的算法3)。

然而,我在实现Yen的第二个改进和Bannister随机改进(本文的算法4和5)方面遇到了一些困难。

本文给出的日元第二次改进的伪码是

代码语言:javascript
复制
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)的伪代码与上面的完全相同,对于第一行期望如下:

代码语言:javascript
复制
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算法的每一次迭代按拓扑顺序处理这两个子图。“

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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-中的边从一个较高的编号顶点转到一个较低的顶点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53454427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档