智能优化算法(源码)-飞蛾扑火优化算法(MFO)
获取更多资讯,赶快关注上面的公众号吧!
文章目录
- 灵感
- MFO算法
飞蛾扑火优化算法(Moth-Flame Optimization,MFO)是澳大利亚学者Seyedali Mirjalili于2015年提出的一种受自然生物启发的智能优化算法,该算法的主要灵感来自于飞蛾被称为“横定向”的导航方法。飞蛾在夜间飞行时相对于月亮保持一个固定的角度,这是一种非常有效的远距离直线飞行机制,但是在人造光周围,飞蛾却容易陷入致命的螺旋路径。作者就是模拟了飞蛾的这种特点。扫码关注公众号,后台回复“飞蛾扑火”或“MFO”可以获取Matlab代码和原文。
灵感
飞蛾最有趣的是它们在夜间的特殊导航方式,它们已经进化到可以利用月光在夜间飞行,这种导航方式叫做横定向。飞蛾飞行时相对于月亮保持一个固定的角度,如图1所示。由于月亮离飞蛾很远,这种机制保证了飞蛾的直线飞行。
尽管有横定向有一定的作用,但是我们通常观察到蛾子绕着灯光盘旋飞行。事实上,蛾子容易被人造光所欺骗而表现出这样的行为,这是因为只有在光源非常远的情况下横定向才有利于直线移动。当飞蛾看到人造光源时,它们会试图与光源保持相似的角度,以保持直线飞行。然而,由于这种光线与月亮相比非常接近,因此与光源保持类似的角度会导致飞蛾产生无用或致命的螺旋飞行路径,如图2所示。可以看出,蛾子最终会向光线靠拢,作者将这种行为进行数学建模,提出飞蛾扑火优化算法。
MFO算法
在提出的MFO算法中,假设候选解是飞蛾,问题的变量是蛾飞蛾在空间中的位置。因此,飞蛾可以通过改变位置向量在一维、二维、三维或多维空间中飞行。由于MFO算法是一种基于种群的算法,因此飞蛾的集合用如下矩阵表示:
M=[m1,1m1,2⋯⋯m1,dm2,1m2,2⋯⋯m2,d⋮⋮⋮⋮⋮mn,1mn,2⋯⋯mn,d](1)M=\left[\begin{array}{ccccc} m_{1,1} & m_{1,2} & \cdots & \cdots & m_{1, d} \\ m_{2,1} & m_{2,2} & \cdots & \cdots & m_{2, d} \\ \vdots & \vdots & \vdots & \vdots & \vdots \\ m_{n, 1} & m_{n, 2} & \cdots & \cdots & m_{n, d} \end{array}\right] \tag{1} M=⎣⎢⎢⎢⎡m1,1m2,1⋮mn,1m1,2m2,2⋮mn,2⋯⋯⋮⋯⋯⋯⋮⋯m1,dm2,d⋮mn,d⎦⎥⎥⎥⎤(1)
其中nnn是飞蛾数量,ddd是变量个数即维度。
对于所有的飞蛾,假设存在一个数组用于存储对应的适应度值:
OM=[OM1OM2⋮OMn](2)O M=\left[\begin{array}{c} O M_{1} \\ O M_{2} \\ \vdots \\ O M_{n} \end{array}\right]\tag{2} OM=⎣⎢⎢⎢⎡OM1OM2⋮OMn⎦⎥⎥⎥⎤(2)
另一个关键要素就是火焰,也是一个类似于飞蛾的矩阵:
F=[F1,1F1,2⋯⋯F1,dF2,1F2,2⋯⋯F2,d⋮⋮⋮⋮⋮Fn,1mn,2⋯⋯Fn,d](3)F=\left[\begin{array}{ccccc} F_{1,1} & F_{1,2} & \cdots & \cdots & F_{1, d} \\ F_{2,1} & F_{2,2} & \cdots & \cdots & F_{2, d} \\ \vdots & \vdots & \vdots & \vdots & \vdots \\ F_{n, 1} & m_{n, 2} & \cdots & \cdots & F_{n, d} \end{array}\right]\tag{3} F=⎣⎢⎢⎢⎡F1,1F2,1⋮Fn,1F1,2F2,2⋮mn,2⋯⋯⋮⋯⋯⋯⋮⋯F1,dF2,d⋮Fn,d⎦⎥⎥⎥⎤(3)
对于火焰,同样假设有一个数组用于存储火焰的适应度值:
OF=[OF1OF2⋮OFn](4)O F=\left[\begin{array}{c} O F_{1} \\ O F_{2} \\ \vdots \\ O F_{n} \end{array}\right]\tag{4} OF=⎣⎢⎢⎢⎡OF1OF2⋮OFn⎦⎥⎥⎥⎤(4)
注意,在飞蛾扑火算法中,飞蛾和火焰都是问题的解,它们之间的区别在于每次更新的方式,飞蛾是在搜索空间中移动的真实的搜索代理,而火焰是飞蛾目前的最优位置。换言之,火焰可以认为是飞蛾打下的标签,因此每只飞蛾围绕火焰搜素,并在找到一个更优解时进行更新。
飞蛾扑火算法可以用一个三元组表示:
MFO=(I,P,T)(5)M F O=(I, P, T)\tag{5} MFO=(I,P,T)(5)
其中III用于随机生成飞蛾种群及其对应的适应度值:
I:∅→{M,OM}(6)I: \emptyset \rightarrow\{M, O M\}\tag{6} I:∅→{M,OM}(6)
PPP函数是主函数,它在搜索空间内移动飞蛾。这个函数接收矩阵MMM,并最终返回更新后的矩阵:
P:M→M(7)P: M \rightarrow M\tag{7} P:M→M(7)
TTT函数返回终止条件是否满足:
T:M→{true ,false }(8)T: M \rightarrow\{\text { true }, \text { false }\}\tag{8} T:M→{ true , false }(8)
基于I,P,TI,P,TI,P,T,可以得到飞蛾扑火的一般框架:
函数III用于生成初始解和计算目标值函数,在该函数可以使用任意随机函数,默认如下:
这里存在两个数组ububub和lblblb,用于定义变量的上界和下界:
ub=[ub1,ub2,ub3,…,ubn−1,ubn](9)u b=\left[u b_{1}, u b_{2}, u b_{3}, \ldots, u b_{n-1}, u b_{n}\right]\tag{9} ub=[ub1,ub2,ub3,…,ubn−1,ubn](9)
其中ubiub_iubi为iii个变量的上界。
lb=[lb1,lb2,lb3,…,lbn−1,lbn](10)l b=\left[l b_{1}, l b_{2}, l b_{3}, \ldots, l b_{n-1}, l b_{n}\right]\tag{10} lb=[lb1,lb2,lb3,…,lbn−1,lbn](10)
其中lbilb_ilbi为iii个变量的下界。
初始化完成之后,函数PPP会循环运行直到TTT函数返回TrueTrueTrue,其作用就是模拟横定向来进行移动,每只飞蛾相对于火焰的位置可按下式进行更新:
Mi=S(Mi,Fj)(11)M_{i}=S\left(M_{i}, F_{j}\right)\tag{11} Mi=S(Mi,Fj)(11)
其中MiM_iMi表示第iii只飞蛾,FjF_jFj表示第jjj个火焰,SSS是螺形函数。
作者选择了对数螺旋作为飞蛾的主要更新机制,当然其他类型的螺旋也是可以的,但是需要满足以下条件:
- 螺旋的起始点应始于飞蛾;
- 螺旋的最终点应该就是火焰的位置;
- 螺旋范围波动不应超过搜索空间。
基于以上几点,对数螺旋可以定义为:
S(Mi,Fj)=Di⋅ebt⋅cos(2πt)+Fj(12)S\left(M_{i}, F_{j}\right)=D_{i} \cdot e^{b t} \cdot \cos (2 \pi t)+F_{j}\tag{12} S(Mi,Fj)=Di⋅ebt⋅cos(2πt)+Fj(12)
其中DiD_iDi为第iii只飞蛾与第jjj个火焰之间的距离,bbb是定义螺旋形状的常量,ttt是[−1,1][-1,1][−1,1]之间的随机数。
DDD的计算如下:
Di=∣Fj−Mi∣(13)D_{i}=\left|F_{j}-M_{i}\right|\tag{13} Di=∣Fj−Mi∣(13)
公式(12)模拟了飞蛾的螺旋飞行路径,飞蛾的下一位置是根据火焰定义的,参数ttt定义了飞蛾的下一位置与火焰的位置有多近(-1表示与火焰距离最近,1表示与火焰距离最远)。因此,可以假设火焰周围有一个超椭圆,飞蛾的下一个位置就在这个空间内。螺旋方程允许飞蛾“绕着”火焰飞行,而不一定是在它们之间的空间。这样才能保证搜索空间的探索和利用,如图3所示。
图4为飞蛾在火焰周围位置更新的概念模型,请注意,纵轴只显示了一个维度(给定问题的1个变量/参数),但本文提出的方法可以用来改变问题的所有变量。图4中飞蛾(蓝色水平线)环绕火焰(绿色水平线)可以选择的下一位置(黑色虚线)清楚地表明,飞蛾可以在一维空间内探索和利用火焰周围的搜索空间。当下一个位置在飞蛾和火焰之间的空间之外时,就会发生探索,如1、3、4表示的箭头,当下一个位置位于飞蛾和火焰之间时,就会发生利用,如2表示的箭头。从这个模型中可以发现一些有趣的现象:
- 飞蛾可以通过改变ttt收敛到火焰附近的任何一点;
- ttt越小,离火焰越近;
- 飞蛾离火焰越近,火焰两侧的位置更新频率越高。
为了进一步加强利用,假设ttt是[r,1][r,1][r,1]范围内的随机数,其中rrr随着迭代的进行线性地从-1降到-2。
另一个考虑就是飞蛾相对于搜索空间中nnn个不同位置的位置更新可能会降低对最优解的利用,为了避免这个问题,提出了一种火焰数自适应机制:
flame no =round (N−l∗N−1T)(14)\text { flame no }=\text { round }\left(N-l * \frac{N-1}{T}\right)\tag{14} flame no = round (N−l∗TN−1)(14)
其中,lll为当前迭代次数,NNN为最大火焰数,TTT为最大迭代次数。
图6显示了在初始迭代时有NNN个火焰,然而飞蛾的位置更新只和迭代最后几步中的最优火焰有关,火焰数量的逐渐减少就平衡了搜索空间的探索和利用。
那么,PPP函数的一般步骤如下:
智能优化算法(源码)-飞蛾扑火优化算法(MFO)相关推荐
- 【老生谈算法】matlab实现FFT变换算法源码——FFT变换算法
Matlab实现FFT变换(单边谱及双边谱) 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]Matlab实现FFT变换程序源 ...
- 【老生谈算法】matlab实现Kmeans聚类算法源码——Kmeans聚类算法
matlab实现Kmeans聚类算法代码实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlab实现Kmeans聚类 ...
- 【老生谈算法】matlab实现IIR滤波器算法源码——IIR滤波器算法
matlab的IIR滤波器的实现算法详解 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlabIIR滤波器设计.doc ...
- 【老生谈算法】matlab实现PCA人脸识别算法源码——人脸识别算法
基于主成分分析(Principal Component Analysis,PCA)方法的人脸识别讲解以及matlab代码实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序 ...
- Metis异常检测算法源码概要
Metis异常检测算法源码概要 算法源码目录 算法层目录 基于指数移动平均算法(EWMA) 孤立森林 xgboost gbdt 3-Sigma 多项式回归 特征层目录 拟合特征 分类特征 统计特征 其 ...
- python求素数积_用Python求素数的快速算法源码示例
本篇文章为Python算法相关,用Python求素数的快速算法源码示例.算法在Python的学习中算是一个要点,能研究明白算法的同学都可以算的上是Python的大牛了. 首先简单的来说下什么是素数:质 ...
- 【老生谈算法】matlab实现制动力优化源码——制动力优化
matlab制动力优化程序源码 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlab制动力优化程序源码.doc 2.算 ...
- (源码)群体智能优化算法之灰狼优化(Grey Wolf Optimizer,GWO)
获取更多资讯,赶快关注上面的公众号吧! 文章目录 第三十三章 灰狼优化(Grey Wolf Optimizer,GWO) 启发 数学模型和算法 社会等级 包围捕食 狩猎 攻击猎物(利用) 搜索猎物(探 ...
- 基于LM的双目图像校准算法源码第一部分
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...
- THOR:MindSpore 自研高阶优化器源码分析和实践应用
摘要:这篇文章跟大家分享下THOR的实践应用.THOR算法的部分内容当前已经在MindSpore中开源 本文分享自华为云社区<MindSpore 自研高阶优化器源码分析和实践应用>,原文作 ...
最新文章
- Oracle VDI 安装
- 当你学不进去的时候,试试“普瑞马法则
- vim编辑器基础知识总结
- eclipse启动tomcat报错
- 【转】浅谈.net remoting 与webservice
- jQuery.extend与jQuery.fn.extend的区别
- 关于[一个基于WF的业务流程平台]表设计的说明
- ibatis3获得总记录数,同时计算数据分页?
- 用户工号转换成姓名加工号
- python面向对象编程指南 豆瓣_一文看懂Python面向对象编程(Python学习与新手入门必看)-绝对原创...
- Redis相关面试题总结
- LightBurn(激光切割排版软件)官方中文版V1.0.04 | 激光切割排版软件哪个好
- java学习 遇到的基本错误
- java秒杀源码_Java秒杀系统实战系列~商品秒杀代码实战
- 笔记本电脑显示dns服务器出错,电脑出现dns错误无法上网的解决方法详解
- [京喜]卡红包实现真正0.01买东西
- 解决方案:ppt打不开,显示发现文件中的内容有问题。可尝试修复此演示文稿
- 2022中国汽车测试及质量监控博览会
- LeetCode 1103[Python]. 分糖果 II 排排坐,分糖果。 我们买了一些糖果 candies,打算把它们分给排好队的 n = num_people 个小朋友。
- 酷跑游戏C语言,毕业设计(论文)-跑酷游戏设计(源程序).doc
热门文章
- 经典排序算法(八)--选择排序Selection Sort
- 01. View C++ as a federation of languages
- http://maven.apache.org/POM/4.0.0 报红
- java泛型范围_Java泛型类型中的通配符参数在其范围内的正式条件是什么?
- python中dbscan和kmeans_DBSCAN聚类教程及Python示例
- python编程新手常犯的错误_Python新手常犯的10个错误 - 里维斯社
- SpringMVC学习笔记(1)-SpringMVC介绍
- 图像特征描述_如何判断ORB特征点的好坏(得分)_FAST_SCORE对比HARRIS_SCORE
- Hadoop学习笔记(二):MapReduce的进度和状态
- leetcode之前K个高频元素