Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
PSO.m
Package: cx9.rar [view]
Upload User: xueli1969
Upload Date: 2022-07-27
Package Size: 19k
Code Size: 6k
Category:
Communication Document
Development Platform:
Matlab
- function [OUT,varargout]=PSO(structure)
- D=3;
- rand('state',sum(100*clock));
- if nargin < 1
- error('Not enough arguments.');
- end
- % PSO PARAMETERS
- VRmin=ones(D,1)*-20;
- VRmax=ones(D,1)*20;
- VR=[VRmin,VRmax];
- minmax = 1;
- P =[1 2000 20 4 2 2 0.9 0.2 1500 2 1e-5 20 1];
- df = P(1);
- me = P(2);
- ps = P(3);
- mv = P(4);
- ac1 = P(5);
- ac2 = P(6);
- iw1 = P(7);
- iw2 = P(8);
- iwe = P(9);
- flagg=P(10);
- ergrd=P(11);
- ergrdep=P(12);
- plotflg=P(13);
- % PLOTTING
- message = sprintf('PSO: %%g/%g iterations, GBest = %%g.n',me);
- pos=40*rand(ps,D)-20;
- vel=8*rand(ps,D)-4;
- % initial pbest positions vals
- pbest=pos;
- for j=1:ps % start particle loop
- numin='0';
- for i=1:D
- numin=strcat(numin,',',num2str(pos(j,i)));
- end
- % evstrg=strcat('feval(''',functname,'''',numin(2:end),',structure',')');
- evstrg=strcat('feval(''myMI''',numin(2:end),',structure',')');
- out(j)=eval(evstrg); % evaluate desired function with particle j
- end
- pbestval=out; % initially, pbest is same as pos
- % assign initial gbest here also (gbest and gbestval)
- if minmax==1
- [gbestval,idx1]=max(pbestval); % this picks gbestval when we want to maximize the function
- elseif minmax==0
- [gbestval,idx1]=min(pbestval); % this works for straight minimization
- end
- gbest=pbest(idx1,:); % this is gbest position
- tr(1)=gbestval; % save for output
- % start PSO iterative procedures
- cnt=0; % counter used for updating display according to df in the options
- cnt2=0; % counter used for the stopping subroutine based on error convergence
- for i=1:me % start epoch loop (iterations)
- if flagg==0 % randimization control, one random set for each epoch
- rannum1=rand(1);
- rannum2=rand(2);
- end
- for j=1:ps % start particle loop
- if flagg==1 % randomization control, one random set for each particle at each epoch
- rannum1=rand(1);
- rannum2=rand(1);
- end
- numin='0';
- for dimcnt=1:D
- numin=strcat(numin,',',num2str(pos(j,dimcnt)));
- end
- % evstrg=strcat('feval(''',functname,'''',numin(2:end),',structure',')');
- evstrg=strcat('feval(''myMI''',numin(2:end),',structure',')');
- out(j)=eval(evstrg); % evaluate desired function with particle j
- e(j) = out(j); % use to minimize or maximize function to unknown values
- %SSEhist(j) = sumsqr(e); % sum squared 'error' for jth particle (averages if there is more than one output)
- % update pbest to reflect whether searching for max or min of function
- if minmax==0
- if pbestval(j)>=e(j);
- pbestval(j)=e(j);
- pbest(j,:)=pos(j,:);
- end
- elseif minmax==1
- if pbestval(j)<=e(j);
- pbestval(j)=e(j);
- pbest(j,:)=pos(j,:);
- end
- end
- % assign gbest by finding minimum of all particle pbests
- if minmax==1
- [iterbestval,idx1]=max(pbestval); % this picks gbestval when we want to maximize the function
- if gbestval<=iterbestval
- gbestval=iterbestval;
- gbest=pbest(idx1,:);
- end
- elseif minmax==0
- [iterbestval,idx1]=min(pbestval); % this works for straight minimization and for minimizing error to target
- if gbestval>=iterbestval
- gbestval=iterbestval;
- gbest=pbest(idx1,:);
- end
- end
- tr(i+1)=gbestval; % keep track of global best val
- te=i; % this will return the epoch number to calling program when done
- % get new velocities, positions (this is the heart of the PSO algorithm)
- if i<=iwe
- iwt(i)=((iw2-iw1)/(iwe-1))*(i-1)+iw1; % get inertia weight, just a linear funct w.r.t. epoch parameter iwe
- else
- iwt(i)=iw2;
- end
- if flagg==2 % each component of each particle gets a different random number set
- for dimcnt=1:D
- rannum1=rand(1);
- rannum2=rand(1);
- vel(j,dimcnt)=iwt(i)*vel(j,dimcnt)...
- +ac1*rannum1*(pbest(j,dimcnt)-pos(j,dimcnt))...
- +ac2*rannum2*(gbest(1,dimcnt)-pos(j,dimcnt));
- end
- else % this velocity update is for flagg= 0 or 1
- vel(j,:)=iwt(i)*vel(j,:)...
- +ac1*rannum1*(pbest(j,:)-pos(j,:))...
- +ac2*rannum2*(gbest(1,:)-pos(j,:));
- end
- % update new position
- pos(j,:)=pos(j,:)+vel(j,:);
- % limit velocity/position components to maximums
- for dimcnt=1:D
- if vel(j,dimcnt)>mv
- vel(j,dimcnt)=mv;
- end
- if vel(j,dimcnt)<-mv
- vel(j,dimcnt)=-mv;
- end
- if pos(j,dimcnt)>=VR(dimcnt,2)
- pos(j,dimcnt)=VR(dimcnt,2);
- end
- if pos(j,dimcnt)<=VR(dimcnt,1)
- pos(j,dimcnt)=VR(dimcnt,1);
- end
- end
- end % end particle loop
- %----------------------------------------------------------------------------------------------------------------------
- % check for stopping criterion based on speed of convergence to desired error
- tmp1=abs(tr(i)-gbestval);
- if tmp1>ergrd
- cnt2=0;
- elseif tmp1<=ergrd
- cnt2=cnt2+1;
- if cnt2>=ergrdep
- if plotflg==1
- fprintf(message,i,gbestval);
- % disp(' ');
- % disp('***** global error gradient too small for too long');
- % disp('***** this means you''ve got the solution or it got stuck');
- end
- break
- end
- end
- end % end epoch loop
- OUT=[gbest';gbestval];
- OUT(1:3)=round(OUT(1:3));
- varargout{1}=[0:te];
- varargout{2}=[tr];