算法简介
1995 年 Price 和 Storn 首次提出差分演化算法 (Differential Evolution) ,因为其结构简单(只有 3 个主要操作算子)、控制参数少(只有 3 个主要参数)、实现容易(基本 C 语言实现不到 30 行)、鲁棒性强、搜索能力好、收敛快等优点,得到了国内外学者的广泛关注并迅速发展。在短短的 20 年时间里,大量基于差分演化算法的改进算法被提出 。并且,差分演化算法已被广泛应用到许多领域,如模式识别 、化学工程 、工程设计 、信号处理 , 卫星通信 、数据挖掘、生物信息、人工神经网络 。
同其他演化算法类似,差分演化算法也是一种基于种群的全局优化算法。其主要思想是将两个个体向量进行做差运算得到差分向量,然后对其进行缩放,并将结果和另一个个体向量相加,从而得到变异向量;接着,变异向量根据交叉策略,同个体向量进行交叉操作,生成试验向量;最后,将试验向量同个体向量进行一对一的竞争,选择适应值好的个体向量进入下一代,如图1所示。
差分演化算法通过变异、交叉和选择三个基本演化算子来引导种群往好的方向不断进行演化,直到满足算法的终止条件。接下来,本文将对算法的基本流程和主要控制参数进行详细的介绍。
算法基本流程
作为一种演化算法,差分演化算法的流程与其他演化算法类似,主要包括种群初始化、个体适应值评价、通过差分演化算子引导算法的演化过程等。
不失一般性,本文假设所要优化的问题为:最小化
f
(
X
)
f(X)
f(X),
X
∈
R
D
X \in {R^D}
X∈RD ,其中 D为所需要优化的问题自变量的维数。在差分演化算法中,种群规模记为 NP,第i 个个体表示为:
其中G表示代数 。
在传统的差分演化算法中,我们采用“DE/x/y/z”来表示和区别不同的差分演化算法,其中“DE”表示差分演化算法,“x”表示基向量的选择方式,“y”表示差分向量的个数,“z”表示交叉操作方式。算法1给出了差分演化算法“DE/rand/1/bin”的主要伪代码。接下来,本博客将从种群初始化、适应值评价以及三个主要演化算子等方面对算法进行详细介绍。
种群初始化
为了让初始种群尽可能均匀地分布在整个搜索空间中,需要对每个个体的每一维,根据其取值范围,采用随机的方式产生。即,对于第 i 个个体的第 j 维采用下面公式进行随机均匀初始化。
其中,rand[0,1) 表示区间 [0,1) 内的随机数实数,
L
j
{L^j}
Lj和
U
j
{U^j}
Uj分别表示第 j 维的下界和上界。
个体适应值评价
在处理优化问题时,种群个体 X i , G {X_{i,G}} Xi,G 的适应值 f ( X i , G ) f({X_{i,G}}) f(Xi,G)由具体的优化目标决定。在差分演化算法中,算法对种群中的每个个体进行适应值计算,进而评价每个个体的优化能力,为选择算子提供参考,以此来指导种群的演化过程。虽然,适应值只是反映了个体的好坏程度,但在种群的层面上,适应值包含了丰富的种群信息,在一定程度上反映了种群的演化状态和所优化问题的信息,对于算法的搜索具有一定的引导作用。
差分演化算子
差分演化算法中主要有三个演化算子:变异、交叉和选择。在每一代,算法对种群中的每一个个体都执行这三个演化算子,从而得到相应的子代个体,然后通过一对一的选择方式,让好的个体进入下一代种群。下面对这三个演化算子做详细介绍。
变异算子
交叉算子
差分演化算法的交叉算子采用的是离散交叉的方式,具体操作主要有两种:二项式交叉 (binomial crossover) 和指数交叉 (exponential crossover)。
其中,⟨·⟩ 表示为以 D 为模的取模函数。
选择算子
在差分演化算法中,选择算子具有指导种群演化的作用,这主要是通过适应值评价来实现的。对于每一个当前个体向量
X
i
,
G
{X_{i,G}}
Xi,G ,通过前面的变异和交叉操作,都会得到一个相应的试验个体向量
U
i
{U_i}
Ui。然后,选择算子采用一对一选择方式 (one-to-one selection) 对
X
i
,
G
{X_{i,G}}
Xi,G和
U
i
{U_i}
Ui进行比较,选择其中适应值较好的作为下一代种群的个体。具体公式如下:
算法控制参数
从上一节对差分演化算法流程的介绍中可以看出,主要有三个控制参数在影响算法的执行,即种群规模 (NP)、变异算子的缩放因子 (F) 以及交叉算子的交叉概率 (CR)。这三个控制参数和差分演化算法的搜索能力以及收敛速度有着密切的关联,面对不同的问题,一般需要对这三个参数进行适当的调整,以得到最优性能。下面对这三个参数对算法的影响做简要的总结:
- 种群规模(NP):当种群规模较大时,种群对搜索空间的覆盖率就比较高,种群便有了更好的多样性,算法的全局探索能力得到增强,有更大的概率搜索到全局最优解,但这样就导致一个问题,就是算法的收敛速度会变慢;当种群规模较小时,种群在搜索空间中的分布会比较密集,算法的局部勘探能力得到增强,收敛速度更快,但同样会产生一个问题,就是算法很容易陷入局部最优并产生停滞现象。
- 缩放因子 (F): 变异算子中的缩放因子可以看成是一种对个体的扰动因子,控制着个体在搜索空间中的跳变步长,对种群的多样性和收敛性有很大的影响。当 F 取值较大时,对个体的扰动就较大,从而增加了种群多样性,算法的全局探索能力得到增强,比较容易跳出局部最小值,但算法的收敛速度也会变慢;当 F取值较小时,对个体的扰动就较小,从而使得个体在搜索空间的跳变步长减小,算法的局部勘探能力得到增强,收敛速度变快,但算法就容易陷入局部最优并产生停滞现象。
- 交叉概率 (CR): 交叉算子中的交叉概率控制着当前个体每一维发生改变的可能性。当 CR 取值较大时,变异个体的方向信息能更好的传递给试验个体,保证了对坐标轴正交方向以外的区域的搜索,有利于解决自变量相互联的优化问题;当CR 取值较小时,变异个体的方向信息中能传递给试验个体的就会减少,从而使得种群可以更多地往坐标轴的正交方向搜索,有利于解决自变量相互独立的优化问题。