粒子群优化算法 ( P a r t i c l e S w a r m O p t i m i z a t i o n ) (Particle \ Swarm\ Optimization) (Particle Swarm Optimization),缩写为 P S O PSO PSO,属于进化算法的一种,和模拟退火算法相似,从随机解出发,通过迭代寻找最优解
P S O PSO PSO通过适应度来评价解的品质,但它比遗传算法规则更简单,没有遗传算法的“交叉”(Crossover)和“变异”(Mutation),它通过追随当前搜索到的最优值来寻找全局最优
优点:原理简单,收敛速度快
缺点:早熟收敛、维数灾难、易于陷入局部极值
知乎——粒子群算法介绍
P S O PSO PSO从鸟群捕食模型中得到启示并可用于解决优化问题
P S O PSO PSO中,每个优化问题的潜在解都是搜索空间中的一只鸟,称为粒子
所有的粒子都有一个由被优化的函数决定的适值( f i t n e s s v a l u e fitness\ value fitness value),每个粒子还有一个速度决定它们“飞行”的方向和距离
粒子们追随当前的最优粒子在解空间中搜索
P S O PSO PSO初始化为一群随机粒子(随机解),然后通过迭代找到最优解。
在每一次迭代中,例子通过跟踪两个极值来更新自己:
一个是粒子本身找到的最优解,这个解称为个体极值;
另一个是整个种群目前找到的最优解,这个极值是全局极值,另外也可以不用整个种群,而只用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
假设在一个 D D D维的目标搜索空间中,有 N N N个粒子组成一个群落,其中第 i i i个粒子的位置是一个 D D D维的向量:
X i = ( x i 1 , x i 2 , . . . , x i D ) , i = 1 , 2 , . . . , N X_i=(x_{i1},x_{i2},...,x_{iD}),\ i=1,2,...,N Xi=(xi1,xi2,...,xiD), i=1,2,...,N
第 i i i个粒子的“飞行”速度也是一个 D D D维的向量,记为:
V i = ( v i 1 , v i 2 , . . . , v i D ) , i = 1 , 2 , . . . , N V_i=(v_{i1},v_{i2},...,v_{iD}),\ i=1,2,...,N Vi=(vi1,vi2,...,viD), i=1,2,...,N
第 i i i个粒子迄今为止搜索到的最优位置称为个体极值,记为:
p b e s t = ( p i 1 , p i 2 , . . . , p i D ) , i = 1 , 2 , . . . , N p_{best}=(p_{i1},p_{i2},...,p_{iD}),\ i=1,2,...,N pbest=(pi1,pi2,...,piD), i=1,2,...,N
整个粒子群迄今为止搜索到的最优位置称为全局极值,记为:
g b e a s t = ( p g 1 , p g 2 , . . . , p g D ) g_{beast}=(p_{g1},p_{g2},...,p_{gD}) gbeast=(pg1,pg2,...,pgD)
在找到这两个最优值时,粒子根据如下的公式来更新自己的速度和位置:
v i d = w ∗ v i d + c 1 r 1 ( p i d − x i d ) + c 2 r 2 ( p g d − x i d ) v_{id}=w*v_{id}+c_1r_1(p_{id}-x_{id})+c_2r_2(p_{gd}-x_{id}) vid=w∗vid+c1r1(pid−xid)+c2r2(pgd−xid)
x i d = x i d + v i d x_{id}=x_{id}+v_{id} xid=xid+vid
所以速度可以理解为下一次迭代移动距离
其中: c 1 c_1 c1和 c 2 c_2 c2为学习因子,也称加速常数, r 1 r_1 r1和 r 2 r_2 r2为[0,1]范围内的均匀随机数。
v i d = w ∗ v i d + c 1 r 1 ( p i d − x i d ) + c 2 r 2 ( p g d − x i d ) v_{id}=w*v_{id}+c_1r_1(p_{id}-x_{id})+c_2r_2(p_{gd}-x_{id}) vid=w∗vid+c1r1(pid−xid)+c2r2(pgd−xid)由三部分组成
自左向右
第一部分为“惯性”或“动量”部分,反映粒子运动“习惯”,代表粒子有维持自己先前速度的趋势。
第二部分为“认知”部分,反映粒子对自身粒子经验的记忆或回忆,代表粒子有向自己历史最佳位置逼近的趋势。
第三部分为“社会”部分,反映了粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体或邻域历史最佳位置逼近的趋势。
粒子群算法应用于多目标优化具有很大的优势,它既可以得到多目标意义下的最优解,也可以通过代表整个解集种群,按并行方式同步搜索多个非劣解,也即搜索到多个Pareto最优解(资源分配的一种理想状态)
(1)初始化粒子群,包括群体规模 N N N,每个粒子的位置 x i x_i xi和速度 v i v_i vi。
(2)计算每个粒子的适应度值 F i t [ i ] F_{it}[i] Fit[i]。
(3)对每个粒子,用它的适应度值 F i t [ i ] F_{it}[i] Fit[i]和个体最优值 p b e s t ( i ) p_{best}(i) pbest(i)比较,如果 F i t [ i ] > p b e s t ( i ) F_{it}[i]>p_{best}(i) Fit[i]>pbest(i),则用 F i t [ i ] F_{it}[i] Fit[i]替换掉 p b e s t ( i ) p_{best}(i) pbest(i)。
(4)对每个粒子,用它的适应度值 F i t [ i ] F_{it}[i] Fit[i]和全局最优值 g b e s t g_{best} gbest比较,如果 F i t [ i ] > g b e s t F_{it}[i]>g_{best} Fit[i]>gbest,则用 F i t [ i ] F_{it}[i] Fit[i]代替 g b e s t g_{best} gbest。
(5)更新粒子的速度 v i v_i vi和位置 x i x_i xi。
(6)如果满足结束条件(误差足够好或到达最大循环次数)退出,否则返回(2)。
在 M A T L A B MATLAB MATLAB中编程实现的基本粒子群算法基本函数为 P S O PSO PSO,如下所示:
function [xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
%基本粒子群算法
%c1 学习因子1
%c2 学习因子2
%w 惯性权重
%M 最大迭代次数
%D 搜索空间维度
%N 初始化群体个体数目
format long;%以long作为数据类型
for i=1:N
for j=1:D
x(i,j)=randn; %随机初始化位置,randn,产生均值为0,方差为1的正态分布的随机数
v(i,j)=randn; %随机初始化速度
end
end
%计算各个粒子的适应度,并初始化Pi(个体最优)、Pg(全局最优)
for i=1:N
P(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
Pg=x(N,:);
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 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
Pbest(t)=fitness(Pg);
end
%最后给出计算结果
disp('-------------------------------')
disp('目标函数取最小值时的自变量')
xm=Pg'
disp('目标函数的最小值为:')
fv=fitness(Pg)
disp('-------------------------------')
end
格里旺克函数,是数学上常用于测试优化程序效率的函数
function y= Griewank( x )
%Griewank函数,PSO粒子群算法的适应度计算
%输入x,给出相应的y值,在x(0,0,..,0)处有全局极小点0,
[row,col]=size(x);
if row>1
error('输入参数有误');%要求为单行
end
y1=1/4000*sum(x.^2);
y2=1;
for h=1:col
y2=y2*cos(x(h)/sqrt(h));
end
y=y1-y2+1;
y=-y;
end
function Griewank_draw(x)
%GRIEWANK_DRAW,绘制Griewank函数图形
y=x;
[X,Y]=meshgrid(x,y);
[row,col]=size(X);
for l=1:col
for h=1:row
z(h,l)=Griewank([X(h,l),Y(h,l)]);
end
end
surf(X,Y,z);
shading interp;%对曲面或图形对象的颜色着色进行色彩的插值处理,使色彩平滑过渡
end
Rastrigin函数,研究智能优化算法时的测试函数
function y= Rastrigin(x)
%RASTRIGIN函数
%输入x,给出相应的y值,在x(0,0,..,0)处有全局极小点0,
[row,col]=size(x);
if row>1
error('输入参数有误');%要求为单行
end
y=sum(x.^2-10*cos(2*pi*x)+10);
y=-y;
end
function Rastrigin_draw(x)
%RASTRIGIN_DRAW,绘制Rastrigin图像
y=x;
[X,Y]=meshgrid(x,y);
[row,col]=size(X);
for l=1:col
for h=1:row
z(h,l)=Rastrigin([X(h,l),Y(h,l)]);
end
end
surf(X,Y,z);
shading interp;%对曲面或图形对象的颜色着色进行色彩的插值处理,使色彩平滑过渡
end
f ( x ) = ∑ i = 1 30 ( x i 2 + x i − 6 ) f(x)=\sum_{i=1}^{30}(x_i^2+x_i-6) f(x)=i=1∑30(xi2+xi−6)
1.根据函数所示,需要确定30个数,使得函数值最小,所以D也就是30;
2.目标为函数最小值,fitness函数就是此函数,且计算结果越小适应度值越高
3.可以直观看出x均为-1/2时,有最小值为-187.5
function y= fitness(x)
y=0;
for i=1:30
y=y+x(i)^2+x(i)-6;
end
end
设粒子群规模 N N N为50,学习因子 C 1 C_1 C1为1.5,学习因子 C 2 C_2 C2为2.5,惯性权值 w w w为0.5,搜索空间维度 D D D为30
根据上图,可分析出如下结果
1.PSO为随机算法,同样的参数所得的结果也不一定一致
2.迭代步数不一定与获得解的精度成正比
3.粒子群规模越大,获得解的精度不一定越高
4.在PSO算法中,想要获得精度高的解,关键是各个参数之间的合适配合