function [ge,Tr]=ETLBO(pop,Gm,D,Np,Lowerbound,Upperbound)
G=1;
ge=zeros(1,Gm);
Tr=zeros(Gm,D);
Tr_new=zeros(Gm,D);
Fit_Tr=zeros(Np,1);
St=pop;
St_Mean=zeros(1,D);
St_new=zeros(Np,D);
% St_selfnew=zeros(Np,D);
Pop_Mean=zeros(Gm,D);
% Pop_Variance=zeros(Gm,D);
while G<=Gm
%***************Teacher Phase**************%
for i=1:D
Sum_Column=0;
for j=1:Np
Sum_Column=Sum_Column+St(j,i);
end
Pop_Mean(G,i)=Sum_Column/Np;
end
%**********Calculate the variance of particles in each generation*********%
% for i=1:D
% Sum_Column_v=0;
% for j=1:Np
% Sum_Column_v=Sum_Column_v+(St(j,i)-Pop_Mean(G,i))^2;
% end
% Pop_Variance(G,i)=Sum_Column_v/Np;
% end
Elitistnumber=5;%1+round(G/50);
for j=1:Np
Fit_Tr(j)=f(St(j,:),D);
end
[Value,Index]=sort(Fit_Tr);
[Y,Tridex]=min(Fit_Tr);
Tr(G,:)=St(Tridex,:);
for i=1:Elitistnumber
St(Index(Np-i+1),:)=St(Index(i),:);
end
Tr_new(G,:)=Tr(G,:)*(1+(rand-0.5)*(1));
if f(Tr_new(G,:),D)<f(Tr(G,:),D)
Tr(G,:)=Tr_new(G,:);
end
for k=1:Np
r1=rand;
r2=rand;
St_new(k,:)=St(k,:)+r1*(Tr(G,:)-((round(1+r2)*Pop_Mean(G,:))));
[St_new]=Checkbound(St_new,Lowerbound,Upperbound,Np,D,G);
if f(St_new(k,:),D)<f(St(k,:),D)
St(k,:)=St_new(k,:);
end
end
%***************Learner Phase**************%
for i=1:Np
dx=randperm(Np);
if dx(i)==i
if f(St(i,:),D)<f(St(dx(2),:),D)
St_new(i,:)=St(i,:)+rand*(St(i,:)-St(dx(2),:));
else
St_new(i,:)=St(i,:)+rand*(St(dx(2),:)-St(i,:));
end
else
if f(St(i,:),D)<f(St(dx(1),:),D)
St_new(i,:)=St(i,:)+rand*(St(i,:)-St(dx(1),:));
else
St_new(i,:)=St(i,:)+rand*(St(dx(1),:)-St(i,:));
end
end
[St_new]=Checkbound(St_new,Lowerbound,Upperbound,Np,D,G);
if f(St_new(i,:),D)<f(St(i,:),D)
St(i,:)=St_new(i,:);
end
% %***************Self-learning Phase**************%
% St_selfnew(i,:)=St(i,:)*(1+(rand-0.5));
% [St_selfnew]=Checkbound(St_selfnew,Lowerbound,Upperbound,Np,D,G);
% if f(St_selfnew(i,:))<f(St(i,:))
% St(i,:)=St_selfnew(i,:);
% end
end
LocalBest=Fit_Tr(Tridex);
if G==1
ge(1)=LocalBest;
end
if G>1
if LocalBest<ge(G-1)
ge(G)=LocalBest;
else
ge(G)=ge(G-1);
end
end
G=G+1;
end
end
% function y=f(Z)
% y= sphere(Z);
% end