PSO中,每个优化问题的解都是搜索空间中的一只鸟。称之为“粒子(Particle)”。所有的粒子都有一个由被优化的函数决定的适应值,每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当 前的最优粒子在解空间中搜索。
PSO 初始化为一群随机粒子。然后通过叠代找到最优解。在每一次叠代中,粒子通过跟踪两个"极值" 来更新自己。第一个就是粒子本身所找到的最优解。 这个解叫做个体极值pBest,另一个极值是整个种群目前找到的最优解,这个极值是全局极值gBest。另外, 也可以不用整个种群而只是用其中一部分的邻居。
n个粒子在d维的搜索空间中,每个粒子的位置按如下公式进行变化:
粒子群初始位置和速度随机产生,然后按公式(1)(2)进行迭代,直至找到满意的解。
下面以一个简单的优化问题为例,实现粒子群优化算法。
问题:min Y = X1 ** 2 + X2 **2(X1 >= -10,X2 <= 10)
import numpy as np
import random as rd
# min y = X1 * X1 + X2 * X2
# X1 >= -10
# X2 <= 10
def update(location,speed,pBest,gBest): #更新粒子群的位置和速度
for i in range(len(location)):
for j in range(len(speed[0])):
speed[i][j] = 0.5 * speed[i][j] + 2.0 * rd.random() * (pBest[i][j] - location[i][j]) + 2.0 * rd.random() * (gBest[j] - location[i][j])
location[i][j] += speed[i][j]
if location[i][j] < -10:
location[i][j] = -10
if location[i][j] > 10:
location[i][j] = 10
def objFunction(X1,X2): #计算目标函数值
f = X1 ** 2 + X2 ** 2
return f
def assess(location,pBest,gBest): #更新粒子的历史最优与全局最优
for i in range(len(location)):
if objFunction(location[i][0],location[i][1]) < objFunction(pBest[i][0],pBest[i][1]):
pBest[i][0] = location[i][0]
pBest[i][1] = location[i][1]
for i in range(len(pBest)):
if objFunction(pBest[i][0],pBest[i][1]) < objFunction(gBest[0],gBest[1]):
gBest[0] = pBest[i][0]
gBest[1] = pBest[i][1]
def init(): #随机初始化5个粒子的位置和速度
location,speed= [],[]
for i in range(5):
X1 = rd.uniform(-10, 10)
X2 = rd.uniform(-10,10)
V1 = rd.uniform(-5,5)
V2 = rd.uniform(-5,5)
location.append([X1,X2])
speed.append([V1,V2])
return location,speed
if __name__ == '__main__':
location,speed = init()
pBest = location
min = float("inf")
gBest = [0,0]
iters = 10000 #迭代次数
for i in range(len(pBest)):
if objFunction(pBest[i][0],pBest[i][1]) < min :
min = objFunction(pBest[i][0],pBest[i][1])
gBest[0] = pBest[i][0]
gBest[1] = pBest[i][1]
for i in range(iters):
update(location, speed, pBest, gBest)
assess(location, pBest, gBest)
print("最优解:" + str(gBest))
print("目标函数最优值:" + str(objFunction(gBest[0],gBest[1])))