%-------------------------------------------------------------------------%
% Binary Dragonfly Algorithm (BDA) source codes demo version %
% %
% Programmer: Jingwei Too %
% %
% E-Mail: [email protected] %
%-------------------------------------------------------------------------%
function [sFeat,Sf,Nf,curve]=jBDA(feat,label,N,T,Dmax)
%---Inputs-----------------------------------------------------------------
% feat: features
% label: labelling
% N: Number of dragonflies
% T: Maximum number of iterations
% Dmax: Maximum velocity
%---Outputs----------------------------------------------------------------
% sFeat: Selected features
% Sf: Selected feature index
% Nf: Number of selected features
% curve: Convergence curve
%--------------------------------------------------------------------------
fun=@jFitnessFunction;
D=size(feat,2); X=zeros(N,D); DX=zeros(N,D);
for i=1:N
for d=1:D
if rand() > 0.5
X(i,d)=1;
end
end
end
curve=inf;fit=zeros(1,N);
fitF=inf; fitE=-inf; t=1; Xnew=zeros(N,D);
figure(1); clf; axis([1 100 0 0.2]); xlabel('Number of iterations');
ylabel('Fitness Value'); title('Convergence Curve'); grid on;
%---Iteration start-------------------------------------------------------
while t <= T
for i=1:N
fit(i)=fun(feat,label,X(i,:));
if fit(i) < fitF
fitF=fit(i); Xf=X(i,:);
end
if fit(i) > fitE
fitE=fit(i); Xe=X(i,:);
end
end
w=0.9-t*((0.9-0.4)/T);
rate=0.1-t*((0.1-0)/(T/2));
if rate < 0, rate=0; end
s=2*rand()*rate; a=2*rand()*rate; c=2*rand()*rate;
f=2*rand(); e=rate;
for i=1:N
index=0; nNeighbor=0; Xn=zeros(1,D); DXn=zeros(1,D);
for j=1:N
if i~=j
index=index+1; nNeighbor=nNeighbor+1;
DXn(index,:)=DX(j,:); Xn(index,:)=X(j,:);
end
end
S=repmat(X(i,:),nNeighbor,1)-Xn; S=-sum(S,1);
A=sum(DXn,1)/nNeighbor;
C=sum(Xn,1)/nNeighbor; C=C-X(i,:);
F=Xf-X(i,:);
E=Xe+X(i,:);
for d=1:D
dX=(s*S(d)+a*A(d)+c*C(d)+f*F(d)+e*E(d))+w*DX(i,d);
dX(dX > Dmax)=Dmax; dX(dX < -Dmax)=-Dmax; DX(i,d)=dX;
TF=abs(DX(i,d)/sqrt(((DX(i,d)^2)+1)));
if rand() < TF
Xnew(i,d)=1-X(i,d);
else
Xnew(i,d)=X(i,d);
end
end
end
X=Xnew; curve(t)=fitF;
pause(1e-20); hold on;
CG=plot(t,fitF,'Color','r','Marker','.'); set(CG,'MarkerSize',5);
t=t+1;
end
Pos=1:D; Sf=Pos(Xf==1); Nf=length(Sf); sFeat=feat(:,Sf);
end