>> function main()3 l% B- m! u% |
clc;clear all;close all;+ }+ J8 [( @. f& k+ v
tic; %程序运行计时9 ?* u* l$ J6 D. x1 C% L
E0=0.001; %允许误差9 E) Q* V& D ], ~1 K# N, Q
MaxNum=100; %粒子最大迭代次数 ) G7 f% g, \+ w* Z! v% ~narvs=1; %目标函数自变量个数( l1 |; P3 K: Y& g0 F
particlesize=30; %粒子群规模 3 P. H% V. q$ g3 `c1=2; %每个粒子个体学习因子,也称加速常数 ' N! W* ~- j, V/ ^c2=2; %每个粒子的社会学习因子,也称加速常数# X7 q- I6 d1 U$ Q# N1 i
w=0.6; %惯性因子 , k- \( R. ?% _! G6 {5 v1 Ivmax=0.8; %粒子最大飞翔速度 3 _$ i f3 X1 D1 ~x=-5+10*rand(particlesize,narvs); %粒子所在位置! \' E; n6 p4 n/ d: J8 a
v=2*rand(particlesize,navrs); %粒子的飞翔速度! ^( a3 X$ ~7 z0 I) X& ~) B
%用inline定义适应度函数以便于将子函数与主程序文件放在一起, 2 ~' h6 g$ p+ ~" e%目标函数是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)) r! B, O% [1 B H7 L4 F5 b
%inline命令定义实应度函数如下2 J, l1 M( s, z( p
fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x'); l, h# A" Y1 X4 }4 |+ q, T
%inline定义的实验度函数会使程序运行速度大大降低 6 b3 q4 I- l5 K6 G! y9 }for i=1:particlesize / s4 Y; q8 W( J! }: x" H for j=1:narvs" m/ l0 a0 L5 s0 B3 |* B# D
f(i)=fitness(x(i,j)); 6 R1 G6 B- V8 i* A" \# A end# t4 a. Y d4 i$ L' |8 z
end' ~; Q: |! `- e. w
personalbest_x=x; 2 W& M4 e+ i) _3 H5 r: ~. g O6 _9 [personalbest_faval=f; ' g. I% n% I; }7 u[globalbest_faval i]=min(personalbest_faval); 4 V- E8 o! C* ]8 p- Y8 Iglobalbest_x=personalbest_x(i,; 5 p) i+ T% j0 n# {5 Nk=1;# ~2 H) e( f w, G) U9 z; m
while k<=MaxNum . z+ Z! Z* j) |2 @5 x1 g for i=1:particlesize B) O" Z V2 m* N; U" M. ~
for j=1:narvs;: Z# d0 l# i5 z, C
f(i)=fitness(x(i,j)); k5 f! }, }& J" N% Y, q
end6 e; ]) V+ F. [$ A1 {
if f(i)<personalbest_faval(i) %判断当前位置是否历史上最佳位置! @. `1 Q r% z
personalbest_faval(i)=f(i); 2 m, X3 s+ n+ Q personalbest_x(i,=x(i,;- Q/ W: S' I) ~
end# Z1 p+ E# M! o1 o8 `" X/ J1 i
end0 ]3 k3 G2 O- g
[globalbest_faval i]=min(personalbest_faval);4 S& |' V" G8 O% l2 e' @/ x
globalbest_x=personalbest_x(i,; - e+ g+ n* q7 Y" s for i=1:particlesize %更新粒子群里每个个体的最新位置2 Y2 u7 @) x- {; U0 I
v(i,=w*v(i,+c1*rand*(personalbest_x(i,-x(i,)... " ~: P7 @- U' \! u7 f +c2*rand*(globalbest_x-x(i,);' R* W+ l0 ^" Y- K+ I5 O
for j=1:narvs %判断粒子的飞翔速度是否超过了最大飞行速度% r9 L% M. V9 ~; o" b
if v(i.j)>vmax; ' q+ _7 a- ^0 A! a" ^* x* O; |: z# `: f
v(i,j)=vmax; . ^ _1 g2 d; n! H6 e else if v(i,j)<-vmax; & m1 E0 T! }* Q7 H v(i,j)=-vmax;9 i- X7 N; a: A9 i% w% c3 i; w
end, H4 A5 ?$ e. K: a
end ) \4 L% ]0 X& D( r x(i,=x(i,+v(i,; t' T& L* @6 n7 R& n1 E5 L end) g4 F! y8 L' Y6 L
if abs(globalbest_faval)<E0,break,end 3 X& h9 _: ]9 K, l: D. K! I k=k+1; . H1 c2 g- Y" y+ M# M: H/ V end 6 V- d& m; B6 K) W9 F) `: X Valuel=1/globalbest_faval-1;Valuel=num2str(Valuel);; e3 @5 P5 f1 i* }* C
%strcat指令可以实现字符的组合输出 . n" K0 ^+ ]# y4 m+ e2 |) d* Z disp(strcat('the maximun valuel','=',Valuel)); 5 s2 p, y9 s+ |# g# y* ? %输出最大值所在的横坐标位置" S0 V: @& r+ p0 Z* P
Value2=globalbest_x; Value2=num2str(Value2);; u8 G) \9 n D: q, `) M% a
disp(strcat('the corresponding coordinate','=',Value2));* \; x( t1 K; ]6 I
x=-5:0.01:5;8 t. X( G$ G0 d( {9 {& o
y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);* W" W# B; Y* [( e$ c
plot(x,y,'m-','linewidth',3); & [" U9 l/ k9 \/ U- O# ^ hold on; # g+ [* h4 d, ]" ~- [ plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);4 y! @8 U& C6 w% d
legend('目标函数','搜索到的最大值');6 P6 u7 a2 q8 s& I: X( \
xlabel('x');ylabel('y');grid on;toc; ) D* Q' k5 C4 y( \0 i& {% b* a. a2 Q% X
& x" d( x! U2 J1 a! t4 t( t错误提示 ??? function main() | J$ `4 ?+ L" e/ U" PError: Function definitions are not permitted in this context.4 q. F8 J2 { {: q, @0 n
* O7 U ]) a, g# Q, z O
去掉function main()后 提示??? Undefined function or variable 'navrs'.错误。求指点!3 F% Q/ @$ ^- N3 Y" |; s
function main() clc;clear all;close all; tic; %程序运行计时 E0=0.001; %允许误差 MaxNum=100; %粒子最大迭代次数 narvs=1; %目标函数自变量个数 particlesize=30; %粒子群规模 c1=2; %每个粒子个体学习因子,也称加速常数 c2=2; %每个粒子的社会学习因子,也称加速常数 w=0.6; %惯性因子 vmax=0.8; %粒子最大飞翔速度 x=-5+10*rand(particlesize,narvs); %粒子所在位置 v=2*rand(particlesize,navrs); %粒子的飞翔速度 %用inline定义适应度函数以便于将子函数与主程序文件放在一起, %目标函数是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)) %inline命令定义实应度函数如下 fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x'); %inline定义的实验度函数会使程序运行速度大大降低 for i=1:particlesize for j=1:narvs f(i)=fitness(x(i,j)); end end personalbest_x=x; personalbest_faval=f; [globalbest_faval i]=min(personalbest_faval); globalbest_x=personalbest_x(i,; k=1; while k<=MaxNum for i=1:particlesize for j=1:narvs; f(i)=fitness(x(i,j)); end if f(i)<personalbest_faval(i) %判断当前位置是否历史上最佳位置 personalbest_faval(i)=f(i); personalbest_x(i,=x(i,; end end [globalbest_faval i]=min(personalbest_faval); globalbest_x=personalbest_x(i,; for i=1:particlesize %更新粒子群里每个个体的最新位置 v(i,=w*v(i,+c1*rand*(personalbest_x(i,-x(i,)... +c2*rand*(globalbest_x-x(i,); for j=1:narvs %判断粒子的飞翔速度是否超过了最大飞行速度 if v(i.j)>vmax; v(i,j)=vmax; else if v(i,j)<-vmax; v(i,j)=-vmax; end end x(i,=x(i,+v(i,; end if abs(globalbest_faval)<E0,break,end k=k+1; end Valuel=1/globalbest_faval-1;Valuel=num2str(Valuel); %strcat指令可以实现字符的组合输出 disp(strcat('the maximun valuel','=',Valuel)); %输出最大值所在的横坐标位置 Value2=globalbest_x; Value2=num2str(Value2); disp(strcat('the corresponding coordinate','=',Value2)); x=-5:0.01:5; y=2.1*(1-x+2*x.^2).*exp(-x.^2/2); plot(x,y,'m-','linewidth',3); hold on; plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4); legend('目标函数','搜索到的最大值'); xlabel('x');ylabel('y');grid on;toc;