>> function main() $ F* @6 N4 r7 O+ U) P# u# oclc;clear all;close all;4 d& U( O9 G' O8 B; }2 I
tic; %程序运行计时! E5 {% w: p7 \; M: r
E0=0.001; %允许误差 / A# f+ U! @! D+ @( y2 K o7 {MaxNum=100; %粒子最大迭代次数 + Z8 w3 W3 l+ k f3 k) anarvs=1; %目标函数自变量个数 ! K. `! x( r0 u: |6 ^* R' Z/ Kparticlesize=30; %粒子群规模7 g. g' w1 P/ f" t) c2 N5 y" C
c1=2; %每个粒子个体学习因子,也称加速常数 ; Z C6 A/ d9 W" B, a& Hc2=2; %每个粒子的社会学习因子,也称加速常数 z- m( o* M! A% [2 kw=0.6; %惯性因子 & d* D0 B% O) Z/ q/ v, i. ^! T; nvmax=0.8; %粒子最大飞翔速度 ! Y. w B2 t* g0 a- r) @x=-5+10*rand(particlesize,narvs); %粒子所在位置 `3 y* f7 M8 K) z W) Z4 O$ j; T3 yv=2*rand(particlesize,navrs); %粒子的飞翔速度3 T8 G/ R, N+ q* l8 n9 c
%用inline定义适应度函数以便于将子函数与主程序文件放在一起, D8 q$ y5 X+ i3 _7 K! @
%目标函数是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))2 F9 U( J) q, K, n9 M
%inline命令定义实应度函数如下; `7 o7 m* ^% h2 e
fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x'); a0 l- n. W. ]+ x [ E
%inline定义的实验度函数会使程序运行速度大大降低) f* K" Z7 E. h. ]
for i=1:particlesize : X' z0 L( r/ c q for j=1:narvs% F9 @- h! D3 p3 {
f(i)=fitness(x(i,j)); ' F- y6 `. O& W8 Z end, R/ w2 p. @7 c- T4 }$ ~$ Y' X0 {
end # V" o! ^$ T1 d( j. U4 z, dpersonalbest_x=x;& u: v; M. N' U; |
personalbest_faval=f; * Y ]7 m' l4 z K: d: ^$ K[globalbest_faval i]=min(personalbest_faval); t8 y# I# Y$ M/ e& J! d! t, Qglobalbest_x=personalbest_x(i,;% u a+ e, x! U% \# s# Y
k=1; ( R+ U. T* @: I4 B: S7 Z8 H5 U* rwhile k<=MaxNum% l9 @3 s% n2 |* `
for i=1:particlesize # I* X9 v; L) [3 { for j=1:narvs;, X3 j, G( O' N
f(i)=fitness(x(i,j)); A8 e! j* s3 }( Z* f1 ] end) _2 l0 ^) O( W. T* T
if f(i)<personalbest_faval(i) %判断当前位置是否历史上最佳位置, }, K& T9 y- q
personalbest_faval(i)=f(i); 4 ^) D# j( P! s! `& i personalbest_x(i,=x(i,; . w: i2 x6 e' f6 b1 I# j end, I' `9 d' s0 i( u c) v
end 6 w" y0 M; E9 ~9 i% @$ r* F [globalbest_faval i]=min(personalbest_faval);. N8 C8 E: S2 L4 P
globalbest_x=personalbest_x(i,; * L& B: `8 F3 ~4 P8 J for i=1:particlesize %更新粒子群里每个个体的最新位置 6 |; I# K( v6 f3 ?1 W" O* S v(i,=w*v(i,+c1*rand*(personalbest_x(i,-x(i,)...7 I( r! p# J/ Y( G) j
+c2*rand*(globalbest_x-x(i,); 4 ~; p, C' r& o! E8 m for j=1:narvs %判断粒子的飞翔速度是否超过了最大飞行速度 2 d N" [# U$ f6 n3 d. s- L. r" S if v(i.j)>vmax; . W% d8 E7 m& O" o5 O
v(i,j)=vmax; * T5 t. B# c) b% m else if v(i,j)<-vmax; ; T0 H' Z% {1 f4 l4 G v(i,j)=-vmax; * ~5 a2 {, K: P; L* Z5 r end! V* ~0 n' S u% _% r9 ?
end : |* k( \1 P$ v# s( x x(i,=x(i,+v(i,;6 b8 l5 }* R0 ^: ^" B( a
end, P% n/ A; n6 k" J5 t; k; R0 O
if abs(globalbest_faval)<E0,break,end 9 }. i3 ^7 a& z: L k=k+1; 2 X/ s; l8 a# T; e end( s/ W/ r: k+ k0 f a/ l7 X
Valuel=1/globalbest_faval-1;Valuel=num2str(Valuel); 0 e, x2 J3 d8 ~; n %strcat指令可以实现字符的组合输出1 ^. u2 j+ @8 G3 W5 M2 x5 Q5 O
disp(strcat('the maximun valuel','=',Valuel));( c4 L) j6 V" A- |1 K* \
%输出最大值所在的横坐标位置9 D+ G" w- B2 b q/ E
Value2=globalbest_x; Value2=num2str(Value2); " n1 A+ D" T8 O disp(strcat('the corresponding coordinate','=',Value2));' B2 V+ K: d- p0 J, _, T/ r# H0 g
x=-5:0.01:5; $ h( n8 V x' ?0 c y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);- T9 ?! `7 a( l( ~9 e0 {
plot(x,y,'m-','linewidth',3); ' X0 N7 e* ^$ E) L hold on;8 l3 w1 [7 t' ^, @$ n% d# B
plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);1 [1 [* W; _) p! U2 W* l* t7 V
legend('目标函数','搜索到的最大值'); " v" t* B1 k8 |+ Z# M xlabel('x');ylabel('y');grid on;toc;0 p8 N0 f4 ~8 I% Q' v' G+ H* r
( @0 I7 A- T% i : _% t2 t) a" Z+ `% B z错误提示 ??? function main() |& f/ X' |& c8 l7 |3 y4 {, O; A7 J
Error: Function definitions are not permitted in this context. & n$ p# n% E! X' Y, _4 F1 _( h " U) ?6 J# A o去掉function main()后 提示??? Undefined function or variable 'navrs'.错误。求指点! 5 }5 M, D. ~2 K( V8 I4 @! f" 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;