>> function main()( w' M- w0 r, |6 Z I, X
clc;clear all;close all;4 F- w3 D7 I! H e# x v$ R
tic; %程序运行计时1 w Y5 R" y# w- ~) d" v
E0=0.001; %允许误差) V0 I- s6 s' O, p' }% e1 ^
MaxNum=100; %粒子最大迭代次数$ w% z, F: e2 Z% d4 }) n
narvs=1; %目标函数自变量个数 ' t! {' h7 }6 i4 _particlesize=30; %粒子群规模( J# n& t6 b5 \( [. @; Z6 C8 s) z
c1=2; %每个粒子个体学习因子,也称加速常数 ( [5 B% J( y: {3 ]/ q, } S$ c8 rc2=2; %每个粒子的社会学习因子,也称加速常数 8 x5 t# b+ D3 }# @- _; ]6 j8 qw=0.6; %惯性因子 ( B. }5 Z3 w- Jvmax=0.8; %粒子最大飞翔速度$ E( ~5 D( H- G2 G3 P- D$ X
x=-5+10*rand(particlesize,narvs); %粒子所在位置 9 M2 Z' o$ Q* }1 C" x2 Hv=2*rand(particlesize,navrs); %粒子的飞翔速度 I1 r* f: S5 h4 X a# S. @%用inline定义适应度函数以便于将子函数与主程序文件放在一起,4 \+ b" P y0 ]
%目标函数是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))" ~% w/ k8 S3 u$ K" t5 s
%inline命令定义实应度函数如下, y- p, F5 k; Y7 ?
fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x'); ; I; \+ g G$ v9 S/ U5 C- y) h%inline定义的实验度函数会使程序运行速度大大降低" V) @5 F3 Q4 S- e$ z& [+ r
for i=1:particlesize- P7 J' j- F% ^4 Z$ M9 i& y
for j=1:narvs 8 Q) M2 H& n+ J. k8 Z f(i)=fitness(x(i,j));5 ]) c Y \; g. S2 e
end8 x* d0 g$ f: \
end / l; D( V0 h7 M: Mpersonalbest_x=x;3 S: g6 F, ~" j2 Y
personalbest_faval=f; 9 w! M! a0 \/ M/ T9 _0 K[globalbest_faval i]=min(personalbest_faval);7 h2 Y1 F, k0 d6 T, L7 y
globalbest_x=personalbest_x(i,;1 e2 z( E( \; P; }5 W; z
k=1; $ D3 A4 e# e0 xwhile k<=MaxNum% n, o, f a* c- W5 `# Q
for i=1:particlesize: A M, b4 \3 F) d; m
for j=1:narvs; l# C' L, s( s- f f(i)=fitness(x(i,j));2 m. J7 s! a7 u' ]: |
end$ u' W8 v, E+ r% h) x0 c% Q
if f(i)<personalbest_faval(i) %判断当前位置是否历史上最佳位置 D# ?3 Q4 _6 @2 a) j! {
personalbest_faval(i)=f(i); % Z$ @6 R6 {, s/ W' p2 b personalbest_x(i,=x(i,; : {% B! D5 A H9 E( Q# T$ `& b- A end + E. F3 I1 z0 S, g$ T end 8 L0 B' S) s$ q$ y1 ~ [globalbest_faval i]=min(personalbest_faval);+ f, K$ A2 p: Z" ]* X
globalbest_x=personalbest_x(i,; / Y% s3 t2 w! J: J" L for i=1:particlesize %更新粒子群里每个个体的最新位置 6 n& D5 Q: O# P2 X) s4 u R& r v(i,=w*v(i,+c1*rand*(personalbest_x(i,-x(i,)... ' V) i! z: B$ X4 o, r" a +c2*rand*(globalbest_x-x(i,); 8 D- f3 g' d9 W R$ i" k7 |* N for j=1:narvs %判断粒子的飞翔速度是否超过了最大飞行速度! D, \( c$ f& a
if v(i.j)>vmax; , R/ [8 ]+ v! z6 ] v(i,j)=vmax;5 z9 t9 ]- X, n( ], v6 Y
else if v(i,j)<-vmax; ! K! I" b( V2 N2 W5 V: Q% ?3 { v(i,j)=-vmax; ( ]- l4 c1 i" s( v+ } T% P% R end 0 K% G2 W H: t# ], ?: h* p/ m- L) k, e end / f9 v0 x3 J( m3 w t7 x$ C x(i,=x(i,+v(i,; 0 ?% L5 q8 M* k$ i end7 \, T* k6 b( G3 o
if abs(globalbest_faval)<E0,break,end 5 C2 ^! s$ _8 D0 o k=k+1;, ?3 Z h3 v: W& q, g7 D4 {
end ; a z$ Y& ?9 A5 g2 J2 K% B Valuel=1/globalbest_faval-1;Valuel=num2str(Valuel);% T' L& O" v' b! I4 J1 q
%strcat指令可以实现字符的组合输出% d- ~& L7 |9 G7 i- y
disp(strcat('the maximun valuel','=',Valuel)); ; ]: h3 J+ Y# j Z6 \ %输出最大值所在的横坐标位置3 \5 @) M ]" q( A2 p% D" E Y. r& C
Value2=globalbest_x; Value2=num2str(Value2); 1 s& }4 Z& s( q9 H disp(strcat('the corresponding coordinate','=',Value2)); 5 J3 K `6 y3 t9 R9 S x=-5:0.01:5; 2 b# t& e7 K8 ~: G# K y=2.1*(1-x+2*x.^2).*exp(-x.^2/2); 4 p) G/ L k9 I& x1 N# h plot(x,y,'m-','linewidth',3); % O) C& s1 K& n; q+ h& u5 f hold on; # S* s) H. C- h6 X# h- m plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4); 7 `( ^3 Z3 U, b, B5 W& n* _ legend('目标函数','搜索到的最大值');8 W6 P' d; |) I `! F
xlabel('x');ylabel('y');grid on;toc;8 u: u4 W8 f4 X3 t! `
0 T, G" t0 T% t$ |* `" y6 s
$ ]3 i! K8 ?3 m9 M# B错误提示 ??? function main() |( u" W7 u; @; y# Z. ^
Error: Function definitions are not permitted in this context. 8 z6 B' e5 X) n' n& u9 C6 r( s 4 g4 s2 b: [& R0 a0 i6 M7 w G% a去掉function main()后 提示??? Undefined function or variable 'navrs'.错误。求指点!; }& {' w$ ~) \4 w
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;