clc
clear
close all
format shortG
%% Insert Data
data=InsertData();
%% Parameters Definiterion
nvar=data.N; % Number of Variables
lb=0*ones(1,nvar); % Variables Lower Bound
ub=1*ones(1,nvar); % Variables Upper Bound
maxiter=100; % Maximum Number of iterations
npop=10; % Number of Fireflies
L=1;
gamma=1./sqrt(L); % Light Absorption Coefficient
beta0=0.5; % Attraction Coefficient Base Value
alpha=0.8; % Mutation Coefficient
alpha_RF=0.98; %Radius Reduction Factor
%% Initerialization
tic
emp.x=[];
emp.fit=[];
pop=repmat(emp,npop,1);
for i=1:npop
pop(i).x=unifrnd(lb,ub);
pop(i)=fitness(pop(i),data);
end
[~,ind]=min([pop.fit]);
gpop=pop(ind);
%% Main Loop
BEST=zeros(maxiter,1);
MEAN=zeros(maxiter,1);
for iter=1:maxiter
newpop=pop;
newpop2=pop;
k=0;
for i=1:npop
for j=1:npop
if pop(j).fit<=pop(i).fit
k=k+1;
rij=norm(pop(i).x-pop(j).x);
beta=beta0*exp(-gamma*rij^2);
R=rand(1,nvar);
pa=1-alpha;
R(R>pa)=1;
R(R<pa)=0;
E=alpha*(unifrnd(-1,1,1,nvar).*(ub-lb)).*R;
newpop(i).x=pop(i).x...
+beta*(pop(i).x-pop(j).x)...
+E;
newpop(i).x=CB(newpop(i).x,lb,ub);
newpop(i)=fitness(newpop(i),data);
newpop2(k)=newpop(i);
end
end
end
% Merge
[pop]=[pop;newpop2;gpop];
% pop=Unique(pop,nvar);
% Sort and Select
[~, ind]=sort([pop.fit]);
pop=pop(ind);
pop=pop(1:npop);
% Select Best Sol
gpop=pop(1);
BEST(iter)=gpop.fit;
MEAN(iter)=mean([pop.fit]);
disp(['iter ' num2str(iter) ' Best= ' num2str(BEST(iter))]);
% Reduction Mutation Coefficient
alpha=alpha*alpha_RF;
% Plot Best Solution
PlotBestSol(gpop,data,iter)
end
%% Results
disp(' ')
[~,x]=sort(gpop.x);
x=[x x(1)];
disp([ ' BEST solution = ' num2str(x)]);
disp([ ' BEST fitness = ' num2str(gpop.fit)]);
disp([ ' Time = ' num2str(toc)]);
figure
semilogy(BEST(1:iter),'r','LineWidth',2)
hold on
semilogy(MEAN(1:iter),'b','LineWidth',2)
xlabel(' iteration ')
ylabel(' fitness')
legend( 'BEST','MEAN')
title('Firefly Algorithm')