遗传算法简单易懂的例子
遗传算法的例子如下:
求解函数 f(x) = x + 10*sin(5*x) + 7*cos(4*x) 在区间[0,9]的最大值。
对于求解函数最大值问题,一般选择二进制编码:
实数编码:直接用实数表示基因,容易理解且不需要解码过程,但容易过早收敛,从而陷入局部最优;
二进制编码:稳定性高,种群多样性大,但需要的存储空间大,需要解码且难以理解。
以目标函数 f(x) = x + 10sin(5x) + 7cos(4x), x∈[0,9] 为例。
设定求解的精度为小数点后4位,可以将x的解空间划分为 (9-0)×(1e+4)=90000个等分。
2^16<90000<2^17,需要17位二进制数来表示这些解。换句话说,一个解的编码就是一个17位的二进制串。
这些二进制串是随机生成的。一个这样的二进制串代表一条染色体串,这里染色体串的长度为17。对于任何一条这样的染色体将它复原(解码)到[0,9]这个区间中。
可以采用以下公式来解码:
x = 0 + decimal(chromosome)×(9-0)/(2^17-1)decimal( )( 将二进制数转化为十进制数。)
一般化解码公式:
f(x), x∈[lower_bound, upper_bound]x = lower_bound + decimal(chromosome)×(upper_bound-lower_bound)/(2^chromosome_size-1)f(x), x∈[lower_bound, upper_bound]x = lower_bound + decimal(chromosome)×(upper_bound-lower_bound)/(2^chromosome_size-1)lower_bound:函数定义域的下限。
upper_bound:函数定义域的上限。
chromosome_size:染色体的长度。
通过上述公式,我们就可以成功地将二进制染色体串解码成[0,9]区间中的十进制实数解。