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

时间:2014-04-29 23:09:13

标签: algorithm graph dijkstra

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

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

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

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

由于

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

2 个答案:

答案 0 :(得分:2)

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

假设使用两个顶点之间最大成本的最短路径,您可以将其更改为使用最小成本,路径将花费更少,这与假设相矛盾。

答案 1 :(得分:0)

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

对于当前节点,考虑所有未访问的邻居并计算其暂定距离。将新计算的暂定距离与当前指定值进行比较,并指定较小的临时距离。例如,如果当前节点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))