利用遗传算法求解TSP问题

一、摘要

TSP问题是指给定平面上N个点及每点的坐标,求一条路径,遍历所有的点并回到起点,使这条路径长度最小。TSP问题是一个组合优化问题。该问题可以被证明具有NPC计算复杂性。因此,任何能使该问题的求解得以简化的方法,都将受到高度的评价和关注。

遗传算法是人工智能方法的一种,用于求解各种传统方法不方便求解或耗时很长的问题。下面给出遗传算法求解TSP问题的步骤。在传统遗传算法求解TSP的基础上,提出了一种新的编码方式,并且讨论了一种优化方法的可行性。

本次实验的程序首先在matlab上验证了基本的算法,然而由于matlab运行较慢,故又移植到C++平台上,经过测试,实验结果良好。

二、算法实现

遗传算法的实现主要包括编码、选择、交叉、编译、将个体放入新种群这么几个步骤,经过很多代的编译求解,以逼近最优解。下面讨论每一个步骤的实现,其中编码方式是我在考虑了传统编码方式不利于计算的缺点下,重新设计的一种全新的编码方式。

编码

在传统TSP问题中,编码可以直接采用二进制编码或自然编码的形式,比如直接把城市转化成(2,5,4,1,3,6)的形式,表示从254136最后回到起点。但是在求解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放在第一个空格处(21),然后取3放在第二个空格处(2,3,1),然后取4放在第二个空格处(2,4,3,1)然后取5放在第一个空格处(5,2,4,3,1)最后取6放在第3个空格处(5,2,64,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++上,通过matlabC++程序的对比,发现matlab的效率确实很低,但是使用非常方便。

4、对该方法有一种显然的优化就是每次都将最优的那一个直接放入下一代。但是该方法会导致程序收敛加快,让程序陷入局部最小。

 

posted on 2013-03-03 22:14  mapleWizard  阅读(2147)  评论(3编辑  收藏  举报

导航