智能优化算法——均衡优化算法(EO)
文献:https://doi.org/10.1016/j.knosys.2019.105190
Main
%_________________________________________________________________________
% --- 智能优化算法 ---
% 编码格式:UTF-8
%
% 算法名称:
% Equilibrium-Optimizer (均衡优化算法)
%
% 调用函数:
% EO_fitness.m
%_________________________________________________________________________
%% 清空环境
clc;clear;
close all;
%% 参数设置
MaxIter = 500; % 最大迭代次数
VarNum = 1; % 变量个数
lb = [0]; % 变量下限
ub = [13.1]; % 变量上限
SearchAgents = 30; % 粒子规模
m1 = 2; % 全局探索权重
m2 = 1; % 局部开发权重
V = 1; % 单位容积
GP = 0.5; % 生成率
% 粒子初始化
for i = 1:VarNum
ub_i = ub(i);
lb_i = lb(i);
Cin(:,i) = rand(SearchAgents,1).*(ub_i-lb_i)+lb_i;
end
clear i;
Ceq1 = zeros(1,VarNum); Ceq1_fit = -inf; % 候选粒子1
Ceq2 = zeros(1,VarNum); Ceq2_fit = -inf; % 候选粒子2
Ceq3 = zeros(1,VarNum); Ceq3_fit = -inf; % 候选粒子3
Ceq4 = zeros(1,VarNum); Ceq4_fit = -inf; % 候选粒子4
Convergence_curve = zeros(MaxIter,VarNum+1); % 收敛曲线
Iter = 0; % 迭代计算器
%% 循环
while Iter < MaxIter
for i = 1:size(Cin,1)
% 边界控制
Flagub = Cin(i,:) > ub;
Flaglb = Cin(i,:) < lb;
Cin(i,:) = (Cin(i,:).*(~(Flagub+Flaglb)))+ub.*Flagub+lb.*Flaglb;
% 计算适应度
Fitness(i) = EO_fitness(Cin(i,1)); % 单/多变量需更改
%% 均衡池和候选解
% 获取候选粒子
if Fitness(i) > Ceq1_fit
Ceq1_fit = Fitness(i); Ceq1 = Cin(i,:);
elseif Fitness(i) < Ceq1_fit && Fitness(i) > Ceq2_fit
Ceq2_fit = Fitness(i); Ceq2 = Cin(i,:);
elseif Fitness(i) < Ceq1_fit && Fitness(i) < Ceq2_fit && Fitness(i) > Ceq3_fit
Ceq3_fit = Fitness(i); Ceq3 = Cin(i,:);
elseif Fitness(i) < Ceq1_fit && Fitness(i) < Ceq2_fit && Fitness(i) < Ceq3_fit && Fitness(i) > Ceq4_fit
Ceq4_fit = Fitness(i); Ceq4 = Cin(i,:);
end
end
clear i;
% --------------------- 保存内存 ---------------------
if Iter == 0
FitnessOld = Fitness; CinOld = Cin;
end
for i = 1:SearchAgents
if FitnessOld(i) > Fitness(i)
Fitness(i) = FitnessOld(i); Cin(i,:) = CinOld(i,:);
end
end
clear i;
% ----------------------------------------------------
CeqAve = (Ceq1+Ceq2+Ceq3+Ceq4)./4; % 平均候选粒子
CeqPool = [Ceq1;Ceq2;Ceq3;Ceq4;CeqAve]; % 均衡池
%% 指数项函数
t = (1-Iter./MaxIter).^(m2.*Iter./MaxIter);
for i = 1:SearchAgents
lambda = rand(1,VarNum);
r = rand(1,VarNum);
Ceq = CeqPool(randi(size(CeqPool,1)),:); % 从均衡池中随机选取候选粒子
F = m1.*sign(r-0.5).*(exp(-lambda.*t)-1);
%% 生成率
r1 = rand(); r2 = rand();
GCP = 0.5.*r1.*ones(1,VarNum).*(r2>=GP);
G0 = GCP.*(Ceq-lambda.*Cin(i,:));
G = G0.*F;
Cin(i,:) = Ceq+(Cin(i,:)-Ceq).*F+(G./lambda.*V).*(1-F);
end
%% 更新迭代并记录
Iter = Iter+1;
for k = 1:VarNum
Convergence_curve(Iter,k) = Ceq1(k);
end
clear k;
Convergence_curve(Iter,size(Convergence_curve,2)) = Ceq1_fit;
end
Function
function fit = EO_fitness(x)
% 求最大值,若需求最小值可求倒值
% 输入参数
% x:变量
% 输出参数
% fit:适应度
fit = (x + 10*sin(5*x) + 7*cos(4*x));
end
Tips
- 多变量情况下需要更改
VarNum
和变量下限lb
与变量上限ub
,比如两个变量的上下限分别为(1,2) & (3,4)
,那么应该设置为lb = [1,3]; ub = [2,4]
;
- 多变量情况下,计算适应度时需要更改为多个输入量;
EO_fitness()
函数可以自行修改。