问题描述
例2.3旅行商问题(TSP问题)。假设有一个旅行商人要拜访全国31个省会城市,他需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。对路径选择的要求是:所选路径的路程为所有路径之中的最小值。
仿真过程
解:仿真过程如下:
(1)初始化种群数目为NP=200,染色体基因维数为N=31,最大进化代数为G=1000
(2)产生初始种群,计算个体适应度值,即路径长度;采用基于概率的方式选择进行操作的个体;对选中的成对个体,随机交叉所选中的成对城市坐标,以确保交叉后路径每个城市只到访一次;对选中的单个个体,随机交换其一对城市坐标作为变异操作,产生新的种群,进行下一次遗传操作。
(3)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。
优化后的路径,其适应度进化曲线如图所示。
matlab源码
%20200928lu注:该matlab代码成功在matlabR2019a运行
%%%%%%%%%%%%%%%%%%%%%%%%%遗传算法解决TSP问题%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
%% 随书源码的31个省会城市坐标
% C=[6734 1453
% 2233 10
% 5530 1424
% 401 841
% 3082 1644
% 7608 4458
% 7573 3716
% 7265 1268
% 6898 1885
% 1112 2049
% 5468 2606
% 5989 2873
% 4706 2674
% 4612 2035
% 6347 2683
% 6107 669
% 7611 5184
% 7462 3590
% 7732 4723
% 5900 3561
% 4483 3369
% 6101 1110
% 5199 2182
% 1633 2809
% 4307 2322
% 675 1006
% 7555 4819
% 7541 3981
% 3177 756
% 7352 4506
% 7545 2801
% 3245 3305
% 6426 3173
% 4608 1198
% 23 2216
% 7248 3779
% 7762 4595
% 7392 2244
% 3484 2829
% 6271 2135
% 4985 140
% 1916 1569
% 7280 4899
% 7509 3239
% 10 2676
% 6807 2993
% 5185 3258
% 3023 1942]
%31个省会城市坐标
%% 书上给的31个省会城市坐标
C=[1304 2312
3639 1315
4177 2244
3712 1399
3488 1535
3326 1556
3238 1229
4196 1004
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];
%%
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
%% 20200928lu注:遗传算法参数设置
NP=200; %种群规模
G=1000; %最大遗传代数
f=zeros(NP,N); %用于存储种群 20200928lu注:f是NP行N列
F=[]; %种群更新中间存储
for i=1:NP
f(i,:)=randperm(N); %随机生成初始种群
end
R=f(1,:); %存储最优种群
len=zeros(NP,1); %存储路径长度
fitness=zeros(NP,1); %存储归一化适应值
gen=0;
%%%%%%%%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while gen<G
%%%%%%%%%%%%%%%%%%%%%计算路径长度%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:NP
len(i,1)=D(f(i,N),f(i,1));
for j=1:(N-1)
len(i,1)=len(i,1)+D(f(i,j),f(i,j+1));
end
end
maxlen=max(len); %最长路径
minlen=min(len); %最短路径
%%%%%%%%%%%%%%%%%%%%%%%%%更新最短路径%%%%%%%%%%%%%%%%%%%%%%%%%%
rr=find(len==minlen); % 20200928lu注:找到最短路径的索引rr
R=f(rr(1,1),:); % 20200928lu注:R为最短路径的种群
%%%%%%%%%%%%%%%%%%%%%计算归一化适应值%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:length(len)
fitness(i,1)=(1-((len(i,1)-minlen)/(maxlen-minlen+0.001)));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nn=0;
%20200928lu注:以下for循环作用是,保留适应值(fitness)大于rand(随机数)的个体为F矩阵
for i=1:NP
if fitness(i,1)>=rand
nn=nn+1;
F(nn,:)=f(i,:);
end
end
[aa,bb]=size(F);
while aa<NP
nnper=randperm(nn); %20200928lu注:将上面选出的种群打乱,保留成nnper
A=F(nnper(1),:); %20200928lu注:
B=F(nnper(2),:);
%%%%%%%%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%20200928lu注:交叉操作,对选中的成对个体(A,B),随机交叉所选中的成对城市坐标,以确保交叉后路径每个城市只到访一次;
W=ceil(N/10); %交叉点个数
p=unidrnd(N-W+1); %随机选择交叉范围,从p到p+W
for i=1:W
x=find(A==B(p+i-1));
y=find(B==A(p+i-1));
temp=A(p+i-1);
A(p+i-1)=B(p+i-1);
B(p+i-1)=temp;
temp=A(x);
A(x)=B(y);
B(y)=temp;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%%%%%%
p1=floor(1+N*rand()); % 20200928lu注:floor朝负无穷大四舍五入
p2=floor(1+N*rand());
while p1==p2
p1=floor(1+N*rand());
p2=floor(1+N*rand());
end
tmp=A(p1);
A(p1)=A(p2);
A(p2)=tmp;
tmp=B(p1);
B(p1)=B(p2);
B(p2)=tmp;
F=[F;A;B];
%20200928lu注:变异操作,对选中的个体(A,B),随机交换个体其一对城市坐标;将变异后的A,B加入选择操作选中的种群,F矩阵
[aa,bb]=size(F);
end %20200928lu注:该while循环为遗传算法迭代一次的过程,子种群F初始有aa个个体,每次循环加2个个体(A,B),直至种群数达到预定种群数跳出该循环,完成一次迭代
if aa>NP
F=F(1:NP,:); %保持种群规模为n
end
f=F; %更新种群
f(1,:)=R; %保留每代最优个体 %20200928lu注:将当代最优个体R,放到种群f矩阵中,留作下次迭代
clear F;
gen=gen+1
Rlength(gen)=minlen; %20200928lu注:Rlength储存每代最优的路径长
end
%% 20200928lu注:绘图
figure
for i=1:N-1
plot([C(R(i),1),C(R(i+1),1)],[C(R(i),2),C(R(i+1),2)],'bo-');
hold on;
end
plot([C(R(N),1),C(R(1),1)],[C(R(N),2),C(R(1),2)],'ro-');%20200928lu注:将起点终点用红线连接
title(['优化最短距离:',num2str(minlen)]);
figure
plot(Rlength)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
中 智能优化算法及其MATLAB实例(第二版)[包子阳,余继周][电子工业出版社][2018年01月][9787121330308]
经过调试,随书所有代码均可以在matlabR2019a上成功运行https://mianbaoduo.com/o/bread/YZyVlp9v
含MATLAB源码 智能优化算法及其MATLAB实例(第二版)
pdd电子书以及matlab源代码
【超级会员V4】通过百度网盘分享的文件:含MATLAB源…zip
链接:https://pan.baidu.com/s/1dLmdWxZudg0MPDIqK-HJ-Q?pwd=N39g
提取码:N39g
复制这段内容打开「百度网盘APP 即可获取」
「0001-含MA…第二版)」,复制整段内容,打开最新版「夸克APP」即可获取。
畅享原画,免费5倍速播放,支持AI字幕和投屏,更有网盘TV版。
伏脂蠃蝲暌违久洞座
/92a634OL3i😕
链接:https://pan.quark.cn/s/3437f4101af0