在通过节点子集的2个节点之间查找图中的最短路径

时间:2011-10-06 18:28:08

标签: performance algorithm graph-theory shortest-path

我试图找到一种有效的方法来找到图中2个节点之间的最短路径,其中正边缘成本通过节点的子集。

更正式:

给定图G =(U,V),其中U是图中所有节点的集合,V是图中所有边的集合,U的子集称为U',成本函数说:< / p>

    f : UxU -> R+  
    f(x, y) = cost to travel from node x to node y if there exists an edge 
              between node x and node y or 0 otherwise,

我必须找到源节点和目标节点之间的最短路径,该路径通过U'中的所有节点。

我访问U'中节点的顺序无关紧要,我可以多次访问节点。

我最初的想法是利用Roy-Floyd算法生成成本矩阵。 然后,对于U'中节点的每个排列,我将计算源和目标之间的成本,如下所示:f(source_node,P 1 )+ f(P 1 ,P 2 )+ ... + f(P k ,target)以最低成本保存配置,然后重建路径。

这种方法的复杂性是 O(n 3 + k!) O(n 3 + k * k!),其中n是图中节点的数量,k是子集U'中节点的数量,这是不受限制的,因为我将不得不处理最大n = 2000个节点的图,其中最多n - 2个节点将是U'子集的一部分。

2 个答案:

答案 0 :(得分:1)

这是旅行推销员的概括。如果U'== U,那么你就得到了TSP。

你可以使用O(n ^ 2 * 2 ^ n)TSP算法,其中满量程TSP(2 ^ n)的指数因子将减少到k = | U'|,所以你得到O( n ^ 2 * 2 ^ k)。

这是TSP的DP解决方案。

http://www.lsi.upc.edu/~mjserna/docencia/algofib/P07/dynprog.pdf

答案 1 :(得分:0)

将源节点 s 和目标节点 t 组合到单个节点 z 中,并定义节点集 U'' := U'union {z} f(z,x)定义的距 z 的距离:= f(s,x) f(x,z):= f(x,t)对于U \ {s,t} 中的所有 x。计算 U''的所有节点之间的最短路径,并让 f'(x,y)为最短距离,或者在没有适当路径时为无穷大。瞧,你现在在完整有向图上有一个旅行商问题,顶点是 U''和边权重 f'