【问题标题】:Yen's & Bannister-Eppstein optimization of Bellman-Ford algorithmBellman-Ford 算法的 Yen 和 Bannister-Eppstein 优化
【发布时间】: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


    【解决方案1】:

    使用 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- 中的边从编号较高的顶点到编号较低的顶点。

    【讨论】:

    • 感谢您的澄清。我能够获得这些算法的工作版本。对于任何想知道的人,Python random.shuffle() 方法使用 Fisher-Yates 来打乱列表。然而有趣的是,随机算法在我的输入图上花费的时间几乎是普通日元算法的 3 倍。我想由于改进不会修改最坏情况的时间,它取决于具体的图表天气,它是否提供了实际的改进。
    • @ASchmalzWorld 迭代次数如何比较?你不会在每一个之后重新随机化,是吗?
    • 不,我只随机化一次。我目前正在计算每个算法的统计数据,但我确实在一个 DAG 上运行了这两种算法,我在网上找到了大约 400 万个顶点和大约 1400 万条边。日元算法耗时约 19 秒,而随机算法耗时约 24 秒。我会说我使用随机 DAG 生成代码进行自动化测试,但缺点是源顶点总是比目标顶点编号低,所以所有边都在 G+ 中。
    • @ASchmalzWorld 这可能会解释它,因为拓扑顺序的第一遍得到所有距离标签正确。
    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多