算法 - 差分进化(DE)算法
文章目录
- 简介
- 1. 算法原理
- 2. 算法流程
- 2.1 初始化种群
- 2.2 变异
- 2.3 交叉
- 2.4 选择
- 3. 算法代码
- 3.1 伪代码
- 3.2 matlab
- 4. 参数控制[^1]
- 4.1 参数说明
- 4.2 参数选择
- 5. 改进方法[^1]
- 5.1 自适应变异算子
简介
差分进化算法(Differential Evolution,DE)由Storn和Price于1995年首次提出。主要用于求解实数优化问题。该算法是一类基于群体的自适应全局优化算法,属于演化算法的一种,由于其具有结构简单、容易实现、收敛快速、鲁棒性强等特点,因而被广泛应用在数据挖掘、模式识别、数字滤波器设计、人工神经网络、电磁学等各个领域。1996年在日本名古屋举行的第一届国际演化计算(ICEO)竞赛中,差分进化算法被证明是速度最快的进化算法。
1. 算法原理
DE算法通过采用浮点矢量进行编码生成种群个体。在DE算法寻优的过程中,首先,从父代个体间选择两个个体进行向量做差生成差分矢量;其次,选择另外一个个体与差分矢量求和生成实验个体;然后,对父代个体与相应的实验个体进行交叉操作,生成新的子代个体;最后在父代个体和子代个体之间进行选择操作,将符合要求的个体保存到下一代群体中去。
2. 算法流程
假设优化模型如下:
minf(x1,x2,⋯,xD)s.t xjL⩽xj⩽xjU,j=1,2,⋯,D\begin{array}{l}{\min f\left(x_{1}, x_{2}, \cdots, x_{D}\right)} \\ {\text { s.t } \quad x_{j}^{L} \leqslant x_{j} \leqslant x_{j}^{U}, j=1,2, \cdots, D}\end{array} minf(x1,x2,⋯,xD) s.t xjL⩽xj⩽xjU,j=1,2,⋯,D
wherewherewhere,D是解空间的维度,xjLx_{j}^{L}xjL、xjUx_{j}^{U}xjU分别表示第j个分量xjx_{j}xj取值范围的上界和下界。
2.1 初始化种群
初始化种群为: {xi(0)∣xj,iL⩽xj,i(0)⩽xj,iv,i=1,2,⋯,NP;j=1,2,⋯,D}\left\{x_{i}(0) | x_{j, i}^{L} \leqslant x_{j, i}(0)\leqslant x_{j, i}^{v}, i=1,2, \cdots, N P ; j=1,2, \cdots, D\right\}{xi(0)∣xj,iL⩽xj,i(0)⩽xj,iv,i=1,2,⋯,NP;j=1,2,⋯,D}
由下式随机生成各种群个体:
xj,i(0)=xj,iL+rand(0,1)⋅(xj,iU−xj,iL)x_{j, i}(0)=x_{j, i}^{L}+{rand}(0,1) \cdot\left(x_{j, i}^{U}-x_{j, i}^{L}\right) xj,i(0)=xj,iL+rand(0,1)⋅(xj,iU−xj,iL)
wherewherewhere,xi(0)x_{i}(0)xi(0)表示种群中第0代的第i个个体,xj,i(0)x_{j, i}(0)xj,i(0)表示第0代的第i个个体的第j个基因。NP表示种群大小,rand(0,1){rand}(0,1)rand(0,1)表示在(0,1)区间均匀分布的随机数。
2.2 变异
差分进化算法与遗传算法最显著的区别在于DE的个体变异是通过差分策略实现的。
常用的差分策略如下:
νi(g+1)=xi1(g)+F⋅(xi(g)−xij(g))i≠r1≠r2≠r3\begin{array}{c}{\nu_{i}(g+1)=x_{i_{1}}(g)+F \cdot\left(x_{i}(g)-x_{i j}(g)\right)} \\ {i \neq r_{1} \neq r_{2} \neq r_{3}}\end{array} νi(g+1)=xi1(g)+F⋅(xi(g)−xij(g))i=r1=r2=r3
wherewherewhere,F{F}F为缩放因子,xi(g)x_{i}(g)xi(g)为第g代种群中第i个个体。
即通过随机选取种群中两个不同的个体,将其向量差缩放后与待变异个体进行向量合成。
在进化过程中,必须保证新生成的解的有效性,因此必须判断生成的解是否满足边界条件,如果不满足,则需要重新生成(生成方案与初始种群相同)。
第g代种群:{xi(g)∣xj,iL⩽xj,i(g)⩽xj,iv,i=1,2,⋯,NP;j=1,2,⋯,D}\left\{x_{i}(g) | x_{j, i}^{L} \leqslant x_{j, i}(g)\leqslant x_{j, i}^{v}, i=1,2, \cdots, N P ; j=1,2, \cdots, D\right\}{xi(g)∣xj,iL⩽xj,i(g)⩽xj,iv,i=1,2,⋯,NP;j=1,2,⋯,D}
变异后的中间体:第g代种群:{xi(g+1)∣xj,iL⩽xj,i(g+1)⩽xj,iv,i=1,2,⋯,NP;j=1,2,⋯,D}\left\{x_{i}(g+1) | x_{j, i}^{L} \leqslant x_{j, i}(g+1)\leqslant x_{j, i}^{v}, i=1,2, \cdots, N P ; j=1,2, \cdots, D\right\}{xi(g+1)∣xj,iL⩽xj,i(g+1)⩽xj,iv,i=1,2,⋯,NP;j=1,2,⋯,D}
2.3 交叉
使用第g代种群和其变异中间体进行交叉:
uj,i(g+1)={vj,i(g+1),if rand(0,1)⩽CRor j=jrandxj,i(g),otherwise \begin{aligned} u_{j, i}(g+1) =\left\{\begin{array}{ll}{v_{j, i}(g+1),} & {\text { if } \operatorname{rand}(0,1) \leqslant C R \text { or } j=j_{\text {rand}}} \\ {x_{j, i}(g),} & {\text { otherwise }}\end{array}\right.\end{aligned} uj,i(g+1)={vj,i(g+1),xj,i(g), if rand(0,1)⩽CR or j=jrand otherwise
wherewherewhere,CR为交叉概率,jrandj_{rand}jrand为[1,2,……,D]的随机整数。
上图为6个基因位的“染色体”或称为“个体”的交叉操作示意图。为了确保变异中间体{vj,i(g+1){v_{j, i}(g+1)}vj,i(g+1)}的每个“染色体”至少有一个“基因”遗传给下一代,第一个交叉操作的基因是随机选择vj,i(g+1){v_{j, i}(g+1)}vj,i(g+1)的第jrandj_{rand}jrand作为交叉后的个体uj,i(g+1)u_{j, i}(g+1)uj,i(g+1)第jrandj_{rand}jrand位的等位基因。后续的交叉操作则是通过交叉概率CR来选取xi(g)x_{i}(g)xi(g)还是vi(g+1)v_{i}(g+1)vi(g+1)的等位基因作为ui(g+1)u_{i}(g+1)ui(g+1)的等位基因。
2.4 选择
采用贪婪算法来选择下一代种群个体:
xi(g+1)={ui(g+1),if f(ui(g+1))⩽f(xi(g))xi(g),otherwise x_{i}(g+1)=\left\{\begin{array}{ll}{u_{i}(g+1),} & {\text { if } f\left(u_{i}(g+1)\right) \leqslant f\left(x_{i}(g)\right)} \\ {x_{i}(g),} & {\text { otherwise }}\end{array}\right. xi(g+1)={ui(g+1),xi(g), if f(ui(g+1))⩽f(xi(g)) otherwise
3. 算法代码
3.1 伪代码
3.2 matlab
4. 参数控制1
DE算法主要的控制参数包括:种群规模(NP)、缩放因子(F)和交叉概率(CR)。
4.1 参数说明
NP主要反映算法中种群信息量的大小,NP值越大种群信息包含的越丰富,但是带来的后果就是计算量变大,不利于求解。反之,使种群多样性受到限制,不利于算法求得全局最优解,甚至会导致搜索停滞。
CR主要反映的是在交叉的过程中,子代与父代、中间变异体之间交换信息量的大小程度。CR的值越大,信息量交换的程度越大。反之,如果CR的值偏小,将会使种群的多样性快速减小,不利于全局寻优。
相对于CR,F对算法性能的影响更大,F主要影响算法的全局寻优能力。F越小,算法对局部的搜索能力更好,F越大算法越能跳出局部极小点,但是收敛速度会变慢。此外,F还影响种群的多样性
4.2 参数选择
- M:一般介于5n到10n之间,但不能少于4,否则变异算则无法进行
- F:一般在[0,2],通常取0.5
- CR:[0,1],通常取0.3.CR越大,收敛速度越快,但易发生早熟现象。
5. 改进方法1
基本DE算法在求解的过程中,随着进化代数的增加,会使种群的多样性变小,过早的收敛到局部极小点,或者致使算法停滞,这对依靠种群差异来进行进化的算法来说无疑是致命的,使算法的性能在进化的过程中变差。
为了解决基本DE算法的上述缺陷,针对DE算法的特点,目前主要的改进方法是针对进化模式和控制参数的优化,还有一些改进方法是将DE算法与其他一些智能算法进行结合仲用。
5.1 自适应变异算子
为了避免早熟,增加自适应变异算子。算子算法如下:
λ=e1−GmGm+1−GF=F0⋅22\begin{array}{l}{\lambda=e^{1-\frac{G_{m}}{G_{m}+1-G}}} \\ {F=F_{0} \cdot 2^{2}}\end{array} λ=e1−Gm+1−GGmF=F0⋅22
wherewherewhere,F0F_{0}F0为变异算子;GmG_{m}Gm为最大进化代数;GGG为当前进化代数。
算法开始时,自适应算子F=F0F= F_{0}F=F0~2F02F_{0}2F0。具有较大值时,初期保持个体多样性,避免早熟,随着算法进度的不断变化,变异算子的值逐步降低,后期变异率接近F0F_{0}F0,保留优良信息,避免最优解遭到破坏,增加搜索到全局最优解的概率。
https://baike.baidu.com/item/%E5%B7%AE%E5%88%86%E8%BF%9B%E5%8C%96%E7%AE%97%E6%B3%95/10052475?fr=aladdin ↩︎ ↩︎
算法 - 差分进化(DE)算法相关推荐
- 【进阶一】Python实现MDCVRP常见求解算法——差分进化算法(DE)
基于python语言,实现差分进化算法(DE)对多车场车辆路径规划问题(MDCVRP)进行求解. 目录 往期优质资源 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. 分步实现 6 ...
- Python实现VRP常见求解算法——差分进化算法(DE)
基于python语言,实现经典差分进化算法(DE)对车辆路径规划问题(CVRP)进行求解. 目录 1. 适用场景 2. 求解效果 3. 问题分析 4. 数据格式 5. 分步实现 6. 完整代码 参考 ...
- 【进阶二】Python实现VRPTW常见求解算法——差分进化算法(DE)
基于python语言,实现经典差分进化算法(DE)对带有时间窗的车辆路径规划问题( VRPTW )进行求解. 目录 往期优质资源 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. ...
- 【进阶四】Python实现(MD)HVRP常见求解算法——差分进化算法(DE)
差分进化算法+Split 求解异构车辆路径规划问题 碧海蓝天 吹吹风 目录 信息传递 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. 分步实现 6. 完整代码 参考 信息传递 p ...
- matlab 思维进化算法,差分进化算法介绍及matlab实现
引言 差分进化算法是基于群体智能理论的优化算法,是通过群体内个体间的合作与竞争而产生的智能优化搜索算法,它保留了基于种群的全局搜索策略,采用实数编码.基于差分的简单变异操作和"一对一&quo ...
- 超级计算机进化算法,差分进化算法的并行实现
摘要: 传统的并行计算任务往往由大型的并行计算机来完成,因而并行机的研究也就成为并行计算的主要研究方向.随着经济和科技的发展,生物医学.天气预报.高能物理等领域的计算任务越来越多,其特点是计算数据多. ...
- 【差分进化算法】基于适应度-距离-平衡的自适应引导差分进化 (FDB-AGDE) 算法附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
- 【论文阅读】基于自适应小生境和 k 均值操作的数据聚类差分进化算法
文章目录 原文题目 摘要 I. 引言 背景知识 Niching(小生境) 适应度共享 参考文献 提出 Niching Method 的动机 Niching Method 需要 Adaptive 的动机 ...
- 标准差分进化算法(DE)
标准差分进化算法 基本原理 差分进化算法(DE)起源于遗传算法(EA),也是一种基于种群进化的算法.通过对种群采取三种进化操作进行反复迭代使得算法的解趋于全局最优解.在所有的进化算法中,每种算法的个体 ...
- matlab实现差分进化算法DE
类似于其它进化算法范例,DE是一种基于群体的随机搜索算法,它采用变异.交 替换等算子指导群体进化.但是,DE执行简单,在收敛速度和搜索性能方面均占 有一定的优势. 在进化过程中,DE保持一个规模为 ...
最新文章
- Python3破冰人工智能,你需要掌握一些数学方法
- Failure Groups in ASM
- PHP获取 当前页面名称、主机名、URL完整地址、URL参数、获取IP
- 2009-12-12
- 窗体的ControlBox属性
- Mybatis高级应用 整合Ehcache
- ASP与SQL数据库连接及SQL常用命令使用方法
- DirectX SDK (June 2010)安装错误S1023,解决方法
- java编程思想学习笔记——第2章 一切都是对象
- 算法导论第三版 第4章习题答案
- HT1621B显示驱动LCD显示驱动芯片- SSOP48
- HTML表格实现固定表头 内容滚动
- DHTMLX入门教程
- java io 和nio 区别_java IO和NIO区别
- 刷脸支付星星之火可以燎原
- 实现手机蓝牙解锁电脑_手机版和电脑版微信多开的实现方法
- php 和风天气,为博客添加实时天气功能(和风天气、中国气象、心知天气)
- 读H.265/HEVC编码笔记(一)
- uni-app 使用u-echarts图表插件步骤(圆环)
- 硅谷华人高管少?看印度 CEO 怎么培养软实力!