差分进化算法
前言
差分进化算法(Differential Evolution Algorithm,DE)是一种高效的全局优化算法。它也是基于群体的启发式搜索算法,群中的每个个体对应一个解向量。差分进化算法的进化流程则与遗传算法非常类似,都包括变异、杂交和选择操作,但这些操作的具体定义与遗传算法有所不同。
差分进化算法
差分进化算法和遗传算法有些相似,但是比遗传算法简单好实现,但是差分进化算法的变种,或者说变形有很多,大家可以根据具体情况选择。
差分进化算法也是在现有的解上面,根据一定的办法选择几个解,根据变异公式把这几个解融合成一个变异解,这个过程称为变异;把第i个变异解和第i个旧解的每个参数,跟据一定概率选择选择新解或者旧解的值,称为交叉,形成交叉解;把第i个交叉解和第i个旧解比较,选择较优的解保存作为下一次循环的解,这也是差分进化算法最不同于遗传算法的地方。
差分进化算法流程
初始化
随机初始化数目为NP的D维参数向量 $x$ ,$x(i)$ 表示第i个解,每个解参数可以表示为 $x(i,j)$ ,$i=1,2,…,NP,j=1,2,…,D$
解数目NP根据情况选择,一般选取[50,200]。变异
对于每个解向量$x(i)$,对应的变异向量$v$可以表示为:
$$
\begin{aligned}
v(i)=x(r_{0})+F*(x(r_{1})-x(r_{2}))
\end{aligned}
$$
$r0,r1,r2$为属于[1,…,NP]的三个随机数,并且 $i,r0,r1,r2$ 都不相同,这要求NP必须大于等于4。
变异算子 $F$ 取值范围为[0,2],F过小可能陷入局部最优,F过大则不容易收敛,一般去[0.4,1]居多。
边界问题:如果变异以后的值$v(i,j)$超出了边界,可以随机再选择一个数,或者直接去边界值都是可以的。交叉
接下来求交叉向量u,对于u的每个值,有:
如果 $rand()<=CR: u(i,j)=v(i,j)$
如果 $rand()>CR : u(i,j)=x(i,j)$
$rand()$是一个随机数,CR是交叉算子,[0,1],用来控制选择变异向量值还是原来的向量值。选择
把交叉向量和原向量对比,选择较优的那个,这里交叉向量之和对应的原向量对比,也就是对比$u(i)$和$x(i)$哪个更优,就选择哪个作为新的解向量,更新向量$x$,进行下一步。终止条件
当最后的解满足条件,或者遍历次数达到最大,则结束,否则重复2到4。
总结
差分进化算法比较简答,容易实现,可修改的地方也不少,比如变异向量选择上面,可以选择x(best)+F*(x(r1)-x(r2)),x(best)是全局最优解。甚至说F*(…)里面的随机参数,可以是四个六个,这些都是差分进化算法的变形。
代码
题目:
''' |