gusucode.com > Toolbox_all_algorithms > Toolbox_all_algorithms/DA/DA.m
%___________________________________________________________________% % Dragonfly Algorithm (DA) source codes demo version 1.0 % % % % Developed in MATLAB R2011b(7.13) % % % % Author and programmer: Seyedali Mirjalili % % % % e-Mail: ali.mirjalili@gmail.com % % seyedali.mirjalili@griffithuni.edu.au % % % % Homepage: http://www.alimirjalili.com % % % % Main paper: % % % % S. Mirjalili, Dragonfly algorithm: a new meta-heuristic % % optimization technique for solving single-objective, discrete, % % and multi-objective problems, Neural Computing and Applications % % DOI: http://dx.doi.org/10.1007/s00521-015-1920-1 % % % %___________________________________________________________________% % You can simply define your cost in a seperate file and load its handle to fobj % The initial parameters that you need are: %__________________________________________ % fobj = @YourCostFunction % dim = number of your variables % Max_iteration = maximum number of generations % SearchAgents_no = number of search agents % lb=[lb1,lb2,...,lbn] where lbn is the lower bound of variable n % ub=[ub1,ub2,...,ubn] where ubn is the upper bound of variable n % If all the variables have equal lower bound you can just % define lb and ub as two single number numbers % To run DA: [Best_score,Best_pos,cg_curve]=DA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj) %__________________________________________ function [Best_score,Best_pos,cg_curve]=DA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj,handles) display('DA is optimizing your problem'); cg_curve=zeros(1,Max_iteration); if size(ub,2)==1 ub=ones(1,dim)*ub; lb=ones(1,dim)*lb; end %The initial radius of gragonflies' neighbourhoods r=(ub-lb)/10; Delta_max=(ub-lb)/10; Food_fitness=inf; Food_pos=zeros(dim,1); Enemy_fitness=-inf; Enemy_pos=zeros(dim,1); X=initialization(SearchAgents_no,dim,ub,lb); Fitness=zeros(1,SearchAgents_no); DeltaX=initialization(SearchAgents_no,dim,ub,lb); for iter=1:Max_iteration r=(ub-lb)/4+((ub-lb)*(iter/Max_iteration)*2); w=0.9-iter*((0.9-0.4)/Max_iteration); my_c=0.1-iter*((0.1-0)/(Max_iteration/2)); if my_c<0 my_c=0; end s=2*rand*my_c; % Seperation weight a=2*rand*my_c; % Alignment weight c=2*rand*my_c; % Cohesion weight f=2*rand; % Food attraction weight e=my_c; % Enemy distraction weight for i=1:SearchAgents_no %Calculate all the objective values first Fitness(1,i)=fobj(X(:,i)'); All_fitness(1,i)=Fitness(1,i); if Fitness(1,i)<Food_fitness Food_fitness=Fitness(1,i); Food_pos=X(:,i); end if Fitness(1,i)>Enemy_fitness if all(X(:,i)<ub') && all( X(:,i)>lb') Enemy_fitness=Fitness(1,i); Enemy_pos=X(:,i); end end end for i=1:SearchAgents_no index=0; neighbours_no=0; clear Neighbours_V clear Neighbours_DeltaX %find the neighbouring solutions for j=1:SearchAgents_no Dist2Enemy=distance(X(:,i),X(:,j)); if (all(Dist2Enemy<=r) && all(Dist2Enemy~=0)) index=index+1; neighbours_no=neighbours_no+1; Neighbours_DeltaX(:,index)=DeltaX(:,j); Neighbours_X(:,index)=X(:,j); end end % Seperation%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Eq. (3.1) S=zeros(dim,1); if neighbours_no>1 for k=1:neighbours_no S=S+(Neighbours_X(:,k)-X(:,i)); end S=-S; else S=zeros(dim,1); end % Alignment%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Eq. (3.2) if neighbours_no>1 A=(sum(Neighbours_DeltaX')')/neighbours_no; else A=DeltaX(:,i); end % Cohesion%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Eq. (3.3) if neighbours_no>1 C_temp=(sum(Neighbours_X')')/neighbours_no; else C_temp=X(:,i); end C=C_temp-X(:,i); % Attraction to food%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Eq. (3.4) Dist2Food=distance(X(:,i),Food_pos(:,1)); if all(Dist2Food<=r) F=Food_pos-X(:,i); else F=0; end % Distraction from enemy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Eq. (3.5) Dist2Enemy=distance(X(:,i),Enemy_pos(:,1)); if all(Dist2Enemy<=r) Enemy=Enemy_pos+X(:,i); else Enemy=zeros(dim,1); end for tt=1:dim if X(tt,i)>ub(tt) X(tt,i)=lb(tt); DeltaX(tt,i)=rand; end if X(tt,i)<lb(tt) X(tt,i)=ub(tt); DeltaX(tt,i)=rand; end end if any(Dist2Food>r) if neighbours_no>1 for j=1:dim DeltaX(j,i)=w*DeltaX(j,i)+rand*A(j,1)+rand*C(j,1)+rand*S(j,1); if DeltaX(j,i)>Delta_max(j) DeltaX(j,i)=Delta_max(j); end if DeltaX(j,i)<-Delta_max(j) DeltaX(j,i)=-Delta_max(j); end X(j,i)=X(j,i)+DeltaX(j,i); end else % Eq. (3.8) X(:,i)=X(:,i)+Levy(dim)'.*X(:,i); DeltaX(:,i)=0; end else for j=1:dim % Eq. (3.6) DeltaX(j,i)=(a*A(j,1)+c*C(j,1)+s*S(j,1)+f*F(j,1)+e*Enemy(j,1)) + w*DeltaX(j,i); if DeltaX(j,i)>Delta_max(j) DeltaX(j,i)=Delta_max(j); end if DeltaX(j,i)<-Delta_max(j) DeltaX(j,i)=-Delta_max(j); end X(j,i)=X(j,i)+DeltaX(j,i); end end Flag4ub=X(:,i)>ub'; Flag4lb=X(:,i)<lb'; X(:,i)=(X(:,i).*(~(Flag4ub+Flag4lb)))+ub'.*Flag4ub+lb'.*Flag4lb; end Best_score=Food_fitness; Best_pos=Food_pos; cg_curve(iter)=Best_score; if iter>2 line([iter-1 iter], [cg_curve(iter-1) cg_curve(iter)],'Color',[ 0.8500 0.3250 0.0980]) xlabel('Iteration'); ylabel('Best score obtained so far'); drawnow end results = get(handles.uitable1,'data'); results{4,1}=iter; results{4,2}=Food_fitness; set(handles.uitable1,'data',results); end function Positions=initialization(SearchAgents_no,dim,ub,lb) Boundary_no= size(ub,2); % numnber of boundaries % If the boundaries of all variables are equal and user enter a signle % number for both ub and lb if Boundary_no==1 ub_new=ones(1,dim)*ub; lb_new=ones(1,dim)*lb; else ub_new=ub; lb_new=lb; end % If each variable has a different lb and ub for i=1:dim ub_i=ub_new(i); lb_i=lb_new(i); Positions(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i; end Positions=Positions';