目录
0 引言
飞蛾扑火算法(Moth-flame optimization,MFO)是由Seyedali Mirjalili在2015年提出新型元启发式优化算法,该算法主要模拟飞蛾围绕火焰飞行策略进行问题寻优。该算法在被大多数学者引用研究中发现其具有搜索速度快,寻优能力强特点。
1 数学模型
MFO通过飞蛾在选择火焰、飞蛾围绕火焰飞行和飞蛾扑火的行为进行模型构建:
1)初始化:MFO算法中,假设候选解是蛾,问题的变量是蛾在空间中的位置。飞蛾集、火焰集的初始化矩阵如下:
飞蛾初始化
飞蛾集:n为种群,d为问题维度
飞蛾种群位置对应适应度
火焰矩阵集
火焰对应适应度
在MFO数学模拟中,把火焰和飞蛾看成一个种群,火焰只是相对位置最优的个体(适应度最好)。飞蛾围绕最优个体进行以下操作进行寻优过程。
2)螺旋飞行:飞蛾根据火焰位置进行定位并向其飞行,MFO采用对数螺旋飞行,其图像和数学模型如下:
式中S为对数螺旋函数,D为飞蛾和火焰之间距离,b为定义对数螺旋形状的常数,t为[-1,1]的随机数。
4)火焰自适应修正:在上述飞蛾运动趋势中,如下图所示
图中黑线表示飞蛾飞行路径,绿线表示火焰的位置路径,飞蛾沿着黑线在火焰周围飞行,MFO算法更新飞蛾位置后通常情况下其适应度值会变好,如黑虚线所示,记录下此时飞蛾的位置并把它作为下一次迭代时火焰的位置,已便于充分提高算法的局部探索性能,同样在一个位置寻优容易陷入局部收敛故MFO对火焰进行自适应更新,如下式:
式l为当前迭代,T为最大迭代,N为最大火焰数量
2 优化方式
前篇对长短期记忆神经网络(长短期记忆神经网络LSTM原理及matlab代码-CSDN博客)原理讲解,从长短期记忆神经网络matlab代码运算过程中,可以看到LSTM受多个超参数影响(隐藏层节点、学习率、分批量、正则化等等)。因此结合上述MFO原理介绍,可以将这些超参数作为飞蛾和火焰种群位置,每一个种群位置对应LSTM的预测值,将这个预测值作为适应度更新上述飞蛾围绕火焰飞行策略,更新最优位置。
3 Maltab代码
3.1 伪代码
3.2 MFO主函数代码
%% 参数
% Max_iteration 最大迭代次数
% N 种群数目
% ub,lb 问题维度边界
% Convergence_curve 适应度曲线
% SYD 适应度函数
% Moth_pos 飞蛾种群位置
% 主函数
while Iteration<Max_iteration+1
% 火焰数量 Eq. (3.14)
Flame_no=round(N-Iteration*((N-1)/Max_iteration));
for i=1:size(Moth_pos,1)
% 飞蛾位置边界
Flag4ub=Moth_pos(i,:)>ub;
Flag4lb=Moth_pos(i,:)<lb;
Moth_pos(i,:)=(Moth_pos(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
% 对应适应度计算
Moth_fitness(1,i)=SYD(Moth_pos(i,:),net);
net.trainParam.showWindow = 0;
end
if Iteration==1
% 第一批飞蛾分类
[fitness_sorted I] = sort(Moth_fitness);
sorted_population=Moth_pos(I,:);
% 更新火焰
best_flames=sorted_population;
best_flame_fitness=fitness_sorted;
else
% 剩下飞蛾分类
double_population=[previous_population;best_flames];
double_fitness=[previous_fitness best_flame_fitness];
[double_fitness_sorted I]=sort(double_fitness);
double_sorted_population=double_population(I,:);
fitness_sorted=double_fitness_sorted(1:N);
sorted_population=double_sorted_population(1:N,:);
% 更新对应火焰
best_flames=sorted_population;
best_flame_fitness=fitness_sorted;
end
% 更新目前获得的最佳火焰位置
Best_flame_score=fitness_sorted(1);
Best_flame_pos=sorted_population(1,:);
previous_population=Moth_pos;
previous_fitness=Moth_fitness;
%Eq. (3.12)
a=-1+Iteration*((-1)/Max_iteration);
for i=1:size(Moth_pos,1)
for j=1:size(Moth_pos,2)
if i<=Flame_no % 更新飞蛾相对于相应火焰的位置
% Eq. (3.13)
distance_to_flame=abs(sorted_population(i,j)-Moth_pos(i,j));
b=1;
t=(a-1)*rand+1;
% Eq. (3.12)
Moth_pos(i,j)=distance_to_flame*exp(b.*t).*cos(t.*2*pi)+sorted_population(i,j);
end
if i>Flame_no % 将飞蛾的位置与一个火焰相对比
% Eq. (3.13)
distance_to_flame=abs(sorted_population(i,j)-Moth_pos(i,j));
b=1;
t=(a-1)*rand+1;
% Eq. (3.12)
Moth_pos(i,j)=distance_to_flame*exp(b.*t).*cos(t.*2*pi)+sorted_population(Flame_no,j);
end
end
end
Convergence_curve(Iteration)=Best_flame_score;
Iteration=Iteration+1;
end
3.3 MFO-LSTM
1)时间序列:时间序列:飞蛾扑火算法优化长短期记忆神经网络模型(MFO-LSTM)
4 视频讲解
B站搜索:‘ 不想学习的陈成 ’