获取更多资讯,赶快关注上面的公众号吧!

文章目录

  • 1、思想
  • 2、方案DE1
    • 变异
    • 交叉
    • 选择
    • 算法伪代码
  • 3、方案DE2
  • 4、 源代码

1、思想

DE是由Rainer Storn 和 Kenneth Price于1995年提出的一种比较经典的进化算法,是一种新型并行直接搜索算法,每一代G中都利用NP个参数向量(个体)作为种群,在优化过程中NP是保持不变的。如果没有掌握一些系统的先验知识,通常初始种群是随机选择的,一般来说,除非另有说明,否则将对所有随机决策假定一个均匀的概率分布,在得到初步解后,通常通过在名义解x‾nom ,0\underline{x}_{\text {nom }, 0}x​nom ,0​上加上正太分布的随机偏差来生成初始种群。DE背后的关键思想是一种生成试验参数向量的新方案,其将两个种群个体的差向量加权后再与第三个成员相加,然后就得到了新的参数向量。如果得到的向量的目标函数值低于(最小化问题)种群中的个体,则用新生成的向量替换与之比较的向量。此外,还对每一代G中的最优参数向量X‾best ,G\underline{\mathrm{X}}_{\text {best }, \mathrm{G}}X​best ,G​进行评估,以追踪最小化进程。

从种群中提取距离和方向信息,产生随机偏差结果,该自适应方案具有良好的收敛性能。下面介绍两种最具潜力的DE变体。

2、方案DE1

变异

第一种DE变体的工作原理如下:对于每一个x‾i,G,i=0,1,2,…,NP−1\underline{x}_{i, G}, i=0,1,2, \ldots, N P-1x​i,G​,i=0,1,2,…,NP−1,根据下式生成试验向量:
v‾=x‾r1,G+F⋅(x‾r2,G−x‾r3,G)(1)\underline{\mathrm{v}}=\underline{\mathrm{x}}_{\mathrm{r}_{1}, \mathrm{G}}+\mathrm{F} \cdot\left(\underline{\mathrm{x}}_{\mathrm{r}_{2}, \mathrm{G}}-\underline{\mathrm{x}}_{\mathrm{r}_{3}, \mathrm{G}}\right)\tag {1} v​=x​r1​,G​+F⋅(x​r2​,G​−x​r3​,G​)(1)

其中r1,r2,r3∈[0,NP−1]\mathrm{r}_{1}, \mathrm{r}_{2}, \mathrm{r}_{3} \in[0, \mathrm{NP}-1]r1​,r2​,r3​∈[0,NP−1],均为整数且互不相同,F>0F>0F>0。这一步相当于变异操作

r1,r2,r3\mathrm{r}_{1}, \mathrm{r}_{2}, \mathrm{r}_{3}r1​,r2​,r3​为从[0,NP−1][0,NP-1][0,NP−1]中随机选择的整数,之所以是NP−1NP-1NP−1,是因为这里所以是从0开始的,所以最后一个个体的索引是NP−1NP-1NP−1,FFF为实值常数因子,控制差分变化(x‾r2,G−x‾r3,G)\left(\underline{\mathbf{x}}_{\mathbf{r}_{2}, \mathbf{G}}-\underline{\mathbf{x}}_{\mathbf{r}_{3}, \mathbf{G}}\right)(x​r2​,G​−x​r3​,G​)的放大率。图1以一个二维示例说明了不同向量再DE1中的作用。

图1 按照DE1生成v的过程

交叉

为了增加参数向量的多样性,构造如下向量:

u‾=(u1,u2,…,uD)T(2)\underline{\mathrm{u}}=\left(\mathrm{u}_{1}, \mathrm{u}_{2}, \ldots, \mathrm{u}_{\mathrm{D}}\right)^{\mathrm{T}}\tag{2} u​=(u1​,u2​,…,uD​)T(2)

uj={vjfor j=⟨n⟩D,⟨n+1⟩D,…,⟨n+L−1⟩D(x‾i,G)jotherwise (3)u_{j}=\left\{\begin{array}{ll} v_{j} & \text { for } \quad j=\langle n\rangle_{D},\langle n+1\rangle_{D}, \ldots,\langle n+L-1\rangle_{D} \\ \left(\underline{x}_{i, G}\right)_{j} & \text { otherwise } \end{array}\right.\tag{3} uj​={vj​(x​i,G​)j​​ for j=⟨n⟩D​,⟨n+1⟩D​,…,⟨n+L−1⟩D​ otherwise ​(3)

其中尖括号⟨⟩D\langle\rangle_{D}⟨⟩D​表示模为DDD的模函数。

式(3)说明u‾\underline{\mathrm{u}}u​中某一向量元素序列等于v‾\underline{\mathrm{v}}v​中的元素,而u‾\underline{\mathrm{u}}u​中的其他元素使用x‾i,G\underline{x}_{i, G}x​i,G​中的原始值。为这种变异选择一组参数的过程类似于进化理论中交叉。图2解释了这一点,其中D=7,n=2,L=3。D为问题维度,起始索引nnn式从[0,D−1][0,D-1][0,D−1]内随机选择的整数,LLL以交叉概率CrCrCr从[0,D−1][0,D-1][0,D−1]内随机选择,LLL按以下方式确定,CrCrCr作用同FFF,用于控制DE。对于每一个试验向量,都要随机生成新的nnn和LLL。
L=0;DO{L=L+1;}WHILE ((rand(0,1)≤Cr)AND(L≤D))\begin{aligned} L &=0 ; \mathrm{DO} \\ &\{\\ L &=L+1 ; \\ &\} \text { WHILE }((r a n d(0,1) \leq C r) \mathrm{AND}(L \leq D)) \end{aligned} LL​=0;DO{=L+1;} WHILE ((rand(0,1)≤Cr)AND(L≤D))​

图2 交叉过程

所以从每个元素的角度就看,则可以得到以下公式:

uj,i,G={vj,i,Gif (randi,j[0,1]≤Cr or j=jrand)xj,i,Gotherwise (4)u_{j, i, G}=\left\{\begin{array}{ll} v_{j, i, G} & \text { if }\left(\text {rand}_{i, j}[0,1] \leq \text {Cr or } j=j_{\text {rand}}\right) \\ x_{j, i, G} & \text { otherwise } \end{array}\right.\tag{4} uj,i,G​={vj,i,G​xj,i,G​​ if (randi,j​[0,1]≤Cr or j=jrand​) otherwise ​(4)
其中randi,j[0,1]\text {rand}_{i, j}[0,1]randi,j​[0,1]为均匀分布随机数,该值需要在第iii个参数向量的每个维度上都重新调用,jrand∈[1,2,...,D]j_{\text {rand}}\in [1,2,...,D]jrand​∈[1,2,...,D]为随机选择的索引,以保证uuu中至少有一个元素取自vvv,对于每一代中的米格向量,只需要实例化此值一次。

选择

为了保证种群大小不变,这一步叫做“选择”,以确定试验向量或目标向量是否存活到下一代,即
x‾i,G+1=u‾if f(u‾)≤f(x‾i,G)=x‾i,Gif f(u‾)>f(x‾i,G)(5)\begin{aligned} \underline{\mathrm{x}}_{i, G+1}&=\underline{\mathrm{u}} & \text { if } f\left(\underline{\mathrm{u}}\right) \leq f\left(\underline{\mathrm{x}}_{i, G}\right) \\ & =\underline{\mathrm{x}}_{i, G} & \text { if } f\left(\underline{\mathrm{u}}\right)>f\left(\underline{\mathrm{x}}_{i, G}\right) \end{aligned}\tag{5} x​i,G+1​​=u​=x​i,G​​ if f(u​)≤f(x​i,G​) if f(u​)>f(x​i,G​)​(5)

其中f()f()f()为待最小化的目标函数,因此新的试验向量产生了相等或更小的目标函数,则替换掉对应的目标向量,否则就保留目标向量至下一代。

算法伪代码

图3 算法伪代码

3、方案DE2

DE2和DE1思想基本一致,只不过在变异时稍有不同:

v‾=x‾i,G+λ⋅(x‾best ,G−x‾i,G)+F⋅(x‾r2,G−x‾r3,G)(6)\underline{\mathrm{v}}=\underline{\mathrm{x}}_{\mathrm{i}, \mathrm{G}}+\lambda \cdot\left(\underline{\mathrm{x}}_{\text {best }, \mathrm{G}}-\underline{\mathrm{x}}_{\mathrm{i}, \mathrm{G}}\right)+\mathrm{F} \cdot\left(\underline{\mathrm{x}}_{\mathrm{r}_{2}, \mathrm{G}}-\underline{\mathrm{x}}_{\mathrm{r}_{3}, \mathrm{G}}\right)\tag{6} v​=x​i,G​+λ⋅(x​best ,G​−x​i,G​)+F⋅(x​r2​,G​−x​r3​,G​)(6)
(6)中引入了一个额外的控制参数λ\lambdaλ,其思想是提供一种通过结合当前最优向量x‾best \underline{\mathrm{x}}_{\text {best }}x​best ​的方式,来增强该方案的贪婪性。图4说明了DE2的向量生成过程。

图4 DE2生成v的过程

4、 源代码

关注公众号后,回复“差分进化”或“DE”获取Matlab源码和Java源码链接。

(文末源码)差分进化(Differential Evolution,DE)相关推荐

  1. 零基础教你Unity制作像素鸟游戏 【文末源码】

    爆肝三天终于写完了,一文教你从零开启Unity制作像素鸟游戏 前言 一,新建目录 二,制作材质 三,场景搭建 四,创建地图 五,制作管道 六,创建主角 七,小鸟动起来 八,游戏状态控制 九,摄像机跟随 ...

  2. Unity 之 手把手教你实现自己Unity2D游戏寻路逻辑 【文末源码】

    Unity 之 手把手教你实现自己Unity2D游戏寻路逻辑 [文末源码] 前言 一,效果展示 二,场景搭建 三,代码逻辑 四,完善场景 五,使用小结 前言 还在看别人的寻路逻辑?保姆级教程,一步步教 ...

  3. 绝了!你裁我剪,斯尼帕!文末源码

    2018年我入手了一台Swithc『 你裁我剪!斯尼帕』是我玩过的最为欢乐游戏,不过为了安全安全起见,大概只玩了十几关! 因为它的威力不亚与『分手厨房』,需要两人密切配合,但这个过程很容易两个人闹矛盾 ...

  4. 程序员带你回味童年,一起用C语言做一个“推箱子”玩!【文末源码】

    这篇文章是用C语言做了一个推箱子小游戏,实现起来比较简单,和大家一起回味一下童年捧着按键机玩推箱子的日子!文末附带万字源码! 目录 一.写在前面 二.设计思路 1.主界面函数介绍 2.选择界面函数 3 ...

  5. 用Python给娃送上一份猪年春节礼物。文末源码!

    随着农历猪年的到来,Pig的卡通形象以火爆的热度迅速成为大家心中的新一任萌宠,尤其是深受小朋友喜欢的小猪佩奇,作为一枚关心热点又家有小娃的非典型程序猿小编,也来蹭蹭热点,让我们用Python来送给娃一 ...

  6. “数字炸弹“——练习Python基础知识的小游戏【文末源码地址】

    文章目录 数字"炸弹" 基本代码 核心代码 源码地址 数字"炸弹" 数字炸弹小游戏,平时可以多个人一块玩.游戏规则也很简单:从0~100之间选一个数字,作为&q ...

  7. Python数据分析实战【十二】:机器学习决策树算法案例实战【文末源码地址】

    文章目录 构造数据 决策树解决 报错解决 源码地址 构造数据 我们用pandas生成20条数据,其中标签为bad的数据有6条,标签为good的数据有14条,代码如下: import pandas as ...

  8. Unity 简单手机小游戏 - 3D重力滚球(文末源码)

    游戏效果图: 目前做了5个关卡 通过陀螺仪使得小球有运动的力 public class groy : MonoBehaviour {float x;float y;Gyroscope go;void ...

  9. 终身伴侣(两个人的网站)代码+效果演示(文末源码地址)

    趁着七夕,把以前做过的一个情侣类的小网站写一写,虽然很早以前就做了,但一直没用上,咳咳.... 演示地址:182.254.213.223/yuanJu/index.jsp (这里要两人注册,可以直接账 ...

  10. Python数据分析实战【九】:用Python处理省份城市编码数据【文末源码地址】

    文章目录 项目背景 项目代码 新增省份编码 获取编码映射数据 合并数据 统计省份用户数 使用SQL实现 源码地址 本文可以学习到以下内容: 免费获取全国省份.城市编码以及经纬度数 使用 pandas ...

最新文章

  1. 最新机器学习库Scikit-learn库使用总结.pptx
  2. php对象的底层机制
  3. 检索COM 类工厂中CLSID 为{00024500-0000-0000-C000-000000000046}组件时失败
  4. python怎么写脚本执行adb命令_android – 如何使用Python执行adb命令?
  5. 学习Python的几个必要条件,你具备吗?
  6. 分布式一致性协议Raft原理与实例
  7. Controller FioriTest.view.LineItem couldn't be instantiated
  8. 如何计算iPhone和Apple Watch上的步数
  9. Spring2.5事务配置的5种方法
  10. sublime text 3 package control
  11. [Hash应用问题] 例3.2 给出n个整数,按从大到小的顺序输出前m大的数
  12. CityMaker SDK与三维GIS城市
  13. c51语言中 位取反指令,C51的几种位操作运算说明
  14. 如何使用电脑注册微博登陆模拟器
  15. 中国身份证号码验证,支持15 18位,可验证成功90 的身份证号
  16. 服饰Clothing
  17. cadence 通孔焊盘_allegro通孔类焊盘的制作方法
  18. (Verilog)单周期CPU设计
  19. 父进程和子进程之间的关系
  20. 华为IPsec实现支部与支部间借助总部进行隧道中转

热门文章

  1. Redis随项目启动或CRUD进行缓存数据
  2. C++ 字节序测试代码
  3. JSP之jsp内置标签
  4. leetcode字节跳动探索
  5. php pdf转为jpg 插件,php使用Image Magick将PDF文件转换为JPG文件的方法
  6. mui 怎么调用系统键盘_电脑开机关机的几种方法,计算机电源键鼠标键盘网络唤醒图文教程...
  7. return可以返回多个值_JDK10的新特性:var泛型和多个接口实现
  8. 实习日志_护理实习日志
  9. Vue源码:虚拟DOM和diff算法
  10. 实战:使用python爬取新冠疫情国内外最新数据