基因算法解决 TSP 问题算法
基因算法的运算方法包括app
对于二进制编码Representation,基因算法的过程能够清晰地表示为:函数
Tips:优化
1. 变异因子pm和交叉因子pc是能够随着优化进行而自适应的。好比在优化起始阶段,pm和pc的值设置稍大能够提升搜索能力,而到了优化后期,pm和pc应当相应地减少,以强化其局部搜索能力。编码
2. 轮盘赌:简言之即得分高的个体其保留几率越大。好比对于基因A适应度/得分为f(A)=a,基因B为f(B)=b,那么A的保留几率为PA=a/(a+b),而PB=b/(a+b)。
lua
对于TSP问题:spa
首先,咱们要有各个城市/地点之间的距离表distance_between_cities。(能够本身随机生成).net
而后,TSP问题其实就是寻找一个合适的地点(循环的)排序R,使得对于R中的每一个相邻元素cityi的距离之和最小。对于Multiple-Run Algorithm,能够不停生成不一样的排序Ri,并计算相应的距离之和(即成本Cost)。而采用基因算法,其步骤以下:blog
交叉运算排序
交叉运算有几种方式,本次实现采用的是基于位置的交叉。首先将种群分为父本和母本,随机肯定父本中要交换的部分并复制到子代,而后将母本的其余基因按顺序复制到子代。代码实现就须要关注避免重复的部分,能够这样实现:随机取出父本中要保留的基因部分F_section(要注意的是这是一段分立的基因),再顺序逐个取出母本基因元素M_element生成和F_section同等大小的M_section,两向量相减再求元素积,为0则表示母本基因元素M_element在父本基因段F_section中已经出现了。利用矩阵、向量运算能够避免循环查询父本基因段中是否有母本元素,以此实现高效率(由于矩阵运算有相关的优化)。
Partial-Mapped Crossover(部分映射交叉)
Order Crossover(顺序交叉)
Position-based Crossover(基于位置的交叉)
交叉因子pc 一般较大,好比取pc=0.8。
变异运算
TSP问题中,变异运算只须要随机肯定须要执行的数量,再依据变异因子pm随机地交换两个城市的位置便可。
评价函数
能够生成一个三维张量R_tensor,其中行列为各个城市,那么易知,矩阵元素若为“1/0”便是表示俩城市间是/否属于路径Ri。而通道则表明了种群中的不一样个体,故R_tensor的大小为num_city * num_city * num_population。将各通道分别与距离表distance_between_cities做矩阵相乘获得矩阵Temp,取其对角元素求和并除以2就是路径Ri的距离之和,能够用来做为每一个路径个体的适应度Cost。
选择运算
有两部分,1.挑选出最优的个体R_best与对应的适应度Cost_best。2.挑选出较优的种群的一部分,做为下一次迭代的父代。(由于交叉运算中一般会使得种群数量减半,因此这里能够加倍来使种群维持在定值)。
自适应的变异因子pm:利用种群多样性
在优化初期,根据种群多样性population_diversity保持在某个值S附近来调整pm,好比population_diversity < S时,须要提高种群多样性,故取c>1,令pm=pm*c提高变异的几率,同理population_diversity > S时,令pm=pm/c下降变异几率。对于浮点型算法,求种群多样性是采用了标准差,而对应到TSP问题中,多样性则体如今路径“基因段”的多样性。变异因子初始值pm0一般在种群数量倒数与基因长度(TSP问题中就是路径长度=城市数量)倒数之间,即pm0∈(min{1/num_population, 1/num_city}, max{1/num_population, 1/num_city})。
举个例子,路径A:1354267和路径B:5423716的类似基因段有:54,42,71,故在此定义A与B的非类似度为7-3=4.对于路径C=A,其非类似度为7-7=0,易知此时非类似度∈[0,7]。对于肯定的城市数量num_city,非类似度=城市数-类似基因段数量,能够考虑用因子S将种群控制在非类似度在0.1*num附近。
其计算过程将不一样通道的Ri相乘再取对角元素求和除以2即便类似基因段数量。如路径1342和路径4123,计算后获得值为2,即12和34。
|
1 |
2 |
3 |
4 |
1 |
0 |
1 |
1 |
0 |
2 |
1 |
0 |
0 |
1 |
3 |
1 |
0 |
0 |
1 |
4 |
0 |
1 |
1 |
0 |
|
1 |
2 |
3 |
4 |
1 |
0 |
1 |
0 |
1 |
2 |
1 |
0 |
1 |
0 |
3 |
0 |
1 |
0 |
1 |
4 |
1 |
0 |
1 |
0 |
关于浮点Representation,总体过程相似,只是其交叉运算和变异运算都有不一样。
交叉运算
假设有父本Xi和母本Yi
子代Zi = a*Xi + (1-a)*Yi 0 < a < 1 且a是随机生成的。
变异运算
变异运算能够用 x_newi = x_oldi + Δxi
有Δxi|r > 0.5 = (xmax, i - xi)*(2*(r - 0.5))β 和 Δxi|otherwise = (xmin, i - xi)*(2*(0.5 - r))β
其中r是从(0,1)均匀分布随机生成的,β一般大于1(好比能够取β = 3)。
关于算法的收敛性:尚未找资料深刻研究过该算法的收敛性。直观地看,该算法能够高效地搜索解空间,而且会获得一个最优个体(感受有点相似Multiple-Run)。
Acknowlegement:
https://blog.csdn.net/greedystar/article/details/80343841?utm_source=blogxgwz2