Tunning of PID controller using Bacterial foraging
Author: Wael Mansour (wael192@yahoo.com)
MSc Student, Electrical Enginering Dept, Faculty of Engineering Cairo University, Egypt
%Initialization clear all clc p=2; % dimension of search space s=10; % The number of bacteria Nc=5; % Number of chemotactic steps Ns=4; % Limits the length of a swim Nre=4; % The number of reproduction steps Ned=2; % The number of elimination-dispersal events Sr=s/2; % The number of bacteria reproductions (splits) per generation Ped=0.25; % The probabilty that each bacteria will be eliminated/dispersed c(:,1)=0.05*ones(s,1); % the run length for m=1:s % the initital posistions P(1,:,1,1,1)= 50*rand(s,1)'; P(2,:,1,1,1)= .2*rand(s,1)'; %P(3,:,1,1,1)= .2*rand(s,1)'; end
%Main loop %Elimination and dispersal loop for ell=1:Ned %Reprodution loop for K=1:Nre % swim/tumble(chemotaxis)loop for j=1:Nc for i=1:s J(i,j,K,ell)=tracklsq(P(:,i,j,K,ell)); % Tumble Jlast=J(i,j,K,ell); Delta(:,i)=(2*round(rand(p,1))-1).*rand(p,1); P(:,i,j+1,K,ell)=P(:,i,j,K,ell)+c(i,K)*Delta(:,i)/sqrt(Delta(:,i)'*Delta(:,i)); % This adds a unit vector in the random direction % Swim (for bacteria that seem to be headed in the right direction) J(i,j+1,K,ell)=tracklsq(P(:,i,j+1,K,ell)); m=0; % Initialize counter for swim length while m<Ns m=m+1; if J(i,j+1,K,ell)<Jlast Jlast=J(i,j+1,K,ell); P(:,i,j+1,K,ell)=P(:,i,j+1,K,ell)+c(i,K)*Delta(:,i)/sqrt(Delta(:,i)'*Delta(:,i)) ; J(i,j+1,K,ell)=tracklsq(P(:,i,j+1,K,ell)); else m=Ns ; end end J(i,j,K,ell)=Jlast; sprintf('The value of interation i %3.0f ,j = %3.0f , K= %3.0f, ell= %3.0f' , i, j, K ,ell ); end % Go to next bacterium end % Go to the next chemotactic %Reprodution Jhealth=sum(J(:,:,K,ell),2); % Set the health of each of the S bacteria [Jhealth,sortind]=sort(Jhealth); % Sorts the nutrient concentration in order of ascending P(:,:,1,K+1,ell)=P(:,sortind,Nc+1,K,ell); c(:,K+1)=c(sortind,K); % And keeps the chemotaxis parameters with each bacterium at the next generation %Split the bacteria (reproduction) for i=1:Sr P(:,i+Sr,1,K+1,ell)=P(:,i,1,K+1,ell); % The least fit do not reproduce, the most fit ones split into two identical copies c(i+Sr,K+1)=c(i,K+1); end end % Go to next reproduction %Eliminatoin and dispersal for m=1:s if Ped>rand % % Generate random number P(1,:,1,1,1)= 50*rand(s,1)'; P(2,:,1,1,1)= .2*rand(s,1)'; %P(3,:,1,1,1)= .2*rand(s,1)'; else P(:,m,1,1,ell+1)=P(:,m,1,Nre+1,ell); % Bacteria that are not dispersed end end end % Go to next elimination and disperstal %Report reproduction = J(:,1:Nc,Nre,Ned); [jlastreproduction,O] = min(reproduction,[],2); % min cost function for each bacterial [Y,I] = min(jlastreproduction); pbest=P(:,I,O(I,:),K,ell); Kp= pbest(1,:) Kd=pbest(2,:)
Kp =
0.9290
Kd =
0.6758
