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