遗传算法解决旅行商问题
作为NP难的经典问题,旅行商问题有多种算法可以解决。
我学习的过程中,首先看到了模拟退火算法解决旅行商问题的过程,模拟退火算法可以保证100%的找到全局最小值。
在我研究遗传算法的过程中,我突然想试一下怎样用遗传算法中选择、交叉的变异的思路来解决这个问题。
以52城的题目为例
使用遗传算法进行解题
首先考虑如何初始化种群,我选择用randperm(52)直接生成一个1到52的随机序列,作为我的一个个体。种群的规模为200.
然后考虑遗传算法的适应值怎么确定,这里取每一个个体的总路径的倒数作为适应度。
我用下面这段程序求目标函数和适应度,并用模拟退火方法求出的最优解代入,以确定代码是正确的。
clc;
clear all;
w=[565 575;25 185;345 750;945 685;845 655;880 660;25 230;
525 1000;580 1175;650 1130;1605 620;1220 580;1465 200;
1530 5;845 680;725 370;145 665;415 635;510 875;560 365;
300 465;520 585;480 415;835 625;975 580;1215 245;1320 315; %坐标输入
1250 400;660 180;410 250;420 555;575 665;1150 1160;700 580;
685 595;685 610;770 610;795 645;720 635;760 650;475 960;95 260;
875 920;700 500;555 815;830 485;1170 65;830 610;605 625;595 360;
1340 725;1740 245];
a=w(:,1); %x坐标
b=w(:,2); %y坐标
ctamount=size(w,1);
d=zeros(ctamount,ctamount);
for i=1:ctamount
for j=1:ctamount
d(i,j)=sqrt((a(i)-a(j)).^2+(b(i)-b(j)).^2); %求出两城之间的距离矩阵
end
end
a=[17 21 42 7 2 30 23 20 50 29 16 46 44 3