>> function main()! V# l+ F, Z+ S" {0 H" L
clc;clear all;close all; / q7 |' P9 O2 E* itic; %程序运行计时$ ~1 E7 Q7 @% _% E! I- [( k
E0=0.001; %允许误差$ ~9 u) t/ b0 n( B
MaxNum=100; %粒子最大迭代次数" \3 r1 k* [8 n1 \" a$ t+ y$ |7 b, `
narvs=1; %目标函数自变量个数# P% {6 Q% ]8 B4 ^/ [, ?
particlesize=30; %粒子群规模9 X3 g/ @' _% N, l
c1=2; %每个粒子个体学习因子,也称加速常数6 T6 q8 _. G4 k# ?
c2=2; %每个粒子的社会学习因子,也称加速常数- |; u0 V6 f0 x- c; ]3 h& k
w=0.6; %惯性因子9 @; x9 F; ?" ?8 C( r- z# {% X
vmax=0.8; %粒子最大飞翔速度1 r! B% K8 ^4 y% y8 |, K6 C
x=-5+10*rand(particlesize,narvs); %粒子所在位置 2 ]" w* B6 [( }. s, Uv=2*rand(particlesize,navrs); %粒子的飞翔速度 $ Z- ?7 g9 e8 q7 v%用inline定义适应度函数以便于将子函数与主程序文件放在一起,/ _( I8 c9 Z, W& q6 ^; A
%目标函数是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))1 l% L$ [0 A2 Z
%inline命令定义实应度函数如下 ! A$ K3 i, J" Efitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');/ ^# `: C; c, S3 d
%inline定义的实验度函数会使程序运行速度大大降低 + c! R/ t) X! n9 [1 K, H- ^; qfor i=1:particlesize - c/ V8 y/ S" _2 N for j=1:narvs & j) d- `4 a* q) P2 W f(i)=fitness(x(i,j)); 9 F# D9 |& n4 T end6 r6 M. p" r) B
end, F' X4 K' @" e; M. w/ H
personalbest_x=x;1 b" p& ?" I2 i& @" G* A. r
personalbest_faval=f; - b+ z! @/ S- }! N0 e$ W3 Z4 Q" o[globalbest_faval i]=min(personalbest_faval);0 O7 f1 J) I+ r* D, p! \! U% n9 ~6 M
globalbest_x=personalbest_x(i,; 5 }# C# K3 @7 d0 t5 |+ b* f9 j3 Pk=1; * u. R: S6 x# h) Z, p9 Ywhile k<=MaxNum* N% S& m" Z# q; G U$ P
for i=1:particlesize, ?! U- y3 x$ C! e0 e
for j=1:narvs;/ }$ o# `; I* ?8 t' k- g" c: x
f(i)=fitness(x(i,j)); 4 V7 K+ a9 ^- A( K9 w2 R! e. P end( q/ e2 I c( u/ H
if f(i)<personalbest_faval(i) %判断当前位置是否历史上最佳位置) K, ?$ z( m4 j$ y& H' w: f) c
personalbest_faval(i)=f(i);) G2 p h" {8 S4 r. k( m
personalbest_x(i,=x(i,; 7 t+ B8 s$ ~6 F) v$ ~ end 3 x" C8 G4 W9 d end. N# L2 k8 K/ `$ e
[globalbest_faval i]=min(personalbest_faval);. _( v3 C8 s+ ` O
globalbest_x=personalbest_x(i,;* P: d: T& I+ A( H' i
for i=1:particlesize %更新粒子群里每个个体的最新位置 " j7 v0 j. v) B v(i,=w*v(i,+c1*rand*(personalbest_x(i,-x(i,)...( r+ `5 D. `" \ A& ?- O
+c2*rand*(globalbest_x-x(i,);. |0 s B2 u8 E% F; c
for j=1:narvs %判断粒子的飞翔速度是否超过了最大飞行速度 % z$ Q; }" O2 w- Y if v(i.j)>vmax; 9 E* P8 k) Q7 c4 |. V0 M; c) {0 G v(i,j)=vmax;6 V" y' R+ u6 Y' i6 V# |) O
else if v(i,j)<-vmax;, x5 M9 m& T k1 n$ F) m( s" b
v(i,j)=-vmax; a' n3 Y# n- h* ^0 \3 w2 P end) n( T3 [" f' w% B7 w: s, v4 M
end7 o! p3 x g& s5 {
x(i,=x(i,+v(i,; - b+ I3 }/ E) x" t: S9 {9 H& _ end ! }. S" _9 y9 ]+ F# m if abs(globalbest_faval)<E0,break,end . A' `! i4 P, t6 D: K k=k+1; " L' w0 h& c: n" j" A8 f end % i1 s- B) i$ H4 S; @6 F. N b Valuel=1/globalbest_faval-1;Valuel=num2str(Valuel); 9 i7 g# Z3 n, _- m' K) @7 Z %strcat指令可以实现字符的组合输出 % C" E5 B9 t6 O. B; p; {; S" \ disp(strcat('the maximun valuel','=',Valuel));5 s3 p J* D6 |+ T- y; q! x0 @
%输出最大值所在的横坐标位置, o' A0 u) P7 w8 A6 K+ R, G F& j
Value2=globalbest_x; Value2=num2str(Value2);$ V0 H9 d, l5 s2 n2 x$ Q1 O/ b
disp(strcat('the corresponding coordinate','=',Value2)); % f/ L! g0 X7 G1 Y0 z, Y* g x=-5:0.01:5;( z9 j" C( l- |4 L& o" w/ K
y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);; g! C- j( N: W, J
plot(x,y,'m-','linewidth',3);$ ]6 F2 F! _5 v1 I1 g
hold on;: N+ x& A; o! c; a3 B3 p/ ]/ z
plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4); I8 a/ r( M+ X, l) h8 J legend('目标函数','搜索到的最大值'); ! J# {( q3 B- y. Q% B xlabel('x');ylabel('y');grid on;toc;4 u2 K1 v4 r" Z' n
. \, ^- ~$ @+ L% r 2 V% M+ n. |, R0 f9 Y! e; t3 T7 l错误提示 ??? function main() |5 |4 v5 f) V# _* }$ M) L
Error: Function definitions are not permitted in this context. ; t5 i* U2 N: `& ^" }: X# M; z 7 ^$ {" p6 j+ P( b# C# B去掉function main()后 提示??? Undefined function or variable 'navrs'.错误。求指点! " I2 }$ _0 w! {& `- k; X
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;