飞蛾扑火算法(MFO)优化长短期记忆神经网络原理及Matlab代码

目录

0 引言

1 数学模型

2 优化方式

3 Maltab代码

3.1 伪代码

3.2 MFO主函数代码

3.3 MFO-LSTM

4 视频讲解

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站搜索:‘ 不想学习的陈成 ’  

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值