this code of BAT algorithm is not working..function i wrote i last three lines..plz guide me
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
function [best,fmin,N_iter]=bat_algorithm(para) % Display help help bat_algorithm.m
% Default parameters if nargin<1, para=[20 1000 0.5 0.5]; end n=para(1); % Population size, typically 10 to 40 N_gen=para(2); % Number of generations A=para(3); % Loudness (constant or decreasing) r=para(4); % Pulse rate (constant or decreasing) % This frequency range determines the scalings % You should change these values if necessary Qmin=0; % Frequency minimum Qmax=2; % Frequency maximum % Iteration parameters N_iter=0; % Total number of function evaluations % Dimension of the search variables d=5; % Number of dimensions % Lower limit/bounds/ a vector Lb=-3*ones(1,d); % Upper limit/bounds/ a vector Ub=6*ones(1,d); % Initializing arrays Q=zeros(n,1); % Frequency v=zeros(n,d); % Velocities % Initialize the population/solutions for i=1:n Sol(i,:)=Lb+(Ub-Lb).*rand(1,d); Fitness(i)=Fun(Sol(i,:)); end % Find the initial best solution [fmin,I]=min(Fitness); best=Sol(I,:);
for t=1:N_gen, % Loop over all bats/solutions for i=1:n, Q(i)=Qmin+(Qmin-Qmax)*rand; v(i,:)=v(i,:)+(Sol(i,:)-best)*Q(i); S(i,:)=Sol(i,:)+v(i,:); % Apply simple bounds/limits Sol(i,:)=simplebounds(Sol(i,:),Lb,Ub); % Pulse rate if rand>r % The factor 0.001 limits the step sizes of random walks S(i,:)=best+0.001*randn(1,d); end
% Evaluate new solutions Fnew=Fun(S(i,:)); % Update if the solution improves, or not too loud if (Fnew<=Fitness(i)) & (rand<A) , Sol(i,:)=S(i,:); Fitness(i)=Fnew; end
% Update the current best solution if Fnew<=fmin, best=S(i,:); fmin=Fnew; end end N_iter=N_iter+n; end % Output/display disp(['Number of evaluations: ',num2str(N_iter)]); disp(['Best =',num2str(best),' fmin=',num2str(fmin)]);
% Application of simple limits/bounds function s=simplebounds(s,Lb,Ub) % Apply the lower bound vector ns_tmp=s; I=ns_tmp<Lb; ns_tmp(I)=Lb(I);
% Apply the upper bound vector J=ns_tmp>Ub; ns_tmp(J)=Ub(J); % Update this new move s=ns_tmp; xdata =[ 10.^(-3) 10.^(-2) 10.^(-1) 10.^(0) 10.^(1) 10.^(2)] ; ydata=(0.5012./(1.9*xdata.^2+1.12*xdata+2)); function fun=@(x)sum(x(1)./((x(2).*xdata.^1.1+x(3).*xdata.^0.1+1)- ydata).^2);
2 comentarios
Image Analyst
el 2 de Mayo de 2018
I've rescued this from the spam quarantine, put there probably because your code is not formatted. Please read this and fix your post so it won't end up there again. http://www.mathworks.com/matlabcentral/answers/13205#answer_18099
Respuestas (0)
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!