1主要内容
飞蛾扑火优化算法(Moth-Flame Optimization,MFO)是澳大利亚学者Seyedali Mirjalili于2015年提出的一种受自然生物启发的智能优化算法,该算法的主要灵感来自于飞蛾被称为“横定向”的导航方法。飞蛾在夜间飞行时相对于月亮保持一个固定的角度,这是一种非常有效的远距离直线飞行机制,但是在人造光周围,飞蛾却容易陷入致命的螺旋路径。作者就是模拟了飞蛾的这种特点。(下载链接包括程序文件和原文)
原理解析
假设候选解是飞蛾,问题的变量是飞蛾在空间中的位置。因此,飞蛾可以通过改变位置向量在一维、二维、三维或多维空间中飞行。由于MFO算法是一种基于种群的算法,因此飞蛾的集合用如下矩阵表示:
上式中,n是飞蛾的个数,d是变量数量,也叫变量维度。
对于所有的飞蛾,假设存在一个数组用于存储对应的适应度值:
在MFO算法中,另外一个关键因数是火焰,同样存在集合矩阵和适应度矩阵如下:
这里很多同学肯定会产生疑问,两个因素——飞蛾和火焰的作用是什么?其实飞蛾和火焰都是问题的解,它们之间的区别在于每次更新的方式,飞蛾是在搜索空间中移动的真实的搜索代理,而火焰是飞蛾目前的最优位置。换言之,火焰可以认为是飞蛾打下的标签,因此每只飞蛾围绕火焰搜索,并在找到一个更优解时进行更新。
在飞蛾扑火算法中,可采用如下的三元组来表示:
式中,I用于随机生成飞蛾种群及其对应的适应度值,P是主函数,用来搜索空间内移动飞蛾,T是返回终止条件函数,用于判断优化是否满足要求。
亮点内容
1.对数螺旋更新机制
在满足如下三个条件时:
对数螺旋定义可为以下形式:
对数螺旋路径示意图
2.火焰数自适应机制
飞蛾相对于搜索空间中n个不同位置的位置更新可能会降低对最佳有前途的解决方案的开发。为了解决这个问题,我们提出了一种针对火焰数量的自适应机制。图6显示了火焰的数量是如何在迭代过程中自适应地减少的。
显而易见,如果一直以n个不同位置的火焰进行搜索,会降低优化效率,因此,该算法提出火焰数量自适应机制,用于更快速、敏捷找到最优解。
其中,l 为当前迭代次数,N为最大火焰数,T 为最大迭代次数。
火焰数自适应减少示意图
2部分代码
% 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
[ ]=Get_Functions_details(Function_name);
[ ]=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)]);
3程序结果
4下载链接
扫码或阅读原文即可跳转程序页面:
想了解更多程序?按照下面教程查看程序目录!