计算 N 条最短路径的 Dijkstra 算法

Posted

技术标签:

【中文标题】计算 N 条最短路径的 Dijkstra 算法【英文标题】:Dijkstra's Algorithm to calculate N shortest paths 【发布时间】:2021-12-10 06:52:59 【问题描述】:

是否可以使用Dijkstra's Algorithm 计算从单个源到单个目的地的 N 条最短路径,其中 N 是节点数?我知道 Dijkstra 输出从单个源到图中所有节点的最短路径,但是当我阅读一篇研究论文时,作者提到了使用 Dijkstra 来计算 st 之间的 N 条最短路径,那是什么让我有点困惑。

以下是原论文的引述: 利用基于 SDN 的 SCADA 系统:反窃听案例研究 也可找到 here

Dijkstra 算法 [22] 用于计算 N 个最短路径(步骤 5),分 N 个阶段。考虑到 N = 2,在第一阶段,Dijkstra 算法确定了两个网络设备之间的最短路径,随后所有链路成本的权重增加了十倍。紧接着,在第二阶段(并且随着链路成本的增加),再次执行 Dijkstra 算法以返回第二最短路径。最后,同样在第二阶段,将第一条路由的链路成本重新建立为原始值。如后所述,N 条最短路径将用于通过不同路径传递通信流,因此将它们存储起来以供以后使用

【问题讨论】:

Dijkstra 发表了几种算法。即使是通常被称为“Dijkstra 算法”的算法也有几种变体。您通常可以从上下文中推断出哪一个。你能引用有问题的论文,还是引用它? 您的意思是在st 之间找到恰好覆盖N 路径的最短路径? 谢谢。我引用了提到这个想法的段落。 【参考方案1】:

这里的N 似乎是作者控制的参数,并非特定于图遍历算法。他们使用算法找到源站和目标站之间的最短路径。

接下来,算法 计算主站和主站之间的 N 条最短路径 具体的变电站,...

N 是阶段数。他们只做一次,找到最短路径,然后增加链接成本(乘以 10)。然后他们在新更新的链接成本上再次运行该算法,以找到第二最短(最低成本)的路径,依此类推,N 次。

然后在最后他们将链接成本重置为其原始值。

他们不是在描述一些花哨的 N 对最短路径,而只是在s-and-tN 次的相同经典最短路径之间的应用程序(每次都有不同的链接成本运行)。

其他变体

引用***this:

该算法存在多种变体; Dijkstra 的原始变体找到了两个节点之间的最短路径,[2] 但更常见的变体将单个节点固定为“源”节点,并找到从源到图中所有其他节点的最短路径,从而生成最短路径树。

您可以使用一次 Dijkstra 计算从一个选定的源节点到所有其他节点的最短路径,但在本文的例子中,它总是在同一源(主站)和目的地(变电站)之间。

【讨论】:

非常感谢您的解释。因此,算法按原样运行 N 次,每次链接成本乘以 10。我只是不明白每次迭代增加链接成本会如何改变最短路径! 为了在后续迭代中再次选择同一路径作为最短路径,在其长度乘以 10 后,它仍需要是最短路径。我还没有阅读完整的论文,但如果您发现自己最喜欢的最短路径出现故障/拥堵,您可能会使用“第二短”路径作为下一个候选路径。 你说They are not describing some fancy N-pairs shortest paths, but merely an application of the same classic shortest-path-between-s-and-t algorithm N times (with different link costs at each run) 你能给我一个解释这些花哨的来源吗?谢谢你

以上是关于计算 N 条最短路径的 Dijkstra 算法的主要内容,如果未能解决你的问题,请参考以下文章

用Dijkstra算法求最短路径

Dijkstra算法

最短路径之Dijkstra算法

最短路径—Dijkstra算法

Dijkstra最短路算法

图的最短路径的Dijkstra算法及Floyd算法