基于Python3开发的群体智能优化算法库
粒子群优化(Particle Swarm Optimization,PSO)的思想是模拟鸟类集群在大自然中协同觅食的过程。在
经典PSO算法最初由Eberhart和Kennedy提出,在基本属性的基础上,粒子增加了“速度”属性作为。对于第
在量子力学中,使用粒子的束缚态来刻画粒子群的聚集性/收敛性。产生束缚态的原因是在粒子运动的中心存在某种吸引势场。为此可以建立一个量子化的吸引势场,从而束缚粒子个体以使群体具呈现出聚集性。刻画粒子的收敛过程是以
QPSO算法的进化方程可以归纳为 $$ X_{i,j}(t+1)=p_{i,j}(t) \pm \alpha·\lvert C_j(t) - X_{i,j}(t) \rvert ·\ln[{1}/{u_{i,j}(t)}] \ =p_{i,j}(t)+A_{i,j}(t) $$ 其中 $$ A_{i,j}(t)=\pm \alpha·\lvert C_j(t) - X_{i,j}(t) \rvert ·\ln[{1}/{u_{i,j}(t)}] $$ 相当于一个服从拉普拉斯分布的随机变量。所以,一种提升QPSO算法收敛性能的思想是提升算法在进化过程中的不确定性。令 $$ A_{i,j}(t)=a_{i,j}(t)+b_{i,j}(t) $$ 其中 $$ a_{i,j}(t)=\pm \alpha·\lvert p_{i,j}(t) - X_{i,j}(t) \rvert ·\ln[{1}/{u_{i,j}(t)}] \ b_{i,j}(t)=\beta·\lvert C_{j}(t)-X_{i,j}(t) \rvert · n(t) \ n(t) \sim \text N(0,1) $$ 进化方程改进为 $$ X_{i,j}(t+1)=p_{i,j}(t) \pm \alpha·\lvert p_{i,j}(t) - X_{i,j}(t) \rvert ·\ln[{1}/{u_{i,j}(t)}]+\beta·\lvert C_{j}(t)-X_{i,j}(t) \rvert · n(t) $$ 采用此种进化方程的算法被称之为具有混合概率分布的量子行为粒子群优化(Revised Quantum-behaved Particle Swarm Optimization, RQPSO)算法。
base.py文件中包含验证非线性优化算法性能的若干多元非线性函数。目前收录的函数有:
- Sphere函数
- Rastrigrin函数
- Rosenbrock函数
- Griewank函数
- Schaffer函数
调用
from evaluator.base import Sphere
y = Sphere.infer(x)
# x:轴为2的numpy数组,第0个轴表示粒子群总数,第1个轴表示优化问题目标函数的维度
# y:目标函数输出,标量
- PSO
from swarm.particle import ParticleSwarm
import numpy as np
swarm = ParticleSwarm(
dimension=2, # 维数
population=50, # 种群规模
upper_bound=np.array([10, 10]), # 搜索范围上界,数组中元素数量必须与维数相同
lower_bound=np.array([-10, -10]), # 搜索范围下界
upper_velocity=np.array([1, 1]), # 速度范围上界
lower_velocity=np.array([-1, -1]), # 速度范围下届
acceleration_coeff1=2., # 加速系数1
acceleration_coeff2=2., # 加速系数2
) # 粒子群实例化
- QPSO
from swarm.particle import QuantumParticleSwarm as QPS
import numpy as np
swarm = QPS(
dimension=2, population=50,
upper_bound=np.array([10, 10]), lower_bound=np.array([-10, -10]),
) # 量子行为粒子群实例化
- RQPSO
from swarm.particle import RevisedQuantumParticleSwarm as RQPS
import numpy as np
swarm = RQPS(
dimension=2, population=50,
upper_bound=np.array([10, 10]), lower_bound=np.array([-10, -10]),
) # 混合量子行为粒子群实例化
from swarm.particle import QuantumParticleSwarm as QPS
from evaluator.base import Sphere
from optimizer.pso import Optimizer
import numpy as np
swarm = QPS(
dimension=2, population=50,
upper_bound=np.array([10, 10]), lower_bound=np.array([-10, -10]),
) # 量子行为粒子群实例化
opt = Optimizer(
epoch=100, # 算法迭代次数
swarm=swarm, evaluator=Sphere, is_record=False
)
opt.fit()
print(opt.swarm.gbest) # 全局最优个体位置
print(opt.gbest_fitness) # 全局最优适应度值
recoder.py实现迭代过程的记录
from swarm.particle import QuantumParticleSwarm as QPS
from evaluator.base import Sphere
from optimizer.pso import Optimizer
import numpy as np
swarm = QPS(
dimension=2, population=50,
upper_bound=np.array([10, 10]), lower_bound=np.array([-10, -10]),
) # 量子行为粒子群实例化
opt = Optimizer(
epoch=100, # 算法迭代次数
swarm=swarm, evaluator=Sphere, is_record=True,
rec_step=1, # 记录步长,每隔多少步记录一次当前优化器和种群的各项属性,取值必须能够整除epoch
)
opt.fit()
print(opt.recoder.fitness) # 适应度值收敛过程
print(opt.recoder.gbest) # 全局最优收敛过程
print(opt.recoder.pbest) # 个体最优收敛过程
visualize.py实现recoder对象中保存记录的动态可视化
from support.visualize import AlgorithmVisual
AlgorithmVisual(
recoder=opt.recoder,
fun=Sphere,
upper_bound=np.array([10, 10])
lower_bound=np.array([-10, -10])
is_save=False # 是否保存动态变化结果。True则保存gif格式,不可视化,False则做动态可视化,不保存
)
以Sphere函数为例,一些可视化结果:
- 全局最优收敛过程示意
- 种群搜索过程示意
- PSO算法
- QPSO算法
- RQPSO算法
- PSO算法
- QPSO算法
- RQPSO算法
- PSO算法
- QPSO函数
- RQPSO算法
- PSO算法
- QPSO算法
- RQPSO算法