摘要:
采用遗传算法进行25个城市的TSP问题求解,通过遗传算法求解得出的最短路径值为29085.91,最优路径为24→15→25→20→19→6→8→17→3→13→7→5→11→1→2→14→4→9→12→21→10→16→22→18→23→24(数字为城市序号)。同时根据不同参数下的实验结果,得出结论,随着种群数量的增长及迭代次数的越来越多,遗传算法寻优的结果越来越好。当然,由于遗传算法本身具有一定的随机性,能否快速收敛得看具体参数设定。
1.1 遗传算法原理
遗传算法是一种基于自然选择和群体遗传机理的搜索算法,它模拟了自然选择和自然遗传过程中的繁殖、杂交和突变现象。
在利用遗传算法求解问题时,问题的每一个可能解都被编码成一个“染色体”,即个体,若干个个体构成了群体(所有可能解)。在遗传算法开始时,总是随机的产生一些个体(即初始解),根据预定的目标函数对每一个个体进行评估给出一个适应度值。基于此适应度值,选择一些个体用来产生下一代,选择操作体现了“适者生存"的原理,“好”的个体被用来产生下一代,“坏”的个体则被淘汰,然后选择出来的个体经过交叉和变异算子进行再组合生成新的一代,这一代的个体由于继承了上一代的一些优良性状,因而在性能上要优于上一代,这样逐步朝着最优解的方向进化。
因此,遗传算法可以看成是一个由可行解组成的群体初步进化的过程。
1.2 实验步骤
步骤一:设置 TSP 问题中25个城市的坐标值,限制每个城市只能拜访一次,并且回到出发的城市。本实验中25个城市坐标如下:
[1549,3408; 1561,2641; 3904,3453; 2216,1177; 1563,4906;
3554,827; 2578,4370; 3358,2054; 143,4789; 610,774;
1557,4064; 771,1823; 4753,4192; 2037,1897; 4692,1887;
839,415; 4314,2696; 428,3626; 2725,543; 2349,263;
770,2550; 1627,1361; 2139,3908; 1977,2775; 4345,11];
步骤二:设置种群数量 P=100,染色体基因数 N=25,迭代次数 maxIter=1000,变异概率 Pm=0.1;
步骤三:初始化种群,计算每个个体的适应度值(即路径长短),执行交叉、变异、选择操作,生成新的种群;
步骤四:判断终止条件(如果满足,则迭代结束。输出最终最短路径值以及绘制最优路径图;否则继续迭代优化,并实时更新最短路径值以及最优路径图)。
主程序源代码(mian.m文件)如下:
%% 采用遗传算法进行TSP问题求解
%% 清理参数及原始变量
clear al1;
close all;
clc;
%% 设置25个城市坐标
C=[1549,3408;1561,2641;3904,3453;2216,1177;1563,4906;
3554,827;2578,4370;3358,2054;143,4789;610,774;
1557,4064;771,1823;4753,4192;2037,1897;4692,1887;
839,415;4314,2696;428,3626;2725,543;2349,263;
770,2550;1627,1361;2139,3908;1977,2775;4345,11];
%% 设置参数
P=100; % 种群容量
N=size(C,1); % 城市个数
maxIter=1000; % 最大迭代次数
Pm=0.1; % 变异概率
%% 开始寻优
% 初始种群
Chro=[];
for i=1:P
temp=randperm(N);
Chro=[Chro;temp];
end
% 计算种群中每个染色的适应度
fit=fitness(Chro,C);
for iter=1:maxIter
% 交叉
for i=1:P/2
chro1=Chro(i,:); % 交叉配对中的第1个染色体
chro2=Chro(i+P/2,:); % 交叉配对中的第2个染色体
pos=randi(N-2)+1; % 随机选取交叉位置
new_chro1=[chro1(1:pos) chro2(pos+1:end)]; % 新的染色