「深度学习之优化算法」(五)差分进化算法

news2024/9/21 0:43:57

1. 差分进化算法简介

(以下描述,均不是学术用语,仅供大家快乐的阅读)

差分进化算法(Differential Evolution Algorithm,DE)是一种基于群体的进化算法,它模拟了群体中的个体的合作与竞争的过程。算法原理简单,控制参数少,只有交叉概率和缩放比例因子,鲁棒性强,易于实现。

差分进化算法中,每一个个体的基因表示待求问题的一个候选解。每次迭代将先进行变异操作,选择一个或多个个体的基因作为基,然后选择不同的个体的差分来构成差分基因,最后将作为基的基因与差分基因相加来得出新的个体。交叉操作将新的个体将于父代的对应个体交叉,然后进行选择操作,比较交叉后的个体与父代的对应个体,选择较优的个体保留至下一代。在迭代完成之后将选择种群中最优个体的基因作为解。

差分进化算法可以算是我所使用过的优化算法中大魔王级别的算法,虽然它每个方面都没有强到离谱,但是综合起来的效果好于大多数算法。它就像一个每个科目都能考到90分(百分制)的学生,虽然没门课都不是最优秀的,但是论综合,论总分,它有极大的概率是第一名。

(两位(正经)魔王,一位宇宙帝王,一位蚁王,蚁王更符合差分进化算法,因为他可以不断的吞食其他个体并吸收他们的能力从而不断变强,是不是和优化算法很像?富坚老贼还是狠)

在我研究优化算法的小路上,我的目标就是找到一个能打败大魔王或是能在大多数方面压制魔王的算法。

2. 算法流程

这次的主角就选魔王军吧(或者蚁王军,为了与蚁群算法区别还是叫魔王军吧),个体则称之为魔王兵。

魔王兵的能力取决于它们的基因,它们可以根据环境或者需要改变自己的基因使得自己更加强大,更方便的处理问题,问题的维度与基因维度相同。

表示第i个魔王兵在进化了第t次后的基因,该个体有D位基因。

与遗传算法同为进化算法的差分进化算法,它们的操作(算子)也都非常相似的,都是交叉,变异和选择,流程也几乎一样(遗传算法先交叉后变异,差分进化算法先变异后交叉)。

 

2.1变异

说到差分进化算法中的变异,我就想到一句论语“三人行,必有我师焉。择其善者而从之,其不善者而改之。”,其实这句论语已经向我们说明了差分进化算法的整个流程:

  “三人行,必有我师焉”——变异,交叉。

  “择其善者而从之,其不善者而改之”——选择。

  差分进化算法中,当一个魔王兵变异时,它会先找来3个小伙伴,当然是随机找来3个小伙伴,避免同化。在一个小伙伴的基因上加上另外两个小伙伴基因之差作为自己的目标基因。其变异公式如下:

  表示第i个魔王兵找到了编号为r1、r2和r3的三个魔王兵,当然了i、r1、r2、r3为互不相同的整数,F为缩放比例因子,通常 ,一般取F=0.5。为第i个魔王兵交叉后的目标基因图纸,不过这是个半成品,再经过交叉后,目标基因图纸才算完成。

 

  其实现在我们已经有了5个基因图纸了,接下来将进行交叉操作。由于变异操作,差分进化算法的种群中个体数至少为4,即魔王军中至少有4个小兵。

 

2.2交叉

交叉操作中,魔王兵i会将目标基因图纸进行加工得到 ,加工过程如下:

 

  其中 。 为交叉概率,其值越大,发生交叉的概率越大,一般取 。为{1,2,…,D}中的随机整数,其作用是保证交叉操作中至少有一维基因来自变异操作产生的基因,不能让交叉操作的努力白费。

 

  从公式上可以看出交叉操作实际上是从变异操作得出的基因图纸上选择至少一位基因来替换自己的等位基因,得到最终的基因图纸。

2.3选择

选择操作相对简单,魔王兵i拿到了最终的基因图纸,大喊一声,进化吧,魔王兵i的基因改变了。它拿出了能力测量器fitness function,如果发现自己变强了,那么就将基因 保留到下一代,否则它选择放弃进化,让自己还原成

 

3. 实验初步

实验又来啦,还是那个实验,简单、易算、好画图。

 

实验1:参数如下

参数

问题维度(维度)

2

小兵数量(种群数)

20

进化次数(最大迭代次数)

50

CR(交叉率)

0.3

F(放缩因子)

0.5

取值范围

(-100,100)

实验次数

10

  图中可以看出在第20代时,群体已经非常集中了,在来看看最终得出的结果。

最优值

1.0917867028293985E-8

最差值

2.9361020954274757E-6

平均值

5.847453820715603E-7

这结果真是好到令人发指,恶魔在心中低语“把其他的优化算法都丢掉吧”。不过别往心里去,任何算法都有优缺点,天下没有免费的午餐,要想获得某种能力必须付出至少相应的代价。

实验2:

将交叉率CR设为0,即每次交叉只选择保留一位变异基因。

参数

问题维度(维度)

2

小兵数量(种群数)

20

进化次数(最大迭代次数)

50

CR(交叉率)

0.0

F(放缩因子)

0.5

取值范围

(-100,100)

实验次数

10

 

看看了看图,感觉跟实验1中相比没有什么变化,那我们再来看看结果。

最优值

2.922699066690564E-10

最差值

1.5170095944418442E-7

平均值

1.9533094363773728E-8

结果总体来说比实验1好了一个数量级。为什么呢?个人感觉应该是每次只改变一位基因的局部搜索能力比改变多位基因更强。下面我们将交叉率CR设为1来看看是否是这样。

实验3:

  将交叉率CR设为1,即每次交叉只选择保留一位原有基因。

参数

问题维度(维度)

2

小兵数量(种群数)

20

进化次数(最大迭代次数)

50

CR(交叉率)

1.0

F(放缩因子)

0.5

取值范围

(-100,100)

实验次数

10

 

实验3的图与实验1和实验2相比好像也没什么差别,只是收敛速度好像快了那么一点点。再来看看结果。

最优值

1.247729854010192E-10

最差值

2.3424955950460443E-8

平均值

4.089766498652818E-9

发现结果比实验2的结果还要好?那说明了实验2我得出的结论是可能是错误的,交叉率在该问题上对差分进化算法的影响不大,它们结果的差异可能只是运气的差异,毕竟是概率算法。

实验4:

  将变异放缩因子设为0,即变异只与一个个体有关。

参数

问题维度(维度)

2

小兵数量(种群数)

20

进化次数(最大迭代次数)

50

CR(交叉率)

0.3

F(放缩因子)

0.0

取值范围

(-100,100)

实验次数

10

 

收敛速度依然很快,不过怎么感觉结果不对,而且个体收敛的路径好像遗传算法,当F=0,时,差分进化算法退化为了没有变异、选择操作的遗传算法,结果一定不会太好。

最优值

0.453120676982517

最差值

286.3408283178992

平均值

106.1719276191775

果然如此。下面我们再看看F=2时的实验。

实验5:

  将变异放缩因子设为2。

参数

问题维度(维度)

2

小兵数量(种群数)

20

进化次数(最大迭代次数)

50

CR(交叉率)

0.3

F(放缩因子)

2.0

取值范围

(-100,100)

实验次数

10

 

实验5的图可以明显看出,群体的收敛速度要慢了许多,到第50代时,种群还未完全收敛于一点,那么在50代时其结果也不会很好,毕竟算法还未收敛就停止进化了。

参数

最优值

0.003982238947037151

最差值

1.1517176365886543

平均值

0.23692008026134745

结果不算很好但也算相对稳定。

通过上面5个实验,我们大致了解了差分进化算法的两个参数的作用。

  交叉率CR,影响基因取自变异基因的比例,由于至少要保留一位自己的基因和变异的基因导致CR在该问题上对算法性能的影响不大(这个问题比较简单,维度较低,影响不大)。

  变异放缩因子F,影响群体的收敛速度,F越大收敛速度越慢,F绝对值越小收敛速度越快,当F=0是群体之间只会交换基因,不会变异基因。

4. 探究与改进

差分进化算法大魔王已经如此强大了,那么还有什么可以改进的呢?当然有下面一一道来。

方案1.将3人行修改为5人行,以及推广到2n+1人行。

实验6:

  将3人行修改为5人行,变异公式如下:

 

参数

问题维度(维度)

2

小兵数量(种群数)

20

进化次数(最大迭代次数)

50

CR(交叉率)

0.3

F1(放缩因子)

0.5

F2(放缩因子)

0.5

取值范围

(-100,100)

实验次数

10

 

五人行的实验图看起来好像与之前并没有太大的变化,我们再来看看结果。

参数

最优值

1.7892717650452213E-8

最差值

4.573249741855863E-6

平均值

1.0415260793972972E-6

结果没有明显提升,反而感觉比之前的结果差了。反思一下五人行的优缺点,优点,取值范围更大,缺点,情况太多,减慢搜索速度。

 

  上图为(这里的公式不显示?)的情况,其中ABCD为平行四边形AD=DE,U可以取到AE上的任一点。

 

  上图为 (这里的公式不显示?)的情况,其中ABCD为平行四边形AD=DE,AFGH为平行四边形,AIJE为平行四边形,AH=HI, U可以取到平行四边形AIJE上的任一点。

  对于交叉操作来所,“五人行”的选择更多,搜索能力应该更强,但这个问题的适应度函数过于简单,可能无法发挥其优势,所以此时“五人行”的结果差于“三人行”的结果。

方案2,变异放缩因子随机化

  第3节中我们可以明显看出变异放缩因子F对差分进化算法的影响明显大于交叉率CR,F能影响算法的收敛速度。注意到差分进化算法没有跳出局部最优的操作,如果算法收敛太快容易陷入局部最优,而收敛太慢又会影响求解速度。因此我向随机化F来均衡一下算法的收敛速度。

实验7:

  F取值为(0,2)内的随机数。

参数

问题维度(维度)

2

小兵数量(种群数)

20

进化次数(最大迭代次数)

50

CR(交叉率)

0.3

F(放缩因子)

(0,2)

取值范围

(-100,100)

实验次数

10

 

可以看出算法的收敛速度比之前的变慢了一点,再看看结果。

参数

最优值

1.002461804484959E-8

最差值

1.5000010808013516E-4

平均值

2.5148494598068475E-5

比之前差。

 

  探究过程中失败是难免的,F为(0,2)内的随机数,那么F的期望为1,其收敛速度变慢导致结果变差也是难免,毕竟最大迭代次数只有50,而且适应度函数过于简单。

方案3:为差分进化算法新增跳出局部最优的操作。

  这个方案没有试验,差分进化算法是否需要该操作还是未知数?差分进化算法有着优秀的搜索能力,那么跳出局部最优能力是否需要呢?一个攻击能力超强的战士是否需要加强防御能力呢?

  其实我认为还是必要的,因为现在我们需要用优化算法去解决的实际问题大多是动态的而不是实验中的静态还是,在处理动态问题时,一点跳出局部最优能力能够让优化算法快速做出反应而不是再缓慢的进化。只是如何给差分进化算法优雅的添加跳出局部最优性能的方案还没有想到。

5. 总结

差分进化算法的学习在此也告一段落。差分进化算法很强大,也很简单、简洁,算法的描述都充满了美感,不愧是大魔王。不过这里并不是结束,这只是个开始,终将找到打败大魔王的方法,让新的魔王诞生。

  由于差分进化算法足够强,而文中实验的问题较为简单导致算法的改进甚至越改越差(其实我也不知道改的如何,需要大量实验验证)。在遥远的将来,也会有更加复杂的问题来检验魔王的能力,总之,后会无期。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/659966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑马点评短信登录功能

一、基于session实现短信登录 1、发送短信验证码 流程图如下: 1、实现UserController下的sendCode方法: /*** 发送手机验证码*/PostMapping("/code")public Result sendCode(RequestParam("phone") String phone, HttpSession se…

微博粉丝清理工具丨2023年最新粉丝批量清理_微博怎么批量清理粉丝

2023年最新微博怎么批量清理粉丝?可能还有不少小伙伴不太清楚 接下来就为大家带来微博批量清理僵尸粉方法 有需要的朋友可以来了解一下,希望下文可以帮到大家 第一种:客服界面清粉方法 然后在客服中心界面选择修正粉丝; 最后点击一下确认就…

const修饰的成员函数

const修饰的成员函数 问题: 哪里出现编译报错了, 如何修改? class A { public:const int get1() const{a1 10;return a1;}private: int a1 0; }; int main() {A a;a.get1();return 0; }当时以为是a是一个非const对象,调用了const成员函数导致编译错误…

关于guacamole项目中的一点感悟与理解

关于guacamole项目中的一点想法 前言一、guacd模块启动相关二、一些感悟与理解参考 前言 Guacamole 是基于 Web 的 VNC 客户端,使用它可以通过web浏览器访问远程服务器终端并进行操作。它的基本架构如下图所示。 巧合之下,前段时间了解了项目中guacd模块…

构建大数据环境:Hadoop、MySQL、Hive、Scala和Spark的安装与配置

前言 在当今的数据驱动时代,构建一个强大的大数据环境对于企业和组织来说至关重要。本文将介绍如何安装和配置Hadoop、MySQL、Hive、Scala和Spark,以搭建一个完整的大数据环境。 简介 安装Hadoop 首先,从Apache Hadoop的官方网站下载所需的…

测试(一)

1.用户需求 可以简单理解为甲方提出的需求,如果没有甲方,那么就是终端用户使用产品时必须要完成的任务。该需求一般比较简略。 2.软件需求 或者叫功能需求,该需求会详细描述开发人员必须实现的软件功能(所谓的测试文档)。 大多数公司在进行…

05- c语言函数 (C语言)

一 函数的概念 1、在程序设计过程中,为了实现某个功能需要编写多行代码,例如求一个二维数组中的最大值,如果 该功能需要被多次使用,我们可以在每次使用时将原来的代码重复编写,但是这样未免有“凑代码”的嫌疑&#x…

大数据治理.数据储存技术

hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转…

Spark大数据处理学习笔记(3.8.3) Spark RDD典型案例-利用RDD实现分组排行榜

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/Twpwe】 文章目录 一、任务目标二、准备工作2.1 在本地创建成绩文件2.2 将成绩文件上传到HDFS上指定目录 三、完成任务3.1 在Spark Shell里完成任务3.1.1 读取成绩文件得到RDD3.1.2 利用映射算子生…

Openfire身份认证绕过漏洞复现+利用(CVE-2023-32315)

0x01 产品简介 Openfire是免费的、开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器甚至可支持上万并发用户。 0x02 漏洞概述 Openfire的管理控制台是一个基于 Web 的…

自然语言处理从入门到应用——动态词向量预训练:ELMo词向量

分类目录:《自然语言处理从入门到应用》总目录 在双向语言模型预训练完成后,模型的编码部分(包括输入表示层以及多层堆叠LSTM)便可以用来计算任意文本的动态词向量表示。最自然的做法是使用两个LSTM的最后一层隐含层输出作为词的动…

Qt项目网络聊天室设计

效果演示 网络聊天室 Qt网络聊天室服务端 网络聊天室程序 基于TCP的可靠连接(QTcpServer、QTcpSocket) 一个服务器,多个客户端 3. 服务器接收到某个客户端的请求以及发送信息,经服务器发给其它客户端 最终实现一个共享聊天内容的聊天室! …

大数据治理.数据采集/归集技术

第一部分 阿里巴巴DATAx DataX 是阿里开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 DataX设计理念 DataX本身作为数据同步框架,将不同…

分布式系统消息通信技术:MOM与RPC

一、中间件 什么是中间件 中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台…

springboot配置 spring.profiles.active spring.profiles.include @profile

springboot配置 spring.profiles.active spring.profiles.include profile spring.profiles.active spring.profiles.include profile的命名方式 以 application-开头, --横杠(减号)不能少 application-{这部分自定义}.propertiesapplication-{这部分自定义}.ymlapplicatio…

c++多态详解

前言: 对于面向对象语言来说,多态是面向对象的三大特性之一,简单一点来说多态就是多种形态,是不同对象接收到同一种消息产生的不同动作或者反应,听起来有点抽象,实际上就是完成一个任务让不同的对象来做产生…

合宙Air724UG Cat.1模块硬件设计指南--模拟语音通道

模拟语音通道 简介 模拟音频技术是由传感器采集得到的连续变化的值,根据其电压的幅度用来展示声音强弱。CAT.1内置3种音频输出模式,分别为扬声器(SPK)输出,耳机(HP)输出和听筒(RECEIVER)输出。 特性 SPK接口 SPK-、SPK。Speaker差分信号接口…

记压测环境数据表死锁导致接口长时间pending问题

背景 压测过程中测试小伙伴反映某个页面长时间loading无法打开,接下来我们排查一下,既然是压测环境,那么就需要排除服务器资源层面的因素,现在考验的就是在系统资源不足时系统的情况,那么我们就直接从代码层面开始排查…

PADS-LAYOUT菜单及工具说明

目录 1 材料清单输出 2 元件属性检查 3 材料清单制作 4 原理图生成PDF 4.1PDF文件生成 4.2PDF文件查阅 4.3PDF文件打印 5 PADS转Altium Designer 5 Altium Designer转PADS 5.1 直接导入法 5.2 软件生成法 6 PADS层定义 7 设计规则输出 7.1 PADS对象管理 7.2 PAD…

pandas---分箱(离散化处理)、绘图、交叉表和透视表

1. 分箱 分箱操作就是将连续型数据离散化。分箱操作分为等距分箱和等频分箱. 1.1 等宽分箱 pandas.cut(x, bins, rightTrue, labelsNone, retbinsFalse, precision3, include_lowestFalse, duplicatesraise, orderedTrue) x:要分箱的一维数组或者 Series。 bi…