1. TSPの問題
旅行中のセールスマンは、nつの都市を旅行したいと考えており、各都市が一度経験し、一度だけ経験してから出発都市に戻る必要があり、最短距離が必要です。特定のケースは既存のケースを採用します。4つの都市間の双方向距離は異なり、同じでもかまいません。
第二に、解決策
1.デプストラバーサルの優先順位アルゴリズムDFS(完全な方法)
すべての結果をリストし、各パスを計算してから、すべての結果を比較します。時間の複雑さはです。この場合、可能なすべての結果は
それはすべての可能なパス、合計4 * 3 * 2 * 1 = 24の状況をリストし、それらを順番に計算してTSP問題の最適なソリューションを取得することがわかります。この観点から、トラバーサル行列を生成することが鍵となります。
1.1走査行列の生成
数が少ない場合は、次の方法を使用できます。
clc;
close all;
clear all;
n=4;
P=[];
for i=1:n
for j=1:n
if j~=i
for k=1:n
if k~=j&&k~=i
for l=1:n
if l~=k&&l~=j&&l~=i
a=[i,j,k,l];
P=[P;a];
end
end
end
end
end
end
end
Matlabはperms関数を提供します。これは、対応する結果を取得できるため、より簡潔です。
clc;
close all;
clear all;
n=1:4;
perms(n)
1.2各スキームの合計距離の計算
トラバース行列Vを計算した後、各プランの合計距離を取得できます
C=[0,3,6,7;5,0,2,3;6,4,0,2;3,7,5,0];
V=[V,V(:,1)];
for i=1:size(V,1)
for j=1:size(V,2)-1
d(i,j)=C(V(i,j),V(i,j+1));
end
end
1.3完全なコード
clc;
close all;
clear all;
n=1:4;
V=perms(n); %得到全排列遍历矩阵
C=[0,3,6,7;5,0,2,3;6,4,0,2;3,7,5,0]; %输入距离矩阵
V=[V,V(:,1)]; %将第一列放到矩阵最后一列形成环路
for i=1:size(V,1) %计算每一条环路的各段长度
for j=1:size(V,2)-1
d(i,j)=C(V(i,j),V(i,j+1));
end
end
D=sum(d,2); %将各段长度加和
[d,position]=min(D); %找到最短环路
d_min=d; %最短环路的长度
path_min=V(position,:); %最短环路的路径
N=length(path_min);
p = num2str(path_min(1)); %将路径加上->
for i=2:N
p=[p,'->',num2str(path_min(i))];
end
disp('深度遍历优先算法DFS得到的最优路径为:')
disp(p)
fprintf('深度遍历优先算法DFS得到的最优路径的长度为:%d\n',d_min)
出力は次のとおりです。