进化算法(evolutionary algorithms,EA)是基于自然选择和自然遗传等生物进化机制的一种搜索算法。进化算法是一个“算法簇” ,包括遗传算法(GA)
、遗传规划
和进化规划
等。进化算法的基本框架是遗传算法所描述的框架。进化算法可广泛应用于组合优化、机器学习、自适应控制、规划设计和人工生命等领域。
适者生存
:最适合自然环境的群体往往产生了更大的后代群体。生物进化的基本过程如下图:
适用性
原则:一个算法的适用性是指该算法所能适用的问题种类,它取决于算法所需的限制与假定。优化问题的不同,则相应的处理方式也不同。可靠性
原则:一个算法的可靠性是指算法对于所设计的问题,以适当的精度求解其中大多数问题的能力。因为演化计算的结果带有一定的随机性和不确定性,所以,在设计算法时应尽量经过较大样本的检验,以确认算法是否具有较大的可靠度。收敛性
原则:指算法能否收敛到全局最优。在收敛的前提下,希望算法具有较快的收敛速度。稳定性
原则:指算法对其控制参数及问题的数据的敏感度。如果算法对其控制参数或问题的数据十分敏感,则依据它们取值的不同,将可能产生不同的结果,甚至过早地收敛到某一局部最优解。所以,在设计算法时应尽量使得算法对一组固定的控制参数能在较广泛的问题的数据范围内解题,而且对一组给定的问题数据,算法对其控制参数的微小扰动不很敏感。生物类比
原则:因为进化算法的设计思想是基于生物演化过程的,所以那些在生物界被认为是有效的方法及操作可以通过类比的方法引人到算法中,有时会带来较好的结果。在求解问题时从多个解开始,然后通过一定的法则进行逐步迭代以产生新的解。
生物遗传学概念 | 遗传算法之应用 |
---|---|
适者生存 | 目标值比较大的解被选择的可能性大 |
个体(Individual) | 解 |
染色体(Chromosome) | 解的编码(字符串、向量等) |
基因(Gene) | 解的编码中每一分量 |
适应性(Fitness) | 适应度函数值 |
群体(Population) | 根据适应度值选定的一组解(解的个数 为群体的规模) |
婚配(Marry) | 交叉(Crossover)选择两个染色体进行 交叉产生一组新的染色体的过程 |
变异(Mutation) | 编码的某一分量发生变化的过程 |
由于遗传算法不能直接处理问题空间的参数,因此必须通过编码将要求解的问题表示成遗传空间的染色体或者个体。对一个具体问题如何进行编码是应用遗传算法的首要问题,也是其难点。
位串编码
:将问题空间的参数编码为一维排列的染色体的方法被称为一维染色体编码方法。其中最常用的就是二进制编码
二进制编码
:用若干二进制数表示一个个体,将原问题 的解空间映射到位串空间 B = { 0 , 1 } B=\{0,1\} B={0,1}上,然后在位串空间上进行遗传操作。
Gray 编码
:将二进制编码通过一个变换进行转换得到的编码。设二进制串 < β 1 β 2 ⋯ β n > <\beta_1\beta_2\cdots\beta_n> <β1β2⋯βn>对应Gray 串 < γ 1 γ 2 ⋯ γ n > <\gamma_1\gamma_2\cdots\gamma_n> <γ1γ2⋯γn>,则从二进制编码到Gray 编码的变换为:
γ k = { β 1 k = 0 β k − 1 ⊕ β k k > 1 \begin{equation} \gamma_k=\left\{ \begin{aligned} & \beta_1 & k=0 \\ & \beta_{k-1}\oplus\beta_k & k>1 \end{aligned} \right. \end{equation} γk={β1βk−1⊕βkk=0k>1
式中 ⊕ \oplus ⊕表示模 2 加法,从一个Gray串到二进制串的变换为:
β k = ∑ i = 1 k γ i ( m o d 2 ) = { γ 1 k = 1 β k − 1 ⊕ γ k k > 1 \begin{equation} \beta_k=\sum^k_{i=1}\gamma_i(mod\ 2)=\left\{ \begin{aligned} & \gamma_1 & k=1 \\ & \beta_{k-1}\oplus\gamma_k & k>1 \end{aligned} \right. \end{equation} βk=i=1∑kγi(mod 2)={γ1βk−1⊕γkk=1k>1
Gray 编码克服了二进制编码的Hamming悬崖的缺点。
实数编码
:用若干使署表示一个个体,然后在实数空间上进行遗传操作。采用实数表达法不必进行数制转换,可直接在解的表现型上进行遗传操作。
多参数级联编码
:把每个参数先进行二进 制编码得到子串,再把这些子串连成一个完整的染色体。多参数级联编码中的每个子串对应各自的编码参数, 所以可以有不同的串长度和参数的取值范围。
群体设定主要包括初始种群的产生和种群规模的确定:
适应度是评价个体优劣的标准。适应度函数是用来区分群体中个体好坏的标准,一般而言适应度函数是由目标函数变换得到的。
将目标函数映射成适应度函数的方法
适应度函数的尺度变换:在遗传算法中,将所有妨碍适应度值高的个体产生,从 而影响遗传算法正常工作的问题统称为欺骗问题 (deceptive problem)
。如果出现过早收敛
则需要缩小这些个体的适应度,以降低这些超级个 体的竞争力。如果停滞现象
则需要改变原始适应值的比例关系,以提高个体之 间的竞争力。对适应度函数值域的某种映射变换即为适应度函数的尺度变换(fitness scaling)或者定标
。
线性变换
f ′ = a f + b 满足 f ′ a v g = f a v g , f ′ m a x = C m u l t ⋅ f a v g 其中 a = ( C m u l t − 1 ) f a v g f m a x − f a v g b = ( f m a x − C m u l t f a v g ) f a v g f m a x − f a v g f'=af+b\\满足{f'}_{avg}=f_{avg}\ ,\ {f'}_{max}=C_{mult}\cdot f_{avg}\\ \\ 其中a=\frac{(C_{mult}-1)f_{avg}}{f_{max}-f_{avg}}\qquad b=\frac{(f_{max}-C_{mult}f_{avg})f_{avg}}{f_{max}-f_{avg}} f′=af+b满足f′avg=favg , f′max=Cmult⋅favg其中a=fmax−favg(Cmult−1)favgb=fmax−favg(fmax−Cmultfavg)favg
幂函数变换法
f ′ = f K f'=f^K f′=fK
式中幂指数 K K K 与求解问题有关,且在算法过程中可按需修正。
指数函数变换法
f ′ = e − a f f'=e^{-af} f′=e−af
式中 a a a 决定了复制的强制性,其值越小复制的强制性就越趋于那些具有最大适应度的个体。
选择操作也称为复制(reproduction)操作:从当前群体中按照一定概率选出优良的个体,使它们有机会作为父代繁殖下一代子孙。判断个体优良与否的准则是各个个体的适应度值,即个体适应度越高,其被选择的机会就越多。
如果总挑选最好的,则遗传算法就变成了确定优化方法,使种群过快收敛到局部最优解。如果只做随机选择,则遗传算法就变成完全随机方法,需要很长时间才收敛。介绍以下几种常见选择方法:
个体选择概率分配
适应度比例方法
:各个个体被选择的概率和其适应度值成比例。设群体规模大小为 M M M,个体 i i i 的适应度值为 f i f_i fi,则这个个体被选择的概率为
p s i = f i ∑ i = 1 k f i p_{si}=\frac{f_i}{\sum\limits^k_{i=1}f_i} psi=i=1∑kfifi
排序方法
:对每个个体按适应度大小顺序对群体中个体进行排序,然后把事先设计好的概率按排序分配给个体作为其选择概率。概率仅取决于个体在种群中的序位,排在前面的个体有较多的被选择的机会。常用以下排序方法:
线性排序:群体成员按适应值大小从好到坏依次排列并按下式分配选择概率
p i = a − b i M ( M + 1 ) p_i=\frac{a-bi}{M(M+1)} pi=M(M+1)a−bi
其中, a , b a,b a,b 是常数。然后按类似转盘式选择的方式选择父体进行遗传操作。
非线性排序:群体成员按适应值大小从好到坏依次排列并按下式分配选择概率
p i = { q ( 1 − q ) i − 1 i = 1 , 2 , ⋯ , M − 1 ( 1 − q ) M − 1 i = M \begin{equation} p_i=\left\{ \begin{aligned} & q(1-q)^{i-1} && i=1,2,\cdots,M-1\\ & (1-q)^{M-1} && i=M \end{aligned} \right. \end{equation} pi={q(1−q)i−1(1−q)M−1i=1,2,⋯,M−1i=M
选择个体方法
当两个生物机体配对或者复制时,它们的染色体相互混合,产生一个由双方基因组成的全新的染色体组。这一过程称为重组(recombination)或者交叉(crossover)。遗传算法中起核心作用的是交叉算子,也称为基因重组(recombination)。采用的交叉方法应能够使父串的特征遗传给子串。子串应能够部分或者全部地继承父串的结构特征和有效基因。
基本交叉算子
修正的交叉方式
由于交叉可能出现不满足约束条件的非法染色体。为解决这一问题,可以采取构造惩罚函数的方法,但试验效果不佳,使得本已复杂的问题更加复杂。另一种处理方法是对交叉、变异等遗传操作作适当的修正,使其自动满足优化问题的约束条件。
进化机制除了能够改进已有特征,也能够产生新的特征。在遗传算法中,变异是将个体编码中的一些位进行随机变化。变异的主要目的是维持群体的多样性,为选择、交叉过程中可能丢失的某些遗传基因进行修复和补充。变异算子的基本内容是对群体中的个体串的某些基因座上的基因值作变动。变异操作是按位进行的,即把某一位的内容进行变异。变异概率是在一个染色体中按位进行变化的概率。主要变异方法有以下5种。
为防止群体重要单一基因丢失,变异概率 P m P_m Pm通常设置为0.001左右。
使用随机方法或者其它方法,产生一个有 N N N 个染色体的初始群体
p o p ( 1 ) , t : = 1 pop(1),\ t:=1 pop(1), t:=1
对群体中的每一个染色体 p o p i ( t ) pop_i(t) popi(t),计算其适应值
f i = f i t n e s s ( p o p i ( t ) ) f_i=fitness(pop_i(t)) fi=fitness(popi(t))
若满足停止条件,则算法停止;否则,以概率 p i = f i / ∑ j = 1 N f j p_i=f_i/\sum\limits^N_{j=1}f_j pi=fi/j=1∑Nfj 从 p o p ( t ) pop(t) pop(t)中随机选择一些染色体构成一个新种群
n e w p o p ( t + 1 ) = { p o p j ( t ) ∣ j = 1 , 2 , ⋯ , N } newpop(t+1)=\{pop_j(t)\mid j=1,2,\cdots,N \} newpop(t+1)={popj(t)∣j=1,2,⋯,N}
以概率 p c p_c pc 进行交叉产生一些新的染色体,得到一个新的群体
c r o s s p o p ( t + 1 ) crosspop(t+1) crosspop(t+1)
以一个较小的概率 p m p_m pm使染色体的一个基因发生变异, 形成 m u t p o p ( t + 1 ) ; t : = t + 1 mutpop(t+1);t:=t+1 mutpop(t+1);t:=t+1 ,成为一个新的群体
p o p ( t ) = m u t p o p ( t + 1 ) pop(t)=mutpop(t+1) pop(t)=mutpop(t+1)
返回 2。
基本思想:双倍体遗传算法采用显性和隐性两个染色体同时进行进化,提供了一种记忆以前有用的基因块的功能。双倍体遗传算法采用显性遗传,延长了有用基因块的寿命,提高了算法的收敛 能力,在变异概率低的情况下能保持一定水平的多样性。
双倍体遗传算法的设计
基本流程:
基本思想:在遗传算法中使用多种群同时进化,并交换种群之间优秀个体所携带的遗传信息,以打破种群内的平衡态达到更高的平衡态,有利于算法跳出局部最优。
双种群遗传算法的设计:
基本流程:
基本思想:使交叉概率 P c P_c Pc和变异概率 P m P_m Pm能够随适应度变化自动改变。当种群各个体适应度趋于一致或者趋于局部最优时,使 P c P_c Pc和 P m P_m Pm增加,以跳出局部最优;而当群体适应度比较分散时,使 P c P_c Pc和 P m P_m Pm减少,以利于优良个体的生存。同时,对于适应度高于群体平均适应值的个体,选择较低的 P c P_c Pc和 P m P_m Pm,使得该解得以保护进入下一代;对低于平均适应值的个体,选择较高的 P c P_c Pc和 P m P_m Pm,使该解被淘汰。
自适应遗传算法的步骤:
自适应的交叉概率与变异概率: P c P_c Pc和 P m P_m Pm按照以下公式进行调整
p c = { k 1 ( f m a x − f ′ ) f m a x − f a v g f ′ > f a v g k 2 f ′ ≤ f a v g \begin{equation} p_c=\left\{ \begin{aligned} & \frac{k_1(f_{max}-f')}{f_{max}-f_{avg}} && f'>f_{avg}\\ & k_2 && f'\le f_{avg} \end{aligned} \right. \end{equation} pc=⎩ ⎨ ⎧fmax−favgk1(fmax−f′)k2f′>favgf′≤favg
p m = { k 3 ( f m a x − f ′ ) f m a x − f a v g f ′ > f a v g k 4 f ′ ≤ f a v g \begin{equation} p_m=\left\{ \begin{aligned} & \frac{k_3(f_{max}-f')}{f_{max}-f_{avg}} && f'>f_{avg}\\ & k_4 && f'\le f_{avg} \end{aligned} \right. \end{equation} pm=⎩ ⎨ ⎧fmax−favgk3(fmax−f′)k4f′>favgf′≤favg
式中 f m a x f_{max} fmax是群体中最大的适应度值; f a v g f_{avg} favg是每代群体的平均适应度值; f ′ f' f′是要交叉的两个个体中较大的适应度值; f f f是要变异的个体的适应度值。 k 1 , k 2 , k 3 , k 4 k_1,\ k_2,\ k_3,\ k_4 k1, k2, k3, k4 是 ( 0 , 1 ) (0,\ 1) (0, 1)之间的常数。
由简单个体组成的群落与环境以及个体之间的互动行为称为群体智能。群智能算法(swarm algorithms,SI)是受动物群体智能启发的算法。群智能算法包括:粒子群优化算法、蚁群算法、蜂群算法等。
粒子群优化(Particle Swarm Optimization, PSO)算法的基本概念源于对鸟群觅食行为的研究。其基本思想是将每个个体看作n维搜索空间中一个没有体积质量的粒子,在 搜索空间中以一定的速度飞行,该速度决定粒子飞行的方向和距离。所有粒子还有一个由被优化的函数决定的适应值。PSO初始化为一群随机粒子,然后通过迭代找到最优解。在每 一次迭代中,粒子通过跟踪两个“极值”来更新自己。第一个就是粒子本身所找到的最优解,这个解称为个体极值。另个一是整个种群目前找到的最优解,这个解称为全局极值。
算法定义:在 n 维连续搜索空间中,对粒子群中的第 i ( i = 1 , 2 , ⋯ , m ) i(i=1,2,\cdots,m) i(i=1,2,⋯,m) 个粒子,定义
每个粒子经历过的最优位置(pbest)记为 p i ( k ) = [ p 1 i p 2 i ⋯ p n i ] p^i(k)=[p^i_1\quad p^i_2\cdots p^i_n] pi(k)=[p1ip2i⋯pni], 群体经历过的最优位置(gbest)记为 p g ( k ) = [ p 1 g p 2 g ⋯ p n g ] p^g(k)=[p^g_1\quad p^g_2\cdots p ^g_n] pg(k)=[p1gp2g⋯png],则基本的PSO算法为:
v j i ( k + 1 ) = ω ( k ) v j i ( k ) + φ 1 r a n d ( 0 , a 1 ) ( p j i ( k ) − x j i ( k ) ) + φ 2 r a n d ( 0 , a 2 ) ( p j g ( k ) − x j i ( k ) ) x j i ( k + 1 ) = x j i ( k ) + v j i ( k + 1 ) i = 1 , 2 , ⋯ , m ; j = 1 , 2 , ⋯ , n v^i_j(k+1)=\omega(k)v^i_j(k)+\varphi_1\ rand(0,a_1)(p^i_j(k)-x^i_j(k))+\varphi_2\ rand(0,a_2)(p^g_j(k)-x^i_j(k))\\ \\x^i_j(k+1)=x^i_j(k)+v^i_j(k+1)\qquad i=1,2,\cdots,m;\ j=1,2,\cdots,n vji(k+1)=ω(k)vji(k)+φ1 rand(0,a1)(pji(k)−xji(k))+φ2 rand(0,a2)(pjg(k)−xji(k))xji(k+1)=xji(k)+vji(k+1)i=1,2,⋯,m; j=1,2,⋯,n
其中 ω \omega ω 是惯性权重因子。 φ 1 、 φ 2 \varphi_1、\varphi_2 φ1、φ2 是加速度常数,均为非负值。 r a n d ( 0 , a 1 ) rand(0,a_1) rand(0,a1) 和 r a n d ( 0 , a 2 ) rand(0,a_2) rand(0,a2) 为 [ 0 , a 1 ] 、 [ 0 , a 2 ] [0,a_1]、[0,a_2] [0,a1]、[0,a2] 范围内的具有均匀分布的随机数, a 1 a_1 a1 和 a 2 a_2 a2为相应的控制参数。
上述等式等号右侧:
基于学习率 φ 1 、 φ 2 \varphi_1、\varphi_2 φ1、φ2 ,Kennedy给出以下4 种类型的PSO模型
:
粒子群优化算法的流程:
初始化每个粒子,即在允许范围内随机设置每个粒子的初始位置和速度。
评价每个粒子的适应度,计算每个粒子的目标函数。
设置每个粒子的 p i p_i pi。对每个粒子,将其适应度与其经历过的最好位置 p i p_i pi 进行比较,如果优于 p i p_i pi,则将其作为该粒子的最好位置 p i p_i pi。
设置全局最优值 P g P_g Pg。对每个粒子,将其适应度与群体经历过的最好位置 P g P_g Pg 进行比较,如果优于 P g P_g Pg,则将其作为当前群体的最好位置 P g P_g Pg。
根据上方公式更新粒子的速度和位置。
检查终止条件。如果未达到设定条件(预设误差或 者迭代的次数),则返回第 2 步。
PSO算法的参数
位置更新方程中各部分的影响
参数设置
ω \omega ω 固定为1.0, φ 1 , φ 2 \varphi_1,\varphi_2 φ1,φ2 固定为2.0,因此 V m a x V_{max} Vmax 成为唯一需要调节的参数,通常设为每维变化范 围10%~20%。Suganthan的实验表明, φ 1 , φ 2 \varphi_1,\varphi_2 φ1,φ2 为常数时 可以得到较好的解,但不一定必须为2。这些参数也可以通过模糊系统进行调节。Shi和Eberhart 提出一个模糊系统来调节 ω \omega ω 。
20世纪90年代初,意大利科学家Marco Dorigo等受蚂蚁觅食行为的启发,提出蚁群算法(Ant Colony Optimization,ACO)。一种应用于组合优化问题的启发式搜索算法。在解决离散
组合优化方面具有良好的性能。
蚁群优化算法的第一个应用是著名的旅行商问题。
蚁群系统模型:
m m m:是蚁群中蚂蚁的数量
d x y ( x , y = 1 , ⋅ ⋅ ⋅ , n ) d_{xy}(x,y=1,···,n) dxy(x,y=1,⋅⋅⋅,n):表示元素(城市) 和元素(城市) 之间的距离。
η x y ( t ) \eta_{xy}(t) ηxy(t):表示能见度,称为启发信息函数,等于距离的倒数,即 η x y ( t ) = 1 d x y \eta_{xy}(t)=\frac{1}{d_{xy}} ηxy(t)=dxy1。
b x ( t ) b_x(t) bx(t):表示 t 时刻位于城市x的蚂蚁的个数, m = ∑ x = 1 n b x ( t ) m=\sum\limits^n_{x=1}b_x(t) m=x=1∑nbx(t)。
τ x y ( t ) \tau_{xy}(t) τxy(t):表示 t 时刻在 xy 连线上残留的信息素,初始时刻,各条路径上的信息素相等即 τ s y ( 0 ) = C ( c o n s t ) \tau_{sy}(0)=C(const) τsy(0)=C(const)。蚂蚁k在运动过程中,根据各条路径上的信息素决定转移方向。
P x y k ( t ) P^k_{xy}(t) Pxyk(t):表示在 t 时刻蚂蚁 k 选择从元素(城市) x 转移到元素(城 市) y 的概率,也称为随机比例规则。由信息素和局部启发信息共同决定。
P x y k ( t ) = { ∣ τ x y ( t ) ∣ α ∣ η x y ( t ) ∣ β ∑ y ∈ a l l o w e d k ( x ) i f y ∈ a l l o w e d k ( x ) 0 其他 \begin{equation} P^k_{xy}(t)=\left\{ \begin{aligned} & \frac{\mid\tau_{xy}(t)\mid^\alpha\mid\eta_{xy}(t)\mid^\beta}{\sum\limits_{y\in allowed_k(x)}} && if\quad y\in allowed_k(x)\\ & 0 && 其他 \end{aligned} \right. \end{equation} Pxyk(t)=⎩ ⎨ ⎧y∈allowedk(x)∑∣τxy(t)∣α∣ηxy(t)∣β0ify∈allowedk(x)其他
用参数 1 − ρ 1-\rho 1−ρ 表示信息素消逝程度,蚂蚁完成一次循环,各路径上信息素浓度消散规则为: τ x y ( t ) = ρ τ x y ( t ) + Δ τ x y ( t ) \tau_{xy}(t)=\rho\tau_{xy}(t)+\Delta\tau_{xy}(t) τxy(t)=ρτxy(t)+Δτxy(t),蚁群的信息素浓度更新规则为: Δ τ x y ( t ) = ∑ k = 1 m Δ τ x y k ( t ) \Delta\tau_{xy}(t)=\sum\limits^m_{k=1}\Delta\tau^k_{xy}(t) Δτxy(t)=k=1∑mΔτxyk(t)。M. Dorigo给出 Δ τ x y k ( t ) \Delta\tau^k_{xy}(t) Δτxyk(t)三种不同模型:
蚂蚁圈系统(Ant-cycle System):单只蚂蚁所访问路径上的信息素浓度更新规则为:
Δ τ x y k ( t ) = { Q L k 若第 k 值蚂蚁在本次循环中从 x 到 y 0 否则 \begin{equation} \Delta\tau^k_{xy}(t)=\left\{ \begin{aligned} & \frac{Q}{L_k} && 若第k值蚂蚁在本次循环中从x到y\\ & 0 && 否则 \end{aligned} \right. \end{equation} Δτxyk(t)=⎩ ⎨ ⎧LkQ0若第k值蚂蚁在本次循环中从x到y否则
其中:
蚂蚁圈系统利用的是全局信息 Q / L k Q/L_k Q/Lk,即蚂蚁完成一个循环后,更新所有路径上的信息。效果最好,通常作为蚁群优化算法的基本模型。
蚂蚁数量系统(Ant-quantity System)
Δ τ x y k ( t ) = { Q d k 若第 k 值蚂蚁在本次循环中从 x 到 y 0 否则 \begin{equation} \Delta\tau^k_{xy}(t)=\left\{ \begin{aligned} & \frac{Q}{d_k} && 若第k值蚂蚁在本次循环中从x到y\\ & 0 && 否则 \end{aligned} \right. \end{equation} Δτxyk(t)=⎩ ⎨ ⎧dkQ0若第k值蚂蚁在本次循环中从x到y否则
蚂蚁数量系统 利用的是局部信息 Q / d k Q/d_k Q/dk,即蚂蚁每走一步都要更新残留信息素的浓度。
蚂蚁密度系统(Ant-density System)
Δ τ x y k ( t ) = { Q 若第 k 值蚂蚁在本次循环中从 x 到 y 0 否则 \begin{equation} \Delta\tau^k_{xy}(t)=\left\{ \begin{aligned} & Q && 若第k值蚂蚁在本次循环中从x到y\\ & 0 && 否则 \end{aligned} \right. \end{equation} Δτxyk(t)={Q0若第k值蚂蚁在本次循环中从x到y否则
蚂蚁密度系统 利用的是局部信息 Q Q Q,即蚂蚁每走一步都要更新残留信息素的浓度。
全局信息更新方法的优点: