当前位置:   article > 正文

matlab|【智能优化算法】飞蛾扑火优化算法(MFO)

matlab|【智能优化算法】飞蛾扑火优化算法(MFO)

目录

1 主要内容

原理解析

亮点内容

火焰数自适应机制

2 部分代码

3 程序结果

4 下载链接


主要内容

飞蛾扑火优化算法(Moth-Flame Optimization,MFO)是澳大利亚学者Seyedali Mirjalili于2015年提出的一种受自然生物启发的智能优化算法,该算法的主要灵感来自于飞蛾被称为“横定向”的导航方法。飞蛾在夜间飞行时相对于月亮保持一个固定的角度,这是一种非常有效的远距离直线飞行机制,但是在人造光周围,飞蛾却容易陷入致命的螺旋路径。作者就是模拟了飞蛾的这种特点。

  • 原理解析

假设候选解是飞蛾,问题的变量是飞蛾在空间中的位置。因此,飞蛾可以通过改变位置向量在一维、二维、三维或多维空间中飞行。由于MFO算法是一种基于种群的算法,因此飞蛾的集合用如下矩阵表示:

上式中,n是飞蛾的个数,d是变量数量,也叫变量维度。

对于所有的飞蛾,假设存在一个数组用于存储对应的适应度值:

在MFO算法中,另外一个关键因数是火焰,同样存在集合矩阵和适应度矩阵如下:

这里很多同学肯定会产生疑问,两个因素——飞蛾和火焰的作用是什么?其实飞蛾和火焰都是问题的解,它们之间的区别在于每次更新的方式,飞蛾是在搜索空间中移动的真实的搜索代理,而火焰是飞蛾目前的最优位置。换言之,火焰可以认为是飞蛾打下的标签,因此每只飞蛾围绕火焰搜索,并在找到一个更优解时进行更新。

在飞蛾扑火算法中,可采用如下的三元组来表示:

式中,I用于随机生成飞蛾种群及其对应的适应度值,P是主函数,用来搜索空间内移动飞蛾,T是返回终止条件函数,用于判断优化是否满足要求。

  • 亮点内容

1.对数螺旋更新机制

在满足如下三个条件时:

  • 螺旋的起始点应始于飞蛾。
  • 螺旋的最终点应该就是火焰的位置。
  • 螺旋范围波动不应超过搜索空间。

对数螺旋定义可为以下形式:

对数螺旋路径示意图

火焰数自适应机制

飞蛾相对于搜索空间中n个不同位置的位置更新可能会降低对最佳有前途的解决方案的开发。为了解决这个问题,我们提出了一种针对火焰数量的自适应机制。图6显示了火焰的数量是如何在迭代过程中自适应地减少的。

显而易见,如果一直以n个不同位置的火焰进行搜索,会降低优化效率,因此,该算法提出火焰数量自适应机制,用于更快速、敏捷找到最优解。

其中,l 为当前迭代次数,N为最大火焰数,T 为最大迭代次数。

火焰数自适应减少示意图

部分代码

% To run MFO: [Best_score,Best_pos,cg_curve]=MFO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj)
%______________________________________________________________________________________________
​
clear all 
clc
​
SearchAgents_no=30; % Number of search agents
​
Function_name='F1'; % Name of the test function that can be from F1 to F23 (Table 1,2,3 in the paper)
​
Max_iteration=1000; % Maximum numbef of iterations
​
% Load details of the selected benchmark function
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
​
[Best_score,Best_pos,cg_curve]=MFO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
​
figure('Position',[284   214   660   290])
%Draw search space
subplot(1,2,1);
func_plot(Function_name);
title('Test function')
xlabel('x_1');
ylabel('x_2');
zlabel([Function_name,'( x_1 , x_2 )'])
grid off
​
%Draw objective space
subplot(1,2,2);
semilogy(cg_curve,'Color','b')
title('Convergence curve')
xlabel('Iteration');
ylabel('Best flame (score) obtained so far');
​
axis tight
grid off
box on
legend('MFO')
​
display(['The best solution obtained by MFO is : ', num2str(Best_pos)]);
display(['The best optimal value of the objective funciton found by MFO is : ', num2str(Best_score)]);

程序结果

4 下载链接

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/152941
推荐阅读
相关标签
  

闽ICP备14008679号