当前位置:文档之家› 基于遗传算法的旅行商问题求解

基于遗传算法的旅行商问题求解


for i=1:n
farm(i,:)=randperm(N);
end
R=farm(1,:);
%一个随机解(个体)
scatter(a(:,1),a(:,2),'x'); %画出所有点,a(:,1):X坐标,a(:,2):Y
坐标
hold on
pause(1)
%画出随机解得路径图
figure;
plotaiwa(a,R);
这 6 个要素构成了遗传算法的核心内容,其流程如图 1 所示。
编码和初始种群生成
种群中个体适应度的检测评估
选择
交叉
变异
图 1 遗传算法的基本流程 遗传算法解题的基本步骤如下:
Step1:参数设置及种群初始化; Step2:对不可行解进行贪婪修复; Step3:适应度评价; Step4:轮盘赌选择; Step5:交叉; Step6:变异; Step7:对不可行解进行贪婪修复; Step8:适应度评价; Step9:终止条件判断,若未达到终止条件,则转到 Step4; Step10:输出结果。
3
开始
参数设置 种群初始化
对不可行解 进行贪婪修
复 适应度评价
轮盘赌选择,用选择出的 个体构成的种群替代旧的
交叉 变异 对不可行解进行贪婪修 适应度评价
是否满足 终止条
输出结果
结束 图 2 遗传算法具体步骤
4
四.程序源代码
%遗传算法求解旅行商问题 %初始化 a=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...
while counter<C for i=1:n len(i,1)=myLength(D,farm(i,:));%计算路径长度 end minlen=min(len); rr=find(len==minlen);%返回的是在len中路径最短的路径坐标(i,1) R=farm(rr(1,1),:);%更新最短路径 FARM=farm;%优胜劣汰,nn记录了复制的个数
function [R,Rlength]=GeneTSP(D,a,n,C,m,Pc,Pm)
[N,NN]=size(D); %(31*31)
farm=zeros(n,N); %存储种群
%随机生成初始种群,随机产生从1到N的N个初始值,例如, RANDPERM(6) , 可能结果为:[2 4 5 6 1 3].
(5) 交叉操作:交叉操作是遗传算法中最主要的遗传操作。简单的交叉(即一 点交叉)可分两步进行:首先对种群中个体进行随机配对;其次,在配对 个体中随机设定交叉处,配对个体彼此交换部分信息。
(6) 变异:变异操作是按位(bit)进行的,即把某一位的内容进行变异。变 异操作同样也是随机进行的。一般而言,变异概率 Pm 都取得较小。变异操作是十 分微妙的遗传操作,它需要和交叉操作配合使用,目的是挖掘群体中个体的多样 性,克服有可能限于局部解的弊病。
%选择 K=23; [aa,bb]=size(FARM); FARM2=FARM; len2=len; [len]=sort(len); for i=1:aa
tt= find(len2==len(i,1)); FARM(i,:)=FARM2(tt(1,1),:); end for i=1:K j=aa+1-i; FARM(j,:)=FARM(i,:);
3238 1229;4196 1044;4312 790;2864 570;1927 1970;2562 1756;... 2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;... 3780 2212;3676 2578;1537 2838;2745 2931;3429 1908;3507 2376;... ];%a:假定问题就是寻找一条最短的遍历 n 个城市的最短路径, 即搜索自然数 子集 W= { 1 ,2 , ⋯ , n} ( W 的元素表示对 n 个城市的编号) 的一个排列
π( W) = { V1 , V2 , ⋯ , Vn} , 使 len = ∑ d ( Vi , Vi+1) + d ( V1 , Vn)取 最小值, 式中的 d ( Vi , Vi+1) 表示城市 Vi 到城市 Vi + 1 的距离. 遗传算法是具有“生成+检测”的迭代过程的搜索算法。它的基本处理流程 如图 1 所示。由此流程图可见,遗传算法是一种群体型操作,该操作以群体中的 所有个体为对象。选择(Selection)、交叉(Crossover)和变异(Mutation)是遗 传算法的 3 个主要操作算子,它们构成了所谓的遗传操作(genetic operation), 使遗传算法具有了其它传统方法所没有的特性。遗传算子包含如下 6 个基本因 素:
(4) 选择(selection):选择或复制操作是为了从当前群体中选出优良的个体, 使它们有机会作为父代为下一代繁殖子孙。个体适应度越高,其被选择的
机会就越多。此处采用与适用度成比例的概率方法进行选择。具体地说,
就是首先计算群体中所有个体适应度的总和( f ),再计算每个个体的
2
适应度所占的比例( fi f ),并以此作为相应的选择概率 Ps 。
n=100;%n:种群个数
C=200;%C:停止代数
m=2;%m:适配值淘汰加速指数,不宜太大
Pc=0.9;%Pc:交叉概率
Pm=0.2;%Pm: 变异概率
D=distance(a);%生成距离矩阵
[R,Rlength]=GeneTSP(D,a,n,C,m,Pc,Pm);
%返回值:最优路径R
%
总距离Rlength
1
一.问题重述
假设有一个旅行商人要拜访 n 个城市,他必须选择所要走的路径,路径的限 制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标 是要求得的路径路程为所有路径之中的最小值。TSP 问题是一个组合优化问题。该
问题可以被证明具有 NPC 计算复杂性。因此,任何能使该问题的求解得以简化的方法,都 将受到高度的评价和关注。
(1) 参数编码:由于遗传算法不能直接处理解空间的解数据,因此必须通过编 码将它们表示成遗传空间的基因型串结构数据。
(2) 生成初始群体:由于遗传算法的群体型操作需要,所以必须为遗传操作准 备一个由若干初始解组成的初始群体。初始群体的每个个体都是通过随机
方法产生。
(3) 适应度评估检测:遗传算法在搜索进化过程中一般不需要其他外部信息, 仅用适应度(fitness)值来评估个体或解的优劣,并作为以后遗传操作的 依据。
6
end
%变异 FARM2=FARM; for i=1:aa
if Pm>=rand FARM(i,:)=mutate(FARM(i,:));
end end
FARM=[R;FARM];%将随机产生的n-aa个体加入从后面种群,将上次迭代的最 优解从前面加入种群
[aa,bb]=size(FARM);
%保持种群规模为n if aa>n
FARM=FARM(1:n,:); end %更新farm farm=FARM; clear FARM %更新迭代次数 counter=counter+1 ; end %结果输出
Rlength=myLength(D,R) figure plotaiwa(a,R)%画图 disp('迭代次数c'); disp(C); disp('迭代后结果'); Rlength=myLength(D,R)%结果输出 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %计算邻接矩阵 %输入参数a是中国31个城市的坐标 %输出参数D是无向图的赋权邻接矩阵
基于遗传算法的旅行商问题求解
摘要
采用 MATLAB,对 TSP 问题进行基于遗传算法的求解。TSP 问题是典型的 NP 完全问题,通过 MATLAB 进行遗传算法编程,从而有效提出一个较好的 TSP 解,实现对问题的解答。进而讨论遗传算法的特点,以及对本问题的可行性。
关键词: TSP 问题 遗传算法
end %交叉操作
[aa,bb]=size(FARM); FARM2=FARM; for i=1:2:aa if Pc>rand&&i<aa %交叉概率Pc A=FARM(i,:); B=FARM(i+1,:); [A,B]=cross(A,B);%交叉算法采用部分匹配交叉 FARM(i,:)=A; FARM(i+1,:)=B; end
function D=distance(a) [c,d]=size(a);%此例中c=24,d=2 D=zeros(c,c);%申请一个0阵 for i=1:c
for j=i:c bb=(a(i,1)-a(j,1)).^2+(a(i,2)-a(j,2)).^2;
7
D(i,j)=bb^(0.5);%计算第i个城市到j城市的距离 D(j,i)=D(i,j); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %总路径len function len=myLength(D,p) [N,NN]=size(D); len=D(p(1,N),p(1,1)); for i=1:(N-1) len=len+D(p(1,i),p(1,i+1)); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %绘制路径示意图 R记录路径 %a:假定的24个城市的坐标 %R:最短路径 function plotaiwa(a,R) scatter(a(:,1),a(:,2),'x') hold on plot([a(R(1),1),a(R(24),1)],[a(R(1),2),a(R(24),2)]) hold on for i=2:length(R) x0=a(R(i-1),1); y0=a(R(i-1),2); x1=a(R(i),1); y1=a(R(i),2); xx=[x0,x1]; yy=[y0,y1]; plot(xx,yy) hold on end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %交叉算法采用部分匹配交叉 function [a,b]=cross(a,b) L=length(a); if L<=10 %确定交叉宽度 W=9; elseif ((L/10)-floor(L/10))>=rand&&L>10 W=ceil(L/10)+8; else W=floor(L/10)+8; end p=unidrnd(L-W+1); %随机选择交叉范围,从p到p+W
相关主题