一、首先来介绍一下遗传算法的常用单词:
基因组:locus
个体:individual
复制:reproduction
种群:population
适应度:fitness
选择:selection
进化:evolution
交叉:crossover 在两个染色体的某一相同位置处DNA被切断,其前后两串分别交叉组合形成两个新的染色体。又称基因重组,俗称“杂交”。
变异:mutation 在细胞进行复制时可能以很小的概率产生某些复制差错,从而使DNA发生某种变异,产生出新的染色体,这些新的染色体表现出新的性状。
编码:coding 表现型到基因型的映射
解码:decoding 从基因型到表现型的映射
二、遗传算法的步骤:
1、对种群中的每个个体进行编码:
1> 编码原则:
完备性(completeness):问题空间的所有解都能表示为所设计的基因型
健全性(soundness):任何一个基因型都对应于一个可能解
非冗余性(non-redundancy):问题空间和表达空间一一对应
2>编码方式:
二进制编码、浮点数编码、格雷码编码、符号编码、复数编码、DNA编码等。
2、适应度评估:
在该步中,我们需要对每一个中种群中的个体进行适应度评估,因此适应度函数的选择直接影响遗传算法的收敛速度以及能否找到最优解。
一般而言,适应度函数是由目标函数变换而成的,对目标函数值域的某种映射变换称为适应度的尺度变换(fitness
scaling)。
1>直接转换法:
若目标函数为最大化问题:适应度函数Fit(f (x)) = f (x)
若目标函数为最小化问题:适应度函数Fit(f (x)) = -f (x)
2>界限构造法1
若目标函数为最大化问题:
若目标函数为最小化问题:
3>界限构造法2
若目标函数为最大化问题:
若目标函数为最小化问题:
3、选择:
对于上一步计算出来的适应度进行选择,就是我们所说的物竞天择,常用的选择方法有:
轮盘赌选择法(roulette wheel selection):
随机遍历抽样法(stochastic universal sampling):
遇到的问题:
早熟现象——适应度高的个体迅速繁殖,使搜索过程过早结束;
种群中个体的适应度接近,导致进化过程陷入局部最优点。
4、复制
5、交叉/基因重组
1>实值重组
离散重组:子个体的每个变量可以等概率地随机挑选父个体对应的变量。
中间重组:子个体=父个体1+α×(父个体2-父个体1)
α是比例因子,由[-d,1+d]上服从均匀分布的随机数产生,d = 0时为中间重组,一般取d = 0.25。子代的每个变量均产生一个α。
线性重组:
2>二进制交叉
单点交叉:
多点交叉:
均匀交叉:
6、变异:
1>实值变异:
2>二值变异:
某一基因座以一小概率变异(编码取反)。
7、进入第2步,对新产生的个体进行下一轮的:适应度评估—选择—复制—交叉—变异,一直到算法收敛,迭代结束,求出最优解。
三、实例化:
求一元函数的最大值:
1、首先进行编码:
由于精度是10的负六次方,区间长度为2-(-1)=3,所以应该分为3x10^6份。由于
所以我们用22位二进制编码来表示每个个体。
2、产生种群:产生的方式是随机的,长度为22的二进制字符串,种群规模的大小可以是30或50个。
1111010011100001011000
1100110011101010101110
1010100011110010000100
1011110010011100111001
0001100101001100000011
0000011010010000000000
1100110011101010101110
1010100011110010000100
1011110010011100111001
0001100101001100000011
0000011010010000000000
........
3、计算适应度:本体直接将目标函数当做适应度函数。
1>将随机产生的个体的二进制编码转换成十进制数,然后利用公式转换成对应的[-1,2]的区间的实数。
如:
1000101110110101000111对应为0.637197
2>计算x的函数值(适应度):当x=0.637197时,
4、选择:轮盘赌选择法
5、交叉:单点交叉
6、变异:小概率变异
7、模拟结果:
设置参数:种群大小50;交叉概率0.75;变异概率0.05;最大代数200。
得到的最佳个体为1111001100111011111100
最大的f=3,8503,对应的x=1.8506
PS:关于交叉跟变异:
交叉:交叉概率较大,只交叉后半部分,对总体的值影响不会很大。其几何意义是:交叉后在其领域附近进行自行组织搜索。
变异:概率小,变异后可能对总体的只影响比较大。其几何意义是:变异后,搜索的区域发生了很大的变化,如果偏离最优解,在下一轮中会被淘汰;如果接近最优解,会在下一轮中继续进行优化。