【啃书】《智能优化算法及其MATLAB实例》例2.3 遗传算法求解TSP问题

本文介绍了使用遗传算法解决旅行商问题的仿真过程,包括初始化种群、计算路径长度、选择和交叉变异操作,以及MATLAB源码实现。通过遗传算法寻找全国31个省会城市的最短访问路径,最终得到优化后的路径和适应度进化曲线。
摘要由CSDN通过智能技术生成

问题描述

例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
在这里插入图片描述

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值