摘要
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 代码实现简单,可广泛应用于机器学习参数优化、工程优化、神经网络训练等领域。