粒子群算法(matlab实现)

基本原理

算法归纳

粒子群算法(PSO),在PSO中,每一个优化问题的潜在解都是搜索空间的一只鸟,被称为粒子,全部的粒子都有一个由适应度函数决定的适值,每一个粒子还有一个速度决定它们“”飞行“”的方向和距离,而后粒子们就追随当前的最优粒子在解空间中搜索,整个过程大体为,PSO初始化为一群随机粒子(随机解),而后经过迭代找到最优解。在每一次迭代的过程当中,粒子经过跟踪两个极值来更新本身:第一个就是粒子自己所找到的最优解,这个解称为个体极值;另外一个极值是整个种群目前找到的最优解,这个解是全局极值web

式子说明

在这里插入图片描述
速度更新公式由三部分组成:算法

  • 第一部分为“惯性”部分,反映了粒子的运动习惯,表明粒子有维持本身先前速度的趋势
  • 第二部分为"认知"部分,反映了粒子对自身历史经验的记忆,表明粒子有向自身历史最佳位置逼近的趋势
  • 第三部分为"社会"部分,反映了粒子间协同合做的群体历史经验,表明粒子有向群体最佳位置逼近的趋势

对粒子群算法整个流程解释较详细的博文编程

程序设计

基本流程

在这里插入图片描述
在这里插入图片描述

代码部分

在matlab中编程实现的基本粒子群算法基本函数为PSO,其调用格式以下所示svg

[xm,fv]=PSO(fitness,N,c1,c2,w,M,D)

其中fitness为待优化的目标函数,也称适应度函数.N是粒子数目,c1是学习因子1,c2是学习因子2,w是惯性权重,M是最大迭代次数,D是搜索空间维数,xm是目标函数取最小值时的自变量,fv是目标函数最小值
代码以下:
函数PSO函数

function [xm,fv] = PSO (fitness,N,c1,c2,w,M,D)
format long;%有效数字16位
for i=1:N
  for j=1:D
    x(i,j)=randn; %随机初始化各个粒子位置
    v(i,j)=randn; %随机初始化各个粒子速度
  end
end
%%%%%%%%%%先计算各个粒子适应度,并初始p(i)和pg%%%%%%
for i=1:N
  p(i)=fitness(x(i,:)); %各个粒子最优适应度,由于第一代,个体最优适应度就是其自己的适应度
  y(i,:)=x(i,:); %各个粒子的个体最优位置,由于为第一代,个体最位置就是其自己
end
pg=x(N,:); %随意初始化,pg为全局最优位置
for i=1:N-1 %寻找全局最优位置
  if fitness(x(i,:)>fitness(pg))
    pg=x(i,:);
  end
end
%%%%进入主要循环,按照公式依次迭代,直到知足精度要求或者循环结束%%%%%%%%
for t=1:M
  for i=1:N
    v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:)); %优化粒子速度
    x(i,:)=x(i,:)+v(i,:); %优化粒子位置
    %防止越界,若越界,则取边界值,没有约束的话去掉这两个if语句
    if x(i,:)<-10
      x(i,:)=-10;
    end
    if x(i,:)>10
      x(i,:)=10
    end
    if fitness(x(i,:))>p(i) %更新个体最优
      p(i)=fitness(x(i,:));
      y(i,:)=x(i,:);
    end
    if p(i)>fitness(pg) %更新全局最优
      pg=y(i,:);
    end
  end
end
xm=pg';
fv=fitness(pg);

举例一:
求函数y=x^2的最小值,其中x在[-10,10]之间
fitness函数学习

function F = fitness (x)
  F=x.^2;
  F=-F; %函数越小,适应度越高

主程序优化

[xm1,fv1]=PSO(@fitness,50,1.5,2.5,0.5,100,1);% 50个粒子,c1是1.5,c2是2.5,w是0.5,迭代一百次,自变量个数为1
disp('目标函数最小时的自变量为:');
disp(xm1);
disp('目标函数的最小值为:');
disp(abs(fv1));

运行结果:
在这里插入图片描述
举例二:
求函数h=x^2+y^2+z^2的最小值
本身去掉PSO函数里面的那两个对自变量范围限制的if语句
fitness函数.net

function F = fitness (x)
  F=sum(x.^2);
  F=-F;

主程序设计

[xm1,fv1]=PSO(@fitness,50,1.5,2.5,0.5,100,3);% 50个粒子,c1是1.5,c2是2.5,w是0.5,迭代一百次,自变量个数为3
disp('目标函数最小时的自变量为:');
disp(xm1);
disp('目标函数的最小值为:');
disp(abs(fv1));

运行结果:
在这里插入图片描述3d

总结

粒子群算法的通用性较好,适合处理多种类型的目标函数约束问题,而且容易与传统的优化方法相结合,从而改进自身的局限性,更高效的解决问题,该算法具备随机性,故每次所求结果可能不一样