简介
能量谷优化器(EVO)是一种新的元启发式算法,它的算法是受到了关于稳定性和不同粒子衰变模式的先进物理原理的启发。在文献中,作者与CEC函数中最先进的算法进行了比较,并且证明该算法确实很强劲。算法原理大家请参考文献。
01
结果展示
在CEC2005函数中结果展示:
02代码展示
function [Best_score,Best_Pos,Conv_History]=EVO(nParticles,MaxFes,lb,ub,VarNumber,fobj)
%% Problem Information
CostFunction = fobj; % @ Cost Function
VarMin = lb *ones(1,VarNumber); % Lower bound of variable;
VarMax = ub *ones(1,VarNumber); % Upper bound of variable;
%% Counters
Iter=0; % Iterations
FEs=0; % Function Evaluations
%% Initialization
Particles=[]; NELs=[];
for i=1:nParticles
Particles(i,:)=unifrnd(VarMin,VarMax,[1 VarNumber]);
NELs(i,1)=CostFunction(Particles(i,:));
FEs=FEs+1;
end
% Sort Particles
[NELs, SortOrder]=sort(NELs);
Particles=Particles(SortOrder,:);
BS=Particles(1,:);
BS_NEL=NELs(1);
WS_NEL=NELs(end);
%% Main Loop
while FEs<MaxFes
Iter=Iter+1;
NewParticles=[];
NewNELs=[];
for i=1:nParticles
Dist=[];
for j=1:nParticles
Dist(j,1)=distance(Particles(i,:), Particles(j,:));
end
[ ~, a]=sort(Dist);
CnPtIndex=randi(nParticles);
if CnPtIndex<3
CnPtIndex=CnPtIndex+2;
end
CnPtA=Particles(a(2:CnPtIndex),:);
CnPtB=NELs(a(2:CnPtIndex),:);
X_NG=mean(CnPtA);
X_CP=mean(Particles);
EB=mean(NELs);
SL=(NELs(i)-BS_NEL)/(WS_NEL-BS_NEL); SB=rand;
if NELs(i)>EB
if SB>SL
AlphaIndex1=randi(VarNumber);
AlphaIndex2=randi([1 VarNumber], AlphaIndex1 , 1);
NewParticle(1,:)=Particles(i,:);
NewParticle(1,AlphaIndex2)=BS(AlphaIndex2);
GamaIndex1=randi(VarNumber);
GamaIndex2=randi([1 VarNumber], GamaIndex1 , 1);
NewParticle(2,:)=Particles(i,:);
NewParticle(2,GamaIndex2)=X_NG(GamaIndex2);
NewParticle = max(NewParticle,VarMin);
NewParticle = min(NewParticle,VarMax);
NewNEL(1,1)=CostFunction(NewParticle(1,:));
NewNEL(2,1)=CostFunction(NewParticle(2,:));
FEs=FEs+2;
else
Ir=unifrnd(0,1,1,2); Jr=unifrnd(0,1,1,VarNumber);
NewParticle(1,:)=Particles(i,:)+(Jr.*(Ir(1)*BS-Ir(2)*X_CP)/SL);
Ir=unifrnd(0,1,1,2); Jr=unifrnd(0,1,1,VarNumber);
NewParticle(2,:)=Particles(i,:)+(Jr.*(Ir(1)*BS-Ir(2)*X_NG));
NewParticle = max(NewParticle,VarMin);
NewParticle = min(NewParticle,VarMax);
NewNEL(1,1)=CostFunction(NewParticle(1,:));
NewNEL(2,1)=CostFunction(NewParticle(2,:));
FEs=FEs+2;
end
else
NewParticle(1,:)=Particles(i,:)+randn*SL*unifrnd(VarMin,VarMax,[1 VarNumber]);
NewParticle = max(NewParticle,VarMin);
NewParticle = min(NewParticle,VarMax);
NewNEL(1,1)=CostFunction(NewParticle(1,:));
FEs=FEs+1;
end
NewParticles=[NewParticles ; NewParticle];
NewNELs=[NewNELs ; NewNEL];
end
NewParticles=[NewParticles ; Particles];
NewNELs=[NewNELs ; NELs];
% Sort Particles
[NewNELs, SortOrder]=sort(NewNELs);
NewParticles=NewParticles(SortOrder,:);
BS=NewParticles(1,:);
BS_NEL=NewNELs(1);
WS_NEL=NewNELs(end);
Particles=NewParticles(1:nParticles,:);
NELs=NewNELs(1:nParticles,:);
% Store Best Cost Ever Found
BestCosts(Iter)=BS_NEL;
% Show Iteration Information
disp(['Iteration ' num2str(Iter) ': Best Cost = ' num2str(BestCosts(Iter))]);
end
Eval_Number=FEs;
Conv_History=BestCosts;
Best_Pos=BS;
Best_score=BestCosts(end);
end
%% Calculate the Euclidean Distance
function o = distance(a,b)
for i=1:size(a,1)
o(1,i)=sqrt((a(i)-b(i))^2);
end
end
03
参考文献
[1] Azizi M , Aickelin U , Khorshidi H A , et al. Energy valley optimizer: a novel metaheuristic algorithm for global and engineering optimization[J]. Scientific Reports.
04关键词回复
代码获取方式后台回复关键词:2023,免费获取2023年智能优化算法合集matlab代码。