基本原理
算法概括
粒子群算法(PSO),在PSO中,每个优化问题的潜在解都是搜索空间的一只鸟,被称为粒子,所有的粒子都有一个由适应度函数决定的适值,每个粒子还有一个速度决定它们“”飞行“”的方向和距离,然后粒子们就追随当前的最优粒子在解空间中搜索,整个过程大致为,PSO初始化为一群随机粒子(随机解),然后通过迭代找到最优解。在每一次迭代的过程中,粒子通过跟踪两个极值来更新自己:第一个就是粒子本身所找到的最优解,这个解称为个体极值;另一个极值是整个种群目前找到的最优解,这个解是全局极值
式子说明
速度更新公式由三部分组成:
- 第一部分为“惯性”部分,反映了粒子的运动习惯,代表粒子有维持自己先前速度的趋势
- 第二部分为"认知"部分,反映了粒子对自身历史经验的记忆,代表粒子有向自身历史最佳位置逼近的趋势
- 第三部分为"社会"部分,反映了粒子间协同合作的群体历史经验,代表粒子有向群体最佳位置逼近的趋势
对粒子群算法整个流程解释较详细的博文
程序设计
基本流程
代码部分
在matlab中编程实现的基本粒子群算法基本函数为PSO,其调用格式如下所示
[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函数
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));
运行结果:
总结
粒子群算法的通用性较好,适合处理多种类型的目标函数约束问题,并且容易与传统的优化方法相结合,从而改进自身的局限性,更高效的解决问题,该算法具有随机性,故每次所求结果可能不同