%微粒群的速度更新迭代公式Vi(K+1)=W*Vi(K)+c1*rand*(pbest-Xi(K))+c2*rand*(gbest-Xi(K))
%微粒群的位置更新迭代公式:Xi(K+1)=Xi(K)+Vi(K+1);
%W为惯性权因子。
%测试函数选择y=sinx,求y在区间-pi到pi之间的最小值,函数可以更换
wmax=0.9; %设置各项参数;
wmin=0.4;
g=str2num(get(handles.edit1,'string'));%从编辑框1获取输入的进化代数g
itmax=g; %微粒群迭代次数为g;
c1=1.4; %可调参数
c2=1.4; %可调参数
U=1.57;
Xmax=pi;
m=0;
n=1;
for iter=1:itmax %可调参数
W(iter)=wmax-((wmax-wmin)/itmax)*iter; %设置惯性权W,使它的值逐渐减小
end
a=-pi;
b=2*pi;
N=20; %微粒群大小为20个微粒
for i=1:N
x(i,1,1)=a+b*rand; %对各个微粒位置进随机初始化,Xi的取值范围是-pi到pi
V(i,1,1)=m+(n-m)*rand; %对各个微粒速度进随机初始化,取值范围是0到1
F(i,1,1)=sin(x(i,1,1)); %各个微粒初始函数值
end
[C,I]=min(F(:,1,1)); %找出总共20个微粒中使函数值最小的那个微粒,设为第I个微粒
gbest(1)=x(I,1,1); %gbest(1)为第一代全局微粒的最好位置
Fbest(1)=sin(gbest(1)); %Fbest(1)为初始化时,全局最小函数值
for i=1:N;
pbest(i,1,1)=x(i,1,1); %设置第i个微粒的个体最好位置的初始值
end
V(:,1,2)=W(1)*V(:,1,1)+c1*rand*(pbest(:,1,1)-x(:,1,1))+c2*rand*(gbest(1)-x(:,1,1)); %第二代微粒的速度和位置;
x(:,1,2)=x(:,1,1)+V(:,1,2);
for j=2:(itmax-1)
for i=1:N;
F(i,1,j)=sin(x(i,1,j)); %计算全局微粒从第二代到第(itmax-1)代的函数值;
end
[C,I]=min(F(:,1,j)); %当进化到第j代时,找出使数值为最小的那个微粒,为第I个微粒;
gbest(j)=x(I,1,j); %进化到第j代的全局微粒最好位置;
Fbest(j)=sin(gbest(j)); %第j代的全局微粒最小函数值;
[C,I]=min(Fbest(:));
if Fbest(j)<=C %使第j代的全局微粒最小函数值gbest(j)为
gbest(j)=gbest(j);%从第1代到第j代的全局微粒的最小函数值的微粒位置
else
gbest(j)=gbest(I);
end
Fbest(j)=sin(gbest(j)); %进化至第j代时的全局最小函数值;
for i=1:N;
[C1,K1]=min(F(i,1,:));
if F(i,1,j)<=C1
pbest(i,1,j)=x(i,1,j);
else
pbest(i,1,j)=x(i,1,K1);%第i个微粒从第1代进化到第j代时的个体最好位置为pbest(i,1,j);
end
end
V(:,1,j+1)=W(j)*V(:,1,j)+c1*rand*(pbest(:,1,j)-x(:,1,j))
+c2*rand*(gbest(j)-x(:,1,j));
x(:,1,j+1)=x(:,1,j)+V(:,1,j+1); %第j代到第j+1代的速度和位置更新;
if x(:,1,j+1)>Xmax %控制x的范围不超出[-Xmax, Xmax];
x(:,1,j+1)=Xmax;
else if x(:,1,j+1)<-Xmax
x(:,1,j+1)=-Xmax;
end
end
if V(:,1,j+1)>U %控制v的范围不超出[-U,U];
V(:,1,j+1)=U;
else if V(:,1,j+1)<-U
V(:,1,j+1)=-U;
end
end
end
hold on
g=str2num(get(handles.edit1,'string'));%此句一定要加上,虽然上面已经定义过,不然仿真会出错
for i=1:g
title('微粒寻优轨迹')
xlabel('微粒进化代数')
ylabel('微粒的位置和速度')
plot(i,x(5,1,i),'*r') %输出第5个微粒的位置进化趋势;
plot(i,V(5,1,i),'xb')
end
disp('全局最好位置G为:')
G=min(gbest(:)) %取gbest的最小为全局最优位置
[A,B]=min(Fbest(:));
disp('优化函数最小值为:')
A %全局最小值A;
disp('最小值所处的进化代数:')
B %全局最小值所处进化代数B
set(findobj(gcbf,'tag','edit2'),'string',B);%将进化代数B送编辑框2显示
set(findobj(gcbf,'tag','edit3'),'string',A);%将全局最小值A送编辑框3显示
set(findobj(gcbf,'tag','edit4'),'string',G);%将全局最优位置G送编辑框4显示