群体智能优化算法-Equilibrium Optimizer (EO,含Matlab源代码)

摘要

Equilibrium Optimizer(EO,平衡优化算法)是一种受流体动力学原理启发的元启发式优化算法,其模拟了流体粒子在达到平衡状态时的运动方式。该算法通过使用一组候选解(称为平衡池),动态调整搜索方向,实现了高效的全局优化能力。本文详细介绍EO的数学公式,并提供完整的MATLAB代码,附带详细中文注释,以帮助读者深入理解其工作机制和实现方式。


一、Equilibrium Optimizer (EO) 算法原理

1.1 算法概述

EO 受流体动力学的启发,其中粒子(解)在搜索空间内运动,并通过一组平衡状态来引导它们朝向最优解。EO的核心在于:

  • 平衡池(Equilibrium Pool):存储多个最优解,用于引导粒子运动。
  • 全局适应度更新:通过竞争机制来选择最优解并动态调整搜索方向。
  • 动态调整搜索过程:使用非线性公式来提高搜索的灵活性。

1.2 主要数学公式

(1) 平衡池的计算

EO 维护4 个最优候选解以及它们的平均值:

(2) 适应度更新与非线性调整

每个粒子更新的搜索方向由以下方程控制:

二、MATLAB 代码

%_________________________________________________________________________________
%  Equilibrium Optimizer (EO) 平衡优化算法
%  版本:1.0
%  MATLAB实现:Afshin Faramarzi & Seyedali Mirjalili
%  论文:
%  A. Faramarzi, M. Heidarinejad, B. Stephens, S. Mirjalili, 
%  Equilibrium optimizer: A novel optimization algorithm
%  Knowledge-Based Systems
%  DOI: https://doi.org/10.1016/j.knosys.2019.105190
%____________________________________________________________________________________

% Equilibrium Optimizer (EO) 主函数
function [Ave, Sd, Convergence_curve] = EO(Particles_no, Max_iter, lb, ub, dim, fobj, Run_no)
    % Particles_no: 搜索粒子的数量
    % Max_iter: 最大迭代次数
    % lb, ub: 搜索变量的上下界
    % dim: 变量的维度
    % fobj: 目标函数句柄
    % Run_no: 运行次数(多次运行以计算均值和标准差)

    for irun = 1:Run_no

        % 初始化平衡候选解
        Ceq1 = zeros(1,dim);   Ceq1_fit = inf; 
        Ceq2 = zeros(1,dim);   Ceq2_fit = inf; 
        Ceq3 = zeros(1,dim);   Ceq3_fit = inf; 
        Ceq4 = zeros(1,dim);   Ceq4_fit = inf;

        % 初始化粒子位置
        C = initialization(Particles_no, dim, ub, lb);

        Iter = 0;
        V = 1; % 初始速度
        a1 = 2; % 控制搜索范围的参数
        a2 = 1; % 收敛因子
        GP = 0.5; % 全局扰动概率

        while Iter < Max_iter
            % 计算适应度
            for i = 1:size(C,1)  
                % 边界处理
                Flag4ub = C(i,:) > ub;
                Flag4lb = C(i,:) < lb;
                C(i,:) = (C(i,:) .* ~(Flag4ub + Flag4lb)) + ub .* Flag4ub + lb .* Flag4lb;         

                % 计算适应度
                fitness(i) = fobj(C(i,:));

                % 更新平衡池
                if fitness(i) < Ceq1_fit 
                    Ceq1_fit = fitness(i);  Ceq1 = C(i,:);
                elseif fitness(i) > Ceq1_fit && fitness(i) < Ceq2_fit  
                    Ceq2_fit = fitness(i);  Ceq2 = C(i,:);              
                elseif fitness(i) > Ceq2_fit && fitness(i) > Ceq3_fit
                    Ceq3_fit = fitness(i);  Ceq3 = C(i,:);
                elseif fitness(i) > Ceq3_fit && fitness(i) > Ceq4_fit
                    Ceq4_fit = fitness(i);  Ceq4 = C(i,:);          
                end
            end

            % 计算平衡池平均值
            Ceq_ave = (Ceq1 + Ceq2 + Ceq3 + Ceq4) / 4;  
            C_pool = [Ceq1; Ceq2; Ceq3; Ceq4; Ceq_ave];

            % 计算时间因子
            t = (1 - Iter / Max_iter)^(a2 * Iter / Max_iter);

            % 更新粒子位置
            for i = 1:Particles_no
                lambda = rand(1,dim);  
                r = rand(1,dim);  
                Ceq = C_pool(randi(size(C_pool,1)),:);
                F = a1 * sign(r - 0.5) .* (exp(-lambda .* t) - 1);
                r1 = rand(); r2 = rand();  
                GCP = 0.5 * r1 * ones(1,dim) * (r2 >= GP);
                G0 = GCP .* (Ceq - lambda .* C(i,:));
                G = G0 .* F;
                C(i,:) = Ceq + (C(i,:) - Ceq) .* F + (G ./ lambda * V) .* (1 - F);
            end

            Iter = Iter + 1;
            Convergence_curve(Iter) = Ceq1_fit;
            Ceqfit_run(irun) = Ceq1_fit;
        end
    end

    % 计算均值和标准差
    Ave = mean(Ceqfit_run);
    Sd = std(Ceqfit_run);
end


function [Cin,domain]=initialization(SearchAgents_no,dim,ub,lb)

Boundary_no= size(ub,2); 

if Boundary_no==1
    Cin=rand(SearchAgents_no,dim).*(ub-lb)+lb;
    domain=ones(1,dim)*(ub-lb);
end


% If each variable has a different lb and ub
if Boundary_no>1
    for i=1:dim
        ub_i=ub(i);
        lb_i=lb(i);
        Cin(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i;
    end
    domain=ones(1,dim).*(ub-lb);
end
end

三、总结

Equilibrium Optimizer(EO)是一种基于流体动力学的智能优化算法,它通过维护多个最优解的平衡池,引导搜索粒子进行优化。EO 的关键在于利用非线性函数进行搜索过程控制,使其兼具全局探索能力(Exploration)局部开发能力(Exploitation)。MATLAB 代码实现简单,可广泛应用于机器学习参数优化、工程优化、神经网络训练等领域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值