遗传算法(Genetic Algorithms,GA)

遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
通常将实际问题的参数编码为二进制串进行遗传操作,从而搜寻最优解。将每个二进制串染色体视为一个向量,则每个向量代表着实际优化问题中的一个参数。每个参数可以被编码为任意长度的bits,而总的bits的数目则代表的待搜索的二进制高维空间的维数。eg,假设问题有www个参数,每个参数有bbb个bits进行表示,则表示每个解空间的个体由w⋅bw\cdot bwb个bit构成,那么待搜索的二进制高维空间的维度则为2wb2^{wb}2wb。在GA中,问题的待优化变量组成显性位空间,给定的变量的确定值被称为显性位;编码的二进制串中的操作构成基因位空间,这些二进制串被称为基因位

GA的主要组成

  1. 问题的解到染色体的编码
  2. 确定一个函数来计算适应度值,用于评估个体的优劣;
  3. 种群初始化
  4. 遗传算子:选择,复制,变异,交叉

编码

以典型的二进制编码为例,每个参数变量被编码为固定长度为ndn_dnd个bits的二进制串染色体。对离散问题较为有效,但对于连续问题,则需要将每个连续的函数映射到ndn_dnd个bits的向量,即:ϕ:ℜ→(0,1)nd\phi:\Re\to(0,1)^{n_d}ϕ:(0,1)nd。连续空间需要被限制到一个有限的范围[xmin,xmax][x_{min}, x_{max}][xmin,xmax],一个标准的二进制编码转换框架可以描述如下:
x=(x1,⋯ ,xj,⋯ ,xnx)\displaystyle \mathbf{x}=(x_1,\cdots,x_j,\cdots,x_{n_x})x=(x1,,xj,,xnx),其中xj∈ℜx_j\in\Rexj,将其转换为二进制个体为b=(b1,⋯ ,bj,⋯ ,bnx)\displaystyle \mathbf{b}=(\mathbf{b_1},\cdots,\mathbf{b_j},\cdots,\mathbf{b_{n_x}})b=(b1,,bj,,bnx),其中,bj=(b(j−1)nd+1,⋯ ,bjnd)\displaystyle \mathbf{b_j}=(b_{(j-1)n_d+1},\cdots,b_{jn_d})bj=(b(j1)nd+1,,bjnd),其中bl∈{0,1}b_l\in\{0,1\}bl{0,1},总bits数nb=nx∗ndn_b=n_x*n_dnb=nxnd。而每一个已经编码好的bj\mathbf{b_j}bj到浮点数的转换可以用函数映射表示,即:
Φj:{0,1}nd→[xmin,j,xmax,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)=xmin,j+xmax,j−xmin,j2nd−1(∑l=1nd−1bj(nd−1)⋅2l)\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+2nd1xmax,jxmin,j(l=1nd1bj(nd1)2l)

实际上,采用编码后不能得到精确解,可以达到最大可获得的每个参数xjx_jxj的解精度为:xmax,j−xmin,j2nd−1\displaystyle\frac{x_{max,j}-x_{min,j}}{2^{n_d}-1}2nd1xmax,jxmin,j

二进制编码的缺陷:海明悬崖问题,即当两个十进制数非常近时,他们的二进制数相差很远,eg,7=0111,8=10007=0111,8=10007=0111,8=1000,他们的海明距离(表示进行位编码时,相应为不同的个数)为4。因此,需要声明,一个好的编码,应该是当变量变化小时,适应度函数的变化也很小。

因此,引进格雷码,格雷码和传统的二进制码之间的转换关系如下:
g1=b1g_1=b_1g1=b1
gl=bl−1⋅blˉ+bˉl−1⋅blg_l=b_{l-1}\cdot \bar{b_l}+\bar{b}_{l-1}\cdot b_lgl=bl1blˉ+bˉl1bl
其中,blb_lbl是二进制数b1b2⋯bnbb_1b_2\cdots b_{n_b}b1b2bnb的第l位,blˉ\bar{b_l}blˉ指逻辑运算+++指逻辑运算⋅\cdot指逻辑运算

具体过程如下所示:
在这里插入图片描述
0 −70~-70 7的二进制码与格雷码的转换如下:
在这里插入图片描述
他们之间的海明距离变化如下:
在这里插入图片描述
融入二进制转换为格雷码,则映射规则应变为:

Φj(b)=xmin,j+xmax,j−xmin,j2nd−1(∑l=1nd−1(∑q=1nd−1b(j−1)⋅nd+q) mod 2)⋅2l\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+2nd1xmax,jxmin,j(l=1nd1(q=1nd1b(j1)nd+q)mod2)2l

种群初始化

种群初始化是GA算法解决问题的第一步,标准方法是随机生成,原则是初始种群是整个搜索空间的均匀分布。初始种群的大小决定了GA的搜索能力,越大,个体多样性越大,搜索能力越大,但每一次迭代需要的计算复杂度和计算时间也会越大。因此,当种群小时,对应的迭代次数就要变大;种群大时,对应的迭代次数可以相应的减小。

适应度函数

适应度函数用来衡量个体的生存能力,它从染色体空间映射到一个实数标量:f:Γnx→ℜf:\Gamma^{n_x}\to\Ref:Γnx,其中Γ\GammaΓ代表nxn_xnx维染色体的数据类型。适应度函数代表着优化问题中的目标函数Ψ\PsiΨ,一个更加详细的表示为:f:SC→ΦSX→Ψℜ→γℜ+\displaystyle f:\mathcal{S_C}\stackrel{\Phi}{\to}\mathcal{S}_X\stackrel{\Psi}{\to}\Re\stackrel{\gamma}{\to}\Re_+f:SCΦSXΨγ+
其中,SC\mathcal{S_C}SC表示搜索空间的目标函数,Φ\PhiΦ表示染色体编码函数,Ψ\PsiΨ表示目标函数,γ\gammaγ表示缩放函数(可选,用于比例选择,以确保得到正的适应值)。
对待不同的优化问题,适应度函数的选择也不同,例如:
1.无约束优化问题SC=SX\mathcal{S_C}=\mathcal{S}_XSC=SX,即目标函数与适应度函数相同。
2.约束优化问题:适应度函数应当包含两项,一项是原始目标函数,另一项为约束的惩罚项;
3.多目标优化问题(MOP):MOPs可以被分解为带权重的多个问题,总的适应度函数应为对应权重子目标函数之和;
4.动态噪声问题:动态问题的适应度函数随时间变化而变化,噪声问题应当加上高斯噪声成分。

选择

选择是GA 的主要操作之一,用于产生下一代更好的解个体,主要包含两个步骤:1.选择优良个体用于产生下一代(可直接复制,也可通过父代进行繁殖);2.复制:优良的个体应当有更多的机会被直接复制到下一代,以确保下一代中包含已得到的最优解其中,交叉和复制更加倾向于优良个体,变异倾向于较差的个体。
选择策略

1.随机选择

每个个体以相同的概率1ns\frac{1}{n_s}ns1被选择,没有使用适应度信息。

2.正比选择(轮盘赌)

倾向于选择适应度值高的个体。其个体被选择的概率为:φs(xi(t))=fγ(xi(t))∑l=1nsfγ(xl(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)),其中,nsn_sns是种群中的个体总数,fγ(xi(t))f_\gamma(\mathbf{x}_i(t))fγ(xi(t))xi\mathbf{x}_ixi缩放后的适应度函数。

对于最小化问题,其缩放函数可为:
1.fγ(xi(t))=γ(xi)=fmax−fΨ(xi(t))f_\gamma(\mathbf{x}_i(t))=\mathbf{\gamma}(\mathbf{x}_i)=f_{max}-f_\Psi(\mathbf{x}_i(t))fγ(xi(t))=γ(xi)=fmaxfΨ(xi(t)),其中fΨ(xi(t))=Ψ(xi(t))f_\Psi(\mathbf{x}_i(t))=\Psi(\mathbf{x}_i(t))fΨ(xi(t))=Ψ(xi(t))xi\mathbf{x}_ixi的原始适应度值,多数情况下,fmaxf_{max}fmax是未知的,因此可用到目前未知第t代最大适应度值fmax(t)f_{max}(t)fmax(t)替代;

或2.fγ(xi(t))=γ(xi)=11+fΨ(xi(t))−fmin(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,其中fmin(t)f_{min}(t)fmin(t)是到目前为止第t代最最小适应度值。

而对最大化问题,其适应度函数可被缩放为:fγ(xi(t))=γ(xi)=11+fmax(t)−fΨ(xi(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.锦标赛选择

从种群中随机选择一组数量为ntsn_{ts}nts的个体(nts<ns)(n_{ts}<n_s)(nts<ns),进行比较,得到改组中最优的个体。ntsn_{ts}nts若太大,则几乎只留下最优个体;若太小,则较差的个体有较大概率留下。

4.排序选择

对适应度值进行排序来觉得选择的概率。该方法的优势是最优个体不会支配选择过程。

线性排序选择:选择个体xi\mathbf{x}_ixii∼U(0,U(0,ns−1))i\sim U(0,U(0,n_s-1))iU(0,U(0,ns1)),给提按照是适应度值降序排列,即最优个体的排序为0,最差个体为ns−1n_s-1ns1。线性排序假定最优个体产生λ^\hat\lambdaλ^个后代,最差个体产生λ~\tilde\lambdaλ~个后代,其中1≤λ^≤21\le\hat\lambda\le21λ^2λ~=2−λ^\tilde\lambda=2-\hat\lambdaλ~=2λ^,每个个体被选择的概率为:
φs(xi(t))=λ~+(fr(xi(t))/(ns−1))(λ^−λ~)ns\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))/(ns1))(λ^λ~),其中fr(xi(t))f_r(\mathbf{x}_i(t))fr(xi(t))xi(t)\mathbf{x}_i(t)xi(t)的顺序。

非线性排序选择:每个个体被选择的概率为(eg):φs(xi(t))=1−e−fr(xi(t))β\displaystyle\varphi_s(\mathbf{x}_i(t))=\frac{1-e^{-f_r(\mathbf{x}_i(t))}}{\beta}φs(xi(t))=β1efr(xi(t)),其中,β\betaβ为归一化常数。

5.玻尔兹曼选择:

个体被选择的概率为:φ(xi(t))=11+ef(xi(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)的减小,选择逐渐趋向于优势个体。
通常,玻尔兹曼选择通常用于两个个体之间的选择,当考虑xi(t)\mathbf{x}_i(t)xi(t)是否被xi′(t)\mathbf{x}'_i(t)xi(t)替代时,若U(0,1)>11+e(f(xi(t))−xi′(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,则选择xi′(t)\mathbf{x}'_i(t)xi(t),否则,选择xi(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.多重组合(超过两个父代生成一个或多个子代)。
在选择父代时,应当注意:若选择一个个体作为父代的两个交配个体,则产生的子代没有变化,这种情况应当避免。此外,当两个父代产生一个子代时,应当以子代替代最差的父代。

二进制交叉

两个父代的交叉:若x1(t)\mathbf{x}_1(t)x1(t)x2(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.均匀交叉
在这里插入图片描述 在这里插入图片描述

其中,pxp_xpx是设定的概率,若px=0.5p_x=0.5px=0.5,则每个bit都有着相同的交叉概率。

浮点数交叉

1.算术交叉

x~ij(t)=∑l=1nμγl⋅xlj(t)\displaystyle{\tilde x}_{ij}(t)=\sum^{n_\mu}_{l=1}\gamma_l\cdot x_{lj}(t)x~ij(t)=l=1nμγlxlj(t),其中,∑l=1nμγl=1\sum^{n_\mu}_{l=1}\gamma_l=1l=1nμγl=1;特别的,当nμ=2n_\mu=2nμ=2时,x~ij(t)=(1−γ)⋅x1j(t)+γ⋅x2j(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~ij(t)=(x1jα1 x2jα2⋯ xnujαnu)\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α2xnujαnu),其中,∑l=1nμαl=1\sum^{n_\mu}_{l=1}\alpha_l=1l=1nμαl=1;

3.模拟二进制单点交叉(SBX)
对两个父本产生jjj个子代:

x~1j(t)=0.5[(1+γj)⋅x1j(t)+(1−γj)⋅x2j(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~1j(t)=0.5[(1−γj)⋅x1j(t)+(1+γj)⋅x2j(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)]

其中,当rj≤0.5r_j\le0.5rj0.5时,γj=(2⋅rj)1η+1\gamma_j=(2\cdot r_j)^{\frac{1}{\eta+1}}γj=(2rj)η+11;当rj>0.5r_j>0.5rj>0.5时,γj=(12⋅(1−rj))1η+1\gamma_j=(\frac{1}{2\cdot (1-r_j)})^{\frac{1}{\eta+1}}γj=(2(1rj)1)η+11。其中,rj∼U(0,1)r_j\sim U(0,1)rjU(0,1)η>0\eta>0η>0,通常,取η=1\eta=1η=1.当η\etaη较大时,子代付父代差异较小,当η\etaη较小时,子代和父代差异很大。

此外,还有单峰分布操作(UNDX)SPXPCX扫描操作等。

变异

变异的目的是为种群产生新基因,是以一定的概率pmp_mpm对子代x~i(t)\mathbf{\tilde x}_i(t)x~i(t)的每个基因进行突变,用于生成新个体xi′(t)\mathbf{ x}'_i(t)xi(t)。变异概率pmp_mpm应当很小,以确保对优秀解的扰动不大。

个体x~i(t)\mathbf{\tilde x}_i(t)x~i(t)突变的概率为:P(x~i(t)突变)=1−(1−pm)nxP(\mathbf{\tilde x}_i(t)突变)=1-(1-p_m)^{n_x}P(x~i(t))=1(1pm)nx,其中,每个个体包含nxn_xnx个基因位。

二进制变异

在二进制中,子代x~i(t)\mathbf{\tilde x}_i(t)x~i(t)和变异版本xi′(t)\mathbf{ x}'_i(t)xi(t)间的海明距离记为H(x~i(t),xi′(t))H(\mathbf{\tilde x}_i(t),\mathbf{ x}'_i(t))H(x~i(t),xi(t)),那么变异版本与原始子代相似的概率为:

P(xi′(t))≈x~i(t)=(pm)H(x~i(t),xi′(t))⋅(1−pm)nx−H(x~i(t),xi′(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))(1pm)nxH(x~i(t),xi(t))

1.均匀(随机)变异
在这里插入图片描述 在这里插入图片描述

2.次序变异
在这里插入图片描述 在这里插入图片描述

3.高斯变异

终止条件

EA算法最简单的收敛准则是规定迭代次数。此外,还可以当种群达到停滞状态时(即算法收敛)停止迭代。收敛准则如下:
1.当发现连续几代没有改进时,停止;
2.当种群不再变化是收敛;
3.发现可接受的解时收敛;
4.当目标函数的梯度趋于0时收敛。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐