粒子群算法

Particle Swarm Optimization (PSO) 是一种启发式学习方法,它具有简单有效特点,该方法来自于具有社会行为的动物种群例如鸟群或鱼群。

PSO的开山之作参考下面这篇论文:

PSO 原理

基本原理

PSO的原理非常简单,可以用一句话概括成为:通过合作的方式,在给定区间中寻找全局最小值。一群粒子在给定区间中活动,一旦某个粒子探索到了一个比较小的值,那么其他粒子就会向它这边靠拢,在这个过程中,就有可能搜索到全局最小值

PSO过程有两个重要的原则:通信与学习。通信的意思是粒子之间会相互告知当前自己的最小值,而学习的意思是粒子能够不断学习知道当前时刻比较好的结果所在的位置。

根据PSO算法的原理,PSO包括如下部分

  • 粒子群:粒子群中每个粒子代表了优化问题的一个候选解
    • 粒子$i$:粒子$i$具有的属性包括其位置$\vec{x}_i(t)$和速度$\vec{v}_i(t)$,它们维度相同。此外每个粒子还应当记录自己的最优值$\vec{P}_i(t)$和全局最优值$\vec{g}(t)$。一个粒子的图示见下图,它的新位置是由当前速度、当前自身最优点和全局最优点决定的。
  • 解空间:所有可能解组成的空间
  • 待优化问题:我们需要解决的问题

数学描述

粒子位置更新公式:

速度更新公式:

写成标量的形式:

从上式中我们可以看出,粒子群的速度更新包括两个部分:惯性部分和加速度部分,惯性部分就是说原来的速度乘以一个系数,加速度部分就是向自身最优和全局最优移动的加速度。加速度又可以根据自身和全局分为认知部分(cognitive)和社会(social)部分。

基于MATLAB的PSO实现

PSO的实现一共分为五个部分:

问题设置

问题设置部分需要对我们的cost function进行设置,包括cost function形式、解空间范围、解空间维度和决策向量的维度。

1
2
3
4
op_problem.cost_function  = @(x) optimization_problem(x); % 待优化问题
op_problem.solution_space = [0 500]; % 解空间
op_problem.dimension = 30; % 解空间维度
op_problem.var_size = [1 op_problem.dimension]; % 决策向量维度

种群参数设置

1
2
3
4
5
swarm.size                = 100;                          % 种群规模
swarm.iteration = 1000; % 迭代次数
swarm.w = 0.9; % 惯性系数
swarm.c1 = 1.5; % 局部加速系数
swarm.c2 = 2.5; % 全局加速系数

种群初始化

主循环

结果显示

参考文献

0%