PSO(粒子群优化)算法在改进神经网络中的应用探索
粒子群优化算法(PSO)
Particle Swarm Optimization
1、 算法起源
粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
2、 算法描述
2.1、 百科定义
粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization),缩写为 PSO, 是近年来由J. Kennedy和R. C. Eberhart等开发的一种新的进化算法(Evolutionary Algorithm – EA)。PSO 算法属于进化算法的一种,和模拟退火算法相似,它也是从随机解出发,通过迭代寻找最优解,它也是通过适应度来评价解的品质,但它比遗传算法规则更为简单,它没有遗传算法的“交叉”(Crossover) 和“变异”(Mutation) 操作,它通过追随当前搜索到的最优值来寻找全局最优。这种算法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性。粒子群算法是一种并行算法。
2.2、 通俗点描述
如同前面的描述,PSO模拟的是鸟群的捕食行为。设想这样一个场景:一群鸟在随机搜索食物。在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻目前离食物最近的鸟的周围区域。
鸟群在整个搜寻的过程中,通过相互传递各自的信息,让其他的鸟知道自己的位置,通过这样的协作,来判断自己找到的是不是最优解,同时也将最优解的信息传递给整个鸟群,最终,整个鸟群都能聚集在食物源周围,即找到了最优解。
PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO 初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪**两个”极值”**来更新自己。**第一个就是粒子本身所找到的最优解,这个解叫做个体极值pBest。另一个极值是整个种群目前找到的最优解,这个极值是全局极值gBest。**另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
3、 粒子的属性
3.1 算法核心
粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。
鸟被抽象为没有质量和体积的微粒(点),并延伸到N维空间,粒子i在N维空间的位置表示为矢量Xi=(x1,x2,…,xN),飞行速度表示为矢量Vi=(v1,v2,…,vN)。每个粒子都有一个由目标函数决定的适应值(fitness value),并且知道自己到目前为止发现的最好位置(pbest)和现在的位置Xi。这个可以看作是粒子自己的飞行经验。除此之外,每个粒子还知道到目前为止整个群体中所有粒子发现的最好位置(gbest)(gbest是pbest中的最好值),这个可以看作是粒子同伴的经验。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。
3.2 速度和位置的更新
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。
第①部分称为【记忆项】,表示上次速度大小和方向的影响;
第②部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;
第③部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。
以上面两个公式为基础,再来看一个公式:
4、 标准PSO算法流程
4.1、 标准PSO算法的流程
1)初始化一群微粒(群体规模为N),包括随机位置和速度;
2)评价每个微粒的适应度;
3)对每个微粒,将其适应值与其经过的最好位置pbest作比较,如果较好,则将其作为当前的最好位置pbest;
4)对每个微粒,将其适应值与其经过的最好位置gbest作比较,如果较好,则将其作为当前的最好位置gbest;
5)根据公式(2)、(3)调整微粒速度和位置;
6)未达到结束条件则转第2)步。
迭代终止条件根据具体问题一般选为最大迭代次数Gk或(和)微粒群迄今为止搜索到的最优位置满足预定最小适应阈值。
4.2、 PSO流程图解
4.3、 学习因子c1、c2分析
公式(2)和(3)中pbest和gbest分别表示微粒群的局部和全局最优位置。
- 当C1=0时,则粒子没有了认知能力,变为只有社会的模型(social-only):
v i = ω × v i + c 2 × r a n d ( ) × ( g b e s t i − x i ) v_i = \omega × v_i+c_2 × rand() × (gbest_i – x_i) vi=ω×vi+c2×rand()×(gbesti−xi)
称为全局PSO算法。粒子有扩展搜索空间的能力,具有较快的收敛速度,但由于缺少局部搜 索,对于复杂问题 比标准PSO 更易陷入局部最优。
- 当C2=0时,则粒子之间没有社会信息,模型变为只有认知(cognition-only)模型:
v i = ω × v i + c 1 × r a n d ( ) × ( p b e s t i − x i ) v_i = \omega × v_i+c_1 × rand() × (pbest_i – x_i) vi=ω×vi+c1×rand()×(pbesti−xi)
称为局部PSO算法。由于个体之间没有信息的交流,整个群体相当于多个粒子进行盲目的随 机搜索,收敛速度慢,因而得到最优解的可能性小。
5、代码实操
找到三维图示的最高点坐标:
% 函数表达式
function y = fit( x )
y = 3*(1-x(1)).^2.*exp(-(x(1).^2) - (x(2)+1).^2) - 10*(x(1)/5 - x(1).^3 - x(2).^5).*exp(-x(1).^2-x(2).^2) - 1/3*exp(-(x(1)+1).^2 - x(2).^2);
end
% main.m
clc
clear
close all
%% 参数初始化
c1 = 1.5; % 学习因子
c2 = 1.5;
w=0.7; % 惯性权重
D=2; % 粒子维度
maxgen = 20; % 迭代次数
sizepop = 5; % 种群大小
Vmax = 1.5; % 速度的范围
Vmin = -1.5;
popmax = 3; % 搜索的范围
popmin = -3;
%% 种群初始化
for i = 1:sizepop
% 随机产生一个种群
pop(i,:) = rand(1,D)*2*popmax-popmax; % 初始化位置
V(i,:) = 0.5 * rands(1,D); % 初始化速度
% 适应度计算
fitness(i) = fit(pop(i,:));
end
%% 个体极值和群体极值
[bestfitness,bestindex] = max(fitness); % 默认将第一代的最大适应度值设置为最佳
zbest = pop(bestindex,:); % 全局最佳
gbest = pop; % 个体最佳
fitnessgbest = fitness; % 个体最佳适应度值
fitnesszbest = bestfitness; % 全局最佳适应度值
%% 迭代寻优
for i = 1: maxgen
for j = 1:sizepop
% 速度更新
V(j,:) = w*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
% 速度越界检查
V(j,find(V(j,:)>Vmax)) = Vmax;
V(j,find(V(j,:)<Vmin)) = Vmin;
% 种群更新
pop(j,:) = pop(j,:) + V(j,:);
% 个体范围越界检查
pop(j,find(pop(j,:)>popmax)) = popmax;
pop(j,find(pop(j,:)<popmin)) = popmin;
% 适应度值计算
fitness(j) = fit(pop(j,:));
end
for j = 1:sizepop
% 个体最优更新
if fitness(j) > fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
% 全局最优更新
if fitness(j) > fitnesszbest
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
% 记录每一代的最优值
bestx(i) = zbest(1);
besty(i) = zbest(2);
yy(i) = fitnesszbest;
disp(['迭代次数:',num2str(i),',最大值为:',num2str(yy(i)),',坐标:',num2str(bestx(i)),',',num2str(besty(i))]);
end
%% 输出结果并绘图
x = -3:0.01:3;
y = -3:0.01:3;
[X,Y]=meshgrid(x,y);
z = 3*(1-X).^2.*exp(-(X.^2) - (Y+1).^2) - 10*(X/5 - X.^3 - Y.^5).*exp(-X.^2-Y.^2) - 1/3*exp(-(X+1).^2 - Y.^2);
mesh(x,y,z);
hold on
plot3(bestx,besty,yy,'r.','MarkerSize',10);
输出结果:
红点为每轮迭代的最优粒子点。
上一篇: python读写LMDB文件的方法
下一篇: 简单易懂详解:粒子群优化算法概览
推荐阅读
-
探究使用MATLAB实现的粒子群优化算法在函数优化中的应用研究
-
PSO(粒子群优化)算法在改进神经网络中的应用探索
-
使用PSO粒子群算法改进RBF神经网络在MATLAB中的数据预测仿真研究
-
使用PSO粒子群优化算法在MATLAB中模拟TSP问题的最短路径寻找
-
如何运用粒子群算法优化BP神经网络的功能与应用探索
-
简单易懂版 - 什么是粒子群算法(PSO)?" - PSO 是这样工作的: 想象一群小鸟寻找食物,它们会互相学习、竞争并跟随最优秀的伙伴。这就是模仿群体智慧(Swarm Intelligence,SI)的粒子群优化算法,由 Eberhart 博士和 Kennedy 博士创造,属于多智能体优化系统(MAOS)的一员。 - 数学背后的逻辑: - 每只“鸟”(粒子)依据邻居过去的发现来飞得更好: 1. 受到激励的好位置(Pbest) 2. 与附近伙伴的成绩对比 3. 阿婆姨领先者的模仿 - 模型简化来说,每个粒子像 D 维空间的理想点,按特定速度飞行,速度随自身经验和同伴表现实时调整。我们用 Xi 表示 D 个粒子的集合,其中 Pi 存储过最佳位置,Pg 是群体中最优的位置,Vi 是粒子的速度。 - 更新规则: - **速度更新**:有点像梯度下降法中的导数概念,但因鸟群数量大,能有效跳出局部最优区域,引导群体朝全局最优方向前进。 - **位置更新**:在固定的时间内,新移动的距离就是 Vi(即速度向量在单位时间内的累积效果)。 - 参数简述:粒子群算法涉及多个参数,如粒子数量、学习因子(影响对过去经验的重视程度)、加速常数(控制探索与利用之间的平衡),这些参数的选择会影响算法的实际性能和收敛速度。
-
简单讲解粒子群优化算法(PSO)及其在MATLAB中的实战实现指南
-
实操解析:粒子群优化算法(PSO)在数学建模中的应用 - 附带Matlab实例与万字详解