利用遗传算法求解TSP问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利⽤遗传算法求解TSP问题
⼀、摘要
TSP问题是指给定平⾯上N个点及每点的坐标,求⼀条路径,遍历所有的点并回到起点,使这条路径长度最⼩。
TSP问题是⼀个组合优化问题。
该问题可以被证明具有NPC计算复杂性。
因此,任何能使该问题的求解得以简化的⽅法,都将受到⾼度的评价和关注。
遗传算法是⼈⼯智能⽅法的⼀种,⽤于求解各种传统⽅法不⽅便求解或耗时很长的问题。
下⾯给出遗传算法求解TSP问题的步骤。
在传统遗传算法求解TSP的基础上,提出了⼀种新的编码⽅式,并且讨论了⼀种优化⽅法的可⾏性。
本次实验的程序⾸先在matlab上验证了基本的算法,然⽽由于matlab运⾏较慢,故⼜移植到C++平台上,经过测试,实验结果良好。
⼆、算法实现
遗传算法的实现主要包括编码、选择、交叉、编译、将个体放⼊新种群这么⼏个步骤,经过很多代的编译求解,以逼近最优解。
下⾯讨论每⼀个步骤的实现,其中编码⽅式是我在考虑了传统编码⽅式不利于计算的缺点下,重新设计的⼀种全新的编码⽅式。
编码
在传统TSP问题中,编码可以直接采⽤⼆进制编码或⾃然编码的形式,⽐如直接把城市转化成(2,5,4,1,3,6)的形式,表⽰
从2到5到4到1到3到6最后回到起点。
但是在求解TSP问题时,如果直接采⽤此种编码⽅式,会导致在交叉或变异时出现冲突的情况。
如(2,5,4,1,3,6)和(3,5,6,1,2,4)交换后变成了(2,5,6,1,2,6)和(3,5,4,1,3,4),显然路径出现了冲突的现象,传统的解决⽅式是通过逐步调整的⽅法来消除冲突,但是这种⽅法增加了编码的复杂度,不利于问题的求解,根据问题的特点,提出了采⽤⼀种插⼊序号的编码⽅式。
假设6个城市(1,2,3,4,5,6)现在有编码(1,1,2,2,1,3),让第n个编码表⽰n放在第⼏个空格处。
那么⽣成路径的规则是⾸先取1放在第⼀个(1),然后取2放在第⼀个空格处(2,1),然后取3放在第⼆个空格处(2,3,1),然后取4放在第⼆个空格处(2,4,3,1)然后取5放在第⼀个空格处(5,2,4,3,1)最后取6放在第3个空格处(5,2,6,4,3,1)。
注意编码X(n)<n。
选择
在这⾥采⽤轮盘赌的⽅式,⾸先计算出种群中每个个体的路径长度L,构造适应系数f= 1-(L-minL)/(maxL-minL),这样,路径越短的个体,适应系数就越强。
然后给每个个体添加⼀个F值使F(n+1)=F(n)+f。
然后⽣成⼀个随机数,这个数落在f⼤的个体中的概率⼤。
交叉
在选取了两个个体后,进⾏交叉,⾸先设定⼀个交叉概率,在满⾜这个概率时,随机截取编码上的⼀段进⾏互换。
变异
设置⼀个个变异概率,然后⽤随机数的⽅式,使当能变异时,随机改变编码。
将新个体放到临时种群中
⽐较编译后的两个个体,将较优的个体放到新的种群中。
在新种群和原种群的个数达到相等的时候,⽤新种群替换原来的种群。
并开始下⼀轮循环。
在放⼊的时候,可以考虑将已知的最⼤样本直接放⼊种群,加快收敛。
但实际上,这种优化的效果并不明显。
三、实验结果
由于10个城市在两种⽅法下,差异不明显,故讨论20个城市的情况。
对于20个城市的情况:
未优化的算法:
未优化⽅案在历史上达到的最优解:
优化⽅案:
这也是优化⽅案在历史上达到的最优解。
两种⽅法的对⽐:
可见,不加⼊当前最优解,有利于种群的繁殖。
有可能是加⼊了最优解,⼀定程度上阻⽌了变异的发⽣。
可见,优化的⽅法会导致过快收敛。
四、程序说明
本次实验编写了matlab程序和C++程序,其中matlab程序在matlab2012a上实现通过,C++程序在WIN7下使⽤MinGW中的g++编译调试通过。
附件包括matlab程序,cpp源⽂件和Makefile⽂件。
其中C++程序,使⽤了CPath对象来负责控制变异、交换、计算路径长度等操作,⽽GAClass负责对CPath进⾏选择等操作。
本次实验还编写了随机⽣成城市路径的⼩程序,⽤于随机⽣成城市位置坐标点。
五、思考总结
1、变异的概率越⼤,种群就越能得到新的编码,但是也越难以收敛,需要更多的循环繁殖次数。
2、最优解的好坏与城市数⽬有关,城市越多,在相同的种群数⽬和循环次数条件下,得到的解越不理想。
因此,增加城市数⽬,必须同时增⼤种群数⽬和循环次数。
3、本次实验⾸先在matlab上实现基本算法,再移植到C++上,通过matlab和C++程序的对⽐,发现matlab的效率确实很低,但是使⽤⾮常⽅便。
4、对该⽅法有⼀种显然的优化就是每次都将最优的那⼀个直接放⼊下⼀代。
但是该⽅法会导致程序收敛加快,让程序陷⼊局部最⼩。