一、实验目的
了解TSP问题,理解利用遗传算法解决TSP问题的算法流程并能够利用matlab实现该算法。
二、实验内容:
1、请描述TSP问题。
2、利用遗传算法求解下述TSP问题。
河北省主要旅游景点的坐标为:
三、实验结果
TSP问题:已知n个城市之间的距离,某一旅行商从某个城市出发访问每个城市一次仅一次,最后回到出发城市,如何安排才使其所走路线最短。
实验代码
clear
clc
close all
X=[119.400118,39.896162
115.996445,38.942194
117.941207,41.001475
113.952393,38.342717
119.805383,39.976263
117.690626,40.180984
115.396635,39.665472
114.709195,39.222931
113.623572,36.647151
114.736727,36.707347
114.773535,41.293246
114.12354,37.540537
114.613672,38.044542
116.392496,37.647955
113.756113,38.266157
114.178316,37.840268
115.547685,39.818167
119.803341,39.975309
114.585748,38.154386
113.987807,38.255855
114.445732,37.472423
114.588754,38.150796
114.775507,37.72822
116.656859,39.548504
114.790993,37.75462
113.881628,36.938712
113.957512,36.908142
114.283595,38.094246
113.852442,38.222625
117.25213,40.692657]%各城市的坐标位置
NIND=100; %种群大小
MAXGEN=200;
Pc=0.9;
Pm=0.05;
GGAP=0.9;
D=Distance(X);
N=size(D,1);
%%初始化种群
Chrom=InitPop(NIND,N);
%%在二维图上画出所有坐标点
%figure
%plot(X£¨£º£¬1),X(:,2),'o');
%%画出随机解的线路图
DrawPath(Chrom(1,:),X)
pause(0.0001)
%%输出随机解的路线和总距离
disp('初始种群中的一个随机值:')
OutputPath(Chrom(1,:));
Rlength=PathLength(D,Chrom(1,:));
disp(['总距离',num2str(Rlength)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~')
%%ÓÅ»¯
gen=0;
figure;
hold on;box on
xlim([0,MAXGEN])
title('优化过程 ')
xlabel('代数')
ylabel('最优值 ')
ObjV=PathLength(D,Chrom);
preObjV=min(ObjV);
while gen<MAXGEN
%%计算适应度
ObjV=PathLength(D,Chrom);
%fprintf('%d %1.10f\n',gen,min(ObjV))
line([gen-1],[preObjV,min(ObjV)]);pause(0.0001)
perObjV=min(ObjV);
FitnV=Fitness(ObjV);
%%选择
SelCh=Select(Chrom,FitnV,GGAP);
%%交叉操作
SelCh=Recombin(SelCh,Pc);
%%变异
SelCh=Mutate(SelCh,Pm);
%%逆转操作
SelCh=Reverse(SelCh,D);
%%重插入子代的新种群
Chrom=Reins(Chrom,SelCh,ObjV);
%%更新迭代次数
gen=gen+1;
end
%%画出最优解的路线图
ObjV=PathLength(D,Chrom);
[minObjV,minInd]=min(ObjV);
DrawPath(Chrom(minInd(1),:),X)
%%输出最优解的路线和总距离
disp('最优解:’)
p=OutputPath(Chrom(minInd(1),:));
disp(['总距离:',num2str(ObjV(minInd(1)))]);
disp('--------------------------------------------')
函数代码
1、
function D=Distance(a)
row=size(a,1);
D=zeros(row,row);
for i=1:row
for j=i+1:row
D(i,j)=((a(i,1)-a(j,1))^2+(a(i,2)-a(j,2))^2)^0.5;
D(i,j)=D(i,j);
end
end
2、
function DrawPath(Chrom,X)
R=[Chrom(1,:) Chrom(1,1)];
figure
hold on
plot(X(:,1),X(:,2),'o','color',[0.5,0.5,0.5])
plot(X(Chrom(1,1),1),X(Chrom(1,1),2),'rv','MarkerSize',20)
for i =1:size(X,1)
text(X(i,1)+0.05,X(i,2)+0.05,num2str(i),'color',[1,0,0]);
end
A=X(R,:);
row=size(A,1);
for i =2:row
[arrowx,arrowy]=dsxy2figxy(gca,A(i-1:i,1),A(i-1:i,2));
annotation('textarrow',arrowx,arrowy,'HeadWidth',8,'color',[0,0,1]);
end
hold off
xlabel('ºá×ø±ê')
ylabel('×Ý×ø±ê')
title('¹ì¼£Í¼')
box on
3、
function FitnV=Fitness(len)
FitnV=1./len
4、
function Chrom=InitPop(NIND,N)
Chrom=zeros(NIND,N);
for i=1:NIND
Chrom(i,:)=randperm(N);
end
5、
function[a,b]=intercross(a,b)
L=length(a);
r1=randsrc(1,1,[1:L]);
r2=randsrc(1,1,[1:L]);
if r1~=r2
a0=a,b0=b;
s=min([r1,r2]);
e=max([r1,r2]);
for i=s:e
a1=a;b1=b;
a(i)=b0(i);
b(i)=a0(i);
x=find(a==a(i));
y=find(b==b(i));
i1=x(x~=i);
i2=y(y~=i);
if~isempty(i1)
a(i1)=a1(i);
end
if~isempty(i2)
b(i2)=b1(i);
end
end
end
6、
function SelCh=Mutate(SelCh,Pm)
[NSel,L]=size(SelCh);
for i=1:NSel
if Pm>=rand
R=randperm(L);
SelCh(i,R(1:2))=SelCh(i,R(2:-1:1));
end
end
7、
function p=OutputPath(R)
R=[R,R(1)];
N=length(R);
p=num2str(R(1));
for i=2:N
p=[p,'->',num2str(R(i))];
end
disp(p)
8、
function len=PathLength(D,Chrom)
[row,col]=size(D);
NIND=size(Chrom,1);
len=zeros(NIND,1);
for i=1:NIND
p=[Chrom(i,:) Chrom(i,1)];
i1=p(1:end-1);
i2=p(2:end);
len(i,1)=sum(D((i1-1)*col+i2));
end
9、
function SelCh=Recombin(SelCh,Pc)
NSel=size(SelCh,1);
for i=1:2:NSel-mod(NSel,2)
if Pc>=rand
[SelCh(i,:),SelCh(i+1,:)]=intercross(SelCh(i,:),SelCh(i+1,:));
end
end
10、
function Chrom=Reins(Chrom,SelCh,ObjV)
NIND=size(Chrom,1);
NSel=size(SelCh,1);
[TobjV,index]=sort(ObjV);
Chrom=[Chrom(index(1:NIND-NSel),:);SelCh];
11、
function SelCh=Reverse(SelCh,D)
[row,col]=size(SelCh);
ObjV=PathLength(D,SelCh);
SelCh1=SelCh;
for i=1:row
r1=randsrc(1,1,[1:col]);
r2=randsrc(1,1,[1:col]);
mininverse=min([r1 r2]);
maxinverse=max([r1 r2]);
SelCh(i,mininverse:maxinverse)=SelCh(i,maxinverse:-1:mininverse);
end
ObjV1=PathLength(D,SelCh1);
index=ObjV1<ObjV;
SelCh(index,:)=SelCh1(index,:)
12、
function SelCh=Select(Chrom,FitnV,GGAP)
NIND=size(Chrom,1);
NSel=max(floor(NIND*GGAP+.5),2);
ChrIx=Sus(FitnV,NSel);
SelCh=Chrom(ChrIx,:);