本文将详细介绍粒子群算法(Particle swarm optimization)的算法由来、数学模型、算法流程以及算法的Python实现。(注:本文由有何不可原创,如若转载,请注明来源!)
1. 算法由来
粒子群算法源自对鸟群行为的研究:假设一群鸟在某个区域内寻找食物,所有的鸟知道自己的位置与食物的大概距离,那么寻找食物的最佳方法就是,搜寻与食物距离最近的那只鸟的邻近区域。
在粒子群算法中,每个优化问题的潜在解都是搜索空间内的一只鸟,称之为“粒子”。“粒子”有着两个属性:位置和速度,并且具有记忆功能,可以记忆自己的历史经验,即在先前的搜索过程中,粒子距离“食物”的远近。粒子群算法基于生物群体之间的“信息共享”机制,来实现在搜索空间对潜在解的寻找,即每个“粒子”在搜索空间内不停地搜索,并且其搜索行为不仅在不同程度上受群体中其他粒子的影响,而且还受其自身经验的影响。
2. 算法数学模型
假设在一个D维(待优化问题的变量数)的搜索空间中,有N个粒子组成一个种群,其中第k个粒子表示为一个D维的向量:
$$ X_k = {x_{k1}, x_{k2}, …, x_{kD} }, k = 1,2,…,N $$
第k个粒子飞行的速度也是一个D维的向量:
$$ V_k = {v_{k1}, v_{k2}, …, v_{kD} }, k = 1,2,…,N $$
第k个粒子迄今为止搜索到的最优位置称为个体极值,记为,
$$ P_{k,best} = {p_{k1}, p_{k2}, …, p_{kD} }, k = 1,2,…,N $$
粒子群迄今为止搜索到的最优位置称为全局极值,记为,
$$ G_{best} = {g_{1}, g_{2}, …, g_{D} } $$
在寻到个体极值和全局极值后,粒子按照下面两个公式进行更新:
速度更新公式:
$$ V_{k}(t+1) = wV_{k}(t) + c_1r_1(t)[P_{k,best}(t)-X_k(t)] + c_2r_2(t)[G_{best}(t)-X_k(t)] $$
式中, w – 惯性权重系数;c1、c2 – 学习因子;r1、r2 – (0, 1)之间的随机数
位置更新公式:
$$ X_{k}(t+1) = X_{k}(t) + V_{k}(t+1) $$
3. 算法流程
- 初始化粒子群,设置算法的控制参数(如惯性权重系数,学习因子);
- 计算粒子群中各粒子的适应度值;
- 更新各粒子的个体最优和粒子群的群体最优;
- 更新粒子群中各粒子的速度和位置;**
- 判断是否满足迭代条件,若满足,则退出;否则,跳转到2。
4. 代码示例 – Python
注意:该算法采用控制参数随迭代次数动态变化…
1
2
3
4 # Import libs
import numpy as np
import random as rd
import matplotlib.pyplot as plt
1 | MIN_POS = [-5, -5] # Minimum position of the particle |
1 | # PSO |
1 | # main |