【PSO】基本PSO算法

基础粒子群算法原理

PSO是一种基于群体的随机化技术,通过初始化一组随机解,通过迭代搜索最优解,PSO算法通过模拟社会,将每个可能产生的解表述为群中的一个微粒,每个微粒具有独自的位置向量和速度向量,以及和目标函数有关的适应度,所有粒子在搜索空间中以一定速度飞行,通过追随当前搜索到的最优值来找到全局最优值.
PSO模拟社会根据如下三条规则进行:

  • 飞离最近的个体
  • 飞向目标
  • 飞向群体的中心

PSO采用“群体”和“进化”的概念,根据个体的适应值进行操作,但是PSO中没有进化算子,粒子的飞行速度根据个体飞行经验和群体的飞行经验进行动态调整.

设在 S S S维的目标搜索空间中,有 m m m个粒子组成一个群体,其中第 i i i个粒子表示为一个 S S S维的向量 x i = ( x i 1 , x i 2 , … , x i s ) , i = 1 , 2 , … , m x_i=(x_{i1}, x_{i2}, \dots, x_{is}), i=1, 2, \dots, m xi=(xi1,xi2,,xis),i=1,2,,m,每个粒子的位置是一个潜在的解分量,目标函数值 f ( x i ) f(x_i) f(xi)给出了解质量信息.
i i i个粒子的速度矢量是 V = ( V i 1 , V i 2 , … , V i s ) V=(V_{i1}, V_{i2}, \dots, V_{is}) V=(Vi1,Vi2,,Vis),记第 i i i粒子目前搜索到的最优位置为 P i s = ( P i 1 , P i 2 , … , P i s ) P_{is}=(P_{i1}, P_{i2}, \dots, P_{is}) Pis=(Pi1,Pi2,,Pis),整个粒子群目前找到的最优位置为 P g s = ( P 1 s , P 2 s , … , P m s ) P_{gs}=(P_{1s}, P_{2s}, \dots, P_{ms}) Pgs=(P1s,P2s,,Pms).
粒子 i i i的当前最好位置由如下方程确定
p i ( t + 1 ) = { p i ( t ) → f ( x i ( t + 1 ) ) ≥ f ( p i ( t ) ) x i ( t + 1 ) → f ( x i ( t + 1 ) ) < f ( p i ( t ) ) (1) p_i(t+1)= \begin{cases} p_i(t)\to f(x_i(t+1))\geq f(p_i(t))\\ x_i(t+1)\to f(x_i(t+1))<f(p_i(t)) \end{cases}\tag{1} pi(t+1)={pi(t)f(xi(t+1))f(pi(t))xi(t+1)f(xi(t+1))<f(pi(t))(1)
Kennedy和Eberhart设置如下进化方程
v i s ( t + 1 ) = v i s ( t ) + c 1 r 1 s ( t ) ( p i s ( t ) − x i s ( t ) ) + c 2 r 2 s ( t ) ( p g s ( t ) − x i s ( t ) ) x i s ( t + 1 ) = x i s ( t ) + v i s ( t + 1 ) \begin{aligned} &v_{is}(t+1)=v_{is}(t)+c_1r_{1s}(t)(p_{is}(t)-x_{is}(t))+c_2r_{2s}(t)(p_{gs}(t)-x_{is}(t))\\ &x_{is}(t+1)=x_{is}(t)+v_{is}(t+1) \end{aligned} vis(t+1)=vis(t)+c1r1s(t)(pis(t)xis(t))+c2r2s(t)(pgs(t)xis(t))xis(t+1)=xis(t)+vis(t+1)
其中, i ∈ [ 1 , m ] , s ∈ [ 1 , S ] i\in[1, m], s\in[1, S] i[1,m],s[1,S] c 1 ≥ 0 c_1\geq 0 c10 c 2 ≥ 0 c_2\geq 0 c20是学习因子, c 1 c_1 c1调节找到自身最好位置的步长, c 2 c_2 c2调节找到全局最好位置的步长; r 1 r_1 r1 r 2 r_2 r2互为独立的服从 [ 0 , 1 ] [0, 1] [0,1]均匀分布的随机数; v i s ∈ [ − v max ⁡ , v max ⁡ ] v_{is}\in[-v_{\max}, v_{\max}] vis[vmax,vmax],如果限制搜索空间为 [ − x max ⁡ , x max ⁡ ] [-x_{\max}, x_{\max}] [xmax,xmax],可以设置 v max ⁡ = k x max ⁡ , ( 0 < k ≤ 1.0 ) v_{\max}=kx_{\max}, (0<k\leq 1.0) vmax=kxmax,(0<k1.0).
Y.shi和Eerhart改进了迭代方程
v i s ( t + 1 ) = w ⋅ v i s ( t ) + c 1 r 1 s ( p i s ( t ) − x i s ( t ) ) + c 2 r 2 s ( t ) ( p g s ( t ) − x g s ( t ) ) v_{is}(t+1)=w\cdot v_{is}(t)+c_1r_{1s}(p_{is}(t)-x_{is}(t))+c_2r_{2s}(t)(p_{gs}(t)-x_{gs}(t)) vis(t+1)=wvis(t)+c1r1s(pis(t)xis(t))+c2r2s(t)(pgs(t)xgs(t))
其中动量 w w w为非负值,控制前一时刻的速度和当前速度的关系,如果 w w w较大,前速度影响较大,模型的全局搜索能力较强,如果 w w w较小,前速度影响较小,局部搜索能力较强,在处理局部最优问题时,需要调整 w w w的值.
算法终止条件为达到最大迭代次数或者满足阈值要求.

算法流程

(1). 初始化规模为 m m m的粒子群,设置位置和速度矢量. 对于任意的 i , s i, s i,s,在 [ − x max ⁡ , x max ⁡ ] [-x_{\max}, x_{\max}] [xmax,xmax]内服从均匀分布产生 x i s x_{is} xis;对于任意的 i , s i, s i,s,在 [ − v max ⁡ , v max ⁡ ] [-v_{\max}, v_{\max}] [vmax,vmax]内服从均匀分布产生 v i s v_{is} vis y i = x i , ∀ i y_i=x_i, \forall i yi=xi,i.
(2). 计算每个粒子的适应值.
(3). 对每个粒子将其适应值和其经历过的最好位置 p i s p_{is} pis的适应值比较,如果当前适应值更好则将其作为当前最好位置.
(4). 对每个粒子将其适应值和全局经历过的最好位置 p g s p_{gs} pgs的适应值比较,如果当前适应值更好则将其作为当前最好位置.
(5). 根据方程 ( 1 ) (1) (1)更新粒子速度和位置
(6). 如果满足终止条件,输出解,否则转(2).

算法收敛性

算法全局收敛需要满足如下假设
(1). f ( D ( z , ξ ) ≤ f ( z ) ) f(D(z, \xi)\leq f(z)) f(D(z,ξ)f(z)),并且如果 ξ ∈ S \xi\in S ξS, 则
f ( D ( z , ξ ) ) ≤ f ( ξ ) f(D(z, \xi))\leq f(\xi) f(D(z,ξ))f(ξ)
随机算法全局收敛表示序列 { f ( z k ) } k = 1 ∞ \{f(z_k)\}_{k=1}^\infty {f(zk)}k=1需要收敛到 ψ \psi ψ,其中
ψ = inf ⁡ { x ∣ v ( z ∈ S ∣ f ( S ) < x ) > 0 } \psi=\inf\{x\mid v(z\in S\mid f(S)<x)>0\} ψ=inf{xv(zSf(S)<x)>0}
由于Lebesgue测度 v ( x ∣ f ( z ) < x ) > 0 v(x\mid f(z)<x)>0 v(xf(z)<x)>0,可以避免病态情况.
(2). 对于 S S S任意Borel子集 A A A,如果测度 v ( A ) > 0 v(A)>0 v(A)>0,则有
∏ k = 0 ∞ ( 1 − μ k ( A ) ) = 0 \prod_{k=0}^\infty (1-\mu_k(A))=0 k=0(1μk(A))=0
其中, μ k ( A ) \mu_k(A) μk(A)是由测度 μ k \mu_k μk得到 A A A的概率.
(3). 略(具体见参考资料page 158)
可以证明粒子群算法满足(1), 但是不满足(2),所以算法不是全局收敛的.

案例:极值求解

PSO算法流程如图所示
pso

使用fminconfminbnd以及Global Search进行求解,找到一维函数 f ( x ) f(x) f(x)的全局最小值
f ( x ) = x sin ⁡ ( x ) + x cos ⁡ ( x ) , x ∈ [ 0 , 10 ] f(x)=x\sin(x)+x\cos(x), x\in[0, 10] f(x)=xsin(x)+xcos(x),x[0,10]
Octave Online中实现代码如下
fmincon设置不同起始点寻找最优解,其中十字符号表示起点,圆圈符号表示在该起点下找到的最优值(最小值)的坐标.

pkg load optim
clear all
clc

%% objective function
f=@(x) x.*sin(x)+x./cos(x)
lb=0;
ub=10;
x0=[0 1 3 6 8 10];
fig=figure;
for i=1:6
    x(i)=fmincon(f, x0(i), [], [], [], [], lb, ub, [], optimset('Algorithm', 'sqp', 'Disp', 'none'))
    subplot(2, 3, i)
    ezplot(f, [lb, ub]);
    hold on
    plot(x0(i), f(x0(i)), 'k+')
    plot(x(i), f(x(i)), 'ro')
    hold off
    title(['Initial Point at ', num2str(x0(i))])
    if i==1 || i==4
        ylabel('x*sin(x)+x/cos(x)')
    end
end

fmincon
使用fminbnd函数求解,不需要设置起始点的位置

pkg load optim
clear all
clc
close all

%% objective function
f=@(x) x.*sin(x)+x./cos(x)
lb=0;
ub=10;

fig=figure;
x2=fminbnd(f, lb, ub)
ezplot(f, [lb, ub])
hold on
plot(x2, f(x2), 'ro')
hold off
ylabel('x*sin(x)+x/cos(x)')
title({'Solution using fminbnd.', 'Required no initial point'})

fminbndMatlab中提供了全局最优搜索函数createOptimProblem,求解代码如下

problem=createOptimProblem('fmincon', 'objective', f, 'x0', x0(1), 'lb', lb, 'ub', ub, 'options', optimset('Algorithm', 'SQP', 'Disp', 'none'));
gs=GlobalSearch;
xgs=run(gs, problem)
fig=figure;
ezplot(f, [lb, ub]);
hold on
plot(xgs, f(xgs), 'ro')
hold off
ylabel('x sin(x)+x/cos(x)')
title('Solution using global Search.')

参考资料

Matlab优化算法案例分析与应用 清华大学出版社 余胜威

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quant0xff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值