%标准粒群优化算法程序% @$ Q9 v# z0 K) Z/ ` v
% 2007.1.9 By jxy/ ~& D- b; y. x
%测试函数:f(x,y)=100(x^2-y)^2+(1-x)^2, -2.048<x,y<2.048( \% J; J" Q, ^, E0 z+ L& g. B( X
%求解函数最小值+ ]2 X& b+ S- T& L& q$ r
# v, s1 n2 |$ G' k8 \" zglobal popsize; %种群规模' J" v- ?6 m/ n! T$ \
%global popnum; %种群数量0 \" ], t' O9 f" ?" f
global pop; %种群' }. F* Q9 X8 E) s; O. x# C
%global c0; %速度惯性系数,为0—1的随机数 - b0 c8 p& G9 F" \8 \/ @; ~! nglobal c1; %个体最优导向系数; s4 O* { X2 ^+ v+ G
global c2; %全局最优导向系数( j% B1 N( J2 m: d7 n+ a2 Y6 n* s
global gbest_x; %全局最优解x轴坐标9 X n1 _' t5 J1 v. X/ R
global gbest_y; %全局最优解y轴坐标 4 H4 o% j/ m! S- w+ C+ j7 F# Cglobal best_fitness; %最优解 : }0 S2 `) r* u- eglobal best_in_history; %最优解变化轨迹% [: G1 e) e/ X. u
global x_min; %x的下限; B# a) J5 i- x1 w1 M B
global x_max; %x的上限* J' F; E) i8 ~3 ~* N1 j! K( S0 B
global y_min; %y的下限 Q; z7 Z8 X. X' Jglobal y_max; %y的上限 * i, h, c, Z; I' H5 U# Gglobal gen; %迭代次数 6 {: s3 i2 w- p) X5 n0 [# Yglobal exetime; %当前迭代次数 % N5 } k9 @+ |1 ]; W$ b5 Xglobal max_velocity; %最大速度 - m& M2 g8 Z7 W4 u) ]2 l0 a, O9 ^' H, l$ \
initial; %初始化7 |8 Q8 x8 u1 W- c' M
+ A* A) y6 M( L, J* n9 bfor exetime=1:gen7 h$ E: U0 O# Q/ z5 p: z8 i$ g
outputdata; %实时输出结果 ; B# K- l& O8 ^. Q6 v1 Vadapting; %计算适应值# b) k& B5 v& r6 a9 O$ ^0 N* b
errorcompute(); %计算当前种群适值标准差4 n- z: t* b% [% B
updatepop; %更新粒子位置 2 J. V9 } v0 K( }! y% @pause(0.01); 9 Z* `2 `) O$ t" bend * k& t+ e" ~8 T; o ; u: ~* Q5 Z) j0 }8 iclear i; 7 s; ]- n/ t% h" [$ | ]- Fclear exetime;. d. u: ]& R. h( E5 f4 R& t6 b5 Q' a
clear x_max;; k3 ~! |7 c+ ?' J9 l. h- k# l
clear x_min;; ~3 ]$ A0 E! m( ~2 N$ H5 S& [
clear y_min; ' |( }( e8 Z$ r/ V( T. C" W4 _$ T+ mclear y_max; + j- e1 q) G1 J: Y4 w, ~5 C) @: w9 \. R- a/ h3 ]
%程序初始化 ' e/ e) F. e3 S+ g4 [8 y7 d6 S- n6 i
gen=100; %设置进化代数 + N8 Q1 k7 R5 m apopsize=30; %设置种群规模大小) t! O' e6 E4 j* B% y8 M) E# T
best_in_history(gen)=inf; %初始化全局历史最优解 . q. v$ v) V7 ^; v1 c/ Z$ @best_in_history( =inf; %初始化全局历史最优解, n' n. O8 I7 `3 M. Q' C
max_velocity=0.3; %最大速度限制. S( [5 J: E8 Z" e
best_fitness=inf;7 Z1 C# N' ?) g# p8 c
%popnum=1; %设置种群数量 2 W* e; @% }0 w 6 @" |) z+ n' G6 D2 r4 J- a% }pop(popsize,8)=0; %初始化种群,创建popsize行5列的0矩阵 * D. O/ t1 p% N5 j%种群数组第1列为x轴坐标,第2列为y轴坐标,第3列为x轴速度分量,第4列为y轴速度分量2 X' s+ z$ Y2 d; t" p# \4 p0 h2 E) g6 V
%第5列为个体最优位置的x轴坐标,第6列为个体最优位置的y轴坐标 4 | s$ u& @5 l+ c# w V& r" ^%第7列为个体最优适值,第8列为当前个体适应值6 k z. q, \- S% {
' L1 C; }8 w& h( a3 k
for i=1:popsize+ c9 ]% G7 `2 T& h% Y( ~6 G7 Z: o
pop(i,1)=4*rand()-2; %初始化种群中的粒子位置,值为-2—2,步长为其速度 ; W" {0 \4 o `8 ~2 _( s6 n) I( F( tpop(i,2)=4*rand()-2; %初始化种群中的粒子位置,值为-2—2,步长为其速度 $ Q3 S3 Z- s( [" ?5 K8 T6 K& zpop(i,5)=pop(i,1); %初始状态下个体最优值等于初始位置 # Y- p: D9 }0 w. D! ~pop(i,6)=pop(i,2); %初始状态下个体最优值等于初始位置 ) L3 z! F. k3 W1 I$ d/ Apop(i,3)=rand()*0.02-0.01; %初始化种群微粒速度,值为-0.01—0.01,间隔为0.0001 , E% i. ?& b- B. [) L9 Tpop(i,4)=rand()*0.02-0.01; %初始化种群微粒速度,值为-0.01—0.01,间隔为0.0001; P# P6 _; h6 ?* L1 y( T- R8 _
pop(i,7)=inf;' R: E4 N5 ?; U) L" g7 a3 e
pop(i,8)=inf;- P, l z& V/ Q( p! ]8 v( Q% b
end 3 j) S5 J6 Y9 K) {" G1 M 9 D) J7 ^" _) t, f) F+ Oc1=2; , f5 H1 `2 ^* r0 C3 a7 Ic2=2; 6 z. x \; N, |- Kx_min=-2; ' V) D6 Y+ k1 y+ `4 y1 g5 }& g% uy_min=-2; ; Q d% F; r$ t; @x_max=2;# D8 j3 N* j1 O. Y
y_max=2; & ~& S* _' j! [- \; T6 Z) h! `7 B' U
gbest_x=pop(1,1); %全局最优初始值为种群第一个粒子的位置, r3 l" _0 |$ x
gbest_y=pop(1,2); + U: P. B5 T( b2 M ! |4 u3 W- C/ A1 @, J/ M# Y%适值计算" z9 J2 q, y; i, k9 J! Z
% 测试函数为f(x,y)=100(x^2-y)^2+(1-x)^2, -2.048<x,y<2.048 $ n# @+ O* f* g# z9 { ' i' Y, S5 b/ o/ D0 `, O; V% X/ O( T%计算适应值并赋值 h6 s# C5 R! A, I
for i=1:popsize : v N! g) `8 ^8 a" G5 B$ Spop(i,8)=100*(pop(i,1)^2-pop(i,2))^2+(1-pop(i,1))^2; ' f, U, |8 H& F7 Aif pop(i,7)>pop(i,8) %若当前适应值优于个体最优值,则进行个体最优信息的更新 9 z j0 L U9 d/ Rpop(i,7)=pop(i,8); %适值更新 ) m9 W( Z/ K1 l# U: tpop(i,5:6)=pop(i,1:2); %位置坐标更新5 A/ I9 C. s; z
end! W: L: ?3 j! |* u* { a- T
end4 _; p" c2 Q. G( y$ g
4 E! u3 N( H0 M) e% _
%计算完适应值后寻找当前全局最优位置并记录其坐标0 C/ N/ _% n t3 w4 e l1 g4 `
if best_fitness>min(pop(:,7)) / z/ ~: ?% L5 j$ v; d! j; s# Qbest_fitness=min(pop(:,7)); %全局最优值; F/ x2 ^, c, e. c- {$ J
gbest_x=pop(find(pop(:,7)==min(pop(:,7))),1); %全局最优粒子的位置 5 x0 ]) ]) w( [+ E+ f" U+ k* ]: w1 O4 P8 s
gbest_y=pop(find(pop(:,7)==min(pop(:,7))),2); 3 ]' q2 w7 N) |6 ?8 B8 i3 N- oend * h' H! J" ?* i1 T* z9 m( e! Y1 T, `8 n* X K1 g) g- P6 Y+ i
best_in_history(exetime)=best_fitness; %记录当前全局最优4 c0 u9 N# c: T( ^/ e- z0 U
( g D( n/ R) n; O8 J9 n6 F! h%实时输出结果8 |4 G( N8 {0 F2 I; L" m- l
5 _7 m& o( ? d- }: D$ ^+ n
%输出当前种群中粒子位置 5 N% b4 Z5 D- csubplot(1,2,1);8 r+ [4 d0 |' W$ v( w, A4 B
for i=1:popsize . W7 y1 ]* ~4 ?. lplot(pop(i,1),pop(i,2),'b*');4 P: ?: h9 R" k1 S9 d! w |/ V
hold on; G- l) k# i) z2 ^7 O3 j8 {+ }2 |4 i
end " u: H# x! M! @* w# C( L. Z4 [; Z8 \# O$ c" V
plot(gbest_x,gbest_y,'r.','markersize',20);axis([-2,2,-2,2]); ) z. C' T1 u) H/ \, p* {7 qhold off;% V) C- h$ g# U. f7 b
+ z- i' Z+ u# Y2 v! `% d; usubplot(1,2,2);3 e/ [, ]/ g* H, I. k" m& L
axis([0,gen,-0.00005,0.00005]); 0 ]5 P q( w5 d. k+ S0 B0 e# B5 r7 ^# B) P
if exetime-1>0* A5 v' N' ~' @4 F% |
line([exetime-1,exetime],[best_in_history(exetime-1),best_fitness]);hold on; ) [" L5 h: `) z6 q' Bend' ^5 u" U! ^1 K& P