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

群体智能优化算法-山羚羊优化算法(Mountain Gazelle Optimizer, MGO,含Matlab源代码)

摘要(Abstract)

山羚羊优化算法(MGO)是一种新的群体智能优化算法,受到山羚羊群体行为的启发,模拟了山羚羊在野外觅食、探索和躲避捕食者的行为模式。MGO 采用了动态搜索策略,包括个体搜索、信息共享、随机扰动和边界检查,以提高全局搜索能力和局部搜索精度。该算法适用于连续优化问题,如函数优化、工程优化和机器学习参数优化。本文提供 MGO 的 MATLAB 实现,并详细解析其工作原理。


算法介绍

1. 主要思想

山羚羊优化算法(MGO)基于山羚羊群的社会行为,主要包括以下核心概念:

  • 山羚羊群体行为:在寻找最佳觅食地点时,山羚羊会根据过去经验、自身探索和群体信息调整位置。
  • 信息共享:个体之间通过交流最佳觅食地点的信息来更新位置。
  • 动态扰动:个体在一定程度上随机调整位置,以避免陷入局部最优。
  • 边界处理:确保搜索个体不会超出定义的搜索空间范围。

2. 算法步骤

  1. 初始化种群:随机生成一组山羚羊个体,每个个体表示一个可能的解。
  2. 计算适应度值:评估每个个体在当前搜索空间中的表现。
  3. 更新山羚羊位置
    • 计算控制参数,模拟动态搜索行为。
    • 采用不同策略调整位置,包括向最佳个体靠近、局部扰动、以及完全随机搜索。
  4. 边界检查:确保所有个体都在搜索空间范围内。
  5. 选择最优个体:根据适应度值选择最佳个体,形成新的种群。
  6. 重复上述步骤,直至满足终止条件(如达到最大迭代次数)

MATLAB 代码实现

% 山羚羊优化算法(Mountain Gazelle Optimizer, MGO)
% 输入:
%   N - 种群大小
%   MaxIter - 最大迭代次数
%   LB - 搜索空间下界
%   UB - 搜索空间上界
%   dim - 变量维度
%   fobj - 目标优化函数
% 输出:
%   BestF - 全局最优适应度值
%   BestX - 最优解
%   cnvg - 收敛曲线

function [BestF, BestX, cnvg] = MGO(N, MaxIter, LB, UB, dim, fobj)

    % 统一变量边界格式
    lb = ones(1, dim) .* LB;  
    ub = ones(1, dim) .* UB;
    
    % 初始化山羚羊种群
    X = initialization(N, dim, UB, LB);
    
    % 初始化最优解
    BestX = [];
    BestFitness = inf; % 设定初始最优值为无穷大

    % 计算初始种群适应度
    for i = 1:N   
        Sol_Cost(i,:) = fobj(X(i,:)); % 计算每个个体的适应度
        
        % 更新最优个体
        if Sol_Cost(i,:) <= BestFitness 
            BestFitness = Sol_Cost(i,:); 
            BestX = X(i,:);
        end
    end

    % 进入主循环,进行迭代优化
    for Iter = 1:MaxIter
        for i = 1:N
            % 选择一个随机子集计算参考点 M
            RandomSolution = randperm(N, ceil(N / 3));
            M = X(randi([(ceil(N / 3)), N]), :) * floor(rand) + mean(X(RandomSolution, :)) .* ceil(rand);     
            
            % 计算动态系数
            cofi = Coefficient_Vector(dim, Iter, MaxIter);
            
            % 计算扰动向量
            A = randn(1, dim) .* exp(2 - Iter * (2 / MaxIter));
            D = (abs(X(i, :)) + abs(BestX)) * (2 * rand - 1);
                       
            % 更新个体位置
            NewX = Solution_Imp(X, BestX, lb, ub, N, cofi, M, A, D, i); 
            
            % 计算新个体适应度,并进行边界检查
            [NewX, Sol_CostNew] = Boundary_Check(NewX, fobj, LB, UB);
            
            % 添加新的山羚羊到种群
            X = [X; NewX];       
            Sol_Cost = [Sol_Cost; Sol_CostNew];
            
            % 更新全局最优个体
            [~, idbest] = min(Sol_Cost);
            BestX = X(idbest, :);
        end
        
        % 选出前 N 个最优个体
        [Sol_Cost, SortOrder] = sort(Sol_Cost);
        X = X(SortOrder, :);
        [BestFitness, idbest] = min(Sol_Cost);   
        BestX = X(idbest, :);
        X = X(1:N, :);
        Sol_Cost = Sol_Cost(1:N, :);

        % 记录收敛曲线
        cnvg(Iter) = BestFitness;
        BestF = BestFitness;
    end
end

%% **边界检查**
function [NewX, Sol_CostNew] = Boundary_Check(NewX, fobj, LB, UB)
    for j = 1:4
        NewX(j, :) = boundaryCheck(NewX(j, :), LB, UB);
        Sol_CostNew(j, :) = fobj(NewX(j, :));
    end
end

%% **计算动态系数**
function cofi = Coefficient_Vector(dim, Iter, MaxIter)
    a2 = -1 + Iter * ((-1) / MaxIter);
    u = randn(1, dim);
    v = randn(1, dim); 

    cofi(1, :) = rand(1, dim);
    cofi(2, :) = (a2 + 1) + rand;
    cofi(3, :) = a2 .* randn(1, dim);
    cofi(4, :) = u .* v .^ 2 .* cos((rand * 2) * u);
end

%% **种群初始化**
function [X] = initialization(N, dim, up, down)
    if size(up, 1) == 1
        X = rand(N, dim) .* (up - down) + down;
    end
    if size(up, 1) > 1
        for i = 1:dim
            high = up(i); low = down(i);
            X(:, i) = rand(1, N) .* (high - low) + low;
        end
    end
end

%% **位置更新**
function NewX = Solution_Imp(X, BestX, lb, ub, N, cofi, M, A, D, i)
    NewX(1, :) = (ub - lb) * rand + lb;
    NewX(2, :) = BestX - abs((randi(2) * M - randi(2) * X(i, :)) .* A) .* cofi(randi(4), :);
    NewX(3, :) = (M + cofi(randi(4), :)) + (randi(2) * BestX - randi(2) .* X((randi(N)), :)) .* cofi(randi(4), :);
    NewX(4, :) = (X(i, :) - D) + (randi(2) * BestX - randi(2) * M) .* cofi(randi(4), :);
end

%% **边界修正**
function [X] = boundaryCheck(X, lb, ub)
    for i = 1:size(X, 1)
        FU = X(i, :) > ub;
        FL = X(i, :) < lb;
        X(i, :) = (X(i, :) .* (~(FU + FL))) + ub .* FU + lb .* FL;
    end
end

总结

1. MGO 主要特点

动态系数调整,适应不同优化阶段。
多种搜索策略结合,提高全局搜索能力。
适用于高维复杂优化问题,如函数优化、特征选择等。

2. MGO 适用场景

  • 函数优化问题
  • 图像处理
  • 深度学习超参数优化
  • 路径规划问题

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

相关文章:

  • 使用TripoAI实现图生模型及文生模型
  • xcode中移除安装的package dependency
  • LeetCode-215. 数组中的第K个最大元素
  • [从零开始学习JAVA] IO流
  • Qt 重入和线程安全
  • QT网络通信的接口与使用
  • 1.23只是起点?XBIT流动性引擎引爆跨链革命
  • 高效PDF翻译解决方案:多引擎支持+格式零丢失
  • 试试智能体工作流,自动化搞定运维故障排查
  • 《Python机器学习基础教程》第3讲:回归算法与模型优化
  • 前沿分享|处理LLM幻觉问题-CoN|笔记链:增强检索增强语言模型的鲁棒性
  • 【2025】基于python+flask的篮球交流社区平台设计与实现(源码、万字文档、图文修改、调试答疑)
  • 腾讯云数据万象服务CI(内容审核)
  • 【C++ 真题】P9749 [CSP-J 2023] 公路
  • SSL/TLS 和 SSH 介绍以及他们的区别
  • Redis全面学习指南
  • 26考研——图_图的存储(6)
  • oracle数据库(数据库启动关闭/sqlplus登录及基本操作/设置字符集/distinct去重)
  • 【MySQL】一篇讲懂什么是聚簇索引和非聚簇索引(二级索引)以及什么是回表?
  • 一文了解Gradle 依赖管理(五)- 依赖管理缓存依赖