进化算法(遗传算法、粒子群算法、差分算法)—— Rosenbrock函数优化

进化算法是一类模拟生物种群进化机制的算法,常用于最优化问题。遗传算法通过选择、交叉、变异操作更新种群,粒子群算法则基于粒子的位置和速度更新,而差分算法结合了选择、交叉和变异。文章详细介绍了这三种算法的流程、关键算子以及如何应用于Rosenbrock函数的最优化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进化算法

进化算法是一类算法簇,这类算法模拟的是自然界当中生物种群的进化机制。进化算法在解决最优化问题或者机器学习问题的时候,通常会维护一个解的集合X={x1,x2,…,xN}X=\{x_1,x_2,\dots,x_N\}X={x1,x2,,xN},称之为种群,NNN称为种群规模。算法运行的机制,是在每一轮迭代当中,对种群进行变异、交叉等操作,形成新的个体添加到种群当中,然后对种群进行筛选,使得种群的规模始终维持在NNN. 筛选的规则是根据种群个体的适应度f(xi)f(x_i)f(xi)设计的,理想的筛选规则应当保留适应度高的个体,淘汰适应度低的个体。

1. 三种算法的标准式表述

我们这里介绍的进化算法,主要是三种:遗传算法、粒子群算法和标准差分算法。

首先我们先定义基本的问题背景:在一个环境env\text{env}env(可能是一个最优化问题、一个强化学习场景、一个实际的工程模拟)当中,每一个解都表示为向量xi∈Rdx_i\in\R^dxiRd. 存在一个适应度函数f(xi)f(x_i)f(xi)能够评价每一个解的适应性,函数评分越高,说明解越适应于该环境。

我们接下来分别介绍三种算法解决该问题的流程。

1.1 遗传算法

遗传算法模拟的是自然界中生物种群的繁衍以及自然选择机制。一个遗传算法的流程可以表示为:

  1. 初始化种群XXX,设置进化代序为t=0t=0t=0
  2. 计算种群的适应度,并且利用选择算子筛选进行遗传的个体Xc=select(X)X_c=\text{select}(X)Xc=select(X)
  3. 对进行遗传的个体进行交叉算子操作Xm=crossover(Xc)X_m=\text{crossover}(X_c)Xm=crossover(Xc)
  4. 对全体种群进行变异操作X′=mutation(Xm)X'=\text{mutation}(X_m)X=mutation(Xm)
  5. 更新种群X=Reproduction(X′)X=\text{Reproduction}(X')X=Reproduction(X)
  6. 检查是否满足终止条件,若不满足,更新进化代序t=t+1t=t+1t=t+1并返回第2步

需要注意的是,遗传算法同样是一个算法簇,而不是某一具体算法。对于具体的实现,筛选、交叉、变异算子在算法流程中的顺序,以及它们对当前种群的更新机制会有一定的差异。

在这个流程当中,最为关键的是三个遗传算子:select(⋅),crossover(⋅),mutation(⋅)\text{select}(\cdot),\text{crossover}(\cdot),\text{mutation}(\cdot)select(),crossover(),mutation(),还有一个非关键的更新算子Reproduction\text{Reproduction}Reproduction.

1.1.1 比例选择算子

假设每一个个体的适应度f(xi)f(x_i)f(xi)都是非负的,那么进行变换

pi=f(xi)∑j=1Nf(xj) p_i=\frac{f(x_i)}{\sum_{j=1}^Nf(x_j)} pi=j=1Nf(xj)f(xi)

在选择过程中,每个个体被选中加入交叉种群XcX_cXc的概率是pip_ipi. 实现这种选择的方法,可以采用轮盘抽奖的算法。假设我们在面积为111的抽奖圆盘上,为每一个个体分配面积为pip_ipi的扇面,然后转动圆盘,当圆盘停止时,指针指向第iii个个体的扇面的概率恰好是pip_ipi. 如图:

在这里插入图片描述

从计算机程序实现角度来说,我们可以规定一个起始坐标q0=0q_0=0q0=0,然后用累加概率的方式找出剩下的各个分界点坐标

qi=∑j=1ipi q_i=\sum_{j=1}^ip_i qi=j=1ipi

随机取一个[q0,qN][q_0,q_N][q0,qN]之间的点λ\lambdaλ,如果λ∈[qi−1,qi]\lambda\in[q_{i-1},q_i]λ[qi1,qi],那就意味着指针落在了xix_ixi对应的圆盘扇面内,xix_ixi被选中加入XcX_cXc。把这个过程重复NNN次,就会选择出期望为NpcNp_cNpc个的种群个体。

这种采样过程产生的交叉种群数NcN_cNc是不固定的,而且比原始种群数NNN要少,需要一定的机制,例如将交叉运算后的个体添加回原种群当中,才能保证种群的数目不会随着迭代次数增加而减少。

1.1.2 其他选择算子

最优选择算子:这种算子通常指定一个数量c<Nc<Nc<N,在每一轮迭代当中,它用当前种群里适应度最高的ccc个个体,替换掉适应度最低的ccc个个体,然后直接用得到的新种群作为XcX_cXc。更新后的种群继续进行交叉、变异算子的操作。

最优保存算子:这种算子不对种群进行筛选,Xc=XX_c=XXc=X. 只是记录下当前适应度最高的个体。最后在进行交叉、变异结束之后的种群X′X'X中,将最优个体插入其中。使得最优个体保持到下一轮迭代。

生存数目算子:计算每一个个体适应度与平均适应度的比值,并且下取整:

Ni=⌊Nf(xi)∑j=1Nf(xj)⌋ N_i=\lfloor\frac{Nf(x_i)}{\sum_{j=1}^Nf(x_j)}\rfloor Ni=j=1Nf(xj)Nf(xi)

将原种群当中的每一个个体xix_ixi,复制NiN_iNi次,加入到交叉种群XcX_cXc当中。按照适应度对于XcX_cXc排序,截取其前NNN个个体。

1.1.3 交叉算子

一般来说,交叉算子总是规定了交叉概率PcP_cPc,并且希望交叉运算产生的子代数目期望为NcPcN_cP_cNcPc. 交叉算子有一个重要的问题是,交叉的两个父本如何选择。这个问题没有固定解法。有的算法当中,会将交叉种群XcX_cXc打乱顺序,之后按顺序两两匹配,对于每一个匹配都以PcP_cPc的概率进行交叉或不交叉;有的算法会随机抽取nnn轮,每轮抽取一对父本以PcP_cPc的概率进行交叉或不交叉;有的算法会随机产生一个(0,1)(0,1)(0,1)之间的随机数λ\lambdaλ,如果λ<Pc\lambda<P_cλ<Pc,就对整个NcN_cNc进行打乱、按顺序两两匹配、交叉运算,否则就完全不进行交叉运算。

交叉算子最常用的是单点交叉算子,即随机地在个体向量上取一个点位min\text{min}min. 对于配对的两个向量xi,xjx_i,x_jxi,xj,将它们从点位min\text{min}min开始直到结束的片段交换:

x‾i,n=xj,n, n≥minx‾j,n=xi,n, n≥min \overline x_{i,n}=x_{j,n},\ n\geq\text{min}\\ \overline x_{j,n}=x_{i,n},\ n\geq\text{min} xi,n=xj,n, nminxj,n=xi,n, nmin

其次还有双点位交叉,即选择两个点位min,max\text{min},\text{max}min,max,交换父本在这两个点位之间的片段。

有的时候,还会使用凸组合交叉算子,即随机采样一个a∈(0,1)a\in(0,1)a(0,1),令

x‾i=axi+(1−a)xjx‾j=(1−a)xi+axj \overline x_i=ax_i+(1-a)x_j\\ \overline x_j=(1-a)x_i+ax_j xi=axi+(1a)xjxj=(1a)xi+axj

这种算子适用于解空间是高维凸域的情形。

最后一个问题是,交叉算子产生的子代和父代如何进行取舍。有的算法是将子代添加到种群XcX_cXc中组合形成X′X'X,然后通过更新算子Reproduction(X′)\text{Reproduction}(X')Reproduction(X)进行取舍(例如选择出适应度前NNN个个体)。有的算法会比较子代与父代的适应度,然后选择保留适应度强的子代。

1.1.4 变异算子

变异算子同样指定一个变异概率PmP_mPm,并且试图使变异的个体数期望为NmPmN_mP_mNmPm. 而实现的方法,可以是对于XmX_mXm的每一个个体都进行二分决策,以PmP_mPm的概率进行突变,也可以是对整个XmX_mXm进行二分决策,突变或者不突变。

对于每一个突变的个体,如果是二进制串(二进制的向量),可以直接进行位反转。

对于一般的向量,还可以随机选取一个片段进行倒置(顺序颠倒),或者选择两个点位互换数值。

和交叉算子类似,变异算子也可以采用线性组合的方式进行变异:随机选取一个v∈Rdv\in\R^dvRd和一个λ∈(0,1)\lambda\in(0,1)λ(0,1),令

x^i=xi+λv \hat x_i=x_i+\lambda v x^i=xi+λv

1.1.5 更新算子

更新算子的实现很简单,如果选择、交叉、变异算子最终产生的种群X′X'X规模是NNN,可以直接将其更新到XXX上. 如果数目超过NNN,那么可以选择保留适应度最高的NNN个个体。(也就是需要再次遍历并且进行适应度评价)

1.2 粒子群算法

粒子群算法和遗传算法的区别在于,粒子群算法没有交叉、变异的相关概念,而是会在每一轮迭代当中,更新每一个个体的值。在粒子群算法当中,种群当中的个体称为粒子,由两个ddd维的向量xi∈Rd,vi∈Rdx_i\in\R^d,v_i\in\R^dxiRd,viRd表示,xix_ixi称为粒子的位置,viv_ivi称为粒子的速度。一个种群可以表示为E=(X,V)E=(X,V)E=(X,V),其中X=(x1,x2,…,xN)X=(x_1,x_2,\dots,x_N)X=(x1,x2,,xN)V=(v1,v2,…,vN)V=(v_1,v_2,\dots,v_N)V=(v1,v2,,vN). 环境中的适应性函数仅仅取决于位置f(xi)f(x_i)f(xi).

粒子群算法当中,每一个粒子都需要维护两个变量pi∈R,Pi∈Rdp_i\in\R, P_i\in\R^dpiR,PiRd,其中pip_ipi是在以往迭代轮数当中,粒子iii所取得的最大适应度,而PiP_iPi是取得该适应度时的位置。

同时在每一轮迭代当中,还要找出两个变量s∈R,S∈Rds\in\R,S\in\R^dsR,SRd,分别是当前种群当中,适应度的最大值,以及适应度最大的粒子所处位置。

标准粒子群算法的参数包括:

  1. 最大进化代数GGG
  2. 学习因子c1,c2c_1,c_2c1,c2
  3. 粒子群规模NNN
  4. 可行集:D⊂RdD\sub \R^dDRd

标准粒子群算法的流程可以描述为:

1 初始化

随机生成(或按照一定分布)粒子群X(t=1),V(t=1)X^{(t=1)},V^{(t=1)}X(t=1),V(t=1),根据初始化条件计算pi(0),Pi(0)p_i^{(0)},P_i^{(0)}pi(0),Pi(0),迭代轮数置为t=1t=1t=1

2 计算适应度

计算每一个粒子的适应度f(xi)f(x_i)f(xi),若f(xi)>pi(t−1)f(x_i)>p_i^{(t-1)}f(xi)>pi(t1),则更新pi(t)=f(xi),Pi(t)=xip_i^{(t)}=f(x_i),P_i^{(t)}=x_ipi(t)=f(xi),Pi(t)=xi,否则pi(t)=pi(t−1),Pi(t)=Pi(t−1)p_i^{(t)}=p_i^{(t-1)}, P_i^{(t)}=P_i^{(t-1)}pi(t)=pi(t1),Pi(t)=Pi(t1)

计算出当前种群最优:s(t),S(t)s^{(t)}, S^{(t)}s(t),S(t)

3 更新粒子

按照如下公式更新粒子的速度和位置:

vi(t+1)=ω(t)vi(t)+c1r1(Pi(t)−xi(t))+c2r2(S(t)−xi(t))xi(t+1)=xi(t)+vi(t) \begin{align*} &v_i^{(t+1)}=\omega(t)v_i^{(t)}+c_1r_1(P_i^{(t)}-x_i^{(t)})+c_2r_2(S^{(t)}-x_i^{(t)})\\ &x_i^{(t+1)}=x_i^{(t)}+v_i^{(t)} \end{align*} vi(t+1)=ω(t)vi(t)+c1r1(Pi(t)xi(t))+c2r2(S(t)xi(t))xi(t+1)=xi(t)+vi(t)

其中ω(t)\omega(t)ω(t)是随迭代轮数自适应的惯性因子,而r1r_1r1r2r_2r2是两个(0,1)(0,1)(0,1)间的随机数.

4 检查结束条件

如果满足结束条件或t>Gt>Gt>G,则算法终止,否则返回到2,并且设置t=t+1t=t+1t=t+1.

粒子群算法当中的位置和速度更新公式

vi(t+1)=ω(t)vi(t)+c1r1(Pi(t)−xi(t))+c2r2(S(t)−xi(t))xi(t+1)=xi(t)+vi(t) \begin{align*} &v_i^{(t+1)}=\omega(t)v_i^{(t)}+c_1r_1(P_i^{(t)}-x_i^{(t)})+c_2r_2(S^{(t)}-x_i^{(t)})\\ &x_i^{(t+1)}=x_i^{(t)}+v_i^{(t)} \end{align*} vi(t+1)=ω(t)vi(t)+c1r1(Pi(t)xi(t))+c2r2(S(t)xi(t))xi(t+1)=xi(t)+vi(t)

模拟的是单个智能体的决策过程。每个智能体都有回到其历史最优值的趋势Pi(t)−xi(t)P_i^{(t)}-x_i^{(t)}Pi(t)xi(t),前往种群最优值的趋势S(t)−xi(t)S^{(t)}-x_i^{(t)}S(t)xi(t),智能体通过一个随机权值组合(c1r1,c2r2)(c_1r_1,c_2r_2)(c1r1,c2r2)来将这两个趋势结合起来。同时,智能体由于先前的速度,在物理空间中存在惯性ω(t)vi(t)\omega(t)v_i^{(t)}ω(t)vi(t). 这三个部分组合在一起,就构成了对速度的改变量。而位置的改变,就是速度,这是符合物理直觉的。

1.2.1 局部粒子群算法

为了增加更多的随机性,避免算法陷入局部最优值,我们还可以对标准粒子群算法进行修改,得到局部粒子群算法。局部粒子群算法相比较于标准粒子群算法的改动在于:当前迭代轮次当中,每个粒子都计算一个局部适应度最优值si(t)s_i^{(t)}si(t)和局部最优位置Si(t)S_i^{(t)}Si(t). 局部si(t)s_i^{(t)}si(t)Si(t)S_i^{(t)}Si(t)的选择范围,通常是编号与iii相近的个体。例如我们可以取

si(t)=Best(f(xi−1(t)),f(xi(t)),f(xi+1(t)))Si(t)=BestX(f(xi−1(t)),f(xi(t)),f(xi+1(t))) s_i^{(t)}=\text{Best}(f(x_{i-1}^{(t)}),f(x_i^{(t)}),f(x_{i+1}^{(t)}))\\ S_i^{(t)}=\text{BestX}(f(x_{i-1}^{(t)}),f(x_i^{(t)}),f(x_{i+1}^{(t)})) si(t)=Best(f(xi1(t)),f(xi(t)),f(xi+1(t)))Si(t)=BestX(f(xi1(t)),f(xi(t)),f(xi+1(t)))

相应的,粒子的更新算法也要修改为

vi(t+1)=ω(t)vi(t)+c1r1(Pi(t)−xi(t))+c2r2(Si(t)−xi(t))xi(t+1)=xi(t)+vi(t) \begin{align*} &v_i^{(t+1)}=\omega(t)v_i^{(t)}+c_1r_1(P_i^{(t)}-x_i^{(t)})+c_2r_2(S_i^{(t)}-x_i^{(t)})\\ &x_i^{(t+1)}=x_i^{(t)}+v_i^{(t)} \end{align*} vi(t+1)=ω(t)vi(t)+c1r1(Pi(t)xi(t))+c2r2(Si(t)xi(t))xi(t+1)=xi(t)+vi(t)

1.3 差分算法

差分算法类似于遗传算法,具有选择、交叉、变异三个流程。

标准的差分算法可以表述为:

1 初始化

随机初始化一个由NNNddd维行向量组成的集合:X(0)={xi(0)∈Rd∣i=1,2,…,N}X^{(0)}=\{x_i^{(0)}\in\R^d|i=1,2,\dots,N\}X(0)={xi(0)Rdi=1,2,,N},称为种群

初始化变异矩阵H(0)=0∈RN×dH^{(0)}=\bm 0\in \R^{N\times d}H(0)=0RN×d

初始化子代矩阵V(0)=0∈RN×dV^{(0)}=\bm 0\in \R^{N\times d}V(0)=0RN×d

初始化进化代数t=0t=0t=0

2 差分变异

对于每一个个体xi(t)x_{i}^{(t)}xi(t),随机选择三个各不相同的个体xp1(t),xp2(t),xp3(t), (i≠p1≠p2≠p3)x_{p_1}^{(t)},x_{p_2}^{(t)},x_{p_3}^{(t)},\ (i\neq p_1\neq p_2\neq p_3)xp1(t),xp2(t),xp3(t), (i=p1=p2=p3). 计算出变异向量:

hi(t+1)=xp1(t)+F(xp2(t)−xp3(t)) h_i^{(t+1)}=x_{p_1}^{(t)}+F(x_{p_2}^{(t)}-x_{p_3}^{(t)}) hi(t+1)=xp1(t)+F(xp2(t)xp3(t))

如果不存在局部最优问题,也就是环境当中的局部最优适应度等价于整体最优适应度,那么可以把xp1(t)x_{p_1}^{(t)}xp1(t)替换为当前种群中适应度最高的个体xbtx_b^{t}xbt,即

hi(t+1)=xb(t)+F(xp2(t)−xp3(t)) h_i^{(t+1)}=x_{b}^{(t)}+F(x_{p_2}^{(t)}-x_{p_3}^{(t)}) hi(t+1)=xb(t)+F(xp2(t)xp3(t))

这样会使得收敛更快

3 交叉操作

对于每一个个体i,ji,ji,j,随机采样一个λ∈(0,1)\lambda\in(0,1)λ(0,1),计算子代单点位值:

vij(t+1)={hij(t+1),λ<cxij(t),λ≥c v_{ij}^{(t+1)}=\begin{cases} h_{ij}^{(t+1)},&\lambda<c\\ x_{ij}{(t)},&\lambda\geq c \end{cases} vij(t+1)={hij(t+1),xij(t),λ<cλc

4 选择操作

对于每一个个体编号iii,判断子代向量vi(t+1)v_i^{(t+1)}vi(t+1)和父代xi(t)x_i^{(t)}xi(t)的适应度,保留适应度更大的一个:

xi(t+1)={xi(t),f(xi(t))≥f(vi(t+1))vi(t+1),f(xi(t))<f(vi(t+1)) x_i^{(t+1)}=\begin{cases} x_i^{(t)},&f(x_i^{(t)})\geq f(v_i^{(t+1)})\\ v_i^{(t+1)},&f(x_i^{(t)})<f(v_i^{(t+1)}) \end{cases} xi(t+1)={xi(t),vi(t+1),f(xi(t))f(vi(t+1))f(xi(t))<f(vi(t+1))

2. 案例:Rosenbrock函数的最优化

Rosenbrock函数的定义式为:

{f(x1,x2)=100(x12−x22)+(1−x1)2−2.048≤xi≤2.048,i=1,2 \begin{cases} f(x_1,x_2)=100(x_1^2-x_2^2)+(1-x_1)^2\\ -2.048\leq x_i\leq 2.048,&i=1,2 \end{cases} {f(x1,x2)=100(x12x22)+(1x1)22.048xi2.048,i=1,2

我们想要求解如下最优化问题

maxx1,x2 f(x1,x2)s.t. −2.048≤xi≤2.048,i=1,2 \begin{align*} \mathop\text{max}\limits_{x_1,x_2}\ &f(x_1,x_2)\\ \text{s.t.}\ &-2.048\leq x_i\leq 2.048,&i=1,2 \end{align*} x1,x2max s.t. f(x1,x2)2.048xi2.048,i=1,2

2.1 解的编码

Rosenbrock最优化的可行解空间是[−2.048,2.048]2⊂R2[-2.048,2.048]^2\sub\R^2[2.048,2.048]2R2,我们可以把这个空间离散化,在x1,x2x_1,x_2x1,x2轴上,分别以长度0.0040.0040.004为单位,划分成离散的区间片段。以区间[−2.048,−2.044)[-2.048,-2.044)[2.048,2.044)编号为000,沿着实数轴的正向递增地编号为0,1,…,10230,1,\dots,10230,1,,1023.

在两个轴上分别取一个区间,编号组合为(i,j)(i,j)(i,j),它们的交叉部分就是一个可行解空间上的矩形区域。把i,ji,ji,j都转换成10位的二进制串,再首位拼接为20位的二进制串xxx,就把这个二进制串视为区间[0.004i−2.048,0.004i−2.044]×[0.004j−2.048,0.004j−2.044][0.004i-2.048,0.004i-2.044]\times[0.004j-2.048,0.004j-2.044][0.004i2.048,0.004i2.044]×[0.004j2.048,0.004j2.044]内任何一个点的编码,而反过来,用点(0.004i−2.048,0.004j−2.048)(0.004i-2.048,0.004j-2.048)(0.004i2.048,0.004j2.048)作为xxx的解码值。

把编码和解码的流程写作算子encode(⋅)\text{encode}(\cdot)encode()decode(⋅)\text{decode}(\cdot)decode()

2.2 应用遗传算法

参数:

  1. 种群规模:N=80N=80N=80
  2. 迭代次数:G=100G=100G=100
  3. 交叉概率:pc=0.6p_c=0.6pc=0.6
  4. 变异概率:pm=0.1p_m=0.1pm=0.1

流程:

  1. 随机生成NNN个20位的二进制串E={x1,…,xN}E=\{x_1,\dots,x_N\}E={x1,,xN}
  2. 对每一个xi∈Ex_i\in ExiE,解码为浮点数(ui,vi)=decode(xi)(u_i,v_i)=\text{decode}(x_i)(ui,vi)=decode(xi)
  3. 计算每一个解码值的Rosenbrock值fi=f(ui,vi)f_i=f(u_i,v_i)fi=f(ui,vi),并作为对应个体的适应度
  4. 按适应度对EEE进行排序,记录下xb=xNx_b=x_Nxb=xN,删除排在xNx_NxN以后的个体(如果有的话)
  5. 选择交叉种群Ec=Select(E)E_c=\text{Select}(E)Ec=Select(E)
  6. 进行交叉计算E=Crossover(Ec)E=\text{Crossover}(E_c)E=Crossover(Ec)
  7. EEE当中的第NNN个个体置为xmx_mxm(这是利用了最优保存策略)
  8. 进行变异计算E=Mutation(Em)E=\text{Mutation}(E_m)E=Mutation(Em)
  9. EEE当中的第NNN个个体置为xmx_mxm
  10. 判断是否达到最大迭代次数GGG,若达到则终止迭代,否则返回第2步
  11. 取终止迭代时,群体中的最优个体为算法的结果
2.2.1 选择算子

Ec=Select(E)E_c=\text{Select}(E)Ec=Select(E)是这样计算的:

  1. 创建一个空集合EcE_cEc
  2. 计算每个个体的适应度,与平均适应度的比值(下取整)
    f‾=∑i=1Nfiqi=floor(fi/f‾) \begin{align*} &\overline f=\sum_{i=1}^Nf_i\\ &q_i=\text{floor}(f_i/\overline f) \end{align*} f=i=1Nfiqi=floor(fi/f)
  3. 对于每个个体xi∈Ex_i\in ExiE,复制qiq_iqi倍,加入到EcE_cEc当中
  4. 返回EcE_cEc
2.2.2 交叉算子

Em=Crossover(Ec)E_m=\text{Crossover}(E_c)Em=Crossover(Ec)的计算规则是这样的:

  1. 创建一个空集合EmE_mEm
  2. 随机选取一个交叉点位n≤20n\leq 20n20
  3. 随机打乱EcE_cEc当中个体的排序,记打乱后的个体是xi′x'_ixi
  4. 对于每一个i=1,3,…,N−1 or N−2i=1,3,\dots,N-1\ or\ N-2i=1,3,,N1 or N2,进行概率为pcp_cpc的二项决策,决定是否进行交叉
  5. 如果决定交叉,那么就将xi′x'_{i}xixi+1′x'_{i+1}xi+1nnn到20位之间的二进制片段交换,得到x‾i,x‾i+1\overline x_i,\overline x_{i+1}xi,xi+1
  6. 若不交换,则x‾i,x‾i+1\overline x_i,\overline x_{i+1}xi,xi+1就是xi′x'_{i}xixi+1′x'_{i+1}xi+1
  7. x‾i,x‾i+1\overline x_i,\overline x_{i+1}xi,xi+1加入到EmE_mEm
  8. 返回EmE_mEm
2.2.3 变异算子

E=Mutation(Em)E=\text{Mutation}(E_m)E=Mutation(Em)是这样计算的:

  1. 创建空集合E′E'E
  2. 对于每一个i=1,2,…,Ni=1,2,\dots,Ni=1,2,,N,进行概率为pmp_mpm的二项决策,决定是否进行变异
  3. 如果决定进行变异,则将个体x‾i\overline x_ixi的每一位取反,得到x^i\hat x_ix^i,否则x^i=x‾i\hat x_i=\overline x_ix^i=xi
  4. x^i\hat x_ix^i加入到E′E'E
  5. 返回E=E′E=E'E=E

2.3 应用局部粒子群算法

参数:

  1. 粒子群规模:N=50N=50N=50
  2. 学习因子:c1=1.4,c2=1.7c_1=1.4,c_2=1.7c1=1.4,c2=1.7
  3. 自适应惯性因子:ω(k)\omega(k)ω(k).
    ω(k)=kG(ωmax−ωmin) \omega(k)=\frac{k}{G}(\omega_\text{max}-\omega_\text{min}) ω(k)=Gk(ωmaxωmin)
  4. 边界:Vmin=−1,Vmax=1,ωmax=0.1,ωmin=0.9V_\text{min}=-1,V_\text{max}=1, \omega_\text{max}=0.1, \omega_\text{min}=0.9Vmin=1,Vmax=1,ωmax=0.1,ωmin=0.9

算法流程:

  1. 初始化粒子群{(x1,v1),…,(xN,vN)}\{(x_1,v_1),\dots,(x_N,v_N)\}{(x1,v1),,(xN,vN)},其中xix_ixiviv_ivi都是20位的二进制串. 按照当前的粒子群分布,初始化历史最优值pi,Pip_i,P_ipi,Pi,初始化粒子局部最优值最优值si,Sis_i, S_isi,Si,设置迭代次数k=1k=1k=1
  2. 对每个粒子更新速度vi=ω(k)vi+c1r1(Pi−xi)+c2r2(Si−xi)v_i=\omega(k)v_i+c_1r_1(P_i-x_i)+c_2r_2(S_i-x_i)vi=ω(k)vi+c1r1(Pixi)+c2r2(Sixi)
    r1r_1r1r2r_2r2是随机采样的(0,1)(0,1)(0,1)之间的值。对于超过区间[Vmin,Vmax][V_\text{min},V_\text{max}][Vmin,Vmax]的值,取边界值。
  3. 对每个粒子更新位置xi=xi+vix_i=x_i+v_ixi=xi+vi
  4. 对每一个粒子xix_ixi,计算适应度fi=f(decode(xi))f_i=f(\text{decode}(x_i))fi=f(decode(xi))
  5. 如果fi>pif_i>p_ifi>pi,则更新pi=fi,Pi=Xip_i=f_i, P_i=X_ipi=fi,Pi=Xi
  6. 计算每个粒子的局部最优值si,Sis_i, S_isi,Si
  7. 如果k>Gk>Gk>G,终止。否则更新k=k+1k=k+1k=k+1并且回到2
  8. 取终止迭代时,粒子群中的最优粒子为算法的结果

2.4 应用差分进化算法

参数:

  1. 种群规模:N=30N=30N=30
  2. 迭代次数:G=50G=50G=50
  3. 变异因子:F=1.2F=1.2F=1.2
  4. 交叉因子:c=0.9c=0.9c=0.9

流程:

  1. 随机初始化种群E={x1,x2,…,xN}E=\{x_1,x_2,\dots,x_N\}E={x1,x2,,xN},计算最优值xbx_bxb和最优适应度fb=f(xb)f_b=f(x_b)fb=f(xb),置迭代次数为t=0t=0t=0
  2. 对于每一个xix_ixi,随机选择i≠r1≠r2≠r3i\neq r_1\neq r_2\neq r_3i=r1=r2=r3,计算差分变异:

hi=xr1+F(xr2−xr3) h_i=x_{r_1}+F(x_{r_2}-x_{r_3}) hi=xr1+F(xr2xr3)

  1. 对于每一个i,ji,ji,j,随机生成一个λ∈(0,1)\lambda\in(0,1)λ(0,1),计算交叉子代矩阵

vij={hij,λ<cxij,λ≥c v_{ij}=\begin{cases} h_{ij},&\lambda<c\\ x_{ij},&\lambda\geq c \end{cases} vij={hij,xij,λ<cλc

  1. 对于每一个iii,进行选择

xi={xi,f(xi)≥f(vi)vi,f(xi)<f(vi) x_i=\begin{cases} x_i,&f(x_i)\geq f(v_i)\\ v_i,&f(x_i)<f(v_i) \end{cases} xi={xi,vi,f(xi)f(vi)f(xi)<f(vi)

  1. 判断是否得到最大迭代次数,若是则终止迭代,否则置t=t+1t=t+1t=t+1
  2. 取终止迭代时群体中的最优个体作为算法的结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值