遗传算法是一种仿生全局优化算法,模仿生物的遗传进化原理,通过选择、交叉和变异等操作机制,使种群中的个体的适应性不断提高。
生物遗传概念 | 遗传算法中的应用 |
---|---|
适者生存 | 目标值比较大的解被选择的可能性大 |
个体(Individual) | 解 |
染色体(Chromosome) | 解的编码(字符串、向量等) |
基因(Gene) | 解的编码中每一分量 |
适应性(Fitness) | 适应度函数值 |
群体(Population) | 根据适应度值选定的一组解(解的个数为群体的规模) |
婚配(Marry) | 交叉(Crossover)选择两个染色体进行交叉产生一组新的染色体的过程 |
变异(Mutation) | 编码的某一分量发生变化的过程 |
编码方案:怎样把优化问题的解进行编码。
适应度函数:怎样根据目标函数构建适应度函数。
选择策略:优胜劣汰。
控制参数:种群的规模、算法执行的最大代数、执行不同遗传操作的概率等。
遗传算子:选择、交叉、变异。
算法终止准则:规定一个最大的演化代数,或算法在连续多少代以后解的适应值没有改进。
遗传算法通常包括如下工作:
遗传算法首先要用字符串表达所研究的问题,这
称作编码。表达问题的字符串相当于遗传学中的染
色体。每个字符串称作个体。每一遗传代次中个体
的组合称为群体。
遗传算法中,常用随机的方法产生初始群体,
即随机生成一组任意排列的字符串。群体中个体
的数目通常也是固定的。
衡量字符串(染色体)好坏的指标是适应度
(Fitness),它通常也就是遗传算法中的目标函数。
适应度是今后优胜劣汰的主要判据。
为了将已有的群体变为下一代群体,遗传算法仿
效进化论中“自然选择,适者生存”的原则,从旧群
体中选择优良个体予以复制,直接进入下一代群体。
选择的依据是个体适应度的大小,适应度大的个体接
受复制,使之繁殖;适应度小的个体则予删除,使之
死亡。
通过复制产生新群体,其总体性能得到改善,然而却不能产生新的个体。为了产生新的个体,遗传算法仿照生物学中交叉的方法,对染色体(字符串)的某些部分进行交叉换位。被交换的母体都选自经过复制产生的新一代个体(优胜者)。
遗传算法模仿生物学中基因变异的方法,将个体字符
串某位符号进行逆变,即由1变为0或由0变为1。例如,下
式左侧的个体于第3位变异,得到新个体如下面所示:{10000}->{10100}
反复执行上述(3)-(6)项工作,直至得出满意的最
优解。
总结:通过上述函数极值求解的例子可以看出,遗传算法仿效生物进化和遗传的过程,从随机生成的初始可行解出发,利用复制、交叉、变异等操作,遵循优胜劣汰的原则,不断循环执行,逐渐逼近全局最优解。
二进制编码:用若干二进制数表示一个个体,将原问题
的解空间映射到位串空间 B={0,1}上,然后在位串空
间上进行遗传操作。
(1)根据问题固有知识,把握最优解所占空间在整
个问题空间中的分布范围,然后,在此分布范围内设
定初始群体。
(2)随机产生一定数目的个体,从中挑选最好的个
体加到初始群体中。这种过程不断迭代,直到初始群
体中个体数目达到了预先确定的规模。
群体规模太小,遗传算法的优化性能不太好,易陷
入局部最优解。群体规模太大,计算复杂。一般种群规模设置为20-100
若目标函数为最大化问题,则(()) = ()
若目标函数为最小化问题,则(()) = 1/()
将目标函数转换为求最大值的形式,且保证函数值非负!
若目标函数为最大化问题,则
(()) = f(x)-Cmin,如果f(x)>Cmin
(()) =0,其它情况
若目标函数为最小化问题,则
(()) = Cmax-f(x),如果f(x)(()) =0,其它情况
过早收敛:缩小这些个体的适应度,以降低这些超级个体的竞争力。
停滞现象:改变原始适应值的比例关系,以提高个体之间的竞争力。
适应度函数的尺度变换(fitness scaling)或者定标:
对适应度函数值域的某种映射变换。
(1)线性变换:′ = +
(2)幂函数变换法: ′ = f^k
(3)指数变换法: ′ = e^(-af)
个体选择概率分配方法
选择操作也称为复制(reproduction)操作:从当前群体中按照一定概率选出优良的个体,使它们有机会作为父代繁殖下一代子孙。
判断个体优良与否的准则是各个个体的适应度值:个体适应度越高,其被选择的机会就越多。
(1)适应度比例方法(fitness proportional model)或蒙特卡罗法(Monte Carlo)
▪ 各个个体被选择的概率和其适应度值成比例。
▪ 个体 被选择的概率为(M为群体规模大小):Psi=fi/(∑fi)
(2) 排序方法 (rank-based model)
① 线性排序:J. E. Bak
➢ 群体成员按适应值大小从好到坏依次排列:1, 2,⋅⋅⋅,
个体xi分配选择概率 =(a-bi)/(M(M+1)),a,b为常数,按转盘式选择的方式选择父体② 非线性排序: Z. Michalewicz
将群体成员按适应值从好到坏依次排列,并按下式分
配选择概率:Pi=q(1-q)^(i-1),i=1,2,M-1;
;Pi=(1-q)^(M-1),i=M
▪ 可用其他非线性函数来分配选择概率,只要满足以
下条件:(1) 若 = 1,2 ⋅⋅⋅, 且 (1) ≥ (2) ≥. . . ≥ (), 则满足1 ≥ 2 ≥⋅⋅⋅≥ ;(2)∑Pi=1;
(1)转盘赌选择
➢ 按个体的选择概率产生一个轮盘,轮盘每个区的角度与个体的选择概率成比例。
➢ 产生一个随机数,它落入转盘的哪个区域就选择相应的个体交叉。
假设第1轮产生一个随机数:0.81 对应个体为6
假设第2轮产生一个随机数:0.32 对应个体为2
(2)锦标赛选择方法
▪ 锦标赛选择方法:从群体中随机选择个体,将其中适应度最高的个体保存到下一代。这一过程反复执行,直到保存到下一代的个体数达到预先设定的数量为止。
▪ 随机竞争方法(stochastic tournament):每次按赌轮选择方法选取一对个体,然后让这两个个体进行竞争,适应度高者获胜。如此反复,直到选满为止。
(3)最佳个体保存方法
▪ 最佳个体(elitist model)保存方法:把群体中适应度最高的个体不进行交叉而直接复制到下一代中,保证遗传算法终止时得到的最后结果一定是历代出现过的最高适应度的个体。
一点交叉:在个体串中随机设定一个交叉点,实行
交叉时,该点前或后的两个个体的部分结构进行互换,
并生成两个新的个体。
▪ 二点交叉:随机设置两个交叉点,将两个交叉点之
间的码串相互交换。
(1)位点变异:群体中的个体码串,随机挑选一个或多个基因座,并对这些基因座的基因值以变异概率作变动。
(2)逆转变异:在个体码串中随机选择两点(逆转点),然后将两点之间的基因值以逆向排序插入到原位置中。
(3)插入变异:在个体码串中随机选择一个码,然后将此码插入随机选择的插入点中间。
(4)互换变异:随机选取染色体的两个基因进行简单互换。
(5)移动变异:随机选取一个基因,向左或者向右移动
一个随机位数。
(1)使用随机方法或者其它方法,产生一个有N个染色 体的初始群体 pop(1),: = 1 ;
(2)对群体中的每一个染色体popi(t),计算其适应值 = (())
(3)若满足停止条件,则算法停止;否则,以概率pi=fi/∑fi从pop(t)中随机选择一些染色体构成一个新种群
( + 1) = {()| = 1,2, . . . , }
(4)以概率 pc进行交叉产生一些新的染色体,得到一个新的群体( + 1)
(5)以一个较小的概率pm 使染色体的一个基因发生变异,形成 mutpop(t+1); t:=t+1,成为一个新的群体pop(t)=mutpop(t+1);返回(2).
求一元函数f(x)的最大值:() = sin( 10 ∗ ) + 2.0 , ∈ [−1,2],要求求解精度到6位小数。
❖ 表现型:x
❖ 基因型:二进制编码(串长取决于求解精度)
按编码原理:假设要求求解精度到6位小数,区间长度为2-(-1)=3,即需将区间分为3/0.000001=3×106等份。
所以编码的二进制串长应为22位。
❖ 产生的方式:随机
❖ 产生的结果:长度为22的二进制串
❖ 产生的数量:种群的大小(规模),如30,50
1111010011100001011000
1100110011101010101110
1010100011110010000100
1011110010011100111001
0001100101001100000011
0000011010010000000000
……
直接用目标函数作为适应度函数
解码:将个体s转化为[-1,2]区间的实数:s=<1000101110110101000111>->x=0.637197
计算x的函数值(适应度):
f(x)=xsin(10pix)+2.0=2.586345
❖ 选择:比例选择法;
❖ 交叉:单点交叉;
❖ 变异:小概率变异
❖ 设置的参数:
种群大小50;交叉概率0.75;变异概率0.05;
最大代数200
得到的最佳个体: smax=<1111001100111011111100>;
xmax=1.8506;f(xmax)=3.8503;
模拟结果
进化的过程:
世代数 | 自变量 | 适应度 |
---|---|---|
1 | 1.4495 | 3.4494 |
9 | 1.8395 | 3.7412 |
17 | 1.8512 | 3.8499 |
30 | 1.8505 | 3.8503 |
50 | 1.8506 | 3.8503 |
80 | 1.8506 | 3.8503 |
120 | 1.8505 | 3.8503 |
200 | 1.8505 | 3.8503 |
这篇博客有详细介绍,这里就不说了。
详细介绍
注意:在交叉操作中采用部分匹配交叉算子执行交叉操作。能够有效地继承双亲的部分基因成分,达到了进化的遗传功能,使该遗传算法并不盲目搜索,二是趋向于使群体具有更多的优良基因。交叉后,考察父个体与子个体的适应度来决定是否更新种群。具体操作过程如下(以0~9编码为例):
父个体:(“|”表示交叉点)
A1:(012|3456|789)
A2:(429|0853|176)
第一步:保留交叉点的中间部分
第二步:交换对应位置的子串
这样操作完之后字串变为:
A1:(429|3546|176)
A2:(012|0853|789)
你会发现在这两个串中头部和尾部都和交叉点中间的数有重合,这里就要消除冲突,解决方法:
对于A1:头部的4和交叉点中的4冲突,找到A1交叉点中的4的位置对应A2中的5,然后5又和A1交叉点中的5冲突,再找到A1交叉点中的5的位置对应A2中的8,这次没有冲突,将A1头部的4改写为8,其它冲突的字同样操作,最后结果为:
A1:(829|3546|170)
A2:(612|0856|749)
基本结论:
(1)遗传算法搜索求解能力与四个因素有关:群体规模、选择算子、交叉率和变异率 。
(2)从主到次依次为:交叉率——群体规模——选择算子——变异率。
- 编码/解码:两个染色体(显性、隐性)
- 复制算子:计算显性染色体的适应度,按照显性染色体的复制概率将个体复制到下一代群体中。
- 交叉算子:两个个体的显性染色体交叉、隐性染色体也同时交叉。
- 变异算子:个体的显性染色体按正常的变异概率变异;隐性染色体按较大的变异概率变异。
- 双倍体遗传算法显隐性重排算子:个体中适应值较大的染色体设为显性染色体,适应值较小的染色体设为隐性染色体。
- 在遗传算法中使用多种群同时进化,并交换种群之间优秀个体所携带的遗传信息,以打破种群内的平衡态达到更高的平衡态,有利于算法跳出局部最优。
- 多种群遗传算法:建立两个遗传算法群体,分别独立地运行复制、交叉、变异操作,同时当每一代运行结束以后,选择两个种群中的随机个体及最优个体分别交换。
- 编码/解码设计
- 交叉算子、变异算子
- 杂交算子:设种群A与种群B,当A与B种群都完成了选择、交叉、变异算子后,产生一个随机数num,随机选择A中num个个体与A中最优个体,随机选择B中num个个体与B中最优个体,交换两者,以打破平衡态。
- Srinvivas M.,Patnaik L. M.等在1994年提出一种自适应遗传算法(adaptive genetic algorithms,AGA): 能随适应度自动改变。
- AGA:当种群各个体适应度趋于一致或者趋于局部最优时,使pc 和pm增加,以跳出局部最优;而当群体适应度比较分散时,使pc 和pm 减少,以利于优良个体的生存。
- 同时,对于适应度高于群体平均适应值的个体,选择较低的pc 和pm ,使得该解得以保护进入下一代;对低于平均适应值的个体,选择较高的pc 和pm 值,使该解被淘汰。
- 编码/解码设计。
- 初始种群产生:N(N 是偶数)个候选解,组成初始解集。
- 定义适应度函数为f=1/ob ,计算适应度fi 。
- 按轮盘赌规则选择N 个个体,计算favg和fmax 。
- 将群体中的各个个体随机搭配成对,共组成N/2对,对每一对个体,按照自适应公式计算自适应交叉概率 pc,随机产生R(0,1),如果R
c 则对该对染色体进行交叉操作。
- 对于群体中的所有个体,共N个,按照自适应变异公式计算自适应变异概率 pm,随机产生 R(0,1),如果R
m则对该染色体进行交叉操作。
- 计算由交叉和变异生成新个体的适应度,新个体与父代一起构成新群体。
- 判断是否达到预定的迭代次数,是则结束;否则转(4)。
解:
交叉操作完变为:
p1=(182|4567|93)
p2=(423|1876|59)