Performance 在经过一个子集的两个节点之间的图中查找最短路径

Performance 在经过一个子集的两个节点之间的图中查找最短路径,performance,algorithm,graph-theory,shortest-path,Performance,Algorithm,Graph Theory,Shortest Path,我试图找到一种有效的方法,在一个具有正边代价的图中,找到两个节点之间的最短路径,该图通过一个子集的节点 更正式地说: 给定一个图G=(U,V),其中U是图中所有节点的集合,V是图中所有边的集合,U的子集称为U'和代价函数表示: 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

我试图找到一种有效的方法,在一个具有正边代价的图中,找到两个节点之间的最短路径,该图通过一个子集的节点

更正式地说:

给定一个图G=(U,V),其中U是图中所有节点的集合,V是图中所有边的集合,U的子集称为U'和代价函数表示:

    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'中节点的顺序无关紧要,我可以多次访问节点

我最初的想法是利用罗伊·弗洛伊德算法生成成本矩阵。 然后,对于U’中节点的每个排列,I将计算源和目标之间的成本,如下所示:f(源节点,P1)+f(P1,P2)+……+f(Pk,target)以最低成本保存配置,然后重建路径


这种方法的复杂性是O(n3+k!)O(n3+k*k!),其中n是图中的节点数,k是子集U′中的节点数,这是不允许的,因为我必须处理最大n=2000个节点的图,其中最大n-2个节点将是U'子集的一部分。

将源节点s和目标节点t组合成一个节点z,并定义节点集U':=U'union{z},到z的距离由f(z,x):=f(s,x)和f(x,z):=f(x,t)对于U\{s,t}中的所有x。计算U''的所有节点之间的最短路径,并将f'(x,y)设为最短距离,如果没有合适的路径,则设为无穷大。瞧,你现在有一个关于顶点为U''、边权为f''的完全有向图的旅行商问题。

这是旅行商问题的推广。如果U'==U,则得到的正是TSP

您可以使用O(n^2*2^n)TSP算法,其中满标度TSP(2^n)的指数因子将减少到k=|U'|,因此得到O(n^2*2^k)

这是TSP的DP解决方案


如果结果是SO上没有人能给您提供满意的答案,您可以试着问一下。开始/结束节点是否在U?你知道U有多大吗?或者更像是理论问题?@Dan W:是的,开始/结束节点是U集合的一部分。U最多有2000个元素,U'最多有1998个元素。这是
O(n^3+k*k!)
,因为每个组合的总和将至少花费
O(k)