%标准粒群优化算法程序 ( N$ f( V" I9 A, e, d+ W% 2007.1.9 By jxy & c4 [; u1 X) b3 q/ z ?%测试函数:f(x,y)=100(x^2-y)^2+(1-x)^2, -2.048<x,y<2.0486 }! u, @% _7 E* c
%求解函数最小值" S3 ?7 N# Y8 a. \6 K' V
! m) \* @. A; ]: nglobal popsize; %种群规模7 o6 U. C+ p7 X- N7 V
%global popnum; %种群数量$ s2 B. ]2 x: F1 N" ?
global pop; %种群/ Q& R5 Z! T4 |
%global c0; %速度惯性系数,为0—1的随机数 g( H+ X* [! H; n8 H, T7 q
global c1; %个体最优导向系数8 a1 [7 l( E9 [0 A8 ^. G# t& ?) w
global c2; %全局最优导向系数 5 s" M1 k- P2 J% H3 O1 Bglobal gbest_x; %全局最优解x轴坐标7 P9 P/ c6 w r, o+ ^. j1 p- v ~! ?
global gbest_y; %全局最优解y轴坐标 5 v2 Z! E) R9 T' H+ c& Qglobal best_fitness; %最优解, ^# e" O8 L: F
global best_in_history; %最优解变化轨迹 5 P* H/ i, N1 ~$ |global x_min; %x的下限 7 W2 C; x, z! a% J( M7 p" }( Z* yglobal x_max; %x的上限 0 I; X- f; ?. r9 O7 pglobal y_min; %y的下限5 L% F/ l. n. q& h* D. Z6 E+ x
global y_max; %y的上限9 v5 [4 Y: j4 N
global gen; %迭代次数* e% k' b- I2 e0 U/ H+ F
global exetime; %当前迭代次数! q* Z' K: e# R$ B1 j+ C
global max_velocity; %最大速度 % R- J& v. A7 G1 N+ M5 D, f% h 3 c9 h$ q* e6 P5 f9 ~" E' V" minitial; %初始化 9 @. Y/ m) a- g: F $ s0 B- C+ g" q. x1 f& Gfor exetime=1:gen2 w4 f) ^# x1 O, c9 `! o" e: `& N
outputdata; %实时输出结果% \" y+ X: e. Z' {4 q5 z$ `: v
adapting; %计算适应值 - \3 u) B: _+ ]; ?* J: N7 ferrorcompute(); %计算当前种群适值标准差- O+ r B F1 @( g- m8 C$ Q, u
updatepop; %更新粒子位置: E; d% s) J- h+ K3 b- w
pause(0.01); 3 j& e, g# A0 ^# t; w. ? q# Tend ! U. ?6 K' \/ d0 ?0 S' e" C) w$ \' h) o3 G; _8 p
clear i; ! ^" L2 A; L; F) H. M7 Gclear exetime; ' w8 w/ H* E8 u% uclear x_max;% a1 P- p. D( L: s3 c
clear x_min; H5 `/ C `7 o5 l* h) N) q% J! `/ rclear y_min; u. E9 }9 T9 D1 {- S0 @, Z
clear y_max;! x9 f) ]7 d, `9 o, C
9 t9 K+ }. @& a+ [! C; C/ x6 g s%程序初始化- n' p3 P1 z7 E M; y( M4 P
6 x/ G5 P( l" I) H
gen=100; %设置进化代数" r u3 I' m# t7 w0 I
popsize=30; %设置种群规模大小 / X3 {. B/ S6 \7 \9 W7 ?best_in_history(gen)=inf; %初始化全局历史最优解. o ~- J. X* v0 ]3 S3 n" t( r. j
best_in_history( =inf; %初始化全局历史最优解! T$ |2 U P( u! n
max_velocity=0.3; %最大速度限制 1 {; L( B2 y1 m* @- o6 W, obest_fitness=inf;5 B {0 X! {6 K' O
%popnum=1; %设置种群数量 + ] H/ C" L; g1 }$ I 3 C2 ^1 g% u$ G& Bpop(popsize,8)=0; %初始化种群,创建popsize行5列的0矩阵# J' x" p+ k" v6 V2 d) \
%种群数组第1列为x轴坐标,第2列为y轴坐标,第3列为x轴速度分量,第4列为y轴速度分量 ) n+ u" F4 r0 |7 T* s# R- E%第5列为个体最优位置的x轴坐标,第6列为个体最优位置的y轴坐标% N, C% A( D+ ?# I/ h; d$ r
%第7列为个体最优适值,第8列为当前个体适应值 , k2 s0 U' S$ w8 }3 P. p' V+ i0 B. W2 W) [) e7 o7 S. [
for i=1:popsize/ r9 q( G+ T7 U( n! t( H
pop(i,1)=4*rand()-2; %初始化种群中的粒子位置,值为-2—2,步长为其速度) C9 t; G: f4 }! K7 E3 Q! y
pop(i,2)=4*rand()-2; %初始化种群中的粒子位置,值为-2—2,步长为其速度 1 m- u1 l% F5 W- kpop(i,5)=pop(i,1); %初始状态下个体最优值等于初始位置 ; ^ j" h- j; e; Z5 o4 Xpop(i,6)=pop(i,2); %初始状态下个体最优值等于初始位置 7 ~8 z" f3 l1 x9 j" [/ S3 \7 \pop(i,3)=rand()*0.02-0.01; %初始化种群微粒速度,值为-0.01—0.01,间隔为0.0001 7 Q5 ~7 h! _$ m1 E+ k% Ypop(i,4)=rand()*0.02-0.01; %初始化种群微粒速度,值为-0.01—0.01,间隔为0.0001 9 X! V7 g2 e, o0 M1 V: Y; ^3 ]! hpop(i,7)=inf; T" n# Q3 p# ~& v8 O; a: l
pop(i,8)=inf; 3 x$ P5 z0 e: z- Kend% t3 l6 @6 X. |- j3 g& ?
% B& Z2 j- c( |+ g8 zc1=2; 5 K* Z. k. X s/ s2 O: ?c2=2;" b( E7 x o3 L! {3 e' p5 y8 s
x_min=-2; . d5 Q# A t7 x. zy_min=-2;! g) y" k2 o( F0 g# n: q% M
x_max=2; 0 P, e! O7 l! ~9 _/ \y_max=2; ! t4 d+ h% b4 I9 R: C' C0 e. F' W& f i5 G
gbest_x=pop(1,1); %全局最优初始值为种群第一个粒子的位置 2 J2 W A" r9 B, hgbest_y=pop(1,2);5 \- r8 g" `! p K
4 I1 d/ r& I: P5 k
%适值计算 : O- M4 U, }9 P5 R% 测试函数为f(x,y)=100(x^2-y)^2+(1-x)^2, -2.048<x,y<2.048& V. {" L$ f, Z+ m1 w& Y" k
: b8 o, Z4 ?4 E- O
%计算适应值并赋值 1 M& C. R. ]8 r) yfor i=1:popsize ) X% |1 H: S! d# n& p2 Kpop(i,8)=100*(pop(i,1)^2-pop(i,2))^2+(1-pop(i,1))^2;7 }+ @+ l; c! {" z
if pop(i,7)>pop(i,8) %若当前适应值优于个体最优值,则进行个体最优信息的更新$ X2 \* I$ o; x0 u) d
pop(i,7)=pop(i,8); %适值更新, I. x# E8 O; Y$ O7 u" Y/ v% l
pop(i,5:6)=pop(i,1:2); %位置坐标更新9 w! C8 I# _- h; r9 u
end ) ]. J3 k+ r. g8 Y. ]end ' c) t6 a3 e. o1 _- ? Z! Y& I4 b% E$ A* |: F2 K/ O
%计算完适应值后寻找当前全局最优位置并记录其坐标 : R5 i v# a& e; Z9 lif best_fitness>min(pop(:,7)), I; x: h! o: H# u
best_fitness=min(pop(:,7)); %全局最优值2 W6 H1 ?3 {% Y
gbest_x=pop(find(pop(:,7)==min(pop(:,7))),1); %全局最优粒子的位置 ! D9 [% s; W' E2 r! { $ O! S: o/ u6 ugbest_y=pop(find(pop(:,7)==min(pop(:,7))),2); * p) S1 u2 d0 r* X; mend2 U8 c' e8 k! r: Q/ z$ o; i; J