智能优化算法——均衡优化算法(EO)
文献:https://doi.org/10.1016/j.knosys.2019.105190
Main
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;
Ceq2 = zeros(1,VarNum); Ceq2_fit = -inf;
Ceq3 = zeros(1,VarNum); Ceq3_fit = -inf;
Ceq4 = zeros(1,VarNum); Ceq4_fit = -inf;
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)
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()
函数可以自行修改。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下