最短的路径变化

时间:2012-04-17 07:18:34

标签: algorithm optimization shortest-path

我正在寻找以下问题的解决方案,与最短路径相关。

给定有向图G =(V,E),源s,目标t1,t2,...,tk和行进边{i,j}的成本是cij。现在我想知道从s到t1,...,tk的最短路径。但是,如果使用了椎骨v i (不是源或目标),那么我们有额外的C成本。注意,两条路径使用相同的椎骨vi,成本C只支付一次。

3 个答案:

答案 0 :(得分:1)

如果您正在寻找最短路径,并且如果使用c 则每条路径都会受到处罚:

创建修改后的加权函数:

w'(u,v) = w(u,v) + C    if v == c
w'(u,v) = w(u,v)        otherwise

很容易看出,在dijkstra's algorithmBellman Ford运行w'时,使用c的任何路径都会被C严重惩罚,因为如果c出现在路径中 - 它只出现一次,因此C会被添加到总权重中[注意c在最短路径中不能再出现一次],当然还有如果在此路径中未使用c,则不会受到惩罚。


编辑:我不确定我是否理解正确,如果@SaeedAmiri提到的是正确的话,如果你只想给予惩罚一次[并且最小化路径的总和到t1,...,tk] 然后你应该使用不同的解决方案 - 有类似的想法:

创建加权函数w',使得:

w'(u,v) = w(u,v) + C + epsilon    if v == c
w'(u,v) = w(u,v)                  otherwise

请注意,重要的是epsilon是一个小尺寸,只能在w'上实现,并且是可能的最小尺寸。

  1. 使用w在图表上运行dijkstra或BF,让我们将权重表示为 W1
  2. 使用w'在图表中运行dijkstra或BF,让我们将权重表示为W2
  3. 如果W1[ti] == W2[ti]每个ti∈{t1,...,tk} - 那么您在最短路径中不需要c,总结果为SUM(W1[ti]) < / LI>
  4. 否则 - 结果为min {SUM(W1 [ti])+ C,SUM(W2 [ti])`
  5. 第4步背后的想法是你有两种可能性:

    • 您可以在不使用c的情况下访问t1,...,tk的所有内容,然后使用带有它的路径会更便宜,因此您将返回W2的总和。
    • 或者,如果忽略c - 只会更加广泛 - 因此你可以自由地使用它[并返回W1的总和],并且只加一次惩罚。

答案 1 :(得分:0)

标准的O(n ^ 3)动态编程解决方案......

http://en.wikipedia.org/wiki/Dijkstras_algorithm

......仍然有效,只需稍作调整:

只计算直接成本的邻接矩阵,然后迭代考虑快捷方式,但在计算快捷方式的成本时加上vi。

答案 2 :(得分:0)

你还没有准确地告诉我们这个问题到底是什么,但是有一个明确的片段承认了从集合覆盖中保持客观的减少。

对于集合封面的任意实例,设置一个图形,其中包含源,每个集合的顶点以及每个元素的顶点。端子t1,...,tk是元件顶点。每个集顶点具有权重为零的边到源和对应于其元素的顶点。在此图表中,我们必须购买一套机盖,以便从源头到达终端,每套机盖都足够了。

除非你能告诉我们你的实例,否则多项式时间算法的近似比率不会比Theta(log n)好,所以我建议整数编程。