基本概念
串:个体的形式,在算法中为二进制串或者其它编码方式的串,对应于染色体。
种群:个体的集合称为种群,串是种群的元素。
种群规模:种群中个体的数量
基因:是串中的元素,表示个体的特征。
适应度:表示某一个体对于环境的适应程度
遗传算法把问题的解表示成“染色体”(在算法中即是以一定方式编码的串)。并且,在执行遗传算法之前,给出一群“染色体”,也即假设解(候选解)。然
后,把这些假设解置于问题的“环境”中,并按适者生存的原则,从中选择出较适应环境的“染色体”进行复制, 再通过交叉,变异过程产生更适应环境的新一
代“染色体”群。这样,一代一代地进化,最后就会收敛到最适应环境的一个“染色体”上, 它就是问题的最优解。
算法的四个组成部分:
- 编码机制
首先要对待解决问题的模型结构和参数进行编码,一般用字符串表示。 - 适应度函数
用适应度函数描述每一个体的适应程度。目的在于可根据其适应度对个体进行评估比较,定出优劣程度。 - 控制参数
需适当确定某些参数的值以提高选优的效果,如:
字符串所含字符的个数(串长)L、种群规模n(30-160)、交叉概率Pc(0.25-0.75)、变异概率Pm(0.01-0.2) - 遗传算子
- 选择算子:选择算子从种群中按某一概率成对选择个体,某个体 xi 被选择的概率Pi 与其适应度值成正比。最通常的实现方法是轮盘赌(roulette wheel)模型。
- 交叉算子:交叉算子将被选中的两个个体的基因链按概率Pc进行交叉,生成两个新的个体,交叉位置是随机的。其中Pc是一个系统参数。
- 变异算子:变异算子将新个体的基因链的各位按概率Pm进行变异, 对二值基因链(0,1编码)来说即是取反。
编码与解码
二进制编码方法
所构成的个体基因型是一个二进制编码符号串。
二进制编码串长度与问题所要求的求解精度有关。设某一参数的取值范围是[A, B],A<B,二进制编码的编码精度为:
浮点数编码方法
个体染色体编码串中的基因值用某一范围内的一个浮点数来表示,个体的编码长度等于其决策变量的个数。因为这种编码方法使用 的是决策变量的真实值,所以浮点数码方法也叫做真值编码方法。
符号编码方法
个体染色体编码串中的基因值取自一个无数值含义、而只有代码含义的符号集。符号集可以是字母表、数字序号表或者代码表({A1,A2,A3。。。})
适应度函数
如TSP问题的目标是路径总长度为最短, 路径总长度的倒数就可以为TSP的适应度函数:
遗传算子
变异算子
以变异概率Pm对某些个体的某些位执行变异。在变异时,对执行变异的串的对应位求反,即把1变为0,把0变为1。Pm的取值应该较小,一般0.0001- 0.1。
如:个体S=10101110,第1,4位置的基因进行变异则有:S’ = 00111110
在所有的个体一样时,交叉是无法产生新的个体。变异能保证算法过程不会产生无法进化的单一种群。
选择算子
轮盘赌选择机制、竞争选择、随机遍历抽样选择、锦标赛选择等。
令 Σfi 表示种群的适应度值之总和,fi 表示种群中第i个染色体的适应度值,则它产生后代的能力正好为其适应度值所占份额fi /Σfi (每个个体的选择概率)。
因此,适应度较高的个体,繁殖下一代的能力就较强。适应度较小的个体,繁殖下一代的能力就较弱,甚至被淘汰。
交叉算子
包括单点交叉、两点交叉、均匀交叉,采用浮点数编码时还有离散交叉和算术交叉。
适合二进制编码的交叉算子
- 单点交叉:在个体编码串中只随机设置一个交叉点,然后在该点相互交换配对个体的部分染色体。
如x1 = {1 0 1 1 0 0 1},x2 = {0 0 1 0 1 1 0}, 若交叉位置为4, x1’ = {1 0 1 1 1 1 0},x2’ = { 0 0 1 0 0 0 1} - 两点交叉:随机设置两个交叉点,然后进行部分基因交换。仍以x1和x2为例,交叉位置为3和5, x1’ = {1 0 1 0 1 0 1},x2’ = { 0 0 1 1 0 1 0}
- 均匀交叉:两个配对个体每个基因座上的基因都以相同的交叉概率进行交换。具体运算是通过设置屏蔽字来确定新个体的各个基因如何由哪个父代提供。
适合浮点数编码的交叉算子
二进制编码交叉算子也适用于浮点数编码,此外还有:
- 离散交叉:在个体之间交换变量的值,子个体的每个变量可按等概率随机地挑选父代个体。
- 算数交叉:由两个个体的线性组合产生出两个新的个体。x1、x2的后代为:x1’ = λ1*x1 + λ2*x2, x2 = λ1*x2 + λ2*x1(λ1、λ2为乘子)
一个例子
利用遗传算法求解区间[0,31]上的二次函数y=x^2的最大值。
分析:
原问题可转化为在区间[0, 31]中搜索能使y取最大值的点a的问题。[0, 31]中的点x就是个体, 函数值f(x)恰好就可以作为x的适应度, 区间[0, 31]就
是一个**(解)空间** 。这样, 只要能给出个体x的适当染色体编码, 该问题就可以用遗传算法来解决。
解决步骤:
1. 设定种群规模,编码染色体,产生初始种群。
将种群规模设定为4;用5位二进制数编码染色体;取下列个体组成初始种群S1 :
s1= 13 (01101), s2= 24 (11000), s3= 8 (01000), s4= 19 (10011)
2. 定义适应度函数:f (x)=x^2
3. 计算各代种群中的各个体的适应度, 并对其染色体进行遗传操作, 直到算法终止条件满足为止。
f (s1) = 13*13 = 169,f (s2) = 576, f (s3) = 64, f (s4) = 361
再计算种群S1中各个体的选择概率,公式为:
可得P(s1) = P(13) = 0.14,P(s2) = 0.49, P(s3) = 0.06, P(s4) = 0.31
轮盘赌选择法:
① 在[0, 1]区间内产生一个均匀分布的随机数r。
② 若r ≤ q1 ,则染色体x1被选中。
③ 若qk-1< r ≤ qk( 2 ≤ k ≤ N ),则染色体 xk 被选中。qi 称为染色体xi (i=1, 2, …, n)的积累概率,公式为:
得到种群:s1 ’ =11000(24), s2 ’ =01101(13) s3 ’ =11000(24), s4 ’ =10011(19)
于是,得到第二代种群S2 : s1=11001(25), s2=01100(12) s3=11011(27), s4=10000(16)
循环上述步骤
假设这一轮选择操作中,种群S2中的4个染色体都被选中,则得到种群:
s1 ’=11001(25), s2 ’= 01100(12) s3 ’=11011(27), s4 ’= 10000(16)
做交叉运算,让s1 ’与s2 ’ ,s3 ’与s4 ’ 分别交换后三位基因,得:
s1 ’’ =11100(28), s2 ’’ = 01001(9) s3 ’’ =11000(24), s4 ’’ = 10011(19)
这一轮仍然不会发生变异。
设这一轮的选择结果为:
s1 ’=11100(28), s2 ’=11100(28) s3 ’=11000(24), s4 ’=10011(19)
做交叉运算,让s1 ’与s4 ’ ,s2 ’与s3 ’ 分别交换后两位基因,得
s1 ’’=11111(31), s2 ’’=11100(28) s3 ’’=11000(24), s4 ’’=10000(16)
这一轮仍然不会发生变异。
于是,得第四代种群S4 :
s1=11111(31), s2=11100(28) s3=11000(24), s4=10000(16)
这一代种群中已经出现了适应度最高的染色体s1=11111。