修改 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 算法以处理具有多个可能成本的边的主要内容,如果未能解决你的问题,请参考以下文章