TSP问题遗传算法通用Matlab程序_第1页
TSP问题遗传算法通用Matlab程序_第2页
TSP问题遗传算法通用Matlab程序_第3页
TSP问题遗传算法通用Matlab程序_第4页
TSP问题遗传算法通用Matlab程序_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

TSP问题遗传算法通用Matlab程序TSP问题遗传算法通用Matlab程序/NUMPAGES9TSP问题遗传算法通用Matlab程序TSP问题遗传算法通用Matlab程序TSP问题遗传算法通用Matlab程序、

程序一:主程序

%TSP问题(又名:旅行商问题,货郎担问题)遗传算法通用matlab程序

%D是距离矩阵,n为种群个数

%参数a是中国31个城市的坐标

%C为停止代数,遗传到第C代时程序停止,C的具体取值视问题的规模和耗费的时间而定

%m为适应值归一化淘汰加速指数,最好取为1,2,3,4,不宜太大

%alpha为淘汰保护指数,可取为0~1之间任意小数,取1时关闭保护功能,建议取0.8~1.0之间的值

%R为最短路径,Rlength为路径长度

function[R,Rlength]=geneticTSP(D,a,n,C,m,alpha)

[N,NN]=size(D);

farm=zeros(n,N);%用于存储种群

fori=1:n

farm(i,:)=randperm(N);%随机生成初始种群

end

R=farm(1,:);

subplot(1,3,1)

scatter(a(:,1),a(:,2),'x')

pause(1)

subplot(1,3,2)

plotaiwa(a,R)

pause(1)

farm(1,:)=R;

len=zeros(n,1);%存储路径长度

fitness=zeros(n,1);%存储归一化适应值

counter=0;

whilecounter

fori=1:n

len(i,1)=myLength(D,farm(i,:));%计算路径长度

end

maxlen=max(len);

minlen=min(len);

fitness=fit(len,m,maxlen,minlen);%计算归一化适应值

rr=find(len==minlen);

R=farm(rr(1,1),:);%更新最短路径

FARM=farm;%优胜劣汰,nn记录了复制的个数

nn=0;

fori=1:n

iffitness(i,1)>=alpha*rand

nn=nn+1;

FARM(nn,:)=farm(i,:);

end

end

FARM=FARM(1:nn,:);

[aa,bb]=size(FARM);%交叉和变异

whileaa

ifnn<=2

nnper=randperm(2);

else

nnper=randperm(nn);

end

A=FARM(nnper(1),:);

B=FARM(nnper(2),:);

[A,B]=intercross(A,B);

FARM=[FARM;A;B];

[aa,bb]=size(FARM);

end

ifaa>n

FARM=FARM(1:n,:);%保持种群规模为n

end

farm=FARM;

clearFARM

counter=counter+1

end

Rlength=myLength(D,R);

subplot(1,3,3)

plotaiwa(a,R)程序二:计算邻接矩阵

%输入参数a是中国31个城市的坐标

%输出参数D是无向图的赋权邻接矩阵

functionD=ff01(a)

[c,d]=size(a);

D=zeros(c,c);

fori=1:c

forj=i:c

bb=(a(i,1)-a(j,1)).^2+(a(i,2)-a(j,2)).^2;

D(i,j)=bb^(0.5);

D(j,i)=D(i,j);

end

end程序三:计算归一化适应值

%计算归一化适应值的子程序

functionfitness=fit(len,m,maxlen,minlen)

fitness=len;

fori=1:length(len)

fitness(i,1)=(1-((len(i,1)-minlen)/(maxlen-minlen+0.0001))).^m;

end程序四:交叉和变异的子程序

%交叉算法采用的是由Goldberg和Lingle于1985年提出的PMX(部分匹配交叉)

function[a,b]=intercross(a,b)

L=length(a);

ifL<=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

fori=1:W%交叉

x=find(a==b(1,p+i-1));

y=find(b==a(1,p+i-1));

[a(1,p+i-1),b(1,p+i-1)]=exchange(a(1,p+i-1),b(1,p+i-1));

[a(1,x),b(1,y)]=exchange(a(1,x),b(1,y));

end

function[x,y]=exchange(x,y)

temp=x;

x=y;

y=temp;程序五:计算路径的子程序

%该路径长度是一个闭合的路径的长度

functionlen=myLength(D,p)

[N,NN]=size(D);

len=D(p(1,N),p(1,1));

fori=1:(N-1)

len=len+D(p(1,i),p(1,i+1));

end程序六:用于绘制路径示意图的程序

functionplotaiwa(a,R)

scatter(a(:,1),a(:,2),'x')

holdon

plot([a(R(1),1),a(R(31),1)],[a(R(1),2),a(R(31),2)])

holdon

fori=2:length(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论