目录
0 引言
粒子群算法(Particle swarm optimization,PSO)是Eberhart等学者在1995年基于鸟群捕食行为研究提出的智能算法。该算法模拟赋予鸟群为粒子形式,通过当前最佳和全局最佳鸟群粒子影响来实现捕食,从而更新自身位置来实现对解空间的搜索,最终更新下一轮全局和局部最优,实现进化过程。
1 数学模型
PSO基于粒子形式模拟鸟群,基于俩个‘极值’来更新自身与猎物距离,从而更新新一轮粒子位置,区数学模型如下:
1)初始化:PSO也是群智能算法一种,其种群在问题维度边界内进行随机生成,其式子如下:
式中i为种群数量,D为问题维度。
2)速度更新:速度向量控制着粒子在搜索空间中移动,该数学模型由三个术语组成来实现对搜索空间全局和局部性能的平衡,分别为记忆项、局部认知项和全局认知项。因此速度被定义为:
式中t为迭代次数,Pi为局部最优粒子位置向量,g为全局最优粒子位置向量,c1,c2为局部和全局的学习因子,R1,R2为随机数。
3)粒子位置更新:在粒子速度确定后,粒子根据以下运动方程来定义参数空间中的轨迹(即迭代更新其位置),其表达式为:
4)引入惯性权重:在后续发展过程中,也有学者研究发现PSO算法容易发生梯度爆炸引起群散落,难以收敛,因此引入惯性权重来避免这种情况,具体策略如下:
式中ω为自适应权重,其表达式如下表:
2 优化方式
前篇对BP神经网络原理讲解(BP神经网络原理及Matlab代码复现-CSDN博客),从BP神经网络原理讲解中可以发现预测值主要受权值和阈值调整修正完成。因此结合上述PSO原理介绍,可以将BP神经网络权值和阈值作为鸟群粒子的位置向量,每一个位置向量对应BP神经网络的预测值,将这个预测值作为适应度定义全局和局部最优粒子,进行每一项粒子的位置及速度更新,比选优势个体进入下一轮算法行为。
3 MATLAB代码复现
3.1 伪代码
3.2 PSO主函数代码
%% PSO主函数
for it=1:MaxIt
for i=1:nPop
% 更新速度
particle(i).Velocity = w*particle(i).Velocity ...
+c1*rand(VarSize).*(particle(i).Best.Position-particle(i).Position) ...
+c2*rand(VarSize).*(GlobalBest.Position-particle(i).Position);
% 速度边界
particle(i).Velocity = max(particle(i).Velocity,VelMin);
particle(i).Velocity = min(particle(i).Velocity,VelMax);
% 更新位置
particle(i).Position = particle(i).Position + particle(i).Velocity;
% 超边界处理
IsOutside=(particle(i).Position<VarMin | particle(i).Position>VarMax);
particle(i).Velocity(IsOutside)=-particle(i).Velocity(IsOutside);
% 位置限制
particle(i).Position = max(particle(i).Position,VarMin);
particle(i).Position = min(particle(i).Position,VarMax);
% 适应度
particle(i).Cost = CostFunction(particle(i).Position);
% 更新个体最优位置
if particle(i).Cost<particle(i).Best.Cost
particle(i).Best.Position=particle(i).Position;
particle(i).Best.Cost=particle(i).Cost;
% 更新全局最优位置
if particle(i).Best.Cost<GlobalBest.Cost
GlobalBest=particle(i).Best;
end
end
end
BestCost(it)=GlobalBest.Cost;
w=w*wdamp;
end
3.3 PSO-BP
单输出回归预测模型、多输出回归预测模型、分类模型和时间序列模型的代码: