>> function main() 1 k- F2 l2 [# q7 T3 M% Q% ^8 D" `clc;clear all;close all;! P+ g7 s' h0 B* S$ k1 M# G
tic; %程序运行计时. Q- `, I# f. _& i( F
E0=0.001; %允许误差 ; V1 s: n! J! q& a4 z3 mMaxNum=100; %粒子最大迭代次数 + t+ a# L( q0 z, x8 k0 G' D3 xnarvs=1; %目标函数自变量个数 5 u7 P, b6 s8 R2 S) T4 x* Q8 wparticlesize=30; %粒子群规模* M- N! k: n$ v1 p7 g7 \/ g
c1=2; %每个粒子个体学习因子,也称加速常数; X- u. W9 |/ Q5 n$ [: F1 G0 u! \" T
c2=2; %每个粒子的社会学习因子,也称加速常数6 d/ D* ]# T/ X) y/ }
w=0.6; %惯性因子0 p0 x8 d. O5 M
vmax=0.8; %粒子最大飞翔速度% d0 B t8 x* ]; e
x=-5+10*rand(particlesize,narvs); %粒子所在位置 . O7 a% f2 |4 Y) G: T( ^v=2*rand(particlesize,navrs); %粒子的飞翔速度. A) }1 f" N" G5 z
%用inline定义适应度函数以便于将子函数与主程序文件放在一起, ' f( ]8 I" J' {%目标函数是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)), _& r+ o. ?3 d; |6 P
%inline命令定义实应度函数如下0 ~5 X7 }, R4 h7 {; u
fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');/ n2 }, A5 J$ a( p4 Q& p0 `+ d
%inline定义的实验度函数会使程序运行速度大大降低3 m& S% V( w) A+ P9 p& V
for i=1:particlesize* R1 p* a( t9 \6 Q+ ]: X
for j=1:narvs" T/ [, z k: n
f(i)=fitness(x(i,j)); ) R3 s/ V4 ^. M1 F( w- X9 W end 0 V9 r$ L. Z+ f1 R) Tend: u `+ s) X" S
personalbest_x=x; : n! [$ n7 T- Z+ r; s# }. k; ppersonalbest_faval=f; : D g2 C# A( m/ X H9 s2 S9 i% v[globalbest_faval i]=min(personalbest_faval); 3 H& B. b9 R! E9 N; Pglobalbest_x=personalbest_x(i,;1 H# P* t/ B4 ?9 m; E9 p* s
k=1; ) b) ~8 x# t) I- ~! ~while k<=MaxNum# V/ K* a8 m( Q& |- K+ e4 R
for i=1:particlesize9 H4 k' R# G, d5 F8 c7 F8 k
for j=1:narvs; . ]* U- ^& h& s0 E# C* X! U f(i)=fitness(x(i,j));8 u* L2 D* \$ m' o
end ) M( h: Q4 _: w if f(i)<personalbest_faval(i) %判断当前位置是否历史上最佳位置 }* e) r9 v7 I& R- }8 {5 L8 B6 l personalbest_faval(i)=f(i);" Z1 e5 P. y* z g7 U% A
personalbest_x(i,=x(i,; 2 u5 f! v& D/ b" t/ i end " N2 `. U) F @# m& s5 C9 s' Y end- Y9 p4 H }6 K* \' s5 ?
[globalbest_faval i]=min(personalbest_faval); , A8 g- R0 Q: W, q( m globalbest_x=personalbest_x(i,;, G5 D6 Q6 P5 V0 t0 {
for i=1:particlesize %更新粒子群里每个个体的最新位置/ m7 ]" }( T% k7 B5 j) k/ I, m# {
v(i,=w*v(i,+c1*rand*(personalbest_x(i,-x(i,)...6 G$ [( X6 { u3 n+ N
+c2*rand*(globalbest_x-x(i,);, [- d0 P; b9 N( M) o+ I4 ~
for j=1:narvs %判断粒子的飞翔速度是否超过了最大飞行速度 * v* T8 x# _4 Z if v(i.j)>vmax; 4 U9 p1 C+ \% t% r' t
v(i,j)=vmax;% T$ i% H$ v$ m, U/ P. v, M
else if v(i,j)<-vmax;& \9 q* i' P) \0 B
v(i,j)=-vmax;; t+ F& t4 N1 G1 j9 {$ U1 s
end3 H$ M$ b9 }0 i7 s
end" @& g& m3 w* I! O
x(i,=x(i,+v(i,;. f/ E s, `5 E
end 5 r/ m# ^ m0 V' K# i if abs(globalbest_faval)<E0,break,end# z) x7 j- D) I5 Q* i4 k
k=k+1; 6 w- v3 h u/ y9 \ end5 I% k2 f: X; j7 X) a3 D
Valuel=1/globalbest_faval-1;Valuel=num2str(Valuel); 4 l; P* t( I( p! |# Z1 L* a0 ` %strcat指令可以实现字符的组合输出# A, _( P1 X4 l" O/ d: X7 c
disp(strcat('the maximun valuel','=',Valuel)); 6 S" P+ O0 Z3 e4 z3 t& @& Y) e! x %输出最大值所在的横坐标位置 1 }* [) J/ R7 d9 d/ c. n- }6 K Value2=globalbest_x; Value2=num2str(Value2); % a% F; Y& ?/ q1 G6 R( a disp(strcat('the corresponding coordinate','=',Value2));0 s" x8 t5 b" r$ i3 `' P
x=-5:0.01:5;4 I1 D, ]" v. b H7 A1 |$ ^
y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);$ }) N- Y+ B! `# j3 J( K2 {* H) f
plot(x,y,'m-','linewidth',3); 9 n2 ]0 c. c8 q: X8 F5 J3 K3 ] hold on; . N2 ^- }7 a$ z: G1 g0 N/ d plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4); / P# f/ b3 o( V! X+ B8 H* } legend('目标函数','搜索到的最大值');2 T: e, C* a+ h' i& Y" n
xlabel('x');ylabel('y');grid on;toc; . S, ], f4 d) l0 P0 H: ]1 k+ F, ?5 G3 Y$ f$ `* X* R
3 Z( T. E5 j( s& Q2 C9 v错误提示 ??? function main() | 8 _$ P) t; ^( d& lError: Function definitions are not permitted in this context.% E4 r1 L* b8 z% ]' L
, k* U3 E" C$ t
去掉function main()后 提示??? Undefined function or variable 'navrs'.错误。求指点! - w, X# `* s; w. Q, h/ X$ q3 V( H
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;