能量谷优化器(EVO)是一种新的元启发式算法,它的算法是受到了关于稳定性和不同粒子衰变模式的先进物理原理的启发。在文献中,作者与CEC函数中最先进的算法进行了比较,并且证明该算法确实很强劲。算法原理大家请参考文献。
[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.
evo算法与其他算法的对比结果图:
更多对比结果与数据请参考本文献,文献与代码作者打包在一起了,请大家查收。
直接上结果图:
算法核心代码:
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
下方小卡片回复关键词:EVO,免费获取代码,参考文献也放在压缩包里了。
后续会继续发布2023年其他最新优化算法,敬请关注。