粒子群算法简介
粒子群优化(Particle Swarm Optimization, PSO),又称微粒群算法,是由J. Kennedy和R. C. Eberhart等于1995年开发的一种演化计算技术,来源于对一个简化社会模型的模拟。其中“群”来源于微粒群匹配M. M. Millonas在开发应用于人工生命的模型时所提出的群体智能的5个基本原则。“粒子(particle)”是一个折衷的选择,因为既需要将群体中的成员描述为没有质量、没有体积的,同时也需要描述它的速度和加速状态。
粒子群算法参数:
1.群体规模 2.惯性权重 3.加速常数c1和c2 4. 最大速度Vmax 5.最大代数Gmax
粒子群算法原理:
粒子群算法是基于群体的,根据粒子所处的环境将粒子移动到好的区域。假设现有一个规模大小为的粒子群,粒子群的个体位置分布记为X={x1,x2……xn},对应速度记为V={v1,v2……vn};粒子群个体在运动过程中所经过的最优位置(即粒子适应度最大时对应的位置)记为P={p1,p2……pn},在编程中常将此设为pbest数组;粒子群的全局最优位置用gbest表示。
核心的运动思想代码:
速度变化
vi=w*vi+c1*rand()*(pi-xi)+c2*rand()*(gbest-xi)
位置变化
xi=xi+vi
其中rand()表示区间[0,1]随机生成的小数。
在速度变化方程中 w*vi 表示微粒此前的惯性,c1*rand()*(pi-xi) 表示微粒本身基于自我历史适应度的思考,c2*rand()*(gbest-xi)表示微粒群之间的社会信息共享。
算法流程图:
例子
求解f(x)=x+5sin(5x)+2cos(4x)在区间上的函数最值。
在编程前首先观察一下函数的图像:
编程实现:
import numpy as np
import matplotlib.pyplot as plt
import math
import random
#群体规模
m=30
#惯性权重
w=1
# 加速常数
c1=2
c2=5
# 最大速度
Vmax=3
# 最大代数
Gmax=10
#目标函数,也就是适应度
def aimFunction(x):
y=x+5*math.sin(5*x)+2*math.cos(4*x)
return y
#左右边界
left=0
right=10
#随机初始化粒子群位置和速度
x=np.random.uniform(left,right,m)
y=x+5*np.sin(5*x)+2*np.cos(4*x)
v=np.random.uniform(0,Vmax,m)
pbset=x.copy()
y_best=y.copy()
gbset=x[y.argmax()]
i=0
while i<Gmax:
for k in range(m):
v[k] = w * v[k] + c1 * random.random() * (pbset[k] - x[k]) + c2 * random.random() * (gbset - x[k])
# 速度限制
if v[k]>Vmax:
v[k]=Vmax
if v[k]<0:
v[k] = 0.01
x[k]=x[k]+v[k]
if x[k]<left:
x[k]=left
if x[k]>right:
x[k]=right
y=x+5*np.sin(5*x)+2*np.cos(4*x)
for k in range(m):
if y_best[k]<y[k]:
y_best[k]=y[k]
pbset[k]=x[k]
gbset=pbset[y_best.argmax()]
i+=1
print(gbset,aimFunction(gbset))