Graph 给定最短路径时修改图边权重的算法

Graph 给定最短路径时修改图边权重的算法,graph,shortest-path,weighted,Graph,Shortest Path,Weighted,给定一个边具有正权重的图、一对节点和节点之间的路径,告诉我如何将图的边权重修改到尽可能小的程度以使指定路径成为节点之间的最短路径(由a*计算)的最佳算法是什么?(当然,如果我指定最短路径作为输入,那么输出将是“不做任何更改”) 注:最小范围是指对边缘权重所做的全部更改。例如,另一个极端(最具破坏性的变化)是将不沿指定路径的所有边的权重更改为无穷大,并将沿指定路径的边的权重更改为零。这让我隐约想起了神经网络训练中常见的反向传播策略。我将概述两种策略,其中第一种是有缺陷的: 计算候选路径P的代价,我

给定一个边具有正权重的图、一对节点和节点之间的路径,告诉我如何将图的边权重修改到尽可能小的程度以使指定路径成为节点之间的最短路径(由a*计算)的最佳算法是什么?(当然,如果我指定最短路径作为输入,那么输出将是“不做任何更改”)


注:最小范围是指对边缘权重所做的全部更改。例如,另一个极端(最具破坏性的变化)是将不沿指定路径的所有边的权重更改为无穷大,并将沿指定路径的边的权重更改为零。

这让我隐约想起了神经网络训练中常见的反向传播策略。我将概述两种策略,其中第一种是有缺陷的:

  • 计算候选路径P的代价,我们称之为
    c(P)
  • 计算最短路径S的代价,我们称之为
    c(S)
  • 减少每个边的重量
    w(p)∈ P
    by
    (c(P)-c(S)-epsilon)/|P |
    ,其中
    epsilon
    是一个非常小的常数,您希望路径小于c(S),
    |P |
    P
    中的边数
  • 当然,这样做的问题是,路径
    S
    (或其他路径)的成本降低幅度可能比
    p
    的成本降低幅度更大!这对我来说意味着这将需要一种迭代方法,通过这种方法,您可以向前开始,并减少给定权重相对于在每一步重新计算的最短路径成本的成本。这是非常昂贵的,但谢天谢地,最短路径算法往往有很好的动态规划解决方案

    因此,修改后的算法如下所示(假设
    i=0
    开始):

  • 计算候选路径P的第一个
    i
    步骤的成本,我们称之为
    c(P\u 0…P\u i)
  • 计算最短路径S的成本,我们称之为
    c(S)
    ,以及它的第一个
    i
    组件的成本,我们将用
    c(S\u 0…S\u i)
    表示
  • 通过
    c(p_0…p_i)-c(s_0…s_i)-epsilon
    减少边权重w(p_n),其中
    epsilon
    是一个非常小的常数,您希望路径小于c(s)
  • 从步骤1开始重复,将
    i
    增加1
  • 其中
    p=S
    首先,如果
    epsilon
    为0,则应保持原始路径不变。否则,您应该减少不超过理想更新的epsilon*| P |


    优化此算法需要您找出如何高效地从
    c(s_0…s_i+1)
    计算
    c(s_0…s_i)
    ,但这是留给读者的练习;-)

    您可以使用Floyd Warshall算法计算所有路径的距离,然后修改所需路径,使其成为最短路径。例如,想象以下3个节点的图。

    让路径为a->b->c。Floyd-Warshall算法将计算以下矩阵

    带绿色圆圈的数字是a->b(2)和b->c(4)之间的距离。红色圆圈数字是a和c(3)之间路径的最短距离。因为2+4=6≠ 3,您知道路径必须调整3才能成为最小路径


    我建议使用这种方法,而不是仅仅计算最短路径的距离并相应地调整所需路径,原因是这种方法允许您查看任意两个节点之间的距离,以便您可以根据需要调整边的权重。

    但是,如何避免这种方法的不稳定性?如果最短路径与候选路径重叠怎么办?修改候选路径权重将使最短路径更短!Floyd-Warshall算法可以存储每个节点的前一个节点来存储最短路径。可以修改理想路径中与最短路径不重叠的部分。