修改 Dijkstra 算法以处理具有多个可能成本的边

Posted

技术标签:

【中文标题】修改 Dijkstra 算法以处理具有多个可能成本的边【英文标题】:Modifying Dijsktra's algorithm to work with edges having more than one possible cost 【发布时间】:2014-04-29 23:09:13 【问题描述】:

我们有一个有向加权图,其中两个节点之间的边可以有多个可能的成本值(更准确地说,最多 2 个成本)。我需要使用 Dijkstra 算法的时间相关变体,它可以处理从一个节点到另一个节点的两种可能方式,节点之间的成本(边缘成本)取决于我们到达源节点的时间和我们将要使用的边缘类型。当从一个节点遍历到另一个节点时,只会选择这些边中的一条,并将其成本添加到相同的总成本中。

我目前将一条边的两种可能成本建模为同一节点之间的两条独立边。

我发现here 有一个类似的问题,建议通过复制节点来扩充图形。但是,这不允许返回到原始图,并且意味着复制所有节点以及它们与原始节点之间可能的边的开销。

对于如何以尽可能少的开销解决这个问题,您有什么建议吗? (原图预计会很大)

谢谢

编辑: 我在第一段中提供了有关该问题的更多详细信息

【问题讨论】:

“两个成本”是指有两条边可供选择,还是有两个单独的成本沿路径相加? 你有办法知道遍历时的成本状态吗? 您为什么会选择成本更高的优势? 【参考方案1】:

出于算法目的,您可以放心地忽略这两个成本中最大的一个。

假设有一条最短路径在两个顶点之间使用最大成本,您可以将其更改为使用最小成本并且路径将成本更低,这与假设相矛盾。

【讨论】:

如果这两个成本是“非此即彼”,那么我完全同意。但是,OP 可能正在讨论一个不同的问题,即每条边上有两个独立的成本被添加到不同的总数中,在这种情况下这不起作用。 我以前读过你的评论,但对我来说没有多大意义。在后一种情况下,是否可以选择只有一个成本的优势(正如他所说,他们最多可以有两个成本)?它应该最小化哪些成本?我认为假设前一种解释是安全的。 我想到的解释(因为我曾经看到过类似的问题)是每个边成本都是某个东西的函数,比如时间,或者已经访问过哪些其他边/顶点。在那种情况下,事情会更复杂。【参考方案2】:

我认为你可以破解 Dijsktra 的algorithm 的第 3 步:

对于当前节点,考虑其所有未访问的邻居并计算它们的暂定距离。将新计算的暂定距离与当前分配的值进行比较,并分配较小的那个。例如,如果当前节点 A 的距离为 6,连接它与邻居 B 的边的长度为 2,那么到 B(通过 A)的距离将为 6 + 2 = 8。如果 B 之前是标记的距离大于8,然后将其更改为8。否则,保持当前值。

在您的设置中,您有两个从 A 到 B 的距离,具体取决于时间有多晚。如果您当前到 A 的距离高于您的时间阈值,则使用第二个。

这一步变成:

if current distance to A above threshold :
    current distance to B = min(current distance to B, current distance to A + d2(A, B)) 
else:
    current distance to B = min(current distance to B, current distance to A + d1(A, B))

【讨论】:

以上是关于修改 Dijkstra 算法以处理具有多个可能成本的边的主要内容,如果未能解决你的问题,请参考以下文章

HDU4725 The Shortest Path in Nya Graph(堆优化的dijkstra算法)

在具有特定成本的无向图中查找路径

Dijkstra 算法随机选择具有相同最小权重的相邻节点

寻找包含两个节点的最短循环

Dijkstra 的最短路径算法不返回权重最小的最短路径

对于 Dijkstra 的算法,有啥方法可以跟踪和存储每条最短路径包含的顶点?