指数分布优化器(EDO)(含MATLAB代码)

2023-10-06 22:04

本文主要是介绍指数分布优化器(EDO)(含MATLAB代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年提出的新型智能优化算法,并附MATLAB代码。

“今天给大家推送的也是2023年提出的一种新算法,发表在AIRE上,这个期刊目前影响因子12,还是很有含金量。就这个算法效果而言,我觉得还可以,并且它框架也简单~

另外,这个算法基于指数分布理论,没有什么好看的图,更多的是数学公式,学起来可能有点枯燥~”

图片

该研究提出了一种新的基于种群的元启发式算法,称为指数分布优化器(Exponential Distribution Optimizer, EDO)。EDO的主要灵感来自于数学中的指数概率分布模型。EDO算法包括了开发策略和勘探策略。利用CEC2014、CEC2017、CEC2020和CEC2022等测试套件以及6个工程设计问题将EDO算法与L-SHADE、LSHADE-cnEpSin和AGSK进行了比较。EDO得到了更理想的结果,并且统计分析在95%的置信区间上证明了EDO的优越性。它的原始参考文献如下:

Abdel-Basset M, El-Shahat D, Jameel M, et al. Exponential distribution optimizer (EDO): a novel math-inspired algorithm for global optimization and engineering problems[J]. Artificial Intelligence Review, 2023: 1-72.

01
预备知识

指数分布理论是EDO算法的灵感来源。

指数分布是一种连续分布,常用于描述各种自然现象。例如,从现在到地震袭击的等待时间呈指数分布。此外,车辆到达收费站的概率随时间呈指数分布。假设有一个指数随机变量x,参数为λ,可以写成xEXP(λ)。该随机变量的概率密度函数(Probability Density Function, PDF)可表示为:

图片

其中,x表示在事件发生前的等待时间。时间是连续的,不能是一个负值,即x≥0。此外,参数λ>0是指数分布的速率。利用该公式可计算得到指数累积分布函数(Cumulative Distribution Function, CDF):

图片

图1显示了衰减参数λ对指数PDF的影响,使用相同的x值和四个不同的λ值(0.25、0.5、0.75和1)。曲线从λ值开始,并逐渐下降。因此,指数分布总是一个关于PDF的递减函数。指数率的值越大,相关的指数随机变量的PDF值就越小。图2展现了使用不同的λ值的CDF曲线的情况。它是一个递增函数,从指数速率开始,CDF随指数随机变量的增加而增加。

图片

图1 不同λ值对应的PDF

图片

图2 不同λ值对应的指数CDF

指数分布随机变量的均值(μ)和方差(σ^2)可以表示为:

图片

从前面的方程中,可以认为参数λ的值与均值和方差值成反比,反之亦然。换句话说,λ值越大,均值和方差值就越小。那么,标准差(σ)与均值相等,可计算如下:

图片

如果只想了解算法的计算流程,可以不看这一节的。这一节就是介绍一下指数分布模型,知不知道都不怎么影响。不是数学专业的同学,可以了解一下。

02
算法设计

为了便于大家理解,介绍算法时就直接抬出公式和流程,就不过多讨论作者的设计思路和出发点了(哎呀,动机、思路、出发点这些都是写给审稿人看的,能自圆其说就行的,了解来也没啥用,知道算法怎么计算的就行了)。与往期推送一样,这部分内容在Word文档里先写好,然后做成图片,最后导入。

图片

图片

03
计算流程

EDO算法的计算流程伪代码如下(公式序号对应上文):

图片

04
实验仿真

这里对EDO算法的性能进行简单的测试。首先将EDO用于函数寻优,算法的MATLAB程序是严格按照它的原始参考文献进行编码的。此外,种群规模取N等于50,Benchmark函数分别采用了CEC2005测试集、CEC2013测试集、CEC2014测试集、CEC2017测试集、CEC2020优化函数测试集和CEC2022优化函数测试集。仅对仿真结果进行简要展示,不再进一步分析。
 首先,检验一下EDO对全局勘探和局部开发的平衡能力。不知道我在说啥的,看一下之前的这一期推送:
种群的勘探(Exploration)与开发(Exploitation)(含MATLAB代码)

如图3所示,是EDO在CEC2005测试函数f7上的勘探和开发占比曲线。

图片

图3 EDO在CEC2005 f7上的勘探和开发百分占比变化曲线

其次,利用CEC2005测试集验证EDO的性能,这里选择今年很火热的蜣螂优化(DBO)算法进行对比(为了对比的公平,两种算法的种群大小设置为30,最大迭代次数为200)。对比结果如下所示:

EDO Vs DBO

可以看到,EDO的竞争力还是很可观的,在一些函数上收敛曲线突然不见了,是因为已经收敛到理论最优值0了。我使用的是semilogy来绘制的收敛曲线,而semilogy画的是y轴的对数,因此,若曲线收敛到0,semilogy是画不出来的。那么,EDO在绝大部分的函数上,用了不到两百次迭代就收敛到了最优值。在CEC2005的大部分函数上,相比于DBO,EDO算法更简单,收敛速度更快,且收敛精度更高。对EDO算法,我本人还是比较推荐的,简单易实现,并且没有调参,不涉及需要用户改动的参数。

再次,以CEC2013测试集中的单峰函数F1为例,展示EDO在30维环境下的收敛效果,如图4所示。(注意是画的误差曲线)

图片

图4 EDO在CEC2013 F1上的误差收敛曲线

接着,以CEC2014测试集中的多模态函数F14为例,展示EDO在30维环境下的收敛效果,如图5所示。(注意是画的误差曲线)

图片

图5 EDO在CEC2014 F14上的误差收敛曲线

再然后,以CEC2017测试集中的多模态函数F4为例,展示EDO在30维环境下的收敛效果,如图6所示。(注意是画的误差曲线)

图片

图6 EDO在CEC2017 F4上的误差收敛曲线

在此之后,以CEC2020优化函数测试集中的单峰函数F2为例,展示EDO在10维环境下的收敛效果,如图7所示。(注意是画的误差曲线)

图片

图7 EDO在CEC2020优化函数F2上的误差收敛曲线

最后,以CEC2022优化函数测试集中的单峰函数F1为例,展示EDO在10维环境下的收敛效果,如图8所示。(注意是画的误差曲线)

图片

图8 EDO在CEC2022优化函数F1上的误差收敛曲线

进一步,可将EDO应用于复杂工程约束优化问题,例如之前推送的两期算法应用内容:

算法应用:基于DBO算法的工程优化设计(第1期)(含MATLAB代码)

算法应用:工程优化设计(第2期)(含MATLAB代码)

这里以行星轮系设计优化问题(Planetary gear train design optimization problem)为例,展示EDO求解效果。该问题的主要目标是使汽车齿轮传动比的最大误差最小化,如图9所示。为了使最大误差最小化,计算了自动行星传动系统的总齿数。

图片

图9 行星轮系设计优化问题(Planetary gear train design)

该问题包含6个整数变量和11个不同的几何约束和装配约束(10个不等式约束,1个等式约束)。这个问题可以定义如下:

图片

采用罚函数处理约束条件,然后利用EDO算法进行求解,最优值和最优解如下所示。目标函数的收敛曲线如图10所示。

图片

图片

图10 EDO在行星轮系设计问题上的目标函数收敛曲线

05
MATLAB代码

EDO算法对应的MATLAB代码链接如下:

EDO跑CEC2005测试集公众号里有链接
EDO跑CEC2013测试集公众号里有链接
EDO跑CEC2014测试集公众号里有链接
EDO跑CEC2017测试集公众号里有链接
EDO跑CEC2020优化函数测试集公众号里有链接
EDO跑CEC2022优化函数测试集公众号里有链接
EDO的勘探(Exploration)和开发(Exploitation)占比分析公众号里有链接
EDO的工程应用(第1期):压力容器设计、滚动轴承设计、拉伸/压缩弹簧设计、悬臂梁设计、轮系设计、三杆桁架设计公众号里有链接
EDO的工程应用(第2期):焊接梁设计、多盘离合器制动器设计问题、步进圆锥滑轮问题、减速机设计问题、行星轮系设计优化问题、机器人夹持器问题公众号里有链接

可通过下方链接下载代码清单,在里面寻找需要的算法代码,然后去对应的链接获取。清单会同步更新,一旦有新的代码,就可以在清单里找到。清单里面有部分代码是开源获取的。可随时免费下载。

链接:https://pan.baidu.com/s/1n2vpbwuhpA8oyXSJGsAsmA

提取码:8023

这篇关于指数分布优化器(EDO)(含MATLAB代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/154165

相关文章

利用c++判断水仙花数并输出示例代码

《利用c++判断水仙花数并输出示例代码》水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身,:本文主要介绍利用c++判断水仙花数并输出的相关资料,文中通过代码介绍的非常详细,需要的朋友可以... 以下是使用C++实现的相同逻辑代码:#include <IOStream>#include <vec

Java 接口定义变量的示例代码

《Java接口定义变量的示例代码》文章介绍了Java接口中的变量和方法,接口中的变量必须是publicstaticfinal的,用于定义常量,而方法默认是publicabstract的,必须由实现类... 在 Java 中,接口是一种抽象类型,用于定义类必须实现的方法。接口可以包含常量和方法,但不能包含实例

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

mybatis-plus分表实现案例(附示例代码)

《mybatis-plus分表实现案例(附示例代码)》MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,:本文主要介绍my... 目录文档说明数据库水平分表思路1. 为什么要水平分表2. 核心设计要点3.基于数据库水平分表注意事项示例

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

SpringBoot实现图形验证码的示例代码

《SpringBoot实现图形验证码的示例代码》验证码的实现方式有很多,可以由前端实现,也可以由后端进行实现,也有很多的插件和工具包可以使用,在这里,我们使用Hutool提供的小工具实现,本文介绍Sp... 目录项目创建前端代码实现约定前后端交互接口需求分析接口定义Hutool工具实现服务器端代码引入依赖获