gusucode.com > Toolbox_all_algorithms > Toolbox_all_algorithms/MFO/MFO.m
%______________________________________________________________________________________________ % Moth-Flame Optimization Algorithm (MFO) toolbox % 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, Moth-Flame Optimization Algorithm: A Novel Nature-inspired Heuristic Paradigm, % Knowledge-Based Systems, DOI: http://dx.doi.org/10.1016/j.knosys.2015.07.006 %_______________________________________________________________________________________________ % 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 MFO: [Best_score,Best_pos,cg_curve]=MFO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj) %______________________________________________________________________________________________ function [Best_flame_score,Best_flame_pos,Convergence_curve]=MFO(N,Max_iteration,lb,ub,dim,fobj,handles) display('MFO is optimizing your problem'); %Initialize the positions of moths Moth_pos=initialization(N,dim,ub,lb); Convergence_curve=zeros(1,Max_iteration); Iteration=1; % Main loop while Iteration<Max_iteration+1 % Number of flames Eq. (3.14) in the paper Flame_no=round(N-Iteration*((N-1)/Max_iteration)); for i=1:size(Moth_pos,1) % Check if moths go out of the search spaceand bring it back Flag4ub=Moth_pos(i,:)>ub; Flag4lb=Moth_pos(i,:)<lb; Moth_pos(i,:)=(Moth_pos(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb; % Calculate the fitness of moths Moth_fitness(1,i)=fobj(Moth_pos(i,:)); All_fitness(1,i)=Moth_fitness(1,i); end if Iteration==1 % Sort the first population of moths [fitness_sorted I]=sort(Moth_fitness); sorted_population=Moth_pos(I,:); % Update the flames best_flames=sorted_population; best_flame_fitness=fitness_sorted; else % Sort the moths double_population=[previous_population;best_flames]; double_fitness=[previous_fitness best_flame_fitness]; [double_fitness_sorted I]=sort(double_fitness); double_sorted_population=double_population(I,:); fitness_sorted=double_fitness_sorted(1:N); sorted_population=double_sorted_population(1:N,:); % Update the flames best_flames=sorted_population; best_flame_fitness=fitness_sorted; end % Update the position best flame obtained so far Best_flame_score=fitness_sorted(1); Best_flame_pos=sorted_population(1,:); previous_population=Moth_pos; previous_fitness=Moth_fitness; % a linearly dicreases from -1 to -2 to calculate t in Eq. (3.12) a=-1+Iteration*((-1)/Max_iteration); for i=1:size(Moth_pos,1) for j=1:size(Moth_pos,2) if i<=Flame_no % Update the position of the moth with respect to its corresponsing flame % D in Eq. (3.13) distance_to_flame=abs(sorted_population(i,j)-Moth_pos(i,j)); b=1; t=(a-1)*rand+1; % Eq. (3.12) Moth_pos(i,j)=distance_to_flame*exp(b.*t).*cos(t.*2*pi)+sorted_population(i,j); end if i>Flame_no % Upaate the position of the moth with respct to one flame % Eq. (3.13) distance_to_flame=abs(sorted_population(i,j)-Moth_pos(i,j)); b=1; t=(a-1)*rand+1; % Eq. (3.12) Moth_pos(i,j)=distance_to_flame*exp(b.*t).*cos(t.*2*pi)+sorted_population(Flame_no,j); end end end Convergence_curve(Iteration)=Best_flame_score; if Iteration>2 line([Iteration-1 Iteration], [Convergence_curve(Iteration-1) Convergence_curve(Iteration)],'Color',[0.4940 0.1840 0.5560]) xlabel('Iteration'); ylabel('Best score obtained so far'); drawnow end results = get(handles.uitable1,'data'); results{5,1}=Iteration; results{5,2}=Best_flame_score; set(handles.uitable1,'data',results); Iteration=Iteration+1; end