📄 pso4.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%测试函数为Rastrigin,这是一个多峰值函数,其局部最优位置随着正弦波动,最优解为x*=0,f(x*)=0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;
success = 0; % Success flag 寻优成功标志
PopSize = 30; % Size of the swarm 群的大小即粒子的个数
MaxIt = 100; % Maximum number of iterations 最大迭代数
iter = 1; % Iterations’counter 迭代次数
c1 = 2; % PSO parameter C1
c2 = 2; % PSO parameter C2
w = 0.4; % inertia weight 惯性权值
unchange=0;
dim = 2; % Dimension of the problem 目标函数维数
upband = 6; % Upper bound for init. of the swarm 种群初始化的上限
lowband = -6; % Lower bound for init. of the swarm 种群初始化的下限
vmin = -1.8; %粒子速度下限值
vmax = 1.8; %粒子速度上限值
ErrGoal = 1e-8; % Desired accuracy 最优值变化值小于次,判断算法停止
%pbest为种群每个粒子最佳位置,gbest为种群最佳的位子,fpopul为每个例子的适应度值
tic; %计时开始
% Initializing swarm and velocities 初始化种群和粒子速度
popul = rand(dim, PopSize)*(upband-lowband) + lowband;
vel = rand(dim, PopSize)*(vmax-vmin)+ vmin;
%计算初始化后粒子的适应值
for i=1:PopSize,
fpopul(i) = (popul(1,i)^2-10*cos(2*pi*popul(1,i))+10)+(popul(2,i)^2-10*cos(2*pi*popul(2,i))+10);
end
pbest = popul; %每个粒子经历的最好的位置
lfpopul = fpopul;
[bestfpopul(iter),g] = min(fpopul);
for i=1:PopSize,
gbest(:,i)=popul(:,g); %整个粒子群经历的最好的位置
end
%迭代计算
while(success==0)&(iter<MaxIt),
iter=iter+1;
r1=rand(dim,PopSize);
r2=rand(dim,PopSize);
vel=w*vel+c1*r1.*(pbest-popul)+c2 *r2.*(gbest-popul);
popul=popul+vel;
%限制粒子的位置,使粒子不超出范围
for i=1:PopSize,
for j=1:dim,
if popul(j,i)>6
popul(j,i)=6;
end
if popul(j,i)<-6
popul(j,i)=-6;
end
end
end
% Evaluating the new particle swarm评估新的种群
for i=1:PopSize,
fpopul(i) = (popul(1,i)^2-10*cos(2*pi*popul(1,i))+10)+(popul(2,i)^2-10*cos(2*pi*popul(2,i))+10);
end
% Updating the best position for each particle 更新每个粒子的最佳位置
for i=1:PopSize,
if fpopul(i)<lfpopul(i)
pbest(:,i)=popul(:,i);
else
fpopul(i)=lfpopul(i);
end
end
lfpopul=fpopul;
%更新整个粒子群经历的最好的位置
for i=1:PopSize,
gbest(:,i)=pbest(:,g);
end
%计算此次迭代后最优值
for i=1:PopSize,
fpbest(i) = (pbest(1,i)^2-10*cos(2*pi*pbest(1,i))+10)+(pbest(2,i)^2-10*cos(2*pi*pbest(2,i))+10);
end
[bestfpopul(iter),g]=min(fpbest);
%判断两次寻优结果的误差值,如果小于设定值,整个迭代过程结束
if abs(bestfpopul(iter)-bestfpopul(iter-1))<=ErrGoal
unchange=unchange+1;
else
unchange=0;
end
if unchange==10
success=1;
end
end
%输出寻优结果和寻优结束时寻优结果的误差值
t=toc; %计算算法所用时间,并赋值给t
result=bestfpopul(iter);
result
iter
popul(:,g)
t
%绘制图形
xx=linspace(1,iter,iter);
yy=bestfpopul(xx);
plot(xx,yy,'r-');
axis([0 iter -2 30]);
grid;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -