遗传算法中每一条染色体,对应着遗传算法的一个解决方案,一般我们用适应性函数(fitness function)来衡量这个解决方案的优劣。所以从一个基因组到其解的适应度形成一个映射[1]。可以这样想象,这个多维曲面里面有数不清的“山峰”,而这些山峰所对应的就是局部最优解。而其中也会有一个“山峰”的海拔最高的,那么这个就是全局最优解。而遗传算法的任务就是尽量爬到最高峰,而不是陷落在一些小山峰。(另外,值得注意的是遗传算法不一定要找“最高的山峰”,如果问题的适应度评价越小越好的话,那么全局最优解就是函数的最小值,对应的,遗传算法所要找的就是“最深的谷底”)
所以我们总结出遗传算法的一般步骤:
开始循环直至找到满意的解。
1.评估每条染色体所对应个体的适应度。
2.遵照适应度越高,选择概率越大的原则,从种群中选择两个个体作为父方和母方。
3.抽取父母双方的染色体,进行交叉,产生子代。
4.对子代的染色体进行变异。
5.重复2,3,4步骤,直到新种群的产生。
结束循环。
1.2遗传算法实现步骤
1.编码
遗传算法的编码有浮点编码和二进制编码两种。这里介绍为二进制编码。设某一参数的取值范围为
,使用长度为k的二进制编码表示改参数,则它共有
中不同的编码,每相邻的编码的两个编码的间隔是
,容易知道
打个比方,如果要求解精度是10^-6 (小数点后六位),且取值的范围是[-1,2],则为了保证精度要求,需要
,又由于
,所以可以知道k应该取值22.
至于为什么是除以(2^k-1),因为这是用二进制编码,而二进制编码的过程中,如果编码长度是n,那么这段编码一共可以表示2^n个元素。知道了编码对应的元素数量之后,我们就需要确定我们这段取值区间范围一共有多少个元素! 就拿区间[-1,2]来说,我们可以就取四个值-1,0,1,2;但这么取值显然精度不够,引入精度的概念后,我们知道了自变量取值要精确到小数点后6位。那么我们假设总共需要把区间分为2^n-1份,这段区间一共对应2^n个元素,然后再利用上面的公式可以求出来n到底是多少!至此,我们知道了如果利用二进制编码每个元素需要的编码长度。
2.解码
解码的目的就是将不直观的二进制数据串还原成十进制。
遗传算法的编码和解码在宏观上可以对应生物的基因型和表现型,在微观上可以对应DNA的转录和翻译两个过程。
简而言之, 将编码转换为取值范围里对应的实数(比如把某段编码通过解码转换成区间[-1,2]里面的实数),需要以下两个步骤:
①将一个二进制串代表的二进制数转化为10进制数:
②对应区间内的实数:
例如一个二进制串<1000101110110101000111>表示实数值0.637197。(下图有错误,应该写成x= -1+2288967*(3)/(2^22-1))
3.交配
“交配运算”是使用单点或者多点进行交叉的算子。首先用随机数产生一个或者多个叫交配点的位置,然后两个个体在交配点位置互换部分基因码,形成两个子个体。如下图:
交配运算.png
两个基因在"/"处进行了交换
4.突变
“突变运算”是使用基本位进行基因突变 。例如,将染色体S=11001101第3位上的0变为1,即S = 11101101=S'.S'可以被看做是原染色S的子代染色体。
5.倒位
将染色体基因的一部分进行逆序排列。例如:S = 100/1100/11,把第二部分进行逆序排列以后为S' = 100/0011/11.
6.个体适应度评估
遗传算法依照与个体适应度成正比的几率决定当前种群中各个个体遗传都下一代群体中的机会。通常求目标函数最大值的问题可以直接把目标函数作为检测个体适应度大小的函数。
7.复制
复制运算时根据个体适应度大小决定其下代遗传的可能性。如果设种群中个体总数为N,个体i的适应度为fi,则个体i被选取的几率为:
参考文献[1]:
[2]:https://www.jianshu.com/p/374624820e3a