TSP问题遗传算法通用Matlab程序
TSP遗传算法程序
TSP题目程序说明1、主函数:Run_TSP_GA.m(运行20次)2、次函数:TSP_GA.m备注:(1)、TSP_GA.m可以直接运行,其结果是一次遗传算法计算产生的解。
(91~98的注释符“%”去掉可以,显示一个最优解并画图)(2)、种群大小在该函数中修改。
3、适应度计算函数:Calculate_fitness.m4、选择函数:Selection.m5、交叉函数:Gene_cross.m6、变异函数:bianyi.m7、路程计算函数:lenghtCal.m关于数据存储的说明:数据没有存到外存,直接存在matlab的workspace里。
20次计算产生20个历史最优值用NOWminLENGHTcun存储,其维数是20*100020次计算产生20个每代最优值用LENGHTcun存储,其维数是20*100020次计算产生20个每代最优解路径用shortestPath存储,其维数是20*15程序如下主函数:Run_TSP_GA.mticclcclear allshortestLEN=0; %用来存储每次的最优值shortestPath=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]; %用来存储每次的最优解LENGHTcun=zeros(1,1000); %用来存储每次的1000代的每代最好值NOWminLENGHTcun=zeros(1,1000);for i=1:20i[opt_Path,NOWminLENGHT,LENGHT]=TSP_GA();%GA运行20次,计算性能if i==1shortestLEN=min(NOWminLENGHT);shortestPath=opt_Path;LENGHTcun=LENGHT;NOWminLENGHTcun=NOWminLENGHT;elseshortestLEN=[shortestLEN min(NOWminLENGHT)];shortestPath=[shortestPath;opt_Path];LENGHTcun=[LENGHTcun;LENGHT];NOWminLENGHTcun=[NOWminLENGHTcun;NOWminLENGHT];endendaver_shortestLEN=mean(shortestLEN); %平均性能maxLEN=max(shortestLEN); %最差性能[minLEN x]=min(shortestLEN); %最好性能fangcha=var(shortestLEN); %方差fprintf('20次随机,平均最短距离为%3.3f\n',aver_shortestLEN);fprintf('20次随机,最好性能为%d\n',minLEN);fprintf('20次随机,最差性能为%d\n',maxLEN);fprintf('20次随机,方差为%.3f\n',fangcha);tocplot(1:1000,LENGHTcun(x,:),'b')hold onplot(1:1000,NOWminLENGHTcun(x,:),'r')legend('每代最优值','历史最优值')xlabel('代数')ylabel('路程')title('无灾变情况下种群大小=40的最优解')子函数:TSP_GA.m(该子函数是单次GA算法,可直接当主函数运行)%% ***************************程序说明*****************************% 作者:陈福沨% 日期:2014年1月9日% 父代种群:individium% 子代:nextGenerat% 下一代种群:nextGenera(竞争选择之后)% 当前最优值:NOWminLENGHT% 每代最优值:LENGHT% 可更改种群大小N% 该子程序为一次计算,可直接运行,将15,91~98的注释符“%”去掉即显示一个最有解并画图%**************************************************************************function [opt_Path,NOWminLENGHT,LENGHT]=TSP_GA()clcclear all%tic%% 城市间距离邻接矩阵D=[0 66 72 16 74 25 60 24 78 44 63 17 67 70 -999;66 0 7 49 8 67 10 42 13 24 6 49 6 5 22;72 7 0 56 2 74 14 49 6 30 10 55 7 4 28;16 49 56 0 58 27 44 9 62 28 47 2 51 54 38;74 8 2 58 0 75 16 50 4 32 11 57 8 5 30;25 67 74 27 75 0 64 36 80 52 67 29 71 71 49;60 10 14 44 16 64 0 36 19 16 4 43 8 14 26;24 42 49 9 50 36 36 0 55 20 39 8 43 47 35;78 13 6 62 4 80 19 55 0 36 15 61 12 9 33;44 24 30 28 32 52 16 20 36 0 20 27 24 29 27;63 6 10 47 11 67 4 39 15 20 0 46 4 10 25;17 49 55 2 57 29 43 8 61 27 46 0 50 53 39;67 6 7 51 8 71 8 43 12 24 4 50 0 8 28;70 5 4 54 5 71 14 47 9 29 10 53 8 0 24;-999 22 28 38 30 49 26 35 33 27 25 39 28 24 0];%% 重要参数定义T=1000; %迭代代数1000代N=40; %种群个体数Score=zeros(1,N); %用来存子代分数Lenght=zeros(1,N); %用来存子代路程Fitness=zeros(1,N); %用来存子代适应度LENGHT=0; %来存储每代种群中最好的个体NOWminLENGHT=0; %存储当前最好值opt_Path=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]; %存储最优解zaibian=0; %灾变标记%% 个体的表示和初始化种群individium=struct('path',[],'fitness',[],'lenght',[],'Pc',[]); %把个体用结构体表示:路径,适应度,路程,生存概率for n=1:N %对1~15随机排序,产生初始种群individium(n).path=randperm(15);end%% 主函数[nextGenerat]=Gene_cross(individium,N); %交叉:产生下一代nextGenera为下一代个体[individiumt,lenght,score,fitness]=Calculate_fitness(nextGenerat,N,D); %计算子代的适应度和生存概率[nextGenera]=Selection(individiumt,N,fitness); %选择:用生存概率选择产生下一代种群[individiumt,lenght,score,fitness]=Calculate_fitness(nextGenera,N,D); %计算种群的适应度Score=score;Lenght=lenght;Fitness=fitness;individium=nextGenera; %下一代种群LENGHT=min(lenght);NOWminLENGHT=LENGHT;for t=2:T%% 遗传算法:交叉变异选择t %显示代数[nextGenerat]=Gene_cross(individium,N); %交叉:产生下一代nextGenera为下一代个体[individiumt,lenght,score,fitness]=Calculate_fitness(nextGenerat,N,D); %计算子代的适应度和生存概率[nextGenerat]=bianyi(individiumt,N,1); %变异:变异概率分别为0.06和0.003,p=1是一个系数,用来方便调整变异率[individiumt,lenght,score,fitness]=Calculate_fitness(nextGenerat,N,D); %计算种群的适应度和生存概率[nextGenera]=Selection(individiumt,N,fitness); %选择:用生存概率选择产生下一代种群[individiumt,lenght,score,fitness]=Calculate_fitness(nextGenerat,N,D);Score=[Score;score];Lenght=[Lenght;lenght];Fitness=[Fitness;fitness];individium=nextGenera;%**********************以下存储最优值和最优解****************************** NOWminLENGHT=[NOWminLENGHT min(LENGHT)]; %存储当前最优值[minLENGHT x]=min(lenght);if minLENGHT<=NOWminLENGHT(t) %存储最优解opt_Path=individium(x).path;endLENGHT=[LENGHT minLENGHT]; %存储每代最好值%% 灾变(当200代内当前最优值都没有改善的时候选择灾变)if LENGHT(t)>=NOWminLENGHT(t)zaibian=zaibian+1;elsezaibian=0;endifzaibian>=200for n=1:N %灾变:重新随机初始化individium(n).path=randperm(15);endzaibian=0;endend%opt_Path%plot(1:T,LENGHT,'b')%hold on%plot(1:T,NOWminLENGHT,'r')%legend('每代最优值','历史最优值')%xlabel('代数')%ylabel('路程')%title('种群大小=10的最优解')子函数:Calculate_fitness.m(适应度函数)function [individium,lenght,score,fitness]=Calculate_fitness(individium,N,D) %计算种群的每个个体适应度和生存概率score=zeros(1,N); %处理前的分数scoret=zeros(1,N); %处理后的分数lenght=zeros(1,N); %存储路程fitness=zeros(1,N); %存储适应度for n=1:N[score(n)]=lenghtCal(individium(n).path,D);individium(n).lenght=score(n);lenght(n)=score(n);end%% 对路程值进行取反,并归一化为scorescore_Max=max(score);score_Min=min(score);ifscore_Max~=score_Minscore=(score_Max-score)/(score_Max-score_Min); %由于该实例的存在负值的路程,且值越小适应度越大,归一化处理elseifscore_Max>0score=score./999;elsescore=-score./999;endendScore=sum(score);average=Score/N;%% 对score进行处理成scoret,舍弃得分小于平均值的个体for n=1:Nif score(n)<=averagescoret(n)=0.01;elsescoret(n)=score(n)-average;endendScoret=sum(scoret);%% 计算该种群的个体适应度和生存概率for n=1:Nindividium(n).fitness=scoret(n);fitness(n)=scoret(n);individium(n).Pc=scoret(n)./Scoret;end子函数:lenghtCal.m(路径长度,在适应度函数中用到)function [score]=lenghtCal(path,D) %计算路程score=0;for i=1:14score=score+D(path(i),path(i+1));endscore=score+D(path(15),path(1));子函数:Selection.m(选择)function [nextGenera]=Selection(individiumt,N,fitness) %竞争选择函数,用轮盘赌nextGenera=struct('path',[],'fitness',[],'lenght',[],'Pc',[]);lunpan=zeros(1,N);lunpan(1)=fitness(1);for n=1:N-1 %设置轮盘lunpan(n+1)=lunpan(n)+fitness(n+1);end[maxfitness x]=max(fitness); % x是最小值的位置for n=1:Nselet=rand()*lunpan(N);if selet>0 &&selet<=lunpan(1); %用生存概率选择产生下一代种群nextGenera(n)=individiumt(1);elsefor i=1:N-1ifselet>lunpan(i) &&selet<=lunpan(i+1)nextGenera(n)=individiumt(i+1);endendendendnextGenera(1)=individiumt(x); %将精英保存下去子函数:Gene_cross.m(交叉)function [nextGenera]=Gene_cross(individium,N) %交叉算子nextGenera=struct('path',[],'fitness',[],'lenght',[],'Pc',[]);for n=2:2:Nsite=randint(1,1,[1,14]); %随机产生交叉位置:1~14Genetemp1=zeros(1,site); %另n为父亲,存放父亲前段基因Genetemp2=zeros(1,site); %另n-1为母亲,存放母亲前段基因numOfleft1=15-site;numOfleft2=15-site;temp1=zeros(1,numOfleft1); %用来存放父基因的后段temp2=zeros(1,numOfleft2); %用来存放母基因的后段for i=1:siteGenetemp1(i)=individium(n).path(i);Genetemp2(i)=individium(n-1).path(i);endfor i=15:-1:1if ~ismember(individium(n-1).path(i),Genetemp1) %temp2(numOfleft2)=individium(n-1).path(i);numOfleft2=numOfleft2-1;endif ~ismember(individium(n).path(i),Genetemp2) %temp1(numOfleft1)=individium(n).path(i);numOfleft1=numOfleft1-1;endendnextGenera(n-1).path=[Genetemp1 temp2]; %交叉组合nextGenera(n).path=[Genetemp2 temp1];end子函数:bianyi.m(变异)function [nextGenerat]=bianyi(individium,N,p) %变异函数,p是一个系数,用来方便调整变异率nextGenerat=struct('path',[],'fitness',[],'lenght',[],'Pc',[]);fitnessTemp=zeros(1,N);for n=1:NfitnessTemp(n)=individium(n).fitness;endaverage=mean(fitnessTemp);for n=1:Nif individium(n).fitness<average %适应度差的变异概率大bianyilv=0.06*p;elsebianyilv=0.003*p; %适应度好的变异率小一点,为了使好的个体保存下去endfor i=1:15bian=rand();if bian<bianyilv %变异:变异方式为随机4个基因两两对换位置site1=randint(1,1,[1,14]);site2=randint(1,1,[1,14]);site3=randint(1,1,[1,14]);site4=randint(1,1,[1,14]);temp=individium(n).path(site1);individium(n).path(site1)=individium(n).path(site2);individium(n).path(site2)=temp;temp=individium(n).path(site3);individium(n).path(site3)=individium(n).path(site4);individium(n).path(site4)=temp;endendendnextGenerat=individium;。
MATLAB关于旅行商问题遗传算法的研究
基于遗传算法对TSP问题的研究摘要:作为一种模拟生物自然遗传与进化过程的优化方法,遗传算法(GA)因其具有隐并行性、不需目标函数可微等特点,常被用于解决一些传统优化方法难以解决的问题。
旅行商问题(TSP)是典型的NP难题组合优化问题之一,且被广泛应用于许多领域,所以研究遗传算法求解TSP具有重要的理论意义和应用价值。
关键字:遗传算法旅行商问题Abstract:Genetic algorithm(GA)which has the characteristic of latent parallelism, non-differentiability of objective function and so on,as a optimization method of simulating the process of natural biotic inherit and evolution,is used to solve some problems which are difficult to solve by the traditional optimization method.Travel salesman problem(TSP)is a typical NF s combination and optimization problem,and is widely used in many fields.So the genetic algorithm to solve TSP has important theoretical significance and application value.Keywords:genetic algorithm TSP一、引言在过去,人们往往只能够处理一些简单的问题,对于大型复杂系统的优化和自适应仍然无能为力。
但是在自然界中,生物在这方面表现出了其优异的能力,他们能够通过优胜劣汰、适者生存的自然进化规则进行生存和繁衍,并且慢慢的产生对其生存环境适应性越来越高的优良物种。
用MATLAB求解TSP问题的一种改进遗传算法
第13卷 第4期厦门理工学院学报Vol .13 No .4 2005年12月Journal of Xiamen University of Technol ogyDec .2005 [收稿日期]2004-04-15 [修回日期]2005-06-10[基金项目]福建省自然科学基金资助项目(A0410005)[作者简介]肖磊(1979-),男,湖北十堰人,在读硕士研究生,从事模糊控制和人工智能方向的研究.用MAT LAB 求解TSP 问题的一种改进遗传算法肖 磊,张阿卜,徐文进(厦门大学自动化系,福建厦门361005)[摘 要]TSP 问题是遗传算法得以成功应用的典型问题.提出一种改进的义叉和变异算子来解决TSP问题,并给出其算子的MAT LAB 程序.通过实验,发现改进的算法比传统算法收敛速度更快,适应值更优,说明改进算法是有效的.[关键词]TSP;遗传算法;贪婪算法;MAT LAB[中图分类号]TP 301.6 [文献标识码]A [文章编号]1008-3804(2005)04-0038-05 1 引言遗传算法(G A )是一种全局寻优搜索算法,它首先对问题的可行解进行编码,组成染色体,然后通过模拟自然界的进化过程,对初始种群中的染色体进行选择、交叉和变异,通过一代代进化来找出最优适应值的染色体来解决问题.遗传算法具有很强的全局搜索能力和较强的自适应性,适合解决连续变量函数优化问题和离散变量的优化组合问题[1].旅行商问题(TSP )是一个典型的优化组合问题,它需要求出旅行商从某一城市出发经过所有城市所走路程的最短路径,其可能的路径数与城市个数成指数关系增长.目前应用遗传算法解决TSP 问题,主要要解决编码问题和算子的设计问题.编码方式约束了运算空间的大小,好的编码方式可以压缩求解空间,提高运算效率.常见的编码方式有二进制编码,实值编码,自然编码等[2]本文主要讨论自然编码方式下算子的改进及其MAT LAB 的程序实现.针对TSP 问题,提出贪婪交叉算子和倒位变异算子来加快算法的收敛速度,同时又不易陷入局部最优,从而较好地解决了群体的多样性和收敛速度的予盾. 2 算法设计及其程序实现用0到n 这n +1个自然数来编码n +1个城市,通过这n +1个编码的不同排列来表示所走的路径.用MAT LAB 的不同程序模块来实现算法的各个重要步骤.主要有:求城市间距离(qiujuli .m )、产生初始种群(start .m )、选择算子(select .m )、交叉算子(cr oss .m )、变异算子(mutate .m ).2.1 初始种群的产生对于n 个城市的问题,每个个体即每个解的长度为n ,用s 行,t 列的pop 矩阵表示初始群体,s 表示初始群体的个数,t 为n +1,矩阵的每一行的前n 个元素表示城市编码,最后一个元素表示这一路径的长度.start .m 程序如下: Functi on [pop ]=start (s ,t )Pop =zer os (s ,t );For i =1∶s%逐行产生初始路径 Pop (i ,1∶t -1)bianma (t -1); 第4期肖磊等:用MAT LAB求解TSP问题的一种改进遗传算法EndFuncti on[a]=bianma(k) %随机产生解空间的一个无重复城市序列a=zer os(1,k); u=30;aa=0∶u-1;For i=1∶k Point=r ound(rand3(u-i))+1; a(i)=aa(Point); aa(point)=[];End 考虑到初始群体的多样性,根据城市的数目大小来设定初始群体的数目.2.2 适应度函数设计和选择算子在TSP的求解中,可以直接用距离总和作为适应度函数.个体的路径长度越小,所得个体越优越,以pop矩阵的每一行最后一个元素作为个体适应值.求适应值的qiujuli.m程序略.计算出初始群体的适应值后,就要进行选择操作,选择就是在适应度评估的基础上,用群体中适应值最小的k个个体直接替换k个适应值最大的个体,进行初步优化.Select.m的程序实现略.2.3 交叉算子设计交叉算子的设计直接影响到种群收敛速度和最优解的得到,在TSP问题中几种有代表性的交叉算子有部分匹配交叉,顺序交叉,边重组交叉、插入交叉和循环交叉等,这些交叉算子都可以产生新个体,又不出现非法回路.但是,有些算子在产生新个体的过程中没有目的性,不能很好的继承父代的优良特性,大大的影响了种群的收敛速度.受贪婪算法的启发,本文设计一种有目的使适应值上升的交叉算子.已知两个父代p1(m11, m12,m13,…,m1n),p2(m21,m22,m23,…,m2n),算法产生后代p1′和p2′的过程如下:(1)随机产生一个城市d作为交叉起点,把d作为p1′和p2′的起始点.(2)分别从p1和p2中找出d的右城市dr1和dr2,并计算(d,d r1)和(d,d r2)的距离j1和j2.(3)如果j1<j2,则把dr1作为p1′的第二个点,从p1和p2中删除d,并且把当前点改为dr1.转步骤(5).(4)如果j1>j2,则把d r2作为p1′的第二个点,从p1和p2中删除d,并且把当前点改为dr2.(5)若此时p1和p2的个数为1,结束,否则回到第二步继续执行.同理,把第二步中的右城市改成左城市d11和d12,通过计算(d,d11)和(d,d12)的距离并比较大小来确定子代p2′.表1 6城市距离表城市12345610817201810280101720153171001012204201710010165182012100961015201690若随机选择从城市6开始,则根据表1应用上述算子产生的子代为p1′(621543),p2′(612345),val(p1)=72,val(p2)=67,val(p1′)=61,val(p2′)=48,可见交叉之后的适应值得到比较大的优化.由上例可见这种用距离表来选择子代基因的交叉算子可以使代在很大程度上继承父代优良基因,迅速优化适应值,达到交叉的目的.MAT LAB的交叉模块cr oss.m程序如下: Functi on[pop]cr oss(pop)[s,t]size(pop);data;%取城市位置数据dist m a=dists(mm,mm);%生成距离表pop1=pop;%保存原群体矩阵m=zer os(1,31);%初始化交叉后第一个个体n=zer os(1,31);%初始化交叉后第二个个・93・厦门理工学院学报2005年体f or i =1∶2:S %每两行进行交叉操作x 1=pop (i ,∶);%取出要交叉的两行进行右交叉y 1=pop (i +1,∶);x 2=pop (i ,∶);%取出要交叉的两行进行左交叉y 2=pop (i +1,∶);c 1=r ound (rand 329);%随机产生交叉起点c 2=c1;m (1)=c 1;n (1)=c 2;j =2;while size (x1,2)>2%交叉结束的条件1=find (x 1==c 1);h =find (x 2==c 2);I f l ==32-j %若为最后一个城市,则右城市为第一个城市 lr =1;Else lr =l +1;%其他情况直接加一EndI f h ==1%若为第一个城市,则左城市为最后一个城市hl =32-j ;Elseh 1=h -1;Endq =find (y 1==c 1);z =find (y 2==c 2);I f q ==32-j %找出第二个父代的右城市qr =1;Else qr =q +1;EndI f z ==1%找出第二个父代的左城市z 1=32-j ;Elsez 1=z -1;End I fdist m a (c 1+1,x 1(lr )+1)<dist m a (c 1+1,y 1(qr )+1)%比较两父代交叉点与右城市的距离,取距离小的城市为子代的下一个点m (j )=x 1(lr );c 1=x 1(lr );Elsem (j )=y1(qr );c 1=y 1(qr );m (j )=y 1(qr );c 1=y 1(qr );Endx 1(1)=[];%删除父代中已经选中的点y 1(q )=[];I fdist m a (c 2+1,x 2(h l )+1)<dist m a (c 2+1,y 2(z l )+1)%比较两父代交叉点与左城市的距离,取距离小的城市作为第二子代的下一点n (j )=x 2(h l );c 2=x 2(h l );Elsen (j )=y 2(z l );c 2=y 2(z l );Endx 2(h )=[];%删除父代中已经选中的点y 2(z )=[];j =j +1;Endpop1(i ,:)=m ;%得到交叉后的群体矩阵pop1(i +1,:)=n ;Endpop1=qiujuli (pop1);%求出交叉种群中个体的适应值For i =1∶s %逐行比较,保留适应值较小的个体I f pop1(i,t )<pop (i,t )pop (i ,:)=pop1(i ,:);End End 2.4 变异算子设计对于TSP 问题,已知的变异算子有交换变异,插入变异和倒位变异等.这些变异算子除了倒位变异外,都没有考虑边的邻接关系,不能保留原有的边的邻接关系,这样就不能把巡回路线上的优良性能较好的遗传到下一代,也就不能提高寻优速度.采用一种贪婪倒位变异,首先确定一个变异起始点c 1,然后在除去起始点右侧的点的那些后来的点中找到与起始点距离最短的点c 2,最后逆序存放c 1到c 2的那些城市编码顺序,完成变异.同时根据适应值来评估变异结果,如果倒位后该个体适应值没有优化,则对该个体不进行变异操作.・04・ 第4期肖磊等:用MAT LAB 求解TSP 问题的一种改进遗传算法倒位原理是:先随机选择父辈个体的两个变异点,然后对一个点之间的城市编码逆序存放,产生变异后的个体.例如,父代个体为p (2651374),随机选择的变异点为6,通过距离表得到1、3、7、4中距离6最近的是7,则把7作为第二变异点,交换它们之间的城市顺序,变异后的个体为p 1(2673154).Mutate .m 具体程序略. 3 仿真实验与结果分析以文献中几个典形的TSP 问题为例,给出城市的位置坐标,并用MAT LAB 编程实现仿真,分析实验结果.3.1 30个城市TSP 问题所给中国30个城市坐标如下:china =(877;9138;8346;7144;6460;6858;8369;8776;7478;7171;5869;5462;5167;3784;4194;299;764;2260;2562;1854;450;1340;1840;2442;2538;4126;4521;4435;58;35;6232)这里设定交叉概率Pc =0.9,变异后概率Pm =0.2,初始种群个数s =250,选择个数k =20.主程序(main .m )略.图1是文献[3]的遗传算法遗传50代后的路径图,图中还有很多交叉路径,所得最短距离为473.4999,.图2是改进遗传算法在遗传50代后得路径图,图形中已经没有交叉,所得最短距离为425.0778,已经非常接近最优结果.图3中,蓝色的线代表文献[3]遗传算法的最优个体距离总和随遗传代数的变化,红线代表改进的遗传算法的最优个体距离总和随代数的变化.可见,改进的遗传算法具有很高的收敛速度,不到30代就已经非常接近最优值.而老的遗传算法需要3000代以上才比较接近最优值.通过文献[3]知道这个TSP 问题的最优结果是423.7601.实验发现,用改进的遗传算法进行10次实验,每次都是50代的遗传代数,有8次得到与本问题的最优值非常接近的424.8693.3.2 50个城市TSP 问题所给50个城市的坐标见文献[4]Cites =[1075;369;9178;……7390;]・14・厦门理工学院学报2005年图4是改进算法在进化50代后的路径图,所得最优路径长551.8073,这个结果比文献[4]所得结果561.8513要好的多.3.3 中国旅行商问题(CTSP )所给中国31城市相对坐标见文献[5],Chinacites =[13042312;36391315;41772244;……23702975;]图5是改进算法运行50代后的最优路径,所得最短路径长15387,该路径与文献[5]中的最优路径非常接近,路径长也非常接近最优值15309. 4 结论提出一种基于TSP 问题的改进的遗传算法.考虑到TSP 问题的特点,采用一种受贪婪算法启发的新的交叉算子和变异算子,即极大地提高了算法的收敛速度又保证了最优解的得到,而且具有较好的鲁棒性.这种算法思想不仅可以用在TSP 问题,还可以很好地应用于其他类似优化问题.[参考文献][1]王小平,曹立明.遗传算法-理论、应用及软件实现[M ].西安:西安交通大学出版社,2002.[2]李敏强,寇纪淞,林丹,等.遗传算法的基本理论与应用[M ].北京:科学出版社,2002.[3]高经纬,张煦,李峰,等.求解TSP 问题的遗传算法实现[J ].计算机时代,2004,(2):19221.[4]熊伟清,郭举良,魏平.一种快速求解TSP 问题的遗传算法[J ].微电子学与计算机,2004,(1):19222.[5]李明海,邢桂华.用MAT LAB 实现中国旅行商问题的求解[J ].微计算机应用,2004,(2):2182222.An I m proved Geneti c A lgor ith m for TSP Proble m Ba sed on M ATLABX I A O Lei,ZHANG A 2bu,XU W en 2jin(Aut omati on Depart m ent,Xia men University,Xia men 361005,China )Abstract:TSP p r oble m is a typ ical p r oble m t o which Genetic A lg orithm can be successfully used .T o s olve the questi on of many G A s on searching TSP p r oble m ,an i m p r oved G A is suggested which gives the MAT LAB p r ogra m its cr oss over operat or and mutati on operat or .Test shows that the i m p r oved G A has better perf or mance than the traditi onal G A on the convergence s peed and the fitness value .The i m p r oved G A obtains a better re 2sult .Key words:TSP;Genetic A lgorith m;Greed A lgorith m;MAT LAB・24・。
一些解决TSP问题的算法及源代码
模拟退火算法新解的产生和接受可分为如下四个步骤:
第一步是由一个产生函数从当前解产生一个位于解空间的新解;为便于后续的计算和接受,减少算法耗时,通常选择由当
前新解经过简单地变换即可产生新解的方法,如对构成新解的全部或部分元素进行置换、互换等,注意到产生新解的变换方法
决定了当前新解的邻域结构,因而对冷却进度表的选取有一定的影响。
(3)产生新解S′
(4)计算增量Δt′=C(S′)-C(S),其中C(S)为评价函数
(5)若Δt′<0则接受S′作为新的当前解,否则以概率exp(-Δt′/T)接受S′作为新的当前解.
(6)如果满足终止条件则输出当前解作为最优解,结束程序。
终止条件通常取为连续若干个新解都没有被接受时终止算法。
(7) T逐渐减少,且T->0,然后转第2步。
(wm, wm-1 ,…,w1 , wm+1 ,…,wk-1 ,wn , wn-1 ,…,wk).
上述变换方法可简单说成是“逆转中间或者逆转两端”。
也可以采用其他的变换方法,有些变换有独特的优越性,有时也将它们交替使用,得到一种更好方法。
代价函数差设将(w1, w2 ,……,wn)变换为(u1, u2 ,……,un),则代价函数差为:
第二步是计算与新解所对应的目标函数差。因为目标函数差仅由变换部分产生,所以目标函数差的计算最好按增量计算。
事实表明,对大多数应用而言,这是计算目标函数差的最快方法。
第三步是判断新解是否被接受,判断的依据是一个接受准则,最常用的接受准则是Metropo1is准则:若Δt′<0则接受S′作
为新的当前解S,否则以概率exp(-Δt′/T)接受S′作为新的当前解S。
% coordinates given by LOC, which is an M by 2 matrix and M is
遗传算法求解TSP问题的MATLAB实现
2007年6月韶关学院学报#自然科学Jun.2007第28卷第6期Journal of Shaoguan University#Natural Science Vol.28No.6遗传算法求解TS P问题的M ATLAB实现温清芳(德化陶瓷职业技术学院,福建德化362500)摘要:以遗传算法求解旅行商问题(TSP)为例,提出一种改进的交叉和变异算子,深入讨论了各个遗传算子的程序实现,并给出其算子的M A TL AB程序编码,最后用5个城市的非对称TSP进行仿真分析.结果表明,改进的算法比传统算法收敛速度更快,适应值更优,说明改进算法是有效的,证实T SP问题是遗传算法得以成功应用的典型例子.关键词:旅行商问题;遗传算法;G refenstettet编码;M A TLA B程序中图分类号:O242文献标识码:A文章编号:1007-5348(2007)06-0018-05尽管对遗传算法的研究方兴未艾[1],但因其基础理论难有突破性进展,要想知道其效果如何就只有利用计算机进行模拟.目前大多采用C语言编写这类程序[2].C语言作为一种高效的编程语言有它的许多优点,但对于编写遗传算法(G A)程序来说,M A TL AB语言则更为合适.遗传算法是一种全局寻优搜索算法,它首先对问题的可行解进行编码,组成染色体,然后通过模拟自然界的进化过程,对初始种群中的染色体进行选择、交叉和变异,通过一代代进化来找出最优适应值的染色体来解决问题.它具有很强的全局搜索能力和较强的自适应性,适合解决连续变量函数优化问题和离散变量的优化组合问题[2].它比用C等其它高级语言要简单、灵活、快捷,程序篇幅也将缩小许多.旅行商问题(TSP)是一个典型的优化组合问题,可具体描述如下:已知n个城市之间的相互距离,现有一个推销员从某一城市出发,必须遍访这n个城市,并且每个城市只能访问一次,最后又必须返回到出发城市.如何安排他对这些城市的访问次序,可使其旅行路线的总长度最短[2,3].事实上,很多实际问题,如电路布线、输油管路铺设、连锁店的货物配送路线等,经过简化处理后都可建模为TSP问题[4].因而,对求解TSP问题方法的研究便具有重要的应用价值.由于TS P问题的可行解数目与城市数目n是成指数型增长的,是一个NP难问题,因而一般只能近似求解,遗传算法(G A)是求解该问题较为有效的方法之一,目前应用遗传算法解决TS P问题,主要解决编码问题和算子的设计问题.采用所遍历城市的顺序排列来表示各个个体的编码串是最自然的编码方法,但它对应的交叉和变异运算实现起来较困难,因为常规的交叉和变异运算会使群体中产生一些不满足问题的约束条件或无意义的巡回路线.为克服这一缺点,可以采用Gref enstettet编码法[5].本文主要针对TSP问题,讨论自然编码方式下算子的改进及其M A TL AB的程序实现,较好地解决了群体的多样性和收敛速度的予盾.1Grefenstettet编码法的描述对于一个TSP问题的城市列表W,假定每个城市的一个访问顺序为T=(t1,t2,t3,,,t n),规定每访问完一个城市,就从城市列表中将该城市去掉,则用第i(i=1,2,3,,,n)个访问的城市t i在所有未访问城市列表W\{t1,,,t i-1}中的对应位置序号g i(1F g i F n-i+1)就可表示具体访问哪个城市,如此这样直到处理完W中所有的城市.将全部g i顺序摆列在一起得到一个列表:G=(g1,,,g n)就可表示一条巡回路线,它即为遗传算法中的一个个体的基因.例如:收稿日期:2006-11-13作者简介:温清芳(1959-),女,福建德化人,德化陶瓷职业技术学院高级讲师,主要从事高校数学教学与研究.W =(123456789101112131415), 则Path =(815210743111461295131),对应Chrom =(8142863257343221).这种编码法的优点在于任意的基因型个体都对应着一条有实际意义的巡回路线,因此可使用常规的交叉算子对其进行操作.2TSP 问题的数学模型假设有一个图G =(V ,E ),其中V 是顶点集,E 是边集,设D =(d ij )nxn 是顶点i 和顶点j 之间的距离所组成的距离矩阵,TSP 问题就是求出一条通过所有顶点且每个顶点只通过一次的具有最短距离的回路.若d ij =d ji (i X j )),称为对称TSP 问题,否则称为非对称TSP 问题.若对于城市W =(v 1,v 2,,,v n )的一个访问顺序为T =E {t 1,t 2,t 3,,,t n },其中t i I V ={1,,,n },且t n -1=t 1,则TSP 问题的数学模型为:min L =E ni =1d(t i t i +1),其中,d (t i t i +1)表示顶点t i 和顶点t i +1之间的距离.3M A TLAB 6.5的实现G A 中的控制参数如下:染色体数Popsiz e,最大代数M axgen,城市数目N cities ,交叉率P c ,距离矩阵D ,城市列表W .3.1 种群的初始化编码:Func tion Chrom=TSPinitialize (Popsiz e,N cities )for i =1:PopsizeChrom (i ,1)=1;%推销员从城市1出发for j =2:N citiesChrom (i ,j )=round (rand *(N cities -j ))+1;endend解码:Func tion pop=TSPdec ode (Popsize,N cities ,Chrom,W )For i =1:Popsizetemp W =W ;for j =1:N citiespop (i ,j )=temp W (chrom(i ,j ));for k =(C hrom(i ,j )):(N cities -j )temp W (k )=temp W (k +1)endend end; 第6期温清芳:遗传算法求解TSP 问题的M A TL AB 实现#19 #计算目标函数:Function rpop=rotatepop(pop)for i=1:Popsizerpop=[pop(i,2:N cities),pop(i,1)]endFunction cost=TS Pcost(Popsize,pop,rpop)For i=1:PopsizeCost(i)=Sum(diag(D(pop(i,:).)(pop(i,:).)));end;3.2遗传操作设计选择:采用具有排名的转盘式选择算子.按照个体目标函数值从大到小排列cost(1)\cost(2)\...\ cost(Popsize),然后根据线性函数计算选择概率:P i=1Popsize(a-b#iPopsize+1)i=1,2,,,Posize,式中:i为排名序数,a,b是常数,1F a F2,b=2(a-1),通常a= 1.1.然后按照转盘方式选择父体进行遗传操作:先产生一个[0,1]内的随机数r,如果P0+...+P i-1<r [P1+......P i(P0=0),则选择i,否则随机选一染色体.Function Chrom=select(Popsize,cost,chrom)B=2*(a-1);[fit,I]=sort(-cost);for i=1:PopsizeP fit(i)=(a-b*i P(Popsinx+1))P Popsize;endpfit=cum Sum(pfit);rs=rand(1,Popsize);for i=1:Popsizeif rs(i)<=pfit(i),Chrom(i,:)=Chrom(I(i),:);else Chrom(I,:)=C hrom((round*Popsize)+,:);endend;交配:采用常规单点交叉.将选择中产生的种群做为父代,两两组队,以交叉率发生交叉操作:若发生交叉操作,在[1,N cities-1]区间随机确定一个交叉位置,进行该位后的所有基因对换,否则不做任何处理.Function Chrom=crossover(Chrom)For i=1:Popsize P2If rand<P cjcross=fix(rand*(N cities-1))+1;%jcross为交叉位P1=Chrom(2*i-1;:),P2=Chrom(2*I;:)Chrom(2*i-1,;:)=[P1(1:jcross),P1((jcross+1):N cities)];Else Chrom(2*i-1,:)=chrom(2*i-1,:);#20#韶关学院学报#自然科学2007年Chrom (2*i :),=Chrom (2*i ,:)endend;变异:传统的遗传算法的基因变异概率很小,在遗传进化过程中,优势个体会越来越多,并在种群中占据大多数位置,到了后期,种群的个体极为相似,就会导致早熟收敛.为解决该弊端,当两个个体太相似时就进行变异操作:随机产生一个染色体替换当作比较的两个个体中的较差者.Function Chrom=popmut (Chrom,cost)for i =1:Popsize P 2sameidx=[Chrom (i *i -1==Chrom(2*i ,:)];dif fidx=find (sa meidx==0);if length (diffidx)<=2if c ost (2*i -1)<cost(2*i )for j =2:N citiesChrom (2*i ,j )=round (rand*(N cities -j ))+1;else f or j =2:N cities Chrom (2*i -1,j )=round (rand *(N cities -j ))+1;endend;4仿真试验以下以5个城市的非对称TSP 问题来说明上述算法的可行性.图1 G A 流程图G A 的流程图如下:M A TL AB 主程序:Popsize=10;Maxgen=20;N cities =5;P c =0.8;D=[061848;701737;44045;201924022;881660];W =[1:N cities ];Gen=0;Chrom=TSPinitialize (Popsize,N cities );Pop=T SPdecode (Popsiz e,N cities ,Chrom,W );Rpop=rotatepop (pop);Cost=TS Pcost (Popsize,pop,rpop);While gen<mazgenGen=gen+1;Chrom=select (Popsize,pfit,Chrom);Chrom=crossve (Chrom);pop=TSPdecode (Popsize,N cities ,Chrom,W )rpop=rotatepop (pop);cost=TSPc ost (Popsize,pop,rpop);Chrom=popmut (Chrom,cost,Popsize,N cities ,P c ,D ) 第6期温清芳:遗传算法求解TSP 问题的M A TL AB 实现 #21 ##22#韶关学院学报#自然科学2007年pop=TSPdecode(Popsize,N cities,Chrom,W);rpop=rotatepop(pop);cost=TSPc ost(Popsize,pop,rpop);[c ostmin,idx]=min(cost);tourmin=pop(idx,:);tourcost(gen)=costmin;disp([num2str(gen).minimum trip lengths=.num2str(costmin)];end;x=[1:M axgen];y=tourmin;plot(x,y)得到最优值为46,最优解为14325,在第2代就达到最优解.5结论本文提出一种基于TSP问题的改进的遗传算法,结合TSP问题的特点,采用一种受贪婪算法启发的新的交叉算子和变异算子,极大地提高了算法的收敛速度,同时又保证了最优解的得到,这种算法思想不仅可以用在TSP问题,还可以很好地应用于其他类似优化问题.参考文献:[1]肖磊,张阿卜,徐文进.用MA TL AB求解TSP问题的一种改进遗传算法[J].厦门理工学院学报,2005,13(4):38-42.[2]陈国梁,王煦法,庄镇泉,等.遗传算法及其应用[M].北京:人民邮电出版社,1996:137-139.[3]Fo gel D B.Applying evolutionary pro gramming to selected traveling salesman problems[J].Cy bernetics and systems,1993,24:27-36.[4]邢桂华.用MA TL AB实现中国旅行商问题的求解[J].微计算机应用,2004(2):218-222.[5]Grefenstette J.Genetic algori thms for the trav eling salesman problem in:proc.of1int.couf.o n genetic algori thms and their applicatio ns[J].L aw rence erlbaun associatio n,1985,23:166-168.Realization of MATLAB on resolving the traveling salesmanproblem by virtue of genetic algorithmsWEN Qing2fang(College of Porcelain Vocation Technology,D ehua362500,Fujian,China)Abstract:This paper has resolved the traveling salesman problem(TSP)by virtue of genetic algorithms(G A),all im2 proved G A is suggested which gives the M A TL AB program its crossover operator and mutation operator.It also solved the question of many G As on searching TSP proble m and gives the relative codes in M A TL AB6.5.Finally,numerical simu2 lations of non-symmetric five-city TSP establish the ef ficiency of the procedure in this paper.Test sho ws that the im2 proved G A has better performance than the traditional G A on the convergence speed and the fitness value.The improved G A obtains a better result.TSP proble m is a typical problem to which Genetic Algorithm can be successfully used. Key words:traveling salesman problem;genetic algorithms;G refenstettet codes;M A TL AB progra m(责任编辑:王桂珍)。
遗传算法编程求解TSP问题
遗传算法编程求解TSP问题摘要本文利用基本遗传算法的思路寻找双峰或多峰函数的最大值,选择仍然采用轮盘选择方法;交叉算法采用一个启发式交叉算法,交叉位置随机,该算法以一定的概率生成一个比父代好的解,交叉概率取0.1;变异概率0.005。
经多次运行,求得最优值。
停止法则为循环最大遗传代数为止,另外如果30代解没有改进则停止。
的编程环境为Matlab6.5。
关键字遗传算法TSP遗传算法是一种通用性非常强,计算性能非常好的算法,解决TSP问题却存在很多问题,主要问题是解的可行性问题,在交叉,变异操作过程中,可能产生不可行的解,因此交叉和变异算子的设计是本程序的关键。
本程序中交叉算子采用一个启发式交叉算法,该算法以一定概率计算出一个比父代好的子代算法思路:设父代F1:10 4 3 2 9 7 8 1 5 6 F2:9 1 3 5 2 6 7 8 4 10 。
随机确定交叉点,如4。
查找F1中第四位为2。
将F1向左旋转3位,使第四位在成为第一位,得到F1:2 9 7 8 1 5 6 10 4 3。
在F2中找到2所在位置,进行类似旋转,使2成为第一位,得到F2:2 6 7 8 4 10 9 1 3 5。
然后比较两个模式中第一位与第二位的距离:disance(2-9),disance(2-6),取比较小的如2-6所在父代F2不变,另外一个为,将F1进行旋转操作,使6在第2位,得到F2::2 6 10 4 3 9 7 8 1 5。
这样就形成了2 6 *********的模式,如此往复,直到最后一位。
另外将这个交叉算子的效率和普通单点交叉算子的效率进行了比较,发现该方法确实使得算法搜索能力增强。
最短路径为: 244最优解为: 4 8 7 1 9 5 3 10 2 6代数:76该问题采用禁忌搜索算法得到的最优解为229。
可见遗传算法虽然是很好的方法,但是如果设计不好则不一定能够收敛到全局最优值,有文章也表明简单遗传算法是不收敛的。
MPST问题MATLAB程序
基于遗传算法的TSP算法matlab代码主程序:clc;clear all;close all;global x yx=[0 3 1 5 4 0 3 7 9 10 14 17 14 12 10 19 2 6 11 15 7 22 21 27 15 15 20 21 24 25 28];y=[0 2 5 4 7 8 11 9 6 2 0 3 6 9 12 9 16 18 17 12 14 5 0 9 19 14 17 13 20 16 18];a=[8 8.2 6 5.5 3 4.5 7.2 2.3 1.4 6.5 4.1 12.7 5.8 3.8 3.4 3.5 5.8 7.5 7.8 4.6 6.2 6.8 2.4 7.6 9.6 10 12 6 8.1 4.2];h=0:30;t=31+1; %送货点数s=1500; %初始中群数G=500; %最大迭代次数c=25; %一次选取25个样本pc=0.80; %交配率pm=0.01; %变异率pop=zeros(s,t);for i=1:spop(i,1:t-1)=randperm(t-1); %初始化种群endfor k=1:1:G %GA开始¼if mod(k,50)==1kendpop=distance1(pop); %调用距离函数pop=select(pop,c); %调用选择函数p1=rand;if p1>=pcpop=cross(pop); %调用交配函数endp2=rand;if p2>=pmpop=mutate(pop); %调用变异函数endend%GA结束%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%bestL=min(pop(:,t))J=pop(:,t);fi=1./J;[Oderfi,Indexfi]=sort(fi); %对fi进行排序BestS=pop(Indexfi(s),:); %得到最短路径I=BestS;for i=1:1:t-1x1(i)=x(I(i));y1(i)=y(I(i));endx1(t)=x(I(1));y1(t)=y(I(1));cities_new=[x1;y1];disp('Best Route is:');disp(cities_new);pos=[cities_new cities_new(:,1)];lentemp=0;for i=1:1:t-1temp=(abs(pos(1,i)-pos(1,i+1))+abs(pos(2,i)-pos(2,i+1))); lentemp=lentemp+temp;enddisp('Shortest Length is:');disp(lentemp);plot(x1,y1,'-or');xlabel('X axis'), ylabel('Y axis'), title('最短路径');axis([0,1,0,1]);axis([0,30,0,20]);axis on距离函数matlab代码:function [pop]=distance1(pop)global x y[s,t]=size(pop);for i=1:1:sdd=0;pos=pop(i,1:t-1);pos=[pos pos(:,1)];for j=1:1:t-1m=pos(j);n=pos(j+1);dd=dd+(abs(x(m)-x(n))+abs(y(m)-y(n)));endpop(i,t)=dd;end选择函数matlab代码:function [pop]=select(pop,c)[s,t]=size(pop);m11=(pop(:,t));m11=m11';mmax=zeros(1,c);mmin=zeros(1,c);num=1;while num<c+1 %取距离大的C个样本[a,mmax(num)]=max(m11);m11(mmax(num))=0;num=num+1;endnum=1;while num<c+1 %取距离小的C个样本[b,mmin(num)]=min(m11);m11(mmin(num))=a;num=num+1;endfor i=1:cpop(mmax(i),:)=pop(mmin(i),:);end交配函数matlab代码:function [pop]=cross(pop)[s,t]=size(pop);pop_1=pop;n=randperm(s); %将种群随机排序for i=1:2:s%随机选择两个交叉点m=randperm(t-3)+1;crosspoint(1)=min(m(1),m(2));crosspoint(2)=max(m(1),m(2));%任意两行交叉x1=n(i);x2=n(i+1);%将X1左边与X2的左边互换middle=pop(x1,1:crosspoint(1));pop(x1,1:crosspoint(1))=pop(x2,1:crosspoint(1));pop(x2,1:crosspoint(1))=middle;%将X1右边与X2的右边互换middle=pop(x1,crosspoint(2)+1:t);pop(x1,crosspoint(2)+1:t)=pop(x2,crosspoint(2)+1:t);pop(x2,crosspoint(2)+1:t)=middle;for j=1:crosspoint(1)while find(pop(x1,crosspoint(1)+1:crosspoint(2))==pop(x1,j)) zhi=find(pop(x1,crosspoint(1)+1:crosspoint(2))==pop(x1,j)); temp=pop(x2,crosspoint(1)+zhi);pop(x1,j)=temp;endendfor j=crosspoint(2)+1:t-1while find(pop(x1,crosspoint(1)+1:crosspoint(2))==pop(x1,j)) zhi=find(pop(x1,crosspoint(1)+1:crosspoint(2))==pop(x1,j)); temp=pop(x2,crosspoint(1)+zhi);pop(x1,j)=temp;endendfor j=1:crosspoint(1)while find(pop(x2,crosspoint(1)+1:crosspoint(2))==pop(x2,j)) zhi=find(pop(x2,crosspoint(1)+1:crosspoint(2))==pop(x2,j));temp=pop(x1,crosspoint(1)+zhi);pop(x2,j)=temp;endendfor j=crosspoint(2)+1:t-1while find(pop(x2,crosspoint(1)+1:crosspoint(2))==pop(x2,j)) zhi=find(pop(x2,crosspoint(1)+1:crosspoint(2))==pop(x2,j)); temp=pop(x1,crosspoint(1)+zhi);pop(x2,j)=temp;endendend%生成新的种群与交叉前相比较[pop]=distance1(pop);for i=1:sif pop_1(i,t)<pop(i,t)pop(i,:)=pop_1(i,:);endend变异函数matlab代码:function [pop]=mutate(pop)[s,t]=size(pop);pop_1=pop;for i=1:2:sm=randperm(t-3)+1;%随机选取两个点mutatepoint(1)=min(m(1),m(2));mutatepoint(2)=max(m(1),m(2));%用倒置变异的方法倒置两个点中间部分的位置mutate=round((mutatepoint(2)-mutatepoint(1))/2-0.5);for j=1:mutatezhong=pop(i,mutatepoint(1)+j);pop(i,mutatepoint(1)+j)=pop(i,mutatepoint(2)-j);pop(i,mutatepoint(2)-j)=zhong;endend[pop]=distance1(pop);for i=1:sif pop_1(i,t)<pop(i,t)pop(i,:)=pop_1(i,:);endend附录二:遗传算法MTSP matlab代码程序一:function varargout =mtspf_ga(xy,dmat,salesmen,min_tour,pop_size,num_iter,show_prog,show_res)%xy 各个送货点坐标%dmat 送货点之间距离%salesmen 路径数%min_tour 派送员最少到底派送点数%pop_size 种群个体数%num_iter 迭代代数%show_prog,show_res 显示参数设定a=[0 8 8.2 6 5.5 3 4.5 7.2 2.3 1.4 6.5 4.1 12.7 5.8 3.8 3.4 3.5 5.8 7.5 7.8 4.6 6.2 6.8 2.4 7.6 9.6 10 12 6 8.1 4.2];[nr,nc] = size(dmat);if nr ~= ncerror('Invalid XY or DMAT inputs!')endn = nr - 1; %送货点数% 输入参数检查salesmen = max(1,min(n,round(real(salesmen(1)))));min_tour = max(1,min(floor(n/salesmen),round(real(min_tour(1))))); pop_size = max(8,8*ceil(pop_size(1)/8));num_iter = max(1,round(real(num_iter(1))));show_prog = logical(show_prog(1));show_res = logical(show_res(1));% 初始化路线,断点num_brks = salesmen-1;dof = n - min_tour*salesmen;addto = ones(1,dof+1);for k = 2:num_brksaddto = cumsum(addto);endcum_prob = cumsum(addto)/sum(addto);%初始化种群pop_rte = zeros(pop_size,n); % 路径集合的种群pop_brk = zeros(pop_size,num_brks); % 断点集合的种群for k = 1:pop_sizepop_rte(k,:) = randperm(n)+1;pop_brk(k,:) = randbreaks();endclr = [1 0 0; 0 0 1; 0.67 0 1; 0 1 0; 1 0.5 0];if salesmen > 5clr = hsv(salesmen);end% 开始遗传算法global_min = Inf; %初始化最短路径total_dist = zeros(1,pop_size);dist_history = zeros(1,num_iter);tmp_pop_rte = zeros(8,n); %当前的路径设置tmp_pop_brk = zeros(8,num_brks); %当前的断点设置new_pop_rte = zeros(pop_size,n); %更新的路径设置new_pop_brk = zeros(pop_size,num_brks);%更新的断点设置if show_progpfig = figure('Name','MTSPF_GA | Current Best Solution','Numbertitle','off');endfor iter = 1:num_iter%评价每一代的种群适应情况并作出选择for p = 1:pop_sizep_rte = pop_rte(p,:);p_brk = pop_brk(p,:);rng = [[1 p_brk+1];[p_brk n]]';w=0;for s = 1:salesmenh=0;d=0;d = d + dmat(1,p_rte(rng(s,1)));w = w + dmat(1,p_rte(rng(s,1)))*a(p_rte(rng(s,1)))*3; % 添加初始路径for k = rng(s,1):rng(s,2)-1d = d + dmat(p_rte(k),p_rte(k+1));w = w + d*a(p_rte(k+1))*3;h = h + a(p_rte(1+k));endh = h + a(p_rte(k+1));d = d + (dmat(p_rte(rng(s,2)),1));w = w + (dmat(p_rte(rng(s,2)),1))*2; % 添加结束路径if h>25w=inf;endendtotal_dist(p) = w;end% 在每代种群中找到最好路径[min_dist,index] = min(total_dist);dist_history(iter) = min_dist;if min_dist < global_minglobal_min = min_dist;opt_rte = pop_rte(index,:);opt_brk = pop_brk(index,:);rng = [[1 opt_brk+1];[opt_brk n]]';if show_prog% Plot the Best Routefigure(pfig);for s = 1:salesmenrte = [1 opt_rte(rng(s,1):rng(s,2)) 1];plot(xy(rte,1),xy(rte,2),'.-','Color',clr(s,:));title(sprintf('Total Distance = %1.4f, Iteration = %d',min_dist,iter));hold onendplot(xy(1,1),xy(1,2),'ko');hold offendend% 遗传算法操作集合rand_grouping = randperm(pop_size);for p = 8:8:pop_sizertes = pop_rte(rand_grouping(p-7:p),:);brks = pop_brk(rand_grouping(p-7:p),:);dists = total_dist(rand_grouping(p-7:p));[ignore,idx] = min(dists);best_of_8_rte = rtes(idx,:);best_of_8_brk = brks(idx,:);rte_ins_pts = sort(ceil(n*rand(1,2)));I = rte_ins_pts(1);J = rte_ins_pts(2);for k = 1:8 %产生新方案tmp_pop_rte(k,:) = best_of_8_rte;tmp_pop_brk(k,:) = best_of_8_brk;switch kcase 2 % 倒置操作tmp_pop_rte(k,I:J) = fliplr(tmp_pop_rte(k,I:J));case 3 % 互换操作tmp_pop_rte(k,[I J]) = tmp_pop_rte(k,[J I]);case 4 % 滑动平移操作tmp_pop_rte(k,I:J) = tmp_pop_rte(k,[I+1:J I]);case 5 % 更新断点tmp_pop_brk(k,:) = randbreaks();case 6 % 倒置并更新断点tmp_pop_rte(k,I:J) = fliplr(tmp_pop_rte(k,I:J)); tmp_pop_brk(k,:) = randbreaks();case 7 % 互换并更新断点tmp_pop_rte(k,[I J]) = tmp_pop_rte(k,[J I]);tmp_pop_brk(k,:) = randbreaks();case 8 % 评议并更新断点tmp_pop_rte(k,I:J) = tmp_pop_rte(k,[I+1:J I]); tmp_pop_brk(k,:) = randbreaks();otherwiseendendnew_pop_rte(p-7:p,:) = tmp_pop_rte; new_pop_brk(p-7:p,:) = tmp_pop_brk;endpop_rte = new_pop_rte;pop_brk = new_pop_brk;end% 返回结果rng = [[1 opt_brk+1];[opt_brk n]]';dis_e=zeros(1,salesmen);for s = 1:salesmendis_e(s)=myLength(dmat,opt_rte(rng(s,1):rng(s,2)));endif nargoutvarargout{1} = opt_rte;varargout{2} = opt_brk;varargout{3} = min_dist;varargout{4} = dis_e;endif show_res% Plotsfigure('Name','MTSPF_GA | Results','Numbertitle','off');subplot(2,2,1);plot(xy(:,1),xy(:,2),'k.');title('City Locations');subplot(2,2,2);imagesc(dmat([1 opt_rte],[1 opt_rte]));title('Distance Matrix');subplot(2,2,3);rng = [[1 opt_brk+1];[opt_brk n]]';for s = 1:salesmenrte = [1 opt_rte(rng(s,1):rng(s,2)) 1];plot(xy(rte,1),xy(rte,2),'.-','Color',clr(s,:));title(sprintf('Total Distance = %1.4f',min_dist));hold on;endplot(xy(1,1),xy(1,2),'ko');subplot(2,2,4);plot(dist_history,'b','LineWidth',2);title('Best Solution History');set(gca,'XLim',[0 num_iter+1],'YLim',[0 1.1*max([1 dist_history])]); end% 随机产生一套断点的集合function breaks = randbreaks()if min_tour == 1 %一个旅行商时没有设置断点tmp_brks = randperm(n-1);breaks = sort(tmp_brks(1:num_brks));else% 强制断点至少找到最短路径的长度num_adjust = find(rand < cum_prob,1)-1;spaces = ceil(num_brks*rand(1,num_adjust));adjust = zeros(1,num_brks);for kk = 1:num_brksadjust(kk) = sum(spaces == kk);endbreaks = min_tour*(1:num_brks) + cumsum(adjust);endendend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% bestL=min(pop(:,t))J=pop(:,t);fi=1./J;[Oderfi,Indexfi]=sort(fi);BestS=pop(Indexfi(s),:);I=BestS;for i=1:1:t-1x1(i)=x(I(i));y1(i)=y(I(i));endx1(t)=x(I(1));y1(t)=y(I(1));cities_new=[x1;y1];disp('Best Route is:');disp(cities_new);pos=[cities_new cities_new(:,1)];lentemp=0;for i=1:1:t-1temp=(abs(pos(1,i)-pos(1,i+1))+abs(pos(2,i)-pos(2,i+1)));lentemp=lentemp+temp;enddisp('Shortest Length is:');disp(lentemp);plot(x1,y1,'-or');xlabel('X axis'), ylabel('Y axis'), title('×î¶ÌµÄ·¾¶');axis([0,1,0,1]);axis([0,30,0,20]);axis on程序:二:x=[0 3 1 5 4 0 3 7 9 10 14 17 14 12 10 19 2 6 11 15 7 22 21 27 15 15 20 21 24 25 28];y=[0 2 5 4 7 8 11 9 6 2 0 3 6 9 12 9 16 18 17 12 14 5 0 9 19 14 17 13 20 16 18];a=[0 8 8.2 6 5.5 3 4.5 7.2 2.3 1.4 6.5 4.1 12.7 5.8 3.8 3.4 3.5 5.8 7.5 7.8 4.6 6.2 6.8 2.4 7.6 9.6 10 12 6 8.1 4.2];[m,n]=size(x);x=x';y=y';xy=[x y];salesmen = 9;min_tour = 8;pop_size = 80;num_iter = 5e3;suma=sum(a);for i=1:nfor j=1:ndmat(i,j) = abs(x(i)-x(j))+abs(y(i)-y(j));endend[opt_rte,opt_brk,min_dist] = mtspf_ga(xy,dmat,salesmen,min_tour,pop_size,num_iter,1,1) [m1,n1]=size(opt_brk);for i=1:n1-1z=0;for j=opt_brk(i):opt_brk(i+1)z=z+a(opt_rte(j+1));endzend以点0表示旅行商的出发城市,称为源点,点1,2,,l表示m个旅行商需访问的城市。
遗传算法及其MATLAB程序代码
遗传算法及其MATLAB程序代码遗传算法及其MATLAB实现主要参考书:MATLAB 6.5 辅助优化计算与设计飞思科技产品研发中⼼编著电⼦⼯业出版社2003.1遗传算法及其应⽤陈国良等编著⼈民邮电出版社1996.6主要内容:遗传算法简介遗传算法的MATLAB实现应⽤举例在⼯业⼯程中,许多最优化问题性质⼗分复杂,很难⽤传统的优化⽅法来求解.⾃1960年以来,⼈们对求解这类难解问题⽇益增加.⼀种模仿⽣物⾃然进化过程的、被称为“进化算法(evolutionary algorithm)”的随机优化技术在解这类优化难题中显⽰了优于传统优化算法的性能。
⽬前,进化算法主要包括三个研究领域:遗传算法、进化规划和进化策略。
其中遗传算法是迄今为⽌进化算法中应⽤最多、⽐较成熟、⼴为⼈知的算法。
⼀、遗传算法简介遗传算法(Genetic Algorithm, GA)最先是由美国Mic-hgan⼤学的John Holland于1975年提出的。
遗传算法是模拟达尔⽂的遗传选择和⾃然淘汰的⽣物进化过程的计算模型。
它的思想源于⽣物遗传学和适者⽣存的⾃然规律,是具有“⽣存+检测”的迭代过程的搜索算法。
遗传算法以⼀种群体中的所有个体为对象,并利⽤随机化技术指导对⼀个被编码的参数空间进⾏⾼效搜索。
其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定等5个要素组成了遗传算法的核⼼内容。
遗传算法的基本步骤:遗传算法是⼀种基于⽣物⾃然选择与遗传机理的随机搜索算法,与传统搜索算法不同,遗传算法从⼀组随机产⽣的称为“种群(Population)”的初始解开始搜索过程。
种群中的每个个体是问题的⼀个解,称为“染⾊体(chromos ome)”。
染⾊体是⼀串符号,⽐如⼀个⼆进制字符串。
这些染⾊体在后续迭代中不断进化,称为遗传。
在每⼀代中⽤“适值(fitness)”来测量染⾊体的好坏,⽣成的下⼀代染⾊体称为后代(offspring)。
现代优化计算方法研究报告——遗传算法解决TSP问题
现代优化计算方法研究报告——遗传算法解决TSP问题授课老师:专业:学号:姓名:摘要旅行商问题(TSP)是典型的NP完全问题,遗传算法是解决NP完全问题的一种常用算法。
本文首先简要介绍了TSP问题和遗传算法,然后用遗传算法对TSP问题进行了求解,并在MATLAB上进行了编程实现。
最后探讨了遗传算法解决TSP问题的一些特点。
关键词:TSP问题;遗传算法;MATLAB目录摘要 (2)目录 (3)1 旅行商问题 (4)1.1 旅行商问题简介 (4)1.2 TSP的数学描述 (4)2 遗传算法 (4)2.1 遗传算法简介 (4)2.2 遗传算法的步骤 (5)3 遗传算法求解TSP问题 (5)3.1 初始群体和适应度函数 (6)3.2 城市的位置和城市间的距离 (6)3.3 交叉和变异 (6)3.4 种群的更新和迭代终止条件 (6)4 MATLAB仿真以及运行结果 (7)5 总结 (7)附件——MATLAB程序代码 (8)1 旅行商问题1.1 旅行商问题简介旅行商问题(traveling salesman problem,TSP )是一个有名的、典型的、易于描述却难以求解的组合优化问题。
TSP 已被证明具有NPC 计算复杂性,并且许多实际问题都可以转化为TSP 。
它是一个具有广泛的实用背景和重要的理论价值的组合优化难题。
1.2 TSP 的数学描述一个商人欲到n 个城市推销商品,每两个城市i 和j 之间的距离为ij d ,如何选择一条道路使得商人每个城市走一遍后回到起点且所走路径最短? TSP 可以细分为对称和非对称距离两大类问题。
当j i d d ji ij ,,∀=时,称为对称距离TSP ,否则为飞对称距离TSP 。
对于一般的TSP ,一种数学模型描述为∑≠ji ij ij x d min (1-1)∑===n j ij n i xt s 1,,2,1,1.. (1-2) ∑===ni ij n j x1,,2,1,1 (1-3) ∑∈⊂-≤≤-≤S j i ij n S n S S x ,},,2,1{,2||2,1|| (1-4)j i n j i x ij ≠=∈,,,1,},1,0{ (1-5)以上是基于图论的数学模型,其中式(1-5)中的决策变量1=ij x 表示商人行走的路线包含从城市i 到城市j 的路径,0=ij x 表示商人没有选择走这条路。
TSP问题遗传算法matlab源程序
TSP问题遗传算法matlab源程序%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);%用于存储种群for i=1:nfarm(i,:)=randperm(N);%随机生成初始种群endR=farm(1,:);%存储最优种群len=zeros(n,1);%存储路径长度fitness=zeros(n,1);%存储归一化适应值counter=0;while counter<cfor i=1:nlen(i,1)=myLength(D,farm(i,:));%计算路径长度endmaxlen=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;for i=1:nif fitness(i,1)>=alpha*randnn=nn+1;FARM(nn,:)=farm(i,:);endendFARM=FARM(1:nn,:);[aa,bb]=size(FARM);%交叉和变异while aa<nif nn<=2----------------------------精品word文档值得下载值得拥有----------------------------------------------nnper=randperm(2);elsennper=randperm(nn);endA=FARM(nnper(1),:);B=FARM(nnper(2),:);[A,B]=intercross(A,B);FARM=[FARM;A;B];[aa,bb]=size(FARM);endif aa>nFARM=FARM(1:n,:);%保持种群规模为nendfarm=FARM;clear FARMcounter=counter+1endRlength=myLength(D,R);function [a,b]=intercross(a,b)L=length(a);if L<=10%确定交叉宽度W=1;elseif ((L/10)-floor(L/10))>=rand&&L>10W=ceil(L/10);elseW=floor(L/10);endp=unidrnd(L-W+1);%随机选择交叉范围,从p到p+Wfor i=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));endfunction [x,y]=exchange(x,y)temp=x;x=y;y=temp;% 计算路径的子程序----------------------------精品word文档值得下载值得拥有----------------------------------------------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%计算归一化适应值子程序function fitness=fit(len,m,maxlen,minlen)fitness=len;for i=1:length(len)fitness(i,1)=(1-((len(i,1)-minlen)/(maxlen-minlen+0.000001))).^m;end她含着笑,切着冰屑悉索的萝卜,她含着笑,用手掏着猪吃的麦糟,她含着笑,扇着炖肉的炉子的火,她含着笑,背了团箕到广场上去晒好那些大豆和小麦,大堰河,为了生活,在她流尽了她的乳液之后,她就用抱过我的两臂,劳动了。
遗传算法解决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);%用于存储种群for i=1:nfarm(i,:)=randperm(N);%随机生成初始种群endR=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;while counter for i=1:nlen(i,1)=myLength(D,farm(i,:));%计算路径长度endmaxlen=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;for i=1:nif fitness(i,1)>=alpha*randnn=nn+1;FARM(nn,:)=farm(i,:);endendFARM=FARM(1:nn,:);[aa,bb]=size(FARM);%交叉和变异while aa if nn<=2nnper=randperm(2);elsennper=randperm(nn);endA=FARM(nnper(1),:);B=FARM(nnper(2),:);[A,B]=intercross(A,B);FARM=[FARM;A;B];[aa,bb]=size(FARM);endif aa>nFARM=FARM(1:n,:);%保持种群规模为nendfarm=FARM;clear FARMcounter=counter+1endRlength=myLength(D,R);subplot(1,3,3)plotaiwa(a,R)程序二:计算邻接矩阵%输入参数a是中国31个城市的坐标%输出参数D是无向图的赋权邻接矩阵function D=ff01(a)[c,d]=size(a);D=zeros(c,c);for i=1:cfor j=i:cbb=(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);endend程序三:计算归一化适应值%计算归一化适应值的子程序function fitness=fit(len,m,maxlen,minlen)fitness=len;for i=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);if L<=10%确定交叉宽度W=9;elseif ((L/10)-floor(L/10))>=rand&&L>10W=ceil(L/10)+8;elseW=floor(L/10)+8;endp=unidrnd(L-W+1);%随机选择交叉范围,从p到p+Wfor i=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));endfunction [x,y]=exchange(x,y)temp=x;x=y;y=temp;程序五: 计算路径的子程序%该路径长度是一个闭合的路径的长度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程序六:用于绘制路径示意图的程序function plotaiwa(a,R)scatter(a(:,1),a(:,2),'x')hold onplot([a(R(1),1),a(R(31),1)],[a(R(1),2),a(R(31),2)])hold onfor 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 onend。
遗传算法求解TSP问题MATLAB实现-精品
遗传算法求解TSP 问题MATLAB 实现摘要:旅行商问题(TSP )是一个经典的优化组合问题,本文采用遗传算法来求解TSP 问题,深入讨论了遗传算法解决TSP 问题的求解过程,并通过MATLAB 对算法进行了实现,最后对实验结果进行分析,并与粒子群算法进行对比和分析。
关键字:TSP ;遗传算法;粒子群算法0.引言旅行商问题是一个经典的优化组合问题,它可以扩展到很多问题,如电路布线、输油管路铺设等,但是,由于TSP 问题的可行解数目与城市数目N 是成指数型增长的,是一个NP 难问题,因而一般只能近似求解,遗传算法(GA )是求解该问题的较有效的方法之一,当然还有如粒子群算法,蚁群算法,神经网络算法等优化算法也可以进行求解。
遗传算法是美国学者Holland 根据自然界“物竞天择,适者生存”现象而提出的一种随机搜索算法,本文采用MATLAB 来实现遗传算法解决TSP 问题。
1.旅行商问题旅行商问题可以具体描述为:已知n 个城市之间的相互距离,现有一个推销员从某一个城市出发,必须遍访这n 个城市,并且每个城市只能访问一次,最后又必须返回到出发城市,如何安排他对这些城市的访问次序,可使其旅行路线的总长度最短。
用图论术语来表示,就是有一个图g=(v,e),其中v 是定点5,e 是边集,设d=(dij)是有顶点i 和顶点j 之间的距离所组成的距离矩阵,旅行商问题就是求出一条通过所有顶点且每个顶点只通过一次的最短距离的回路。
若对与城市v={v1,v2,v3…vn}的一个访问顺序为t=(t1,t2,t3…,tn),其中ti ∈v(i=1,2,..n),且记tn+1=t1,则旅行上问题的数学模型为式1:min ((),(1))(1,....,)I d t i t i i n δ =+ = (1)2.遗传算法与粒子群算法2.1遗传算法遗传算法的基本原理是通过作用于染色体上的基因寻找好的染色体来求解问题,它需要对算法所产生的每个染色体进行评价,并基于适应度值来选择染色体,使适应性好的染色体有更多的繁殖机会,在遗传算法中,通过随机方式产生若干个所求解问题的数字编码,即染色体,形成初始种群;通过适应度函数给每个个体一个数值评价,淘汰低适应度的个体,选择高适应度的个体参加遗传操作,经过遗产操作后的个体集合形成下一代新的种群,对这个新的种群进行下一轮的进化。
基于遗传算法解决TSP问题
基于遗传算法解决TSP问题摘要题目要求给出环游全国全部省会的最短路径方案,是传统的TSP问题,本文将图表数据数字化后,将其转变成为线性规划问题,进而采取遗传算法用Matlab 求解出理论上的最短路径与路线图。
通过第一问求出的路线顺序结合实际情况求解出实际情况下的最短路径与最短时间。
针对第一问,首先建立基本TSP模型,求出其线性规划方程组,用Matlab 对地图做出基本处理,求出其像素坐标的矩阵。
将省会城市初始化为种群数据,用遗传算法求解出模型最优解,即最短路径大小与旅游城市顺序。
针对第二问,由于遗传算法求出的是近似最优解,以及实际道路情况不可能是直线距离,所以理论数据与实际有一定差别。
将旅行顺序求解出后,需要根据实际道路情况重新求解出最短路径大小,并根据题目所给条件求解出最短时间。
根据实际情况,求得最后的最短路径长度为20402.9公里,时间为45天。
题目中给出城市转化为图集,一共有33个顶点,数据较大,用Dijkstra算法和Floyd算法虽然答案可能更精确,但数据处理量大,时间复杂度高。
采用遗传算法可以得到近似最优解,并且精简了时间复杂度。
关键词:最短路径TSP冋题线性规划遗传算法一、问题重述如果从杭州出发,要想开车走遍全国所有的省会城市,而且在到了每个省会城市以后都必须住一晚,第二天早上才能出发,安全起见每天开车时间最多在8小时左右,车速视实际路况而定,一般高速公路可以取平均车速100公里/小时左右,不是高速公路平均车速取60公里/小时左右,从杭州出发要走遍所有省会城市以后回到杭州,开车里程最少需要多少公里?最少需要多少时间?(暂不考虑台湾省)二、问题分析题目要求求出最短路径与时间是典型的TSP问题,即要用最短的总路径走遍所有城市,此处需要设立一个二元组(V(G), E(G)),并且求出一个点的邻接矩阵。
根据经典的TSP模型,得出一般的线性规划方程组。
解TSP模型的一般算法有Dijkstra 算法和Floyd算法,由于TSP问题是典型的NP难题,其可能路径数目与城市总数目n是呈指数型增长,并不适合用以上两种算法。
遗传算法解决TSP问题的matlab程序
1.遗传算法解决TSP 问题(附matlab源程序)2.知n个城市之间的相互距离,现有一个推销员必须遍访这n个城市,并且每个城市3.只能访问一次,最后又必须返回出发城市。
如何安排他对这些城市的访问次序,可使其4.旅行路线的总长度最短?5.用图论的术语来说,假设有一个图g=(v,e),其中v是顶点集,e是边集,设d=(dij)6.是由顶点i和顶点j之间的距离所组成的距离矩阵,旅行商问题就是求出一条通过所有顶7.点且每个顶点只通过一次的具有最短距离的回路。
8.这个问题可分为对称旅行商问题(dij=dji,,任意i,j=1,2,3,…,n)和非对称旅行商9.问题(dij≠dji,,任意i,j=1,2,3,…,n)。
10.若对于城市v={v1,v2,v3,…,vn}的一个访问顺序为t=(t1,t2,t3,…,ti,…,tn),其中11.ti∈v(i=1,2,3,…,n),且记tn+1= t1,则旅行商问题的数学模型为:12.min l=σd(t(i),t(i+1)) (i=1,…,n)13.旅行商问题是一个典型的组合优化问题,并且是一个np难问题,其可能的路径数目14.与城市数目n是成指数型增长的,所以一般很难精确地求出其最优解,本文采用遗传算法15.求其近似解。
16.遗传算法:17.初始化过程:用v1,v2,v3,…,vn代表所选n个城市。
定义整数pop-size作为染色体的个数18.,并且随机产生pop-size个初始染色体,每个染色体为1到18的整数组成的随机序列。
19.适应度f的计算:对种群中的每个染色体vi,计算其适应度,f=σd(t(i),t(i+1)).20.评价函数eval(vi):用来对种群中的每个染色体vi设定一个概率,以使该染色体被选中21.的可能性与其种群中其它染色体的适应性成比例,既通过轮盘赌,适应性强的染色体被22.选择产生后台的机会要大,设alpha∈(0,1),本文定义基于序的评价函数为eval(vi)=al23.pha*(1-alpha).^(i-1) 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序一:主程序
%TSP问题(又名:旅行商问题,货郎担问题)遗传算法通用matlab程序
%D是距离矩阵,n为种群个数
%参数a是中国31个城市的坐标
%C为停止代数,遗传到第 C代时程序停止,C的具体取值视问题的规模和耗费的时间而定%m为适应值归一化淘汰加速指数,最好取为1,2,3,4,不宜太大
%alpha为淘汰保护指数,可取为0~1之间任意小数,取1时关闭保护功能,建议取~之间的值%R为最短路径,Rlength为路径长度
function [R,Rlength]=geneticTSP(D,a,n,C,m,alpha)
[N,NN]=size(D);
farm=zeros(n,N);%用于存储种群
for i=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;
while counter for i=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;
for i=1:n
if fitness(i,1)>=alpha*rand
nn=nn+1;
FARM(nn,:)=farm(i,:);
end
end
FARM=FARM(1:nn,:);
[aa,bb]=size(FARM);%交叉和变异
while aa if nn<=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
if aa>n
FARM=FARM(1:n,:);%保持种群规模为n end
farm=FARM;
clear FARM
counter=counter+1
end
Rlength=myLength(D,R);
subplot(1,3,3)
plotaiwa(a,R)
程序二:计算邻接矩阵
%输入参数a是中国31个城市的坐标
%输出参数D是无向图的赋权邻接矩阵
function D=ff01(a)
[c,d]=size(a);
D=zeros(c,c);
for i=1:c
for j=i:c
bb=(a(i,1)-a(j,1)).^2+(a(i,2)-a(j,2)).^2;
D(i,j)=bb^;
D(j,i)=D(i,j);
end
end
程序三:计算归一化适应值
%计算归一化适应值的子程序
function fitness=fit(len,m,maxlen,minlen)
fitness=len;
for i=1:length(len)
fitness(i,1)=(1-((len(i,1)-minlen)/(maxlen-minlen+)).^m;
end
程序四:交叉和变异的子程序
%交叉算法采用的是由Goldberg和Lingle于1985年提出的PMX(部分匹配交叉) function [a,b]=intercross(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
for i=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;
程序五: 计算路径的子程序
%该路径长度是一个闭合的路径的长度
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
程序六:用于绘制路径示意图的程序
function plotaiwa(a,R)
scatter(a(:,1),a(:,2),'x')
hold on
plot([a(R(1),1),a(R(31),1)],[a(R(1),2),a(R(31),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。