TSP问题—启发式遗传算法

本章涉及知识点

1、达尔文进化论

2、遗传算法的思想

3、遗传算法下的TSP模型

4、染色体的编码

5、种群的初始化

6、适应度函数

7、精英种群的选择

8、轮盘赌法

9、染色体的交叉操作

10、染色体的变异操作

11、染色体的逆转操作

12、python编程实现遗传算法

13、结果分析

一、达尔文进化论

达尔文认为,生物之间都存在着生存斗争,只有经过不同程度的斗争,适应者才可以顺利的存活下来,而不适者将被合理的淘汰,即"物竞天择,适者生存"

而斗争的过程和结果,就是生物的进化,生物正是通过基因的交叉、变异和自然选择,让自己从低级到高级,从简单到复杂,从不适到适合的进化成长,如果进化成功,它就能继续存活并且进化下去,否则将面临灭亡

二、遗传算法的思想

在日常生活中,我们经常需要求一个问题的最优解,而许多问题的最优解却没有一个通用的数学解法,或者在有限的时间空间内,无法精确的找到全局最优解,例如NP问题里的组合优化问题—TSP问题

TSP问题—启发式遗传算法_第1张图片
遗传算法思想

遗传算法(GA)属于人工智能启发式算法,启发式算法的目标就是寻找原始问题的最优解,该算法的定义为

人类通过直观常识和生活经验,设计出一种以搜索最优解为目的,通过仿真大自然规律的算法,该算法在可以在接受的花销(计算时间和存储空间)范围内找到问题实例的一个可行解,且该可行解和真实最优解的误差一般不可以被估计

当下主要有的启发式算法包括遗传算法、退火法,蚁群算法、人工神经网络等,这篇文章主要介绍遗传算法

遗传算法的基本原理是模拟达尔文进化论"物竞天择,适者生存"的自然法则,其核心思想为

(1)将原始问题的参数,抽象为基因编码

(2)将原始问题的可行解,抽象为基因排列的染色体组合

(3)将原始问题的解集规模,抽象为一定数量染色体组成的种群

(4)寻找可行解的过程,抽象为种群的进化过程(染色体选择、交叉、变异等)

(5)比较可行解的优劣,抽象为量化比较不同种群对当前环境的适应程度

(6)逼近最优解的过程,抽象为淘汰适应度差的种群,保留适应度高的种群进行下一次进化

(7)问题的最优解,抽象为经过多次进化后,最终生存下来的精英种群

理论上,通过有限次种群进化,生存下来的种群都是精英染色体,是最适合当前环境条件的种群,也就可以无限逼近原始问题的最优解

遗传算法可以用来求解多元非线性函数的极值,也可以用来求解组合问题的最优解

三、遗传基因算法下的TSP模型

我们选择GA算法来求解TSP问题,首先需要抽象出GA算法下TSP的模型

TSP问题—启发式遗传算法_第2张图片
GA算法下TSP的模型

四、染色体的编码

我们将一个城市抽象为一个基因,而城市的旅行顺序,可以看做一个离散型问题,因此我们可以采用1~n的整数,对这n个城市进行一一编码,即

基因整数编码

我们对编码好的城市,进行任意的排列,即让一组基因组成一个染色体,染色体的意义为

(1)染色体包含了所有的基因(城市)

(2)染色体的长度,就是所有城市的数量

(3)一个染色体描述了一次TSP的旅行路线

(4)一个染色体代表了一个TSP的可行解

染色体编码

五、种群的初始化

TSP问题中所有旅行线路的规模为n!,由于n可能非常大,一般我们选择初始化m个染色体来组成种群(m < n)

初始化种群可以有下面两个方法

(1)求解m的全排列,这样求解出的种群就包含了原始问题的所有可行解

(2)每次都随机打乱基因组的排列,来生成不同的染色体

我们的程序里就是采用第二种方法来初始化种群

六、适应度函数

由于种群需要不断进化,为此我们需要定义一个规则,来评估打分当前环境下哪些种群可以生存,哪些种群将被淘汰,我们将这个规则叫做适应度函数

我们可以设计出TSP模型下的适应度函数为:一次旅行路线行走的总距离的倒数

TSP问题—启发式遗传算法_第3张图片
适应度函数

可以看出:总距离越长,适应度越低;总距离越短,适应度越高

七、精英种群的选择

每一次种群进化后,我们都需要对当前种群进行优胜劣汰,让精英种群尽量生存下去,翻译为数学语言为:

种群被选中定义为精英种群的概率,与其适应度成正比,即一个染色体的适应度越高,该染色体被选中为精英染色体的概率也将越大

选择精英种群的概率方法,我们使用轮盘赌法

八、轮盘赌法

根据古典概率型,第i个种群被选中的概率为

第i个种群被选中的概率

每个种群都对应着其相应的适应度分数Fi,我们抽象出一张转盘来表示n个种群的概率分布

TSP问题—启发式遗传算法_第4张图片
n个种群的概率分布

饼图中每个种群的扇形面积,就是其适应度分数的比例,我们只要随机旋转这个轮盘,直到轮盘停止的时候,指针指在哪一块上,就选择该种群,显然分数越高(面积越大),被选中的概率也就越大

由此可以看出轮盘赌法满足:

种群被选中的概率与其适应度函数值成正比

九、染色体的交叉操作

交叉操作:发生在两个染色体各自任意的基因片段上

假设有下面两个染色体

两个染色体

染色体交叉的策略如下:

(1)产生两个随机数r1和r2,代表这两个染色体发生交叉操作的基因片段位置,如r1=1,r2=3,下图红色标注的区域就是即将发生交叉操作的基因片段

即将发生交叉操作的基因片段

(2)交换这两个基因片段,变为

交换基因片段

但是我们发现交换基因片段后,染色体的基因会有重复,为此我们需要解决这个基因冲突问题,下图蓝色标注的区域就是冲突的基因

基因冲突问题

(3)一一交换两个染色体的冲突基因,即可解决冲突产生新的一对染色体

解决基因冲突

至此,我们可以看到交叉操作的意义为

(1)通过交叉产生两个新的染色体

(2)为寻找全局最优解,提供了新的可能性

十、染色体的变异操作

染色体变异:发生在单个染色体的两个基因位置上

假设有下面染色体

染色体

染色体变异的策略如下:

(1)产生两个随机数r1和r2,代表两个即将发生基因变异的位置,如r1=3,r2=6,下图红色标注的区域就是即将变异的基因位置

即将发生变异操作的基因片段

(2)直接交换这两个基因位置,得到

染色体变异

至此,我们可以看到变异操作的意义为

(1)使得染色体的基因更加有随机性

(2)为跳出局部最优解,提供了可能性

十一、染色体的逆转操作

染色体的逆转:发生在单个染色体的一段基因片段上

假设有下面染色体

染色体

染色体逆转的策略如下:

(1)产生两个随机数r1和r2,代表单个染色体的某段基因片段,如r1=2,r2=5,下图红色标注的区域就是即将发生逆转的基因片段

即将发生逆转操作的基因片段

(2)逆转这段基因片段,得到

染色体逆转

(3)比较新旧两个染色体的适应度分数

(1)如果逆转后新染色体适应度分数大于旧染色体,则逆转有意义

(2)如果逆转后新染色体适应度分数小于旧染色体,则逆转无意义

比较新旧两个染色体的适应度分数

至此,我们可以看到逆转操作的意义为

(1)单向性逆转,提供了比较逆转前后染色体优劣的机会

(2)使得逆转后的染色体变得更加优秀

(3)加速种群进化的质量

十二、python编程实现遗传算法

根据上述分析,我们可以很容易的用python编程实现GA算法来解决案例的TSP问题

种群的编码和初始化

TSP问题—启发式遗传算法_第5张图片
种群的编码和初始化

适应度打分函数

TSP问题—启发式遗传算法_第6张图片
适应度打分函数

轮盘赌法

TSP问题—启发式遗传算法_第7张图片
轮盘赌法

染色体选择操作

TSP问题—启发式遗传算法_第8张图片
染色体选择操作

染色体交叉操作

TSP问题—启发式遗传算法_第9张图片
染色体交叉操作-1
TSP问题—启发式遗传算法_第10张图片
染色体交叉操作-2

染色体变异操作

TSP问题—启发式遗传算法_第11张图片
染色体变异操作

染色体逆转操作

TSP问题—启发式遗传算法_第12张图片
染色体逆转操作

开始种群进化

TSP问题—启发式遗传算法_第13张图片
开始种群进化

十三、结果分析

我们设置以下GA算法的参数来求解TSP案例

初值设置

根据这些初值,GA算法在100个种群进化了200代之后,找到的TSP的最优路线解为

Hopfield网络找到的TSP路线

最终GA算法找到的最优哈密顿回路为

TSP问题—启发式遗传算法_第14张图片
GA算法找到的最优哈密顿回路

可以看到初值设置得当,GA算法非常迅速的在进化到第二代的时候就找到了最优解,且该最优解和案例的真实最优解一致

至此,用GA算法来求解TSP问题,我们可以总结出以下几点

(1)GA算法是求解TSP问题的一种启发式仿真算法

(2)GA算法通过模拟大自然优胜劣汰的进化法则,在参数设置合理的情况下,有可能直接找到真实最优解,比近似算法计算的效果要好

(3)GA算法的随机性非常强,种群规模、进化代数以及交叉变异的概率都会影响算法的寻优,从而算法可能会陷入局部最优解而没有及时跳出,最后可能找到不同的次优解

案例代码见:GA算法求解TSP问题

你可能感兴趣的:(TSP问题—启发式遗传算法)