我试图找到一种有效的方法来找到图中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'子集的一部分。
答案 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'。