飞蛾扑火( Moth-flame optimization algorithm,MFO) 是Seyedali Mirjalili等于2015年提出的一种新型智能优化算法。该算法具有并行优化能力强,全局性优且不易落入局部极值的性能特征,逐渐引起了学术界和工程界的关注。
目录
1.飞蛾扑火算法描述
飞蛾火焰优化算法((moth-flame optimization,MFO)是由自然界中飞蛾横向定位导航机制演变而来的。在夜间,飞蛾飞行时把遥远的月亮当作参考物,可以将月光视为平行光,飞蛾根据光照方向来和自身夹角来调整飞行方向,由于人工火焰距离较近,飞蛾飞行时与火焰保持固定的角度,飞蛾与火焰的距离会不断变化,最终产生螺旋式逼近火焰的飞行路径。MFO算法并行优化能力强,总体特性好,对于非凸函数而言,由于非凸函数具有大量的局部最优点,因此MFO算法能够广泛探索搜索空间,并发现其中存在全局最优点的概率更大的区域。
1.1 算法步骤
1)初始化算法参数。设置输入控制变量维度,飞蛾种群规模,最大迭代次数以及自变量上下限等参数。
2)在搜索空间中随机生成飞蛾位置,对飞蛾种群中每只飞蛾进行适应度评价。
3)重复如下过程指导达到停止标准
3.1)自适应更新火焰个数n。将飞蛾空间位置以适应度值递增的顺序排序后赋值给火焰,作为第一代中火焰的空间位置。当迭代次数为1时,飞蛾个数即为火焰个数。
3.2)将更新后的火焰位置与飞蛾位置的适应度值重新排序,选取适应度值更优的空间位置更新为下一代火焰的位置。
3.3)自适应机制减少火焰数量,更新飞蛾的搜索参数。
3.4)更新飞蛾位置。根据每只飞蛾对应的火焰与飞行参数更新飞蛾的位置
4)输出所得最优解(火焰)
2.MFO优化BP神经网络流程
Step1:初始化BP神经网络的权值和阈值
Step2:计算MFO的决策变量长度,选取预测误差的范数作为优化的目标函数。
Step3:设置算法停止准则,使用飞蛾扑火算法优化神经网络的权值和阈值参数。
Step4:将优化得到的权值和阈值参数赋给BP神经网络。
Step5:优化后的BP神经网络训练与测试,与优化前的BP神经网络进行误差分析和精度对比。
3.模型介绍
3.1 确定BP神经网络的拓扑结构
输入层和输出层节点使用size函数直接获取。 隐含层节点数量参考经验公式:
式中,n是隐含层节点数量,m是输入层节点数量
inputnum=size(P_train,2); %输入层神经元节点个数
hiddennum=2*inputnum+1;%隐含层神经元节点个数
outputnum=size(T_train,2);%输出层神经元节点个数
3.2 BP神经网络参数
net=newff(p_train,t_train,hiddennum); %隐含层为hiddennum个神经元
%设定参数网络参数
net.trainParam.epochs=1000;
net.trainParam.goal=1e-3;
net.trainParam.lr=0.01;
net.trainParam.showwindow=false; %高版MATLAB使用 不显示图形框
3.3 飞蛾扑火算法初始参数
%% 定义算法参数
N=50;%种群规模
Max_iteration=50;%最大迭代代数
lb=-0.5;%下限
ub=0.5;%上限
3.4 适应度函数公式
式中,T_sim,T_test,分别为训练集和测试集的样本。使用飞蛾扑火算法优化后,适应度函数值越小,即预测误差的范数越小,表明训练越准确,且模型的预测精度更好。
3.5 优化后的权重与阈值赋给BP
net.iw{1,1}=reshape(W1,hiddennum,inputnum); %为神经网络的输入层到隐含层权值赋值
net.lw{2,1}=reshape(W2,outputnum,hiddennum); %为神经网络的隐含层到输出层权值赋值
net.b{1}=reshape(B1,hiddennum,1); %为神经网络的隐层神经元阈值赋值
net.b{2}=reshape(B2,outputnum,1); %为神经网络的输出层阈值赋值
3.6 MFO优化后的BP神经网络训练与仿真预测
net = train(net,p_train,t_train);
%% 测试网络
t_sim = sim(net,p_test);
T_sim = mapminmax('reverse',t_sim,ps_output); %反归一化
4.运行结果
4.1 飞蛾扑火算法进化曲线
4.2 飞蛾扑火算法MFO优化BP神经网络的预测结果
4.3 飞蛾扑火算法MFO优化BP神经网络的预测误差
4.4 预测值和真实值的误差计算
5.完整代码
代码链接放这,不需要积分:MATLAB基于飞蛾扑火算法优化BP神经网络(MFO-BP)的预测模型