粒子群算法学习
一、简介~
因鸟而起~:
- 1995年,美国社会心理学者James Kennedy和电气工程师Russell Eberhart合作提出了粒子群算法。他们在模拟鸟群觅食的社会模型时获得了启发,将这个模型应用到优化问题求解中,开发出了粒子群算法。
- 该算法模拟鸟群觅食的行为,每个解对应一个鸟,称为“粒子”。粒子在解空间飞行,当粒子发现更好的解时,会向那里飞行。全体粒子最终会聚集到最优解处。
- 粒子群算法借鉴了遗传算法的思想,但它没有遗传算法的选育、交叉、变异等操作。其只根据粒子本身经验和群体经验来调整粒子的飞翔方向和速度。
- 与遗传算法等其他群智能优化算法相比,粒子群算法具有计算简单、易实现、快速收敛等特点,因此应用广泛。
二、粒子群优化~
2.1 工作原理
假设有一群鸟在某个区域觅食,目标是找到食物最丰富的地方。
- 每只鸟可以看作一个"粒子",它可以在区域内飞翔,代表算法中的一个潜在解。
- 每只鸟有一个当前位置(解)和飞翔速度。它会根据自身以往的觅食经验,和群体中其他鸟所传递的食物信息,来调整自己的飞行方向和速度。
- 每只鸟都记载着它自己发现过的食物最丰富的位置(个体经验最优,pbest)。整群鸟发现的食物最丰富区域就是全局最优(gbest)。
- 随着时间的迭代,每只鸟根据下式更新自己的速度和位置:
新速度 = 旧速度 + 自身经验 + 群体经验
新位置 = 旧位置 + 新速度 - 自身经验是它飞向自己最佳地点的趋势,群体经验是它飞向群体最佳地点的趋势。
- 通过这个更新过程,整群鸟会最终聚集在食物最多的那片区域。
2.2 基本参数
- S ( n ) = { s 1 , s 2 , … , s n } S(n)=\{s_1,s_2,\dots,s_n\} S(n)={s1,s2,…,sn} 表示一大群粒子集合
- s i s_i si 表示群体中具有位置 p i p_i pi 和速度 v i v_i vi 的个体
- p i p_i pi 为粒子 s i s_i si 的位置
- v i v_i vi 为粒子在 p i p_i pi 位置的速度
- p b e s t pbest pbest 为单个粒子的最优解(经验)
- g b e s t gbest gbest 为粒子群的最优解(经验),也就是全局最优解
- f f f 为适应度函数
- c 1 , c 2 c_1,c_2 c1,c2 为加速度函数(认知和社会参数)
- r 1 , r 2 r_1,r_2 r1,r2 为介于0~1之间的随机数
- t t t 为迭代次数
2.3 迭代方程
v i t + 1 = w v i t + c 1 r 1 ( p b e s t i t − p i t ) + c 2 r 2 ( g b e s t t − p i t ) \begin{equation} v^{t+1}_i=wv^t_i+c_1r_1(pbest^t_i-p^t_i)+c_2r_2(gbest^t-p^t_i) \end{equation} vit+1=wvit+c1r1(pbestit−pit)+c2r2(gbestt−pit)
p i t + 1 = p i t + v i t + 1 \begin{equation} p^{t+1}_i=p^t_i+v^{t+1}_i \end{equation} pit+1=pit+vit+1
式(1)为速度更新方程,式(2)为位置更新方程。
- v i t v^t_i vit 上一次迭代的速度;
- c 1 r 1 ( p b e s t i t − p i t ) c_1r_1(pbest^t_i-p^t_i) c1r1(pbestit−pit) 代表粒子本身经验的影响, c 1 c_1 c1 为粒子本身经验对自身的置信度, r 1 r_1 r1 为自身经验影响的随机效应;
- $c_2r_2(gbestt-pt_i) $ 代表社会经验对粒子的影响, c 2 c_2 c2 为社会经验对自身的置信度, r 2 r_2 r2 为社会经验影响的随机效应;
- 根据新得到的速度 v i t + 1 v^{t+1}_i vit+1 来更新位置 p i t + 1 p^{t+1}_i pit+1 ;
- w w w 为对上一次动作的信任程度,一种自适应调整的策略,随着迭代次数的增加,惯性权重 w w w 不断减小,从而使得粒子群算法在初期具有较强的全局收敛能力,在后期具有较强的局部收敛能力;
粒子当前位置 p i p_i pi 的个体经验会驱使它走向 p b e s t i pbest_i pbesti 处,但是收到群体经验的影响粒子也会趋向 g b e s t i gbest_i gbesti 处,根据其他因素 c 1 , c 2 , r 1 , r 2 c_1,c_2,r_1,r_2 c1,c2,r1,r2 的影响粒子同时会进行方向折中(两个方向都沾点)和幅度折中(两个方向的比例都沾点),根据式(1)可以得出最后的速度,从而驱动粒子从当前位置 p i p_i pi 走向新的位置,从而完成迭代。
2.4 优化步骤
三、 优化举例~
3.1 问题描述
Example:
已知函数
y = f ( x 1 , x 2 ) = x 1 2 + x 2 2 y=f(x_1,x_2)=x_1^2+x_2^2 y=f(x1,x2)=x12+x22
其中
− 10 ≤ x 1 , x 2 ≤ 10 -10 \leq x_1,x_2\leq 10 −10≤x1,x2≤10
求解y的最小值
3.2 Matlab代码
clc;clear;close all;
%% 功能 PSO算法求最小值
%% 说明
% PSO算法,寻找函数y的最小值
% 其中 y = f(x1,x2) = x1^2+x2^2
% x的范围 -10 <= x1,x2 <= 10
% 无惯性因子w或w=1,维度为1
%% 参数
% v_max :粒子速度最大值
% v_min :粒子速度最小值
% p_max :粒子位置最大值
% p_min :粒子位置最小值
% p_num :粒子个数
% fvar :目标函数自变量个数function varries
% t :迭代次数
% t_max :最大迭代次数
% pos :粒子位置向量position
% spd :粒子速度向量speed
% pbest :粒子个体最优解(经验)
% gbest :粒子群体最优解(经验)
% c1 :粒子的个体学习因子
% c2 :粒子的社会学习因子
% p_cfit:粒子当前适应度向量current fitness
% p_bfit:粒子最优适应度向量best fitness
% g_bfit:粒子群体最优适应度
% g_bs :存储向量->粒子群体最优适应度
% cond1 :群体最优适应度<cond1退出循环
%% 基本常量初始化
p_num = 20;
fvar = 2;
cond1 = 0;
v_max = 4;
v_min = -2;
p_max = 10;
p_min = -10;
c1 = 2;
c2 = 2;
t = 1;
t_max = 300;
p_cfit = zeros(p_num,1);
g_bs = zeros(t_max,1);
%% 主函数
%初始化粒子速度和位置
[spd,pos]= Init_pos_spd(v_min,v_max,p_num,fvar,p_min,p_max);
%初始化适应度函数值
[pbest,p_bfit,g_bfit,gbest] = Init_fits(p_num,pos,p_cfit);
while (t < t_max)%退出条件1:超过最大迭代次数
% 1.更新速度和位置
[pos,spd] = update_pos_spd(p_num,spd,pos,c1,c2,pbest, ...
gbest,fvar,v_min,v_max,p_min,p_max);
% 2.更新适应度函数值
[g_bfit,gbest,pbest,p_bfit] = update_fits(p_num,pos,p_bfit,p_cfit,pbest);
% 存储全局最优自适应函数值
g_bs(t) = g_bfit;
% 退出条件2:群体最优适应度 < cond1提前退出循环
if g_bfit < cond1
break
end
% 迭代+1
t = t + 1;
end
figure(1)
set(gcf,'color','white');
plot(1:length(g_bs),g_bs)
%% 函数块
function [fitness] = fit_fn(p)
% 适应度函数,计算粒子适应度
fitness = p(1)^2 + p(2)^2;
end
function [g_bfit,gbest,pbest,p_bfit] = update_fits(p_num,pos,p_bfit,p_cfit,pbest)
% 更新适应度函数值
for i=1:p_num
p_cfit(i)=fit_fn(pos(i,:));
if p_cfit(i) < p_bfit(i)
p_bfit(i) = p_cfit(i);
pbest(i,:) = pos(i,:);
end
end
[g_bfit,min_index]=min(p_bfit);
gbest = pbest(min_index);
end
function [position,speed] = update_pos_spd(p_num,spd,pos,c1,c2,pbest, ...
g_best,fvar,v_min,v_max,p_min,p_max)
% 更新速度和位置,加边界约束
for i=1:p_num
%更新速度向量
spd(i) = spd(i) + c1*rand*(pbest(i)-pos(i))+c2*rand*(g_best-pos(i));
%如果速度越界则取边界值
for j=1:fvar
if spd(i,j) < v_min
spd(i,j) = v_min;
end
if spd(i,j) > v_max
spd(i,j) = v_max;
end
end
%更新位置向量
pos(i) = pos(i) + spd(i);
%如果位置越界则取边界值
for j=1:fvar
if pos(i,j) < p_min
pos(i,j) = p_min;
end
if pos(i,j) > p_max
pos(i,j) = p_max;
end
end
end
position = pos;
speed = spd;
end
function [speed,position] = Init_pos_spd(v_min,v_max,p_num,fvar,p_min,p_max)
% 初始化速度、位置向量
speed = v_min + (v_max - v_min)*rand(p_num,fvar);
position = p_min + (p_max - p_min)*rand(p_num,fvar);
end
function [pbest,p_bfit,g_bfit,gbest] = Init_fits(p_num,pos,p_cfit)
%初始化粒子适应度和群体适应度
for i=1:p_num
p_cfit(i)=fit_fn(pos(i,:));
end
pbest = pos;
p_bfit = p_cfit;
[g_bfit,min_index] = min(p_bfit);
gbest = pbest(min_index);
end
3.3 仿真结果
结果显示其找到了接近全局最小0的解,但是未收敛到0处
Reference:
[1] 粒子群优化算法(Particle Swarm Optimization, PSO)的详细解读 - 知乎 (zhihu.com)