遗传算法求解旅行商有关问题

遗传算法求解旅行商问题

1.遗传算法

        遗传算法是受大自然的启发,模拟生物在自然环境中的遗传和进化过程而形成的一种自适应、具有全局优化能力的随机搜索算法。

自然界的进化包括3个原则:

(1)适者生存原则,这意味着适应能力强的物种,会在残酷的竞争中生存下来,而适应能力差的物种会逐渐地消亡。

(2) 两性繁殖。这意味着种群中性别不同的个体,生活在一起,产生新的个体。

(3) 变异。 由于环境的变化,新物种的出现,以及不同物种的交互都会引起种群的变异。

        遗传算法的思路是通过从给定一个初始群体出发,利用选择算子、杂交算子以及变异算子来模拟自然进化的三种原则,逐步改进种群,一步步逼近最优解,以达到求解最优华问题的目的。


GA算法的计算步骤:


遗传算法求解旅行商有关问题遗传算法求解旅行商有关问题遗传算法求解旅行商有关问题

遗传算法求解旅行商有关问题

        记住遗传算法的过程很重要,首先是初始化一群解,然后再在这些解中选择较优的一部分,将选择的这一部分解进行交叉,且以一定概率变异,(交叉一般能得到比当前解更好的解,而变异则很可能让结果变差,所以变异的概率一般不是很大,但是这样有助于我们跳出局部最优)。交叉变异以后进行群体更新,对于TSP问题,群体更新时保存这一次迭代产生的最好的解,然后继续进行下一次迭代,直到满足终结条件为止。

遗传算法求解旅行商有关问题遗传算法求解旅行商有关问题

GA的算法过程:

遗传算法求解旅行商有关问题

        初始化t,t代表while循环已经迭代了多少次。其中f(pop(t))是指这个解的适应度,对于TSP问题,适应度就是它的代价,第8行是按一定的概率选择较有的解。第9行以Pc概率进行交叉,第10行以Pm概率进行变异。

2. 问题建模

        遗传算法其实很简单,就是初始化一群解,然后选择这一群里面较优的解,在较优的解里面,让其中的个体交叉,使得交叉后得到更好的解,再按一定概率进行变异,希望变异能跳出局部最优。对于遗传算法求解TSP问题,最难的地方在于问题建模,刚开始根本不知道如何用遗传算法来求解旅行商问题,如何交叉,如何变异。

        首先初始化一群解,可以通过C++提供的库函数来产生一个城市的随机排列,每一个排列代表一个解random_shuffle(temp.path, temp.path + nCities)。然后以一定概率选择较优的解,选择的方法有很多,我们不一定非要按照上面伪代码的方式来选择,比如我们希望每次保存当前这群解中的前60%,则我们可以按解的适应度排序,然后取前60%的解,对于后40%的解,我们可以用前40%的解去覆盖它,则前40%的解就有2个副本,只要我们交叉的时候不要让相同的两个副本交叉就行了,因为相同的两个解交叉,不会让结果变得更好。

        变异也很简单,只需要在一个解中随机的选择两个城市,然后交换它们即可。注意,变异的概率不宜太大。

        最难的部分是交叉,我们要如何用两个解得到一个更好的解?这就是交叉,让一代比一代强,我们才可能慢慢接近最优解。交叉的方法有很多,可以参考http://blog.****.net/xuyuanfan77/article/details/6726477


源码中采用类似于三交换启发交叉(THGA),我把它改成了二交叉的。

三交换启发交叉方法的基本思想如下:

选3个参加交配的染色体作为父代,以8个城市为例来说明这一过程,其中dij由前面的表1给出,父代染色体为

A = 3 2 1 4 8 7 6 5

B = 2 4 6 8 1 3 5 7

C = 8 7 5 6 4 3 2 1

SUM1=42,SUM2=40,SUM3=46(SUM1,SUM2,SUM3分别为这3种排法所走的距离总和数).

随机选出初始城市j=1,Sj=3右转动,使3成为3父代的第1位置.

A = 3 2 1 4 8 7 6 5

B = 3 5 7 2 4 6 8 1

C = 3 2 1 8 7 5 6 4

由于d(3,2)>d(3,5),所以有:

A = × 5 2 1 4 8 7 6

B = × 5 7 2 4 6 8 1

C = × 5 6 4 2 1 8 7

由此规则计算可得:

O = 3 5 7 6 8 4 2 1

我们本来是3个不同的解,现在得到了一个比三个解都优的解,总不能让原来的三个解都等于现在的这个局部最优解吧,这样不利于下次交叉,我们可以用如下的方法改变另外两个解的路径:

        

        上行代码执行以后,它的代价还是和原来一样的,路径也是一样,只是起点变了,这样有什么好处呢?有利于下次交叉的时候,原来的两个相同代价,不同路径的解能和其他解交叉出不同的结果,这样有利于找到更好的解。


3. 代码实现


4.参考资料:

[1] http://blog.****.net/xuyuanfan77/article/details/6726477

[2] 算法设计与分析(高级教程),国防工业出版社