⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pso4.m

📁 此文件为Matlab编的一个基本pso算法
💻 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 + -