我希望使用矩阵解决旅行推销员类型问题,以便找到转换之间的最短时间。矩阵看起来像这样:
A = [inf 4 3 5;
1 inf 3 5;
4 5 inf 3;
6 7 1 inf]
y轴表示“from”节点,x轴表示“to”节点。我试图找到从节点1到节点4的最佳时间。我被告知有一个名为“TravellingSalesman”的Matlab函数。这是真的,如果没有,我将如何解决这个矩阵?
谢谢!
答案 0 :(得分:0)
以下是解决从节点1
到节点n
的路径的TSP的强力算法概述:
C = inf
P = zeros(1,n-2)
for each permutation P of the nodes [2..n-1]
// paths always start from node 1 and end on node n
C = A(1,P(1)) + A(P(1),P(2)) + A(P(2),P(3)) + ... +
A(P(n-3),P(n-2)) + A(P(n-2),n)
if C < minCost
minCost = C
minPath = P
elseif C == minCost // you only need this part if you want
minPath = [minPath; P] // ALL paths with the shortest distance
end
end
请注意,总和中的第一个和最后一个因素是不同的,因为您事先知道第一个和最后一个节点是什么,因此您不必将它们包含在排列中。因此,在给出的示例中,使用n=4
,实际上只有2!=2
个可能的路径。
可以使用perms(2:n-1)
预先计算排列列表,但这可能涉及存储大矩阵(n! x n
)。或者,您可以在生成每个排列时计算成本。 Mathworks文件交换中有几个文件,其中包含适用于您的nextPerm
等名称。无论哪种方式,随着n
的增长,您将产生大量的排列,并且您的计算将需要很长时间。