一、简介
旅行商问题(TSP问题)。假设有一个旅行商人要拜访全国31个省会城市,他需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择要求是所选路径的路程为所有路径之中的最小值。
二、源代码
%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
C = [1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...
3238 1229;4196 1044;4312 790;4386 570;3007 1970;2562 1756;...
2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;...
3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;...
3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...
2370 2975]; %31个省会城市坐标
N=size(C,1); %TSP问题的规模,即城市数目
D=zeros(N); %任意两个城市距离间隔矩阵
%%%%%%%%%%%%%%%%%%%%%求任意两个城市距离间隔矩阵%%%%%%%%%%%%%%%%%%%%%
for i=1:N
for j=1:N
D(i,j)=((C(i,1)-C(j,1))^2+...
(C(i,2)-C(j,2))^2)^0.5;
end
end
Tabu=zeros(N); %禁忌表
TabuL=round((N*(N-1)/2)^0.5); %禁忌长度
Ca=200; %候选集的个数(全部领域解个数)
CaNum=zeros(Ca,N); %候选解集合
S0=randperm(N); %随机产生初始解
bestsofar=S0; %当前最佳解
BestL=Inf; %当前最佳解距离
figure(1);
p=1;
Gmax=1000; %最大迭代次数
%%%%%%%%%%%%%%%%%%%%%%%%%%%禁忌搜索循环%%%%%%%%%%%%%%%%%%%%%%%%%%
while p<Gmax
ALong(p)=func1(D,S0); %当前解适配值
%%%%%%%%%%%%%%%%%%%%%%%%%%%交换城市%%%%%%%%%%%%%%%%%%%%%%%%%%
i=1;
A=zeros(Ca,2); %解中交换的城市矩阵
%%%%%%%%%%%%%%%%%求领域解中交换的城市矩阵%%%%%%%%%%%%%%%%%%%%%
while i<=Ca
M=N*rand(1,2);
M=ceil(M);
if M(1)~=M(2)
A(i,1)=max(M(1),M(2));
A(i,2)=min(M(1),M(2));
if i==1
isa=0;
else
for j=1:i-1
if A(i,1)==A(j,1) && A(i,2)==A(j,2)
isa=1;
break;
else
isa=0;
end
end
end
if ~isa
i=i+1;
else
end
else
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%产生领域解%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%保留前BestCaNum个最好候选解%%%%%%%%%%%%%%%%%%%
BestCaNum=Ca/2;
BestCa=Inf*ones(BestCaNum,4);
F=zeros(1,Ca);
for i=1:Ca
CaNum(i,:)=S0;
CaNum(i,[A(i,2),A(i,1)])=S0([A(i,1),A(i,2)]);
F(i)=func1(D,CaNum(i,:));
if i<=BestCaNum
BestCa(i,2)=F(i);
BestCa(i,1)=i;
BestCa(i,3)=S0(A(i,1));
BestCa(i,4)=S0(A(i,2));
else
for j=1:BestCaNum
if F(i)<BestCa(j,2)
BestCa(j,2)=F(i);
BestCa(j,1)=i;
BestCa(j,3)=S0(A(i,1));
BestCa(j,4)=S0(A(i,2));
break;
end
end
end
end
三、运行结果
四、备注
版本:2014a