基于Matlab的遗传算法解决TSP问题的报告

合集下载

实验六:遗传算法求解TSP问题实验2篇

实验六:遗传算法求解TSP问题实验2篇

实验六:遗传算法求解TSP问题实验2篇第一篇:遗传算法的原理与实现1. 引言旅行商问题(TSP问题)是一个典型的组合优化问题,它要求在给定一组城市和每对城市之间的距离后,找到一条路径,使得旅行商能够在所有城市中恰好访问一次并回到起点,并且总旅行距离最短。

遗传算法作为一种生物启发式算法,在解决TSP问题中具有一定的优势。

本实验将运用遗传算法求解TSP问题,以此来探讨和研究遗传算法在优化问题上的应用。

2. 遗传算法的基本原理遗传算法是模拟自然界生物进化过程的一种优化算法。

其基本原理可以概括为:选择、交叉和变异。

(1)选择:根据问题的目标函数,以适应度函数来评估个体的优劣程度,并按照适应度值进行选择,优秀的个体被保留下来用于下一代。

(2)交叉:从选出的个体中随机选择两个个体,进行基因的交换,以产生新的个体。

交叉算子的选择及实现方式会对算法效果产生很大的影响。

(3)变异:对新生成的个体进行基因的变异操作,以保证算法的搜索能够足够广泛、全面。

通过选择、交叉和变异操作,不断迭代生成新一代的个体,遗传算法能够逐步优化解,并最终找到问题的全局最优解。

3. 实验设计与实施(1)问题定义:给定一组城市和每对城市之间的距离数据,要求找到一条路径,访问所有城市一次并回到起点,使得旅行距离最短。

(2)数据集准备:选择适当规模的城市数据集,包括城市坐标和每对城市之间的距离,用于验证遗传算法的性能。

(3)遗传算法的实现:根据遗传算法的基本原理,设计相应的选择、交叉和变异操作,确定适应度函数的定义,以及选择和优化参数的设置。

(4)实验流程:a. 初始化种群:随机生成初始种群,每个个体表示一种解(路径)。

b. 计算适应度:根据适应度函数,计算每个个体的适应度值。

c. 选择操作:根据适应度值选择一定数量的个体,作为下一代的父代。

d. 交叉操作:对父代进行交叉操作,生成新的个体。

e. 变异操作:对新生成的个体进行变异操作,以增加搜索的多样性。

用matlab求解tsp问题的一种改进遗传算法

用matlab求解tsp问题的一种改进遗传算法

用matlab求解tsp问题的一种改
进遗传算法
1.遗传算法:
遗传算法是一种仿生算法,它是根据自然进化规律模拟的进化过程,是一种基于群体智能的搜索方法。

主要包括了四个步骤:初始化、选择、交叉和变异。

2.Matlab求解TSP问题的一种改进遗传算法:
(1)首先,利用matlab的rand函数随机产生多条可行路径,作为遗传算法的初始种群;
(2)然后,对初始种群中的每条路径,计算其适应度函数,也就是路径的总距离,并将它们排序;
(3)接着,使用改进的轮盘赌算法,在当前种群中选择适应度较高的个体,作为新一代种群;
(4)然后,对新一代种群中的每条路径进行交叉运算,产生新的路径;
(5)最后,以一定的概率对新产生的路径进行变异,将变异后的路径加入到新一代种群中,重复上述步骤,直到满足停止条件,便可找到最优解。

基于某遗传算法解决TSP问题

基于某遗传算法解决TSP问题

基于遗传算法解决TSP问题摘要题目要求给出环游全国全部省会的最短路径方案,是传统的TSP问题,本文将图表数据数字化后,将其转变成为线性规划问题,进而采取遗传算法用Matlab求解出理论上的最短路径与路线图。

通过第一问求出的路线顺序结合实际情况求解出实际情况下的最短路径与最短时间。

针对第一问,首先建立基本TSP模型,求出其线性规划方程组,用Matlab 对地图做出基本处理,求出其像素坐标的矩阵。

将省会城市初始化为种群数据,用遗传算法求解出模型最优解,即最短路径大小与旅游城市顺序。

针对第二问,由于遗传算法求出的是近似最优解,以及实际道路情况不可能是直线距离,所以理论数据与实际有一定差别。

将旅行顺序求解出后,需要根据实际道路情况重新求解出最短路径大小,并根据题目所给条件求解出最短时间。

根据实际情况,求得最后的最短路径长度为20402.9公里,时间为45天。

题目中给出城市转化为图集,一共有33个顶点,数据较大,用Dijkstra 算法和Floyd算法虽然答案可能更精确,但数据处理量大,时间复杂度高。

采用遗传算法可以得到近似最优解,并且精简了时间复杂度。

关键词:最短路径 TSP问题线性规划遗传算法一、问题重述如果从出发,要想开车走遍全国所有的省会城市,而且在到了每个省会城市以后都必须住一晚,第二天早上才能出发,安全起见每天开车时间最多在8小时左右,车速视实际路况而定,一般高速公路可以取平均车速100公里/小时左右,不是高速公路平均车速取60公里/小时左右,从出发要走遍所有省会城市以后回到,开车里程最少需要多少公里?最少需要多少时间?(暂不考虑省)二、问题分析题目要求求出最短路径与时间是典型的TSP问题,即要用最短的总路径走遍所有城市,此处需要设立一个二元组))EV,并且求出一个点的邻接矩阵。

G(G(),(根据经典的TSP模型,得出一般的线性规划方程组。

解TSP模型的一般算法有Dijkstra算法和Floyd算法,由于TSP问题是典型的NP难题,其可能路径数目与城市总数目n是呈指数型增长,并不适合用以上两种算法。

用MATLAB求解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问题的MATLAB实现

遗传算法求解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(责任编辑:王桂珍)。

基于Matlab的遗传算法解决TSP问题的报告

基于Matlab的遗传算法解决TSP问题的报告

报告题目:基于Matlab的遗传算法解决TSP问题说明:该文包括了基于Matlab的遗传算法解决TSP问题的基本说明,并在文后附录了实现该算法的所有源代码。

此代码经过本人的运行,没有发现错误,结果比较接近理论最优值,虽然最优路径图有点交叉。

因为本人才疏学浅,本报告及源代码的编译耗费了本人较多的时间与精力,特收取下载积分,还请见谅。

若有什么问题,可以私信,我们共同探讨这一问题。

希望能对需要这方面的知识的人有所帮助!1.问题介绍旅行商问题(Traveling Salesman Problem,简称TSP)是一个经典的组合优化问题。

它可以描述为:一个商品推销员要去若干个城市推销商品,从一个城市出发,需要经过所有城市后,回到出发地,应如何选择行进路线,以使总行程最短。

从图论的角度看,该问题实质是在一个带权完全无向图中。

找一个权值最小的Hemilton回路。

其数学描述为:设有一个城市集合其中每对城市之间的距离(),i j d c c R +∈,求一对经过C中每个城市一次的路线()12,,n c c c ΠΠΠ⋯使()()()1111min ,,n i n i i d c c d c c −ΠΠΠΠ+=+∑其中()12,,12n n ΠΠΠ⋯⋯是,的一个置换。

2.遗传算法2.1遗传算法基本原理遗传算法是由美国J.Holland 教授于1975年在他的专著《自然界和人工系统的适应性》中首先提出的,它是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。

遗传算法模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。

遗传算法,在本质上是一种不依赖具体问题的直接搜索方法,是一种求解问题的高效并行全局搜索方法。

遗传算法在模式识别、神经网络、图像处理、机器学习、工业优化控制、自适应控制、负载平衡、电磁系统设计、生物科学、社会科学等方面都得到了应用。

遗传算法编程求解TSP问题

遗传算法编程求解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。

可见遗传算法虽然是很好的方法,但是如果设计不好则不一定能够收敛到全局最优值,有文章也表明简单遗传算法是不收敛的。

遗传算法求解TSP问题报告

遗传算法求解TSP问题报告

遗传算法求解TSP问题实验报告一、实验要求:以旅行商问题(TSP)为例做模拟进化搜索技术实验,并提交实验研究报告。

二、实验思路:bool fnCreateRandomGene(); //产生随机基因bool fnGeneAberrance(); //基因变异bool fnGeneMix(); //基因交叉产生新的个体测试并淘汰适应度低的个体bool fnEvalAll(); //测试所有基因的适应度int fnEvalOne(T &Gene); //测试某一个基因的适应度void Crossover( int nFatherA, int nFatherB);void fnDispProbability(); //显示每个个体的权值Crossover()——两染色体的交叉实现输入参数:1、nFatherA 父染色体A2、nFatherB 父染色体B3、nMode 交叉方式返回值:空注:现有交叉方式1、常规交叉方式,该方式比《现代计算方法》(邢文训等编著)p178给出的“非常规码的常规交配法”稍复杂些。

书中只随机选择一个交配位,两个后代交配位之前的基因分别继承双亲的交配位之前的基因。

本程序中,是随机选择两个不相同的交配位,后代在这两个交配位之间继承双亲在这两个交配位之间的基因如父A 1 2 3 | 4 5 6 7 | 8 9 10父B 4 7 8 | 3 2 5 9 | 1 6 10子A 8 3 2 | 4 5 6 7 | 9 1 10子B 1 4 6 | 3 2 5 9 | 7 8 102、贪心交叉方式(Greedy Crossover),具体算法可参见谢胜利,等.求解TSP问题的一种改进的遗传算法[J].计算机工程与应用,2002(8):58~245.三、实验代码:#include <fstream>#include<iostream>#include <vector>#include <algorithm>#include<math.h>#include <time.h>#include <stdlib.h>#include "def.h"#include "TSP.h"void main(){ifstream input_file;ofstream output_file;time_t time1,time2;int _GENERATION_AMOUNT;int times;int _CITY_AMOUNT=-1;int ii,j,k;std::vector<double> x;std::vector<double> y;char readfile[50];const char* writefile="tsp.txt";double tempx[10000],tempy[10000];cout<<"打开城市坐标文件:";cin>>readfile;input_file.open(readfile);if(!input_file){cout<<"打开错误!";return;}cout<<"读入城市坐标........"<<endl;while(1){if(!input_file.eof()){_CITY_AMOUNT++;input_file>>tempx[_CITY_AMOUNT]>>tempy[_CITY_AMOUNT];if(tempx[_CITY_AMOUNT]<0||tempy[_CITY_AMOUNT]<0){cout<<"文件格式有误!";return;}}elsebreak;}if( _CITY_AMOUNT==-1){cout<<"文件格式有误!";return;}input_file.close();_CITY_AMOUNT=_CITY_AMOUNT+1;x.reserve(_CITY_AMOUNT);y.reserve(_CITY_AMOUNT);lpCityDistance.reserve(_CITY_AMOUNT*_CITY_AMOUNT);for(k=0;k<_CITY_AMOUNT;k++){x[k]=tempx[k];y[k]=tempy[k];}cout<<"已存入的城市信息为:"<<endl;for(ii=0;ii<_CITY_AMOUNT;ii++)cout<<"第"<<ii+1<<"个城市"<<"("<<x[ii]<<","<<y[ii]<<")"<<endl;lpCityDistance.clear();for(k=0;k<_CITY_AMOUNT;k++){lpCityDistance[k*_CITY_AMOUNT+k]=0;for(j=k+1;j<_CITY_AMOUNT;j++){lpCityDistance[k*_CITY_AMOUNT+j]=lpCityDistance[j*_CITY_AMOUNT+k] =sqrt((x[k]-x[j])*(x[k]-x[j])+(y[k]-y[j])*(y[k]-y[j]));}}cout<<"输入进化代数:"<<endl;cin>>times;cout<<"输入种群大小:(大于城市个数小于10000)"<<endl;cin>> _GENERATION_AMOUNT;while(_GENERATION_AMOUNT>=10000||_GENERATION_AMOUNT<_CITY_AMOUNT){cout<<"种群数输入错误!请重新输入(大于城市个数小于10000)"<<endl;cin>> _GENERATION_AMOUNT;}Csga<_CONTAINER, _CONTAINER_P> CUnit(times,_GENERATION_AMOUNT,_CITY_AMOUNT); //初始化time1=time(NULL);//开始遗传算法if(!CUnit.fnCreateRandomGene()) //产生随机基因//产生随机的基因{exit(0);}//循环基因编译,杂交,淘汰过程CUnit.fnEvalAll(); //测试所有基因的适应度for ( int i = 0; i<times; ++i ){//CUnit.fnDispProbability();//显示每个个体的权值CUnit.fnGeneAberrance(); //基因变异//基因变异//CUnit.fnDispProbability();//显示每个个体的权值CUnit.fnGeneMix();//交叉产生新的个体测试并淘汰适应度低的个体//基因杂交CUnit.fnEvalAll(); //测试所有基因的适应度// 每隔_DISP_INTERV AL显示一次结果if ( (i+1)%_DISP_INTERV AL == 0 || i == 0){cout << "第" << i+1 << "代" <<endl;CUnit.fnDispProbability();CUnit.fnDispHistoryMin();}}CUnit.fnDispHistoryMin();time2=time(NULL);cout<<"\n\n计算用时为:"<<difftime(time2,time1)<<"s"<<endl;}四、实验结果:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

报告题目:基于Matlab的遗传算法解决TSP问题说明:该文包括了基于Matlab的遗传算法解决TSP问题的基本说明,并在文后附录了实现该算法的所有源代码。

此代码经过本人的运行,没有发现错误,结果比较接近理论最优值,虽然最优路径图有点交叉。

因为本人才疏学浅,本报告及源代码的编译耗费了本人较多的时间与精力,特收取下载积分,还请见谅。

若有什么问题,可以私信,我们共同探讨这一问题。

希望能对需要这方面的知识的人有所帮助!1.问题介绍旅行商问题(Traveling Salesman Problem,简称TSP)是一个经典的组合优化问题。

它可以描述为:一个商品推销员要去若干个城市推销商品,从一个城市出发,需要经过所有城市后,回到出发地,应如何选择行进路线,以使总行程最短。

从图论的角度看,该问题实质是在一个带权完全无向图中。

找一个权值最小的Hemilton回路。

其数学描述为:设有一个城市集合其中每对城市之间的距离(),i j d c c R +∈,求一对经过C中每个城市一次的路线()12,,n c c c ΠΠΠ⋯使()()()1111min ,,n i n i i d c c d c c −ΠΠΠΠ+=+∑其中()12,,12n n ΠΠΠ⋯⋯是,的一个置换。

2.遗传算法2.1遗传算法基本原理遗传算法是由美国J.Holland 教授于1975年在他的专著《自然界和人工系统的适应性》中首先提出的,它是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。

遗传算法模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。

遗传算法,在本质上是一种不依赖具体问题的直接搜索方法,是一种求解问题的高效并行全局搜索方法。

遗传算法在模式识别、神经网络、图像处理、机器学习、工业优化控制、自适应控制、负载平衡、电磁系统设计、生物科学、社会科学等方面都得到了应用。

在人工智能研究中,现在人们认为“遗传算法、自适应系统、细胞自动控制、混沌理论与人工智能一样,都是对今后十年的计算技术有重大影响的关键技术”。

2.2遗传算法的流程标准的遗传算法包括群体的初始化,选择,交叉,变异操作。

流程图如图1所示,其主要步骤可描述如下:(1)随机产生一组初始个体构成的初始种群,并评价每一个个体的适配值。

(2)判断算法的收敛准则是否满足。

若满足输出搜索结果;否则执行以下步骤。

(3)根据适配值大小以一定方式执行选择操作。

(4)按交叉概率Pc 执行交叉操作。

(5)按变异概率Pm 执行变异操作。

(6)返回步骤(2)。

图1遗传算法流程图3.TSP 问题的遗传算法设计与实现3.1TSP 问题的图论描述求最短路径问题,用图论术语描述如下:在图G(V,A)中,V 表示顶点集合,V=(v1,v2,…,vn)对G 中的某一边(i v ,j v ),相应的有一个数d(i v ,j v ),如果G 中不存在边(i v ,j v ),则令d(i v ,j v )无穷大,如果把d(i v ,j v )认为是边(i v ,j v )的长度,则通路的长度定义为组成路的各条边的长度总和。

顶点i v ,j v 之间是否有边相连,由邻接矩阵来决定。

邻接矩阵A :对一个具有v 个顶点,e 条边的图G 的邻接矩阵A=[ij a ]是一个v×v 阶方阵,其中ij a =1,表示i v 和j v 邻接,ij a =0表示vi 和vj 不相邻接(或i=j )。

3.2读取txt 文件标准的测试文件一般都是存储n*2的txt 文件,为此本人编译了一个readfile.m 的程序,方便了不同文件的使用。

此程序返回的是城市的坐标矩阵pop 和城市的距离矩阵dista 。

3.3初始种群对于n 个城市的问题,每个个体即每个解的长度为n ,用s 行,t 列的pop 矩阵表示初始群体,s 表示初始群体的个数,t 为n +1,矩阵的每一行的前n 个元素表示城市编码,最后一个元素表示这一路径的长度。

这一算法通过start .m 程序实现。

3.3适应度在TSP 的求解中,可以直接用距离总和作为适应度函数。

个体的路径长度越小,所得个体优越,以pop 矩阵的每一行最后一个元素作为个体适应值。

求适应值的qiujuli.m 程序,见附录。

3.4选择选择就是从群体中选择优胜个体、淘汰劣质个体的操作,它是建立在群体中个体适应度评估基础上。

这里采用方法是最优保存方法。

算法就是首先将群体中适应度最大的k个个体直接替换适应度最小的k个个体。

程序为select.m,见附录。

3.5交叉受贪婪算法的启发,本文设计一种有目的使适应值上升的交叉算子。

已知两个父代a1(m11,m12,m13,...,m1n),a2(m21,m22,m23,...,m2n),算法产生后代a1’和a2’的过程如下:(1)随机产生一个城市d作为交叉起点,把d作为a1’和a2’的起始点(2)分别从a1和a2中找出d的右城市dr1和dr2,并计算(d,dr1)和(d,dr2)的距离j1和j2。

(3)如果j1<j2,则把dr1作为a1'的第二个点,从a1和a2中删除d,并且把当前点改为dr1.转步骤(5)。

(4)如果j1>j2,则把dr2作为a1'的第二个点,从a1和a2中删除d,并且把当前点改为dr2。

(5)若此时p1和p2的个数为1,结束,否则回到第二步继续执行。

同理,把第二步中的右城市改成左城市dle1和dle2,通过计算(d,d1e1)和(d,d1e2)的距离并比较大小来确定子代a2'。

为程序cross.m,见附录。

3.6变异变异操作是以变异概率Pm对群体中个体串某些基因位上的基因值作变动,若变异后子代的适应度值更加优异,则保留子代染色体,否则,仍保留父代染色体。

这里采用的方法是倒置变异法。

假设当前个体X为(1374805962)。

如果Pm>rand,那么随机选择来自同一个体的两个点mutatepoint(1)和mutatepoint(2),比如说3和7,倒置P1和P之间的部分,产生下面的子体X'为(1375084962)。

为mutate.m程序,见附录。

4.试验与结果分析试验采用TSPLib标准库的eil51,eil76,eil101作为测试实例。

每个实例分别测试五次,求出平均值和最优值作为比较依据。

问题求解次数最优理论最优解最差解平均值解eil515426432.3981445.9899441.2703eil765538561.5283576.1645570.2783eil1015629678.3685699.7653693.5415下面给出五次运行中的最优路径图:图1eil51最优路径图图2eil76最优路径图图3eil101最优路径图从图中可以看出,所获得路线都有交叉,明显不是最优路径。

对于51个城市和76个城市来说,都只有一个交叉,而对于101个城市来说,交叉比较多,求得最优路径的结果也不是太理想。

从参数设置来说,对于51个城市和76个城市,参数:群体总数s=400,交叉概率Pc=0.9,变异概率Pm=0.2,最大迭代次数C=100。

对于不断调整试验参数中可以得出,最大迭代次数越多,结果比较接近理论最优解。

对于101个城市,参数:群体总数s=500,交叉概率Pc=0.9,变异概率Pm=0.1,最大迭代次数C=200。

对于不断调整试验参数中可以得出,对于较大数目的城市数,变异概率小一些,得到结果也会相应好一些。

5.结语本文运用Matlab软件,利用遗传算法解决了小规模的TSP问题。

文章首先介绍了TSP问题,并给出TSP问题的数学定义,然后介绍了遗传算法的原理以及算法的基本过程,最后通过对标准TSPLib中的51、76和101个城市分别进行了测试,根据试验对参数进行分析。

本文程序解决小规模的TSP问题还可以,随着城市数目的增大,计算精度有所下降,计算时间增长很快,效率较低较快,这也是下一步需要改进的地方。

6.附录%此为主程序代码,将下面各个程序分别保存在同一文件下运行,即可得出比较%好的解,只是会有点交叉,但是最小路径值很接近最优理论值function gas=500;%群体中个体数目k=100;%选择优化个数Pc=0.9;%交叉概率Pm=0.1;%变异概率C=200;%最大循环次数[M,dista]=readfile('tsp76.txt');%读取城市坐标文件[Ncities,b]=size(M);t=Ncities+1;farm=start(s,t);%随机初始化种群farm=qiujuli(farm,dista);%求出种群的适应度counter=0;while counter<=Ccounter=counter+1;farm=select(farm,k);%选择if(Pc>rand)farm=cross(farm,dista);%交叉endif(Pm>rand)farm=mutate(farm,dista);%变异endend[a,b]=size(farm);%求出总路径中的最小值A=zeros(1,a);for i=1:aA(1,i)=farm(i,b);endshortest_path=min(A)%最短路径值[c,d]=find(A==shortest_path);e=c(1);%画出最短路径图for i=1:Ncitiesplot(M(i,1),M(i,2),'ro');%‘ro’可改hold onendfor i=1:t-2plot_ga(farm(e,1),farm(e,t-1),M);plot_ga(farm(e,i),farm(e,i+1),M);end---------------------------------------------------------------------------------------------------------%读取城市坐标的txt文件,格式为n*2的坐标,n为城市数目,%filename为文件名,返回n*2的坐标pop,以及城市距离矩阵%city_distance,为n*nfunction[pop,city_distance]=readfile(filename)fid=fopen(filename,'r');pop=fscanf(fid,'%d',[2inf]);pop=pop';[a,b]=size(pop);city_distance=zeros(a,a);for i=1:afor j=i:acity_distance(i,j)=sqrt((pop(i,1)-pop(j,1))^2+(pop(i,2)-pop(j,2))^2);city_distance(j,i)=city_distance(i,j);endendfclose(fid)-----------------------------------------------------------------------------------------------------------------------%生成s*t列的种群,其中每一行的前t-1个数为1到t-1的随机不重复排列,用于%显示随机行走的路径,最后一列记录这样走的总距离,一般t等于城市数目+1,%s为初始设置的群体中个体数目function pop=start(s,t)pop=zeros(s,t);for i=1:spop(i,1:t-1)=randperm(t-1);end----------------------------------------------------------------------function[a]=bianma(k,u)%编码,生成k个小于u的整数数组a=zeros(1,k);aa=0:u-1;for i=1:kpoint=round(rand*(u-i))+1;a(i)=aa(point);aa(point)=[];end================================================================--------------------------------------------------%该算法主要实现pop矩阵中最后一列的值,即总距离function[pop]=qiujuli(pop,D)%D为城市的距离矩阵,pop为种群[s,t]=size(pop);for i=1:sdd=0;for j=1:t-2dd=D(pop(i,j),pop(i,j+1))+dd;enddd=dd+D(pop(i,1),pop(i,t-1));%dd为每个访遍城市路径的适应度pop(i,t)=dd;%存储适应度end------------------------------------------------------------------------------------------------------------------------%该算法是将群体中适应度最大的k个个体直接替换适应度最小的k个%个体function[pop]=select(pop,k)[s,t]=size(pop);m11=(pop(:,t));m11=m11';mmax=zeros(1,k);mmin=zeros(1,k);num=1;while num<k+1;[a,mmax(num)]=max(m11);m11(mmax(num))=0;num=num+1;endnum=1;while num<k+1;[b,mmin(num)]=min(m11);m11(mmin(num))=a;num=num+1;endfor i=1:kpop(mmax(i),:)=pop(mmin(i),:);end------------------------------------------------------------------------------------------------------------------------%交叉算法,主要思想是:每两行进行交叉的操作,使每行的适应度%减少function[pop]=cross(pop,D)[s,t]=size(pop);pop1=pop;%保存原群体矩阵m=zeros(1,t);%初始化交叉后第一个个体n=zeros(1,t);%初始化交叉后第二个个体for i=1:2:s%每两行进行交叉操作x1=pop(i,:);y1=pop(i+1,:);x2=pop(i,:);y2=pop(i+1,:);c1=round(rand*(t-2))+1;%生成1到t-1之间的随机整数c2=c1;m(1)=c1;n(1)=c2;j=2;while size(x1,2)>2%判断是否继续l=find(x1==c1);h=find(x2==c2);if l==t+1-jlr=1;elselr=l+1;endif h==1hle=t+1-j;elsehle=h-1;endq=find(y1==c1);z=find(y2==c2);if q==t+1-jqr=1;else qr=q+1;endif z==1zle=t+1-j;else zle=z-1;endif D(c1,x1(lr))<D(c1,y1(qr))%根据比较两点间距离进行交换m(j)=x1(lr);c1=x1(lr);elsem(j)=y1(qr);c1=y1(qr);endx1(l)=[];%删除父节点y1(q)=[];%删除父节点if D(c2,x2(hle))<D(c2,y2(zle))%根据比较两点间距离进行交换n(j)=x2(hle);c2=x2(hle);elsen(j)=y2(zle);c2=y2(zle);endx2(h)=[];%删除父节点y2(z)=[];%删除父节点j=j+1;endpop1(i,:)=m;pop1(i+1,:)=n;endpop1=qiujuli(pop1,D);%求出交叉后的路径矩阵for i=1:s%选择适应度变小的交叉,进行更新if pop1(i,t)<pop(i,t)pop(i,:)=pop1(i,:);endend--------------------------------------------------------------------------------------------------------------------------------------------%变异,D为城市的距离矩阵,进行变异function[pop]=mutate(pop,D)[s,t]=size(pop);pop1=pop;for i=1:smutatepoint=bianma(2);b=round((mutatepoint(2)-mutatepoint(1))/2-0.5);for j=1:bzhong=pop1(i,mutatepoint(1)+j);pop1(i,mutatepoint(1)+j)=pop1(i,mutatepoint(2)-j);pop1(i,mutatepoint(2)-j)=zhong;endendpop1=qiujuli(pop,D);for i=1:sif pop1(i,t)<pop(i,t)pop(i,:)=pop1(i,:)endend--------------------------------------------------------------------------------------------------------------------------------------------%画图function plot_ga(a,b,V)P=[V(a,1)V(a,2)];Q=[V(b,1)V(b,2)];c=P(1,2);P(1,2)=Q(1,1);Q(1,1)=c;plot(P,Q,'g-')%g表示颜色,-表示连线的形状,可改。

相关文档
最新文档