遗传算法概述
利用遗传算法求解最大值
遗传算法模拟自然界的进化过程,选择(Selection),交叉(Crossover),变异(Mutation)。每次迭代过程,都保留部分上一组的个体,经过许多次这样的迭代,就能求得最优解的近似解。
遗传算法在函数优化、模式识别、生产调度等方面有许多应用。
编码
编码有两种,一种是实数编码,一种是二进制编码:
- 实数编码,便于理解,不用编码,也就不需要解码,但是容易过早收敛,找到局部极小值。
- 二进制编码,可以找到全局最优值。但是比起实数值,需要更多的空间。
解空间:二进制编码之前,最原始的实数解 的空间。
编码空间:对实数解进行二进制编码,编码之后的解 的空间。
编码空间实际是对原来解的另一种角度的解读。
f(x) = sin(x)+sin(7*x)+8x
比如,求解[0,4]最大值定义域上的解,要求解保留4位小数。
那么解空间就有 \([4-0]~*~10000 = 40000,40000<2^{16}=65536\) ,所以编码之后的解空间可以用16bit来表示所有的实数解,还有冗余。
一个解的编码就是一个16位的二进制串。
但是一开始这些二进制串是随机生成的,由于编码冗余的原因,注意随机生成二进制串不一定都在实数解空间里。
这样的一条二进制串,就是一个解,在遗传算法中也被叫做一条染色体。
解码
对于这种染色体,如何解码到[0,4]中对应的实数解??
我们可以用如下公式:
x = 0+decimal(chromosome)✖️ (4-0)/(2^16-1)
一般化解码公式:
通过上述公式,我们就可以成功把二进制染色体翻译成十进制实数解。
个体
个体就是承载一条染色体的载体,而染色体又能表示某种特征。对于求解本例函数求极值问题,每一个实数解就是一条染色体,或者称其为一个个体。许多个个体组成了种群。
适应度函数
适应度函数通常是我们需要求解的特定函数来描述一个个体的好坏,然后通过适应度函数值进行个体筛选。本问题由于求解最大值点,适应度函数就可以选择问题本身对应函数。
对于求解最大值来说,最大值越大,解的质量就越好。
适应度函数就是遗传算法类问题的"遗传规则",也是核心。具体的选用通常要根据实际问题选择。
遗传算子
遗传算子的作用,通过几个方法(算子)达到将初始总群进化到比较优秀的种群的目的。因为初始种群是随机的,肯定刚开始解的质量非常差,通过用适应度函数不断地进化到比较优秀的解,但是也要注意:必须设立阈值点,不能一味的接近最优点,计算能力顶不住。
进化时每一次都保留原始种群中比较优秀的部分,差的部分被淘汰,代替的是优秀个体通过遗传算子得到的比较优秀的子代。
进化能力一般讲的就是遗传算子的设计:
遗传算子包含以下几个算子:
- 选择算子
选择是在上一代种群中 选择多对优秀个体,一对优秀个体就叫做一对父母,每一对父母可以产生一个优秀后代。
选择之前把种群中所有的个体按照适应度从小到大排列。采用一些方法(通常是轮盘赌选择法:各个个体被选择概率与其适应度值大小成正比)。
还有别的方法,比如精英机制:直接选择前代最好的两个个体,因为轮盘赌选择法具有随机性,这一点确实很好的模拟了自然界基因的随机性,但是也得明白,选择的随机性比较容易丢掉最好的两个优秀个体。
- 交叉算子
根据选择算子找出的比较优秀的两个个体,根据交叉算子的交叉概率按照某种方式交换某段基因。
方法有单点交叉、多点交叉等等
- 变异算子
交叉完之后,染色体按照某种变异概率进行染色体变异、
变异方法有:单点变异、多点变异
一些经验:
交叉概率我们选择的一般比较大,变异概率选择的比较小。具体问题具体分析。求解函数极值的问题,交叉概率通常选择0.6,变异概率通常选择0.01。
上图是适应度最大值随着遗传代数增加的图像,可以发现在大概第20次左右得到了收敛,适应度最大值大概在24左右。