PSO.m
上传用户:xueli1969
上传日期:2022-07-27
资源大小:19k
文件大小:6k
源码类别:

通讯编程文档

开发平台:

Matlab

  1. function [OUT,varargout]=PSO(structure)
  2. D=3;
  3. rand('state',sum(100*clock));
  4. if nargin < 1
  5.    error('Not enough arguments.');
  6. end
  7.     
  8. % PSO PARAMETERS
  9.    VRmin=ones(D,1)*-20; 
  10.    VRmax=ones(D,1)*20;    
  11.    VR=[VRmin,VRmax];
  12.    minmax = 1;
  13. P =[1 2000 20 4 2 2 0.9 0.2 1500 2 1e-5 20 1];
  14. df  = P(1);
  15. me  = P(2);
  16. ps  = P(3);
  17. mv  = P(4);
  18. ac1 = P(5);
  19. ac2 = P(6);
  20. iw1 = P(7);
  21. iw2 = P(8);
  22. iwe = P(9);
  23. flagg=P(10);
  24. ergrd=P(11);
  25. ergrdep=P(12);
  26. plotflg=P(13);
  27. % PLOTTING
  28.  message = sprintf('PSO: %%g/%g iterations, GBest = %%g.n',me);
  29. pos=40*rand(ps,D)-20;
  30. vel=8*rand(ps,D)-4;
  31.  
  32. % initial pbest positions vals
  33.  pbest=pos;
  34.  
  35.  for j=1:ps  % start particle loop
  36.     numin='0';
  37.     for i=1:D
  38.         numin=strcat(numin,',',num2str(pos(j,i)));
  39.     end
  40. %     evstrg=strcat('feval(''',functname,'''',numin(2:end),',structure',')');  
  41. evstrg=strcat('feval(''myMI''',numin(2:end),',structure',')');
  42.     out(j)=eval(evstrg);     % evaluate desired function with particle j      
  43.  end
  44.  
  45.  pbestval=out;   % initially, pbest is same as pos
  46. % assign initial gbest here also (gbest and gbestval)
  47.  if minmax==1
  48.     [gbestval,idx1]=max(pbestval);  % this picks gbestval when we want to maximize the function
  49.  elseif minmax==0
  50.     [gbestval,idx1]=min(pbestval);  % this works for straight minimization
  51.  end
  52.  gbest=pbest(idx1,:);  % this is gbest position
  53.  tr(1)=gbestval;       % save for output
  54. % start PSO iterative procedures
  55. cnt=0; % counter used for updating display according to df in the options
  56. cnt2=0; % counter used for the stopping subroutine based on error convergence
  57. for i=1:me  % start epoch loop (iterations)
  58.    if flagg==0   % randimization control, one random set for each epoch
  59.        rannum1=rand(1);  
  60.        rannum2=rand(2);
  61.    end
  62.    
  63.    for j=1:ps  % start particle loop
  64.        
  65.      if flagg==1   % randomization control, one random set for each particle at each epoch
  66.          rannum1=rand(1);
  67.          rannum2=rand(1);
  68.      end
  69.      numin='0';
  70.      for dimcnt=1:D
  71.          numin=strcat(numin,',',num2str(pos(j,dimcnt)));
  72.      end
  73. %      evstrg=strcat('feval(''',functname,'''',numin(2:end),',structure',')'); 
  74. evstrg=strcat('feval(''myMI''',numin(2:end),',structure',')');
  75.      out(j)=eval(evstrg);     % evaluate desired function with particle j  
  76.      e(j) = out(j);              % use to minimize or maximize function to unknown values
  77.      %SSEhist(j) = sumsqr(e);    % sum squared 'error' for jth particle (averages if there is more than one output)
  78.      
  79.     % update pbest to reflect whether searching for max or min of function
  80.      if minmax==0
  81.        if pbestval(j)>=e(j);
  82.           pbestval(j)=e(j);
  83.           pbest(j,:)=pos(j,:);
  84.        end
  85.      elseif minmax==1
  86.        if pbestval(j)<=e(j);
  87.            pbestval(j)=e(j);
  88.            pbest(j,:)=pos(j,:);
  89.        end
  90.      end
  91.  
  92.           
  93.     % assign gbest by finding minimum of all particle pbests 
  94.      if minmax==1
  95.        [iterbestval,idx1]=max(pbestval);  % this picks gbestval when we want to maximize the function
  96.        if gbestval<=iterbestval
  97.           gbestval=iterbestval;
  98.           gbest=pbest(idx1,:);
  99.        end       
  100.      elseif minmax==0 
  101.        [iterbestval,idx1]=min(pbestval);  % this works for straight minimization and for minimizing error to target
  102.        if gbestval>=iterbestval
  103.           gbestval=iterbestval;
  104.           gbest=pbest(idx1,:);
  105.        end       
  106.      end    
  107.     
  108.      tr(i+1)=gbestval; % keep track of global best val
  109.      te=i;           % this will return the epoch number to calling program when done
  110.     % get new velocities, positions (this is the heart of the PSO algorithm)
  111.      if i<=iwe
  112.         iwt(i)=((iw2-iw1)/(iwe-1))*(i-1)+iw1; % get inertia weight, just a linear funct w.r.t. epoch parameter iwe
  113.      else
  114.         iwt(i)=iw2;
  115.      end
  116.     
  117.      if flagg==2              % each component of each particle gets a different random number set
  118.         for dimcnt=1:D
  119.            rannum1=rand(1);
  120.            rannum2=rand(1);
  121.            vel(j,dimcnt)=iwt(i)*vel(j,dimcnt)...
  122.                     +ac1*rannum1*(pbest(j,dimcnt)-pos(j,dimcnt))...
  123.                     +ac2*rannum2*(gbest(1,dimcnt)-pos(j,dimcnt));
  124.         end
  125.      else                     % this velocity update is for flagg= 0 or 1
  126.         vel(j,:)=iwt(i)*vel(j,:)...
  127.                  +ac1*rannum1*(pbest(j,:)-pos(j,:))...
  128.                  +ac2*rannum2*(gbest(1,:)-pos(j,:));
  129.      end
  130.     % update new position
  131.      pos(j,:)=pos(j,:)+vel(j,:);    
  132.     % limit velocity/position components to maximums
  133.      for dimcnt=1:D
  134.         if vel(j,dimcnt)>mv
  135.            vel(j,dimcnt)=mv;
  136.         end
  137.        
  138.         if vel(j,dimcnt)<-mv
  139.           vel(j,dimcnt)=-mv;
  140.         end    
  141.         
  142.         if pos(j,dimcnt)>=VR(dimcnt,2)
  143.            pos(j,dimcnt)=VR(dimcnt,2);
  144.         end
  145.        
  146.         if pos(j,dimcnt)<=VR(dimcnt,1)
  147.            pos(j,dimcnt)=VR(dimcnt,1);
  148.         end       
  149.         
  150.         
  151.      end
  152.        
  153.    end         % end particle loop
  154.    
  155.   %---------------------------------------------------------------------------------------------------------------------- 
  156.    
  157.    
  158.    % check for stopping criterion based on speed of convergence to desired error   
  159.     tmp1=abs(tr(i)-gbestval);
  160.     if tmp1>ergrd
  161.        cnt2=0;
  162.     elseif tmp1<=ergrd
  163.        cnt2=cnt2+1;
  164.        if cnt2>=ergrdep
  165.          if plotflg==1
  166.           fprintf(message,i,gbestval);           
  167. %           disp(' ');
  168. %           disp('***** global error gradient too small for too long');
  169. %           disp('***** this means you''ve got the solution or it got stuck');
  170.          end
  171.          break
  172.        end       
  173.     end     
  174. end  % end epoch loop
  175.       OUT=[gbest';gbestval];
  176.  OUT(1:3)=round(OUT(1:3));
  177.  varargout{1}=[0:te];
  178.  varargout{2}=[tr];
  179.  
  180.