当前位置: 首页 > article >正文

群体智能优化算法-蛾火焰优化算法(Moth-Flame Optimization Algorithm,含Matlab源代码)

摘要

蛾火焰优化算法(Moth-Flame Optimization, MFO)是一种新型的自然启发式优化算法,其灵感来源于飞蛾趋光行为。MFO 通过飞蛾围绕火焰的螺旋轨迹进行搜索,模拟了自然界中飞蛾在光源周围盘旋的现象,以实现对搜索空间的探索与开发。本文详细介绍了 MFO 算法的数学模型、关键公式及其 MATLAB 实现,并对代码进行了逐行详细注释,以帮助读者深入理解 MFO 算法的工作原理及其在优化问题中的应用。

一、MFO 算法详细介绍

(1)算法的灵感来源

MFO 算法模仿了自然界中飞蛾(Moth)围绕光源(Flame)进行螺旋飞行的行为。飞蛾使用名为 光航行(Transverse Orientation)的导航机制,在自然环境中,飞蛾会利用月光保持固定角度前进。然而,当光源是人造灯光时,飞蛾会误判导致围绕光源盘旋,最终被吸引到火焰或光源附近。

MFO 算法基于这一行为构建了一种新的优化算法,其中:

  • 飞蛾(Moth)代表搜索代理;
  • 火焰(Flame)代表潜在的全局最优解;
  • 螺旋更新公式用于更新飞蛾的位置,使其围绕火焰进行搜索。

(2)数学模型及公式

MFO 算法的核心公式如下:

① 螺旋更新公式(核心飞行轨迹)

MFO 使用一个对数螺旋公式来更新飞蛾的位置,使其围绕火焰进行搜索:

② 动态火焰更新机制

在 MFO 算法中,火焰的数量随着迭代次数的增加而减少:

(3)MFO 算法执行流程

  1. 初始化:随机生成飞蛾的位置,并计算其适应度值。
  2. 排序:按适应度值对飞蛾排序,前NNN个作为火焰。
  3. 位置更新:飞蛾围绕火焰按螺旋轨迹飞行,同时随机选择不同火焰进行搜索。
  4. 更新火焰:随着迭代次数增加,火焰数量逐渐减少,最终收敛到最优解。

二、MFO 代码详细注释(MATLAB)

1. MFO 主函数

function [Best_flame_score,Best_flame_pos,Convergence_curve]=MFO(N,Max_iteration,lb,ub,dim,fobj)

% 初始化飞蛾群体
Moth_pos = initialization(N, dim, ub, lb);

% 初始化收敛曲线
Convergence_curve = zeros(1, Max_iteration);

% 迭代计数器
Iteration = 1;

% 进入主循环
while Iteration < Max_iteration + 1
    
    % 计算当前火焰的数量,随迭代次数减少
    Flame_no = round(N - Iteration * ((N-1) / Max_iteration));
    
    % 计算所有飞蛾的适应度
    for i = 1:N
        % 边界处理:确保飞蛾位置不超出搜索空间
        Flag4ub = Moth_pos(i,:) > ub;
        Flag4lb = Moth_pos(i,:) < lb;
        Moth_pos(i,:) = (Moth_pos(i,:) .* (~(Flag4ub + Flag4lb))) + ub .* Flag4ub + lb .* Flag4lb;
        
        % 计算适应度
        Moth_fitness(i) = fobj(Moth_pos(i,:));
    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,:);

        % **选取前 N 个火焰**
        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;

    % **计算螺旋更新参数 a**
    a = -1 + Iteration * ((-1) / Max_iteration);
    
    % **飞蛾位置更新**
    for i = 1:N
        for j = 1:dim
            % **更新靠近火焰的飞蛾**
            if i <= Flame_no
                distance_to_flame = abs(sorted_population(i,j) - Moth_pos(i,j));
                b = 1;
                t = (a-1) * rand + 1;
                Moth_pos(i,j) = distance_to_flame * exp(b * t) * cos(t * 2 * pi) + sorted_population(i,j);
            else
                % **剩余飞蛾向最后一个火焰靠近**
                distance_to_flame = abs(sorted_population(i,j) - Moth_pos(i,j));
                b = 1;
                t = (a-1) * rand + 1;
                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;
    
    % **迭代次数 +1**
    Iteration = Iteration + 1;
end
end

2. 初始化函数 

function X = initialization(SearchAgents_no, dim, ub, lb)

Boundary_no = size(ub,2);

% 如果所有变量边界相同
if Boundary_no == 1
    X = rand(SearchAgents_no, dim) .* (ub - lb) + lb;
end

% 如果每个变量有不同的边界
if Boundary_no > 1
    for i = 1:dim
        X(:,i) = rand(SearchAgents_no,1) .* (ub(i) - lb(i)) + lb(i);
    end
end
end

三、总结

MFO 通过飞蛾的螺旋飞行方式进行搜索,并结合动态火焰更新机制,兼顾了全局搜索与局部开发,广泛应用于:

  • 组合优化问题
  • 机器学习超参数优化
  • 复杂函数优化
  • 工程设计优化

http://www.kler.cn/a/597859.html

相关文章:

  • uboot(bootrom的作用)
  • [快乐学坊_2] 后端api测试
  • 数据结构篇——二叉树的存储与遍历
  • UnoCSS极速入门:下一代原子化CSS引擎实战指南
  • CVPR 2025 | 文本和图像引导的高保真3D数字人高效生成GaussianIP
  • Gradle/Maven 本地仓库默认路径迁移 (减少系统磁盘占用)
  • 【中文翻译】第1章-The Algorithmic Foundations of Differential Privacy
  • OTN(Optical Transport Network,光传输网络)
  • 机器人的位姿变换左乘与右乘
  • The First Indoor Pathloss Radio Map Prediction Challenge
  • 数组作为哈希表的妙用:寻找缺失的第一个正数
  • TensorFlow面试题及参考答案
  • uniapp vue3使用uniapp的生命周期
  • 如何高效参与 GitHub 知名项目开发并成为核心贡献者
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例11,TableView15_11带分页的导出表格示例
  • SpringCloud构建一个服务步骤
  • 人机交互中的“分布式主体性”与“集中式整体性”
  • WebLogic中间件漏洞攻略
  • 关于极端场景下,数据库更新与 MQ 消息一致性保障方案的详细总结
  • 回顾Python基础语法,辨析和C++等的不同~