遗传算法(Genetic Algorithms,GA)
遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
通常将实际问题的参数编码为二进制串进行遗传操作,从而搜寻最优解。将每个二进制串染色体视为一个向量,则每个向量代表着实际优化问题中的一个参数。每个参数可以被编码为任意长度的bits,而总的bits的数目则代表的待搜索的二进制高维空间的维数。eg,假设问题有
w
w
w个参数,每个参数有
b
b
b个bits进行表示,则表示每个解空间的个体由
w
⋅
b
w\cdot b
w⋅b个bit构成,那么待搜索的二进制高维空间的维度则为
2
w
b
2^{wb}
2wb。在GA中,问题的待优化变量组成显性位空间,给定的变量的确定值被称为显性位;编码的二进制串中的操作构成基因位空间,这些二进制串被称为基因位。
GA的主要组成
- 问题的解到染色体的编码;
- 确定一个函数来计算适应度值,用于评估个体的优劣;
- 种群初始化;
- 遗传算子:选择,复制,变异,交叉
编码
以典型的二进制编码为例,每个参数变量被编码为固定长度为
n
d
n_d
nd个bits的二进制串染色体。对离散问题较为有效,但对于连续问题,则需要将每个连续的函数映射到
n
d
n_d
nd个bits的向量,即:
ϕ
:
ℜ
→
(
0
,
1
)
n
d
\phi:\Re\to(0,1)^{n_d}
ϕ:ℜ→(0,1)nd。连续空间需要被限制到一个有限的范围
[
x
m
i
n
,
x
m
a
x
]
[x_{min}, x_{max}]
[xmin,xmax],一个标准的二进制编码转换框架可以描述如下:
x
=
(
x
1
,
⋯
,
x
j
,
⋯
,
x
n
x
)
\displaystyle \mathbf{x}=(x_1,\cdots,x_j,\cdots,x_{n_x})
x=(x1,⋯,xj,⋯,xnx),其中
x
j
∈
ℜ
x_j\in\Re
xj∈ℜ,将其转换为二进制个体为
b
=
(
b
1
,
⋯
,
b
j
,
⋯
,
b
n
x
)
\displaystyle \mathbf{b}=(\mathbf{b_1},\cdots,\mathbf{b_j},\cdots,\mathbf{b_{n_x}})
b=(b1,⋯,bj,⋯,bnx),其中,
b
j
=
(
b
(
j
−
1
)
n
d
+
1
,
⋯
,
b
j
n
d
)
\displaystyle \mathbf{b_j}=(b_{(j-1)n_d+1},\cdots,b_{jn_d})
bj=(b(j−1)nd+1,⋯,bjnd),其中
b
l
∈
{
0
,
1
}
b_l\in\{0,1\}
bl∈{0,1},总bits数
n
b
=
n
x
∗
n
d
n_b=n_x*n_d
nb=nx∗nd。而每一个已经编码好的
b
j
\mathbf{b_j}
bj到浮点数的转换可以用函数映射表示,即:
Φ
j
:
{
0
,
1
}
n
d
→
[
x
m
i
n
,
j
,
x
m
a
x
,
j
]
\displaystyle\Phi_j:\{0,1\}^{n_d}\to[x_{min,j}, x_{max,j}]
Φj:{0,1}nd→[xmin,j,xmax,j],即
Φ
j
(
b
)
=
x
m
i
n
,
j
+
x
m
a
x
,
j
−
x
m
i
n
,
j
2
n
d
−
1
(
∑
l
=
1
n
d
−
1
b
j
(
n
d
−
1
)
⋅
2
l
)
\displaystyle \Phi_j(\mathbf{b})=x_{min,j}+\frac{x_{max,j}-x_{min,j}}{2^{n_d}-1}(\sum^{n_d-1}_{l=1}b_{j(n_d-1)}\cdot2^l)
Φj(b)=xmin,j+2nd−1xmax,j−xmin,j(l=1∑nd−1bj(nd−1)⋅2l)。
实际上,采用编码后不能得到精确解,可以达到最大可获得的每个参数 x j x_j xj的解精度为: x m a x , j − x m i n , j 2 n d − 1 \displaystyle\frac{x_{max,j}-x_{min,j}}{2^{n_d}-1} 2nd−1xmax,j−xmin,j。
二进制编码的缺陷:海明悬崖问题,即当两个十进制数非常近时,他们的二进制数相差很远,eg, 7 = 0111 , 8 = 1000 7=0111,8=1000 7=0111,8=1000,他们的海明距离(表示进行位编码时,相应为不同的个数)为4。因此,需要声明,一个好的编码,应该是当变量变化小时,适应度函数的变化也很小。
因此,引进格雷码,格雷码和传统的二进制码之间的转换关系如下:
g
1
=
b
1
g_1=b_1
g1=b1
g
l
=
b
l
−
1
⋅
b
l
ˉ
+
b
ˉ
l
−
1
⋅
b
l
g_l=b_{l-1}\cdot \bar{b_l}+\bar{b}_{l-1}\cdot b_l
gl=bl−1⋅blˉ+bˉl−1⋅bl
其中,
b
l
b_l
bl是二进制数
b
1
b
2
⋯
b
n
b
b_1b_2\cdots b_{n_b}
b1b2⋯bnb的第l位,
b
l
ˉ
\bar{b_l}
blˉ指逻辑运算非,
+
+
+指逻辑运算或,
⋅
\cdot
⋅指逻辑运算且。
具体过程如下所示:
0
−
7
0~-7
0 −7的二进制码与格雷码的转换如下:
他们之间的海明距离变化如下:
融入二进制转换为格雷码,则映射规则应变为:
Φ j ( b ) = x m i n , j + x m a x , j − x m i n , j 2 n d − 1 ( ∑ l = 1 n d − 1 ( ∑ q = 1 n d − 1 b ( j − 1 ) ⋅ n d + q ) m o d 2 ) ⋅ 2 l \displaystyle \Phi_j(\mathbf{b})=x_{min,j}+\frac{x_{max,j}-x_{min,j}}{2^{n_d}-1}(\sum^{n_d-1}_{l=1}(\sum^{n_d-1}_{q=1}b_{(j-1)\cdot n_d+q})\,mod \,2)\cdot2^l Φj(b)=xmin,j+2nd−1xmax,j−xmin,j(l=1∑nd−1(q=1∑nd−1b(j−1)⋅nd+q)mod2)⋅2l。
种群初始化
种群初始化是GA算法解决问题的第一步,标准方法是随机生成,原则是初始种群是整个搜索空间的均匀分布。初始种群的大小决定了GA的搜索能力,越大,个体多样性越大,搜索能力越大,但每一次迭代需要的计算复杂度和计算时间也会越大。因此,当种群小时,对应的迭代次数就要变大;种群大时,对应的迭代次数可以相应的减小。
适应度函数
适应度函数用来衡量个体的生存能力,它从染色体空间映射到一个实数标量:
f
:
Γ
n
x
→
ℜ
f:\Gamma^{n_x}\to\Re
f:Γnx→ℜ,其中
Γ
\Gamma
Γ代表
n
x
n_x
nx维染色体的数据类型。适应度函数代表着优化问题中的目标函数
Ψ
\Psi
Ψ,一个更加详细的表示为:
f
:
S
C
→
Φ
S
X
→
Ψ
ℜ
→
γ
ℜ
+
\displaystyle f:\mathcal{S_C}\stackrel{\Phi}{\to}\mathcal{S}_X\stackrel{\Psi}{\to}\Re\stackrel{\gamma}{\to}\Re_+
f:SC→ΦSX→Ψℜ→γℜ+
其中,
S
C
\mathcal{S_C}
SC表示搜索空间的目标函数,
Φ
\Phi
Φ表示染色体编码函数,
Ψ
\Psi
Ψ表示目标函数,
γ
\gamma
γ表示缩放函数(可选,用于比例选择,以确保得到正的适应值)。
对待不同的优化问题,适应度函数的选择也不同,例如:
1.无约束优化问题:
S
C
=
S
X
\mathcal{S_C}=\mathcal{S}_X
SC=SX,即目标函数与适应度函数相同。
2.约束优化问题:适应度函数应当包含两项,一项是原始目标函数,另一项为约束的惩罚项;
3.多目标优化问题(MOP):MOPs可以被分解为带权重的多个问题,总的适应度函数应为对应权重子目标函数之和;
4.动态和噪声问题:动态问题的适应度函数随时间变化而变化,噪声问题应当加上高斯噪声成分。
选择
选择是GA 的主要操作之一,用于产生下一代更好的解个体,主要包含两个步骤:1.选择优良个体用于产生下一代(可直接复制,也可通过父代进行繁殖);2.复制:优良的个体应当有更多的机会被直接复制到下一代,以确保下一代中包含已得到的最优解其中,交叉和复制更加倾向于优良个体,变异倾向于较差的个体。
选择策略:
1.随机选择:
每个个体以相同的概率 1 n s \frac{1}{n_s} ns1被选择,没有使用适应度信息。
2.正比选择(轮盘赌):
倾向于选择适应度值高的个体。其个体被选择的概率为: φ s ( x i ( t ) ) = f γ ( x i ( t ) ) ∑ l = 1 n s f γ ( x l ( t ) ) \displaystyle\varphi_s(\mathbf{x}_i(t))=\frac{f_\gamma(\mathbf{x}_i(t))}{\sum^{n_s}_{l=1}f_\gamma(\mathbf{x}_l(t))} φs(xi(t))=∑l=1nsfγ(xl(t))fγ(xi(t)),其中, n s n_s ns是种群中的个体总数, f γ ( x i ( t ) ) f_\gamma(\mathbf{x}_i(t)) fγ(xi(t))是 x i \mathbf{x}_i xi缩放后的适应度函数。
对于最小化问题,其缩放函数可为:
1.
f
γ
(
x
i
(
t
)
)
=
γ
(
x
i
)
=
f
m
a
x
−
f
Ψ
(
x
i
(
t
)
)
f_\gamma(\mathbf{x}_i(t))=\mathbf{\gamma}(\mathbf{x}_i)=f_{max}-f_\Psi(\mathbf{x}_i(t))
fγ(xi(t))=γ(xi)=fmax−fΨ(xi(t)),其中
f
Ψ
(
x
i
(
t
)
)
=
Ψ
(
x
i
(
t
)
)
f_\Psi(\mathbf{x}_i(t))=\Psi(\mathbf{x}_i(t))
fΨ(xi(t))=Ψ(xi(t))是
x
i
\mathbf{x}_i
xi的原始适应度值,多数情况下,
f
m
a
x
f_{max}
fmax是未知的,因此可用到目前未知第t代最大适应度值
f
m
a
x
(
t
)
f_{max}(t)
fmax(t)替代;
或2. f γ ( x i ( t ) ) = γ ( x i ) = 1 1 + f Ψ ( x i ( t ) ) − f m i n ( t ) \displaystyle f_\gamma(\mathbf{x}_i(t))=\mathbf{\gamma}(\mathbf{x}_i)=\frac{1}{1+f_\Psi(\mathbf{x}_i(t))-f_{min}(t)} fγ(xi(t))=γ(xi)=1+fΨ(xi(t))−fmin(t)1,其中 f m i n ( t ) f_{min}(t) fmin(t)是到目前为止第t代最最小适应度值。
而对最大化问题,其适应度函数可被缩放为: f γ ( x i ( t ) ) = γ ( x i ) = 1 1 + f m a x ( t ) − f Ψ ( x i ( t ) ) \displaystyle f_\gamma(\mathbf{x}_i(t))=\mathbf{\gamma}(\mathbf{x}_i)=\frac{1}{1+f_{max}(t)-f_\Psi(\mathbf{x}_i(t))} fγ(xi(t))=γ(xi)=1+fmax(t)−fΨ(xi(t))1。
3.锦标赛选择:
从种群中随机选择一组数量为 n t s n_{ts} nts的个体 ( n t s < n s ) (n_{ts}<n_s) (nts<ns),进行比较,得到改组中最优的个体。 n t s n_{ts} nts若太大,则几乎只留下最优个体;若太小,则较差的个体有较大概率留下。
4.排序选择:
对适应度值进行排序来觉得选择的概率。该方法的优势是最优个体不会支配选择过程。
线性排序选择:选择个体
x
i
\mathbf{x}_i
xi,
i
∼
U
(
0
,
U
(
0
,
n
s
−
1
)
)
i\sim U(0,U(0,n_s-1))
i∼U(0,U(0,ns−1)),给提按照是适应度值降序排列,即最优个体的排序为0,最差个体为
n
s
−
1
n_s-1
ns−1。线性排序假定最优个体产生
λ
^
\hat\lambda
λ^个后代,最差个体产生
λ
~
\tilde\lambda
λ~个后代,其中
1
≤
λ
^
≤
2
1\le\hat\lambda\le2
1≤λ^≤2,
λ
~
=
2
−
λ
^
\tilde\lambda=2-\hat\lambda
λ~=2−λ^,每个个体被选择的概率为:
φ
s
(
x
i
(
t
)
)
=
λ
~
+
(
f
r
(
x
i
(
t
)
)
/
(
n
s
−
1
)
)
(
λ
^
−
λ
~
)
n
s
\displaystyle\varphi_s(\mathbf{x}_i(t))=\frac{\tilde\lambda+(f_r(\mathbf{x}_i(t))/(n_s-1))(\hat\lambda-\tilde\lambda)}{n_s}
φs(xi(t))=nsλ~+(fr(xi(t))/(ns−1))(λ^−λ~),其中
f
r
(
x
i
(
t
)
)
f_r(\mathbf{x}_i(t))
fr(xi(t))是
x
i
(
t
)
\mathbf{x}_i(t)
xi(t)的顺序。
非线性排序选择:每个个体被选择的概率为(eg): φ s ( x i ( t ) ) = 1 − e − f r ( x i ( t ) ) β \displaystyle\varphi_s(\mathbf{x}_i(t))=\frac{1-e^{-f_r(\mathbf{x}_i(t))}}{\beta} φs(xi(t))=β1−e−fr(xi(t)),其中, β \beta β为归一化常数。
5.玻尔兹曼选择:
个体被选择的概率为: φ ( x i ( t ) ) = 1 1 + e f ( x i ( t ) ) / T ( t ) \displaystyle\varphi(\mathbf{x}_i(t))=\frac{1}{1+e^{f(\mathbf{x}_i(t))/T(t)}} φ(xi(t))=1+ef(xi(t))/T(t)1
其中
T
(
t
)
T(t)
T(t)是温度参数,使用温度变化将
T
(
t
)
T(t)
T(t)从最开始的大值减小。初始的大值用于确保所有的个体有相对相等的概率被选择,随着
T
(
t
)
T(t)
T(t)的减小,选择逐渐趋向于优势个体。
通常,玻尔兹曼选择通常用于两个个体之间的选择,当考虑
x
i
(
t
)
\mathbf{x}_i(t)
xi(t)是否被
x
i
′
(
t
)
\mathbf{x}'_i(t)
xi′(t)替代时,若
U
(
0
,
1
)
>
1
1
+
e
(
f
(
x
i
(
t
)
)
−
x
i
′
(
t
)
)
)
/
T
(
t
)
\displaystyle U(0,1)>\frac{1}{1+e^{(f(\mathbf{x}_i(t))-\mathbf{x}'_i(t)))/T(t)}}
U(0,1)>1+e(f(xi(t))−xi′(t)))/T(t)1,则选择
x
i
′
(
t
)
\mathbf{x}'_i(t)
xi′(t),否则,选择
x
i
(
t
)
\mathbf{x}_i(t)
xi(t)。
6. ( μ , λ ) (\mu,\lambda) (μ,λ)和 ( μ + , λ ) (\mu^+,\lambda) (μ+,λ)选择:
这两种方法基于排序选择方法,其中 μ \mu μ指父代数量, λ \lambda λ指每个父代产生的子代数量。在产生 λ \lambda λ个子代后, ( μ , λ ) (\mu,\lambda) (μ,λ)方法从子代中选取最优的 μ \mu μ个子代作为下一代;而 ( μ + , λ ) (\mu^+,\lambda) (μ+,λ)从父代和子代中选取最优的 μ \mu μ个个体作为下一代。
7.精英主义:
最优个体不经过变异直接复制到下一代,更多个体直接保留到下一代,意味着降低了下一代的多样性。
复制
复制是由选择的父代经过交叉/变异等操作来产生子代的过程。变异是随机改变染色体上基因的过程,用于生成新基因,增加基因多样性,但应注意:*不能扰乱搞适应度个体的优秀基因,因此,变异应当以低概率进行:优秀个体低概率变异,差的个体高概率变异;为了提高搜索能力,初始迭代时变异概率应设置高一点,随着迭代的进行,变异概率应逐渐降低。
交叉
交叉主要有三种类别:1.无性生殖(一个父代);2.有性生殖(两个父代);3.多重组合(超过两个父代生成一个或多个子代)。
在选择父代时,应当注意:若选择一个个体作为父代的两个交配个体,则产生的子代没有变化,这种情况应当避免。此外,当两个父代产生一个子代时,应当以子代替代最差的父代。
二进制交叉
两个父代的交叉:若
x
1
(
t
)
\mathbf{x}_1(t)
x1(t)和
x
2
(
t
)
\mathbf{x}_2(t)
x2(t)指被选中的父代,
M
(
t
)
M (t)
M(t)是一个掩码,它指定父节点的哪些位应该交换来生成子节点
x
~
1
(
t
)
\mathbf{\tilde x}_1(t)
x~1(t)和
x
~
2
(
t
)
\mathbf{\tilde x}_2(t)
x~2(t)。交叉操作的算法流程图如下所示:
有以下方法用于计算掩码:
1.单点交叉
2.两点交叉
3.均匀交叉
其中, p x p_x px是设定的概率,若 p x = 0.5 p_x=0.5 px=0.5,则每个bit都有着相同的交叉概率。
浮点数交叉
1.算术交叉
x ~ i j ( t ) = ∑ l = 1 n μ γ l ⋅ x l j ( t ) \displaystyle{\tilde x}_{ij}(t)=\sum^{n_\mu}_{l=1}\gamma_l\cdot x_{lj}(t) x~ij(t)=l=1∑nμγl⋅xlj(t),其中, ∑ l = 1 n μ γ l = 1 \sum^{n_\mu}_{l=1}\gamma_l=1 ∑l=1nμγl=1;特别的,当 n μ = 2 n_\mu=2 nμ=2时, x ~ i j ( t ) = ( 1 − γ ) ⋅ x 1 j ( t ) + γ ⋅ x 2 j ( t ) \displaystyle{\tilde x}_{ij}(t)=(1-\gamma)\cdot x_{1j}(t)+\gamma \cdot x_{2j}(t) x~ij(t)=(1−γ)⋅x1j(t)+γ⋅x2j(t)。
2.几何交叉
x ~ i j ( t ) = ( x 1 j α 1 x 2 j α 2 ⋯ x n u j α n u ) \displaystyle{\tilde x}_{ij}(t)=(x^{\alpha_1}_{1j}\,x^{\alpha_2}_{2j}\cdots\,x^{\alpha_{n_u}}_{n_uj}) x~ij(t)=(x1jα1x2jα2⋯xnujαnu),其中, ∑ l = 1 n μ α l = 1 \sum^{n_\mu}_{l=1}\alpha_l=1 ∑l=1nμαl=1;
3.模拟二进制单点交叉(SBX)
对两个父本产生
j
j
j个子代:
x ~ 1 j ( t ) = 0.5 [ ( 1 + γ j ) ⋅ x 1 j ( t ) + ( 1 − γ j ) ⋅ x 2 j ( t ) ] \displaystyle{\tilde x}_{1j}(t)=0.5[(1+\gamma_j)\cdot x_{1j}(t)+(1-\gamma _j)\cdot x_{2j}(t)] x~1j(t)=0.5[(1+γj)⋅x1j(t)+(1−γj)⋅x2j(t)]
x ~ 1 j ( t ) = 0.5 [ ( 1 − γ j ) ⋅ x 1 j ( t ) + ( 1 + γ j ) ⋅ x 2 j ( t ) ] \displaystyle{\tilde x}_{1j}(t)=0.5[(1-\gamma_j)\cdot x_{1j}(t)+(1+\gamma _j)\cdot x_{2j}(t)] x~1j(t)=0.5[(1−γj)⋅x1j(t)+(1+γj)⋅x2j(t)]
其中,当 r j ≤ 0.5 r_j\le0.5 rj≤0.5时, γ j = ( 2 ⋅ r j ) 1 η + 1 \gamma_j=(2\cdot r_j)^{\frac{1}{\eta+1}} γj=(2⋅rj)η+11;当 r j > 0.5 r_j>0.5 rj>0.5时, γ j = ( 1 2 ⋅ ( 1 − r j ) ) 1 η + 1 \gamma_j=(\frac{1}{2\cdot (1-r_j)})^{\frac{1}{\eta+1}} γj=(2⋅(1−rj)1)η+11。其中, r j ∼ U ( 0 , 1 ) r_j\sim U(0,1) rj∼U(0,1), η > 0 \eta>0 η>0,通常,取 η = 1 \eta=1 η=1.当 η \eta η较大时,子代付父代差异较小,当 η \eta η较小时,子代和父代差异很大。
此外,还有单峰分布操作(UNDX)、SPX、PCX、扫描操作等。
变异
变异的目的是为种群产生新基因,是以一定的概率 p m p_m pm对子代 x ~ i ( t ) \mathbf{\tilde x}_i(t) x~i(t)的每个基因进行突变,用于生成新个体 x i ′ ( t ) \mathbf{ x}'_i(t) xi′(t)。变异概率 p m p_m pm应当很小,以确保对优秀解的扰动不大。
个体 x ~ i ( t ) \mathbf{\tilde x}_i(t) x~i(t)突变的概率为: P ( x ~ i ( t ) 突 变 ) = 1 − ( 1 − p m ) n x P(\mathbf{\tilde x}_i(t)突变)=1-(1-p_m)^{n_x} P(x~i(t)突变)=1−(1−pm)nx,其中,每个个体包含 n x n_x nx个基因位。
二进制变异:
在二进制中,子代 x ~ i ( t ) \mathbf{\tilde x}_i(t) x~i(t)和变异版本 x i ′ ( t ) \mathbf{ x}'_i(t) xi′(t)间的海明距离记为 H ( x ~ i ( t ) , x i ′ ( t ) ) H(\mathbf{\tilde x}_i(t),\mathbf{ x}'_i(t)) H(x~i(t),xi′(t)),那么变异版本与原始子代相似的概率为:
P ( x i ′ ( t ) ) ≈ x ~ i ( t ) = ( p m ) H ( x ~ i ( t ) , x i ′ ( t ) ) ⋅ ( 1 − p m ) n x − H ( x ~ i ( t ) , x i ′ ( t ) ) P(\mathbf{ x}'_i(t))\approx\mathbf{\tilde x}_i(t)=(p_m)^{H(\mathbf{\tilde x}_i(t),\mathbf{ x}'_i(t))}\cdot (1-p_m)^{n_x-H(\mathbf{\tilde x}_i(t),\mathbf{ x}'_i(t))} P(xi′(t))≈x~i(t)=(pm)H(x~i(t),xi′(t))⋅(1−pm)nx−H(x~i(t),xi′(t))。
1.均匀(随机)变异
2.次序变异
3.高斯变异
终止条件
EA算法最简单的收敛准则是规定迭代次数。此外,还可以当种群达到停滞状态时(即算法收敛)停止迭代。收敛准则如下:
1.当发现连续几代没有改进时,停止;
2.当种群不再变化是收敛;
3.发现可接受的解时收敛;
4.当目标函数的梯度趋于0时收敛。