三、遗传算法的基本实现技术
笔者最近在学习遗传算法,希望可以通过笔记对遗传算法做一个简要的介绍与记录。也欢迎小伙伴们一起学习交流。
3.1 编码方法
遗传算法可以使得各种人工系统具有优良的自适应能力和优化能力。遗传算法所借鉴的生物学基础就是生物的遗传和进化。
- 编码原则一(有意义的积木块编码原则):应使用能易于产生与所求问题相关的且具有低阶、短定义长度模式的编码方案
- 编码原则二(最小字符集编码原则):应使用能使问题得到自然表示或者描述的具有最小编码字符集的编码方案
3.1.1 二进制编码方法
二进制编码符号串的长度与问题所要求的求解精度有关。假设某一个参数的取值范围为
[
U
m
i
n
,
U
m
a
x
]
[U_{min},U_{max}]
[Umin,Umax],我们用长度为l的二进制编码符号来表示该参数。
二进制编码的精度:
δ
=
U
m
a
x
−
U
m
i
n
2
l
−
1
\delta=\frac{U_{max}-U_{min}}{2^l-1}
δ=2l−1Umax−Umin
假设一个个体的编码为:
X
:
b
l
b
l
−
1
b
l
−
2
.
.
.
b
2
b
1
X:b_lb_{l-1}b_{l-2}...b_2b_1
X:blbl−1bl−2...b2b1
则对应的解码公式为
x
=
U
m
i
n
+
(
∑
i
=
1
l
b
i
∗
2
i
−
1
)
∗
δ
x=U_{min}+(\sum_{i=1}^{l}b_i * 2^{i-1})*\delta
x=Umin+(i=1∑lbi∗2i−1)∗δ
3.1.2 格雷码编码方法
格雷码其连续的两个整数所对应的编码值之间仅仅只有一个码位是不同的,其余码位都完全相同。
假设有一个二进制编码为
B
=
b
m
b
m
−
1
b
m
−
2
.
.
.
b
2
b
1
B=b_mb_{m-1}b_{m-2}...b_2b_1
B=bmbm−1bm−2...b2b1,其对应的格雷码为
G
=
g
m
g
m
−
1
g
m
−
2
.
.
.
g
2
g
1
G=g_mg_{m-1}g_{m-2}...g_2g_1
G=gmgm−1gm−2...g2g1。则由二进制编码到格雷码的转换公式为:
{
g
m
=
b
m
g
i
=
b
i
+
1
⊕
b
i
,
i
=
m
−
1
,
m
−
2
,
.
.
.
,
1
\left\{ \begin{aligned} g_m=b_m \\ g_i=b_{i+1} \oplus b_i , && && && i=m-1,m-2,...,1 \end{aligned} \right.
{gm=bmgi=bi+1⊕bi,i=m−1,m−2,...,1
由格雷码到二进制编码转换公式为:
{
b
m
=
g
m
b
i
=
b
i
+
1
⊕
g
i
,
i
=
m
−
1
,
m
−
2
,
.
.
.
,
1
\left\{ \begin{aligned} b_m=g_m \\ b_i=b_{i+1} \oplus g_i , && && && i=m-1,m-2,...,1 \end{aligned} \right.
{bm=gmbi=bi+1⊕gi,i=m−1,m−2,...,1
在格雷码中,任意两个整数的差是这两个整数多对应的格雷码之间的海明距离。并且格雷码便于提高遗传算法的局部搜索能力。
3.1.3 浮点数编码方法
所谓的浮点数编码方法,是指个体的每个基因值都用某一范围内的一个浮点数来表示,个体的编码长度等于其决策变量的个数。但是要注意在进行交叉运算的时候,必须在两个基因的分界字节处进行,而不能在某个基因的中间字节分隔处进行。
3.1.4 符号编码方法
符号编码的方法是指个体染色体编码串中的基因值取自一个无数值含义,而只有代码含义的符号集。
3.1.5 多参数级联编码方法
对含有多个变量的个体进行编码的方法就叫做是 多参数编码方法。
将各个参数分别以某种编码方法进行编码,然后再将它们的编码按一定的顺序连接在一起就组成了全部参数的个体编码。
3.1.6 多参数交叉编码方法
基本思想是:将各个参数中起主要作用的编码位集中在一起,这样它们就不易于被遗传算子破坏掉。
3.2 适应度函数
3.2.1 目标函数与适应度函数
最优化问题可以分为两大类,即一类为求目标函数的全局最大值,另一类为求目标函数的全局最小值。而这两者,我们已经在前面介绍过了。
3.2.2 适应度尺度变换
为了克服早期收敛现象,我们希望在遗传算法的初期对一些适应度较高的个体进行控制,降低其适应度与其它个体适应度之间的的差异程度;为了能够保持对某些区域进行重点搜索,我们希望能够在遗传算法后期对个体的适应度进行适当的放大,扩大最佳个体适应度与其它个体适应度之间的差异程度,以提高个体之间竞争性。
适应度尺度变换:
- 线性尺度变换
F ′ = a F + b F'=aF+b F′=aF+b
需要满足的条件:
(1) .尺度变换后全部个体的新适应度的平均值 F a v g ′ F'_{avg} Favg′要等于其原来适应度的平均值 F a v g F_{avg} Favg,这是为了保证群体中适应度接近于平均适应度的个体能够有期待的数量被遗传到下一代群体中。
(2). 尺度变换后群体中新的最大适应度 F ‘ m a x F‘_{max} F‘max要等于其原平均适应度 F a v g F_{avg} Favg的指定倍数(C倍),C为最佳个体的期望复制数量,对于群体规模大小为50-100个个体的情况,一般取C为1.2-2.这是为了保证群体中最好的个体能够期望复制C倍到新一代个体中。 - 乘幂尺度变换
F ′ = F k F'=F^k F′=Fk - 指数尺度变换
KaTeX parse error: Undefined control sequence: \betaF at position 9: F'=exp(-\̲b̲e̲t̲a̲F̲)
即新的适应度是原来适应度的某个指数。式中系数 β \beta β决定了选择的强制性,其越小,原有适应度较高的个体的新适应度就越与其它个体的新适应度相差较大,亦即越增加了选择该个体的强制性。
3.3 选择算子
选择操作的主要目的是为了避免基因缺失、提高全局收敛性和计算效率。
3.3.1 比例选择
设群体大小为M,个体i的适应度为
F
i
F_i
Fi,则个体i被选中的概率
p
i
p_i
pi为:
p
i
s
=
F
i
/
∑
i
=
1
M
F
i
(
i
=
1
,
2
,
.
.
.
,
M
)
p_{is}=F_i/\sum_{i=1}^{M}F_i \quad(i=1,2,...,M)
pis=Fi/i=1∑MFi(i=1,2,...,M)
3.3.2 最优保存策略
即当前群体中适应度最高的个体不参与交叉运算和变异运算,而是用它来替换掉本代群体中经过交叉、变异等遗传操作后所产生的适应度最低的个体。
另外,该策略还可以进行推广,即在每一代的进化过程中保留多个最优个体不参加交叉、变异等遗传运算,而直接将它们复制到下一代群体中。这种选择方法也叫做 稳态复制。
3.3.3 确定式采样选择
该方法想要按照一种确定的方式来进行选择操作。过程是:
- 计算群体中各个个体在下一代群体中期望生存数目
N
i
N_i
Ni
N i = M ∗ F i / ∑ i = 1 M F i ( i = 1 , 2 , . . . , M ) N_i=M *F_i /\sum_{i=1}^{M}F_i(i=1,2,...,M) Ni=M∗Fi/i=1∑MFi(i=1,2,...,M) - 用 N i N_i Ni的整数部分 ⌊ N i ⌋ \lfloor N_i \rfloor ⌊Ni⌋确定各个对应个体在下一代群体中的生存数目。其中 ⌊ x ⌋ \lfloor x \rfloor ⌊x⌋ 代表取不大于x的最大的整数。由该步骤就可以确定出下一代群体中的 ∑ i = 1 M ⌊ N i ⌋ \sum_{i=1}^M\lfloor N_i \rfloor ∑i=1M⌊Ni⌋个个体
- 按照 N i N_i Ni的小数部分对个体进行降序排序,顺序取前M- ∑ i = 1 M ⌊ N i ⌋ \sum_{i=1}^M\lfloor N_i \rfloor ∑i=1M⌊Ni⌋个个体加入到下一代群体中,这样就可以完全确定出下一代群体中的M个个体。
3.3.4 无回放随机选择
也称为 期望值选择方法,它的基本思想就是根据每个个体在下一代群体中的生存期望值来进行随机选择运算。
- 计算群体中每个个体在下一代群体中的生存期望数目
N
i
N_i
Ni:
N i = M ∗ F i / ∑ i = 1 M F i ( i = 1 , 2 , . . . , M ) N_i=M *F_i /\sum_{i=1}^{M}F_i(i=1,2,...,M) Ni=M∗Fi/i=1∑MFi(i=1,2,...,M) - 若某一个个体每选中参与交叉运算,则它在下一代中的生存期望数目减去0.5,若未被选中参与交叉运算,则它在下一代中的生存期望减去1.0
- 随着选择过程的进行,若某一个个体的生存期望值小于0,则该个体就不会再有机会被选中。
3.3.5 无回放余数随机选择
过程如下:
- N i = M ∗ F i / ∑ i = 1 M F i ( i = 1 , 2 , . . . , M ) N_i=M *F_i /\sum_{i=1}^{M}F_i(i=1,2,...,M) Ni=M∗Fi/i=1∑MFi(i=1,2,...,M)
- 用 N i N_i Ni的整数部分 ⌊ N i ⌋ \lfloor N_i \rfloor ⌊Ni⌋确定各个对应个体在下一代群体中的生存数目。由该步骤就可以确定出下一代群体中的 ∑ i = 1 M ⌊ N i ⌋ \sum_{i=1}^M\lfloor N_i \rfloor ∑i=1M⌊Ni⌋个个体
- 以
F
i
−
⌊
N
i
⌋
∗
∑
i
=
1
M
F
i
/
M
F_i-\lfloor N_i \rfloor *\sum_{i=1}^{M}F_i/M
Fi−⌊Ni⌋∗∑i=1MFi/M为各个个体新的适应度,用比例选择方法来随机确定下一代群体中还未确定的
M
−
⌊
N
i
⌋
M-\lfloor N_i \rfloor
M−⌊Ni⌋个个体。
这种选择操作方法可以确保适应度比平均适应度大一些的个体一定能被遗传到下一代个体中。
3.3.6 排序选择
对群体中的所有个体按照其适应度大小进行排序,基于这个排序来分配各个个体被选中概率。
- 对群体中的所有个体按其适应度大小进行降序排序。
- 根据具体求解问题,设计一个概率分配表,将各个概率值按上述排列次序分配给各个个体。
- 以各个个体所分配的概率值作为其能够被遗传到下一代的概率,基于这些概率的方法来产生下一代群体。
3.3.7 随机联赛选择
是一种基于个体适应度之间大小关系的选择方法。
- 从群体中随机选取N个个体进行适应度大小的比较,将其中适应度最高的个体遗传到下一代群体中。
- 将上述过程重复M次,就可以得到下一代群体中的M个个体。
3.4 交叉算子
在遗传算法中,在交叉运算之前还需要先对群体中的个体进行配对。交叉算子主要考虑以下两方面的内容:
- 如何确定交叉点的位置
- 如何进行部分基因交换
3.4.1 单点交叉
3.4.2 双点交叉与多点交叉
3.4.3 均匀交叉
两个配对个体的每一个基因座上的基因都以相同的交叉概率进行交换,从而形成两个新的个体。其具体运算可以通过设置一屏蔽字来确定新个体的各个基因如何由哪一个父代个体来提供。
1.随机产生一个与个体编码串长度等长的屏蔽字
W
=
w
1
w
2
w
3
.
.
.
w
i
.
.
.
w
l
W=w_1w_2w_3...w_i...w_l
W=w1w2w3...wi...wl,其中l为个体编码的串的长度
2. 由下述规则从A、B两个父代个体中产生两个新的子代个体。
- 若 w i = 0 w_i=0 wi=0,则A’在第i个基因座上的基因值继承A的对应基因值,B’则继承B的
- 若 w i = 1 w_i=1 wi=1,则A’在第i个基因座上的基因值继承B的对应基因值,B’则继承A的
3.4.4 算术交叉
指两个个体的线性组合而产生出两个新的个体。为了能够进行线性组合运算,算数交叉的操作对象一般由浮点数编码所表示的个体。
假设在两个个体
A
A
t
A^t_A
AAt、
B
B
t
B^t_B
BBt之间进行算术交叉,则交叉运算后的个体:
{
X
A
t
+
1
=
α
X
B
t
+
(
1
−
a
)
X
A
t
X
B
t
+
1
=
α
X
A
t
+
(
1
−
a
)
X
B
t
\left\{ \begin{aligned} X_A^{t+1} =\alpha X_B^t+(1-a)X_A^t\\ X_B^{t+1} =\alpha X_A^t+(1-a)X_B^t \end{aligned} \right.
{XAt+1=αXBt+(1−a)XAtXBt+1=αXAt+(1−a)XBt
,其中
α
\alpha
α可以是一个常数,此时所进行的交叉运算就叫均匀算术交叉;它也可以是由进化代数所决定的变量,此时所进行的交叉叫非均匀算术交叉
3.5变异算子
交叉算子与变异算子相互配合,共同完成对搜索空间的全局搜索和局部搜索。
主要涉及如下两部分内容:
- 如何确定变异点的位置
- 如何进行基因值替换
3.5.1 基本位变异
对个体编码串中以变异概率 p m p_m pm随机指定的某一位或者某几位基因座上的基因值做变异运算。
3.5.2 均匀变异
分别用符合某一范围内均匀分布的随机数,以某一较小的概率来替换个体编码各个基因座上的原有基因值。
3.5.3 边界变异
是上述均匀变异操作的一个变形遗传算法。在进行边界变异操作时,随机地取基因座的二个对应边界值之一去替代原有基因值。
3.5.4 非均匀变异
为了实现重点区域的局部搜索,我们不是取均匀分布的随机数去替换原有的基因值而是对原有的基因值做一个随机的扰动,被扰动后的结果作为变异后的新的基因值。对每个基因座都已相同的概率进行变异运算之后,相当于整个解向量在解空间中作了一个轻微的变动。这就是非均匀变异.
在进行由
X
=
x
1
x
2
.
.
.
x
k
.
.
.
x
l
X=x_1x_2...x_k...x_l
X=x1x2...xk...xl向
X
′
=
x
1
x
2
.
.
.
x
k
′
.
.
.
x
l
X'=x_1x_2...x'_k...x_l
X′=x1x2...xk′...xl的非均匀变异操作时,若变异点
x
k
x_k
xk的基因值取值范围为
[
U
m
i
n
k
,
U
m
a
x
k
]
[U_{min}^k,U_{max}^k]
[Umink,Umaxk],则新的基因值
x
k
′
x'_k
xk′ 由下式确定:
x
k
′
=
{
x
k
+
Δ
(
t
,
U
m
a
x
k
−
v
k
)
i
f
r
a
n
d
o
m
(
0
,
1
)
=
0
x
k
−
Δ
(
t
,
v
k
−
U
m
a
x
k
)
i
f
r
a
n
d
o
m
(
0
,
1
)
=
1
x'_k= \left\{ \begin{aligned} x_k+\Delta(t,U^k_{max}-v_k)&& if random(0,1)=0\\ x_k-\Delta(t,v_k-U^k_{max})&& if random(0,1)=1 \end{aligned} \right.
xk′={xk+Δ(t,Umaxk−vk)xk−Δ(t,vk−Umaxk)ifrandom(0,1)=0ifrandom(0,1)=1
式中,
Δ
(
t
,
y
)
\Delta (t,y)
Δ(t,y)(y表示
U
m
a
x
k
−
v
k
U^k_{max}-v_k
Umaxk−vk和
v
k
−
U
m
a
x
k
v_k-U^k_{max}
vk−Umaxk) 表示[0,y]范围内符合非均匀分布的一个随机数,要求随着进化代数t的增加,
Δ
(
t
,
y
)
\Delta (t,y)
Δ(t,y)接近于0的概率也逐渐增加。
由以上可以知道,非均匀变异可以使得遗传算法在其初始阶段进行均匀随机搜索,而后在后期进行局部搜索,所以其产生的新基因值比均匀搜索所产生的基因值更加接近于原有的基因值。
3.5.5 高斯变异
所谓高斯变异就是在进行变异操作时,使用符合均值为 μ \mu μ,方差为 σ 2 \sigma ^2 σ2的正态分布的一个随机值去替换原来的基因值。
3.6 遗传算法的运行参数
3.7 约束条件的处理方法
实际应用中的优化问题一般都含有一定的约束条件,它们的描述方式各种各样。暂时未找到通用方法
3.7.1 搜索空间限定法
基本思想是 对遗传算法的搜索空间的大小加以限制,使得搜索空间中表示一个个体与解空间中表示一个可行解具有一一对应的关系。
- 方法一:用编码的方法来保证总是产生出在解空间中有对应可行解的染色体。
- 方法二:用程序来保证直到产生出在解空间中有对应可行解的染色体之前,一直都进行交叉运算和变异运算。
3.7.2 可行解变换法
基本思想: 在由个体基因型到个体表现型的变换中,增加使其满足约束条件的处理过程。即寻找出一种个体基因型和个体表现型之间的多对一的变换关系,使进化过程中所产生的个体总能够通过这个变换转化为解空间中满足约束条件的一个可行解。
3.7.3 罚函数法
基本思想是 对在解空间中无对应可行解的个体,计算其适应度时,处以一个罚函数,从而降低该个体的适应度,使得该个体被遗传到下一代群体中的机会减少。
F
′
(
X
)
=
{
F
(
X
)
(
X
满
足
约
束
条
件
的
时
候
)
F
(
X
)
−
P
(
X
)
(
X
不
满
足
约
束
条
件
的
时
候
)
F'(X)=\left\{ \begin{aligned} F(X) && && && &&(X满足约束条件的时候)\\ F(X)-P(X)&& && &&(X不满足约束条件的时候) \end{aligned} \right.
F′(X)={F(X)F(X)−P(X)(X不满足约束条件的时候)(X满足约束条件的时候)