TSP问题的程序.docx
- 文档编号:7560166
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:69
- 大小:29.39KB
TSP问题的程序.docx
《TSP问题的程序.docx》由会员分享,可在线阅读,更多相关《TSP问题的程序.docx(69页珍藏版)》请在冰豆网上搜索。
TSP问题的程序
%TSP问题(又名:
旅行商问题,货郎担问题)遗传算法通用matlab程序
%D是距离矩阵,n为种群个数,建议取为城市个数的1~2倍,
%C为停止代数,遗传到第C代时程序停止,C的具体取值视问题的规模和耗费的时间而定
%m为适应值归一化淘汰加速指数,最好取为1,2,3,4,不宜太大
%alpha为淘汰保护指数,可取为0~1之间任意小数,取1时关闭保护功能,最好取为0.8~1.0
%R为最短路径,Rlength为路径长度
function[R,Rlength]=geneticTSP(D,n,C,m,alpha)
[N,NN]=size(D);
farm=zeros(n,N);%用于存储种群
fori=1:
n
farm(i,:
)=randperm(N);%随机生成初始种群
end
R=farm(1,:
);%存储最优种群
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); function[a,b]=intercross(a,b) L=length(a); ifL<=10%确定交叉宽度 W=1; elseif((L/10)-floor(L/10))>=rand&&L>10 W=ceil(L/10); else W=floor(L/10); 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 %计算归一化适应值子程序 functionfitness=fit(len,m,maxlen,minlen) fitness=len; fori=1: length(len) fitness(i,1)=(1-((len(i,1)-minlen)/(maxlen-minlen+0.000001))).^m; end 一个C++的程序: //c++的程序 #include #include template classGraph { public: Graph(intvertices=10) { n=vertices; e=0; } ~Graph(){} virtualboolAdd(intu,intv,constT&w)=0; virtualboolDelete(intu,intv)=0; virtualboolExist(intu,intv)const=0; intVertices()const{returnn;} intEdges()const{returne;} protected: intn; inte; }; template classMGraph: publicGraph { public: MGraph(intVertices=10,TnoEdge=0); ~MGraph(); boolAdd(intu,intv,constT&w); boolDelete(intu,intv); boolExist(intu,intv)const; voidFloyd(T**&d,int**&path); voidprint(intVertices); private: TNoEdge; T**a; }; template MGraph : MGraph(intVertices,TnoEdge) { n=Vertices; NoEdge=noEdge; a=newT*[n]; for(inti=0;i a[i]=newT[n]; a[i][i]=0; for(intj=0;j =j)a[i][j]=NoEdge; } } template MGraph : ~MGraph() { for(inti=0;i delete[]a; } template boolMGraph : Exist(intu,intv)const { if(u<0||v<0||u>n-1||v>n-1||u==v||a[u][v]==NoEdge)returnfalse; returntrue; } template boolMGraph : Add(intu,intv,constT&w) { if(u<0||v<0||u>n-1||v>n-1||u==v||a[u][v]! =NoEdge){ cerr<<"BadInput!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TSP 问题 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)