import numpy as np
def pso(fitness, D=1, c1=2, c2=2, w=0.8, N=200, M=1000):
# 函数返回待优化函数的最小值和对应的解
# fitness 表示待优化函数
# D 表示数据的维度
# c1,c2 表示学习因子
# w 表示惯性权重
# N 表示粒子数量
# M 表示主循环迭代次数
# 初始化位置和速度
x = np.random.rand(N, D)
v = np.random.rand(N, D)
# 初始化粒子历史最优值
p = np.zeros(N)
# 初始化各个粒子的历史最优解
y = [0] * N
# 初始化粒子自身的历史最优值
for i in range(N):
p[i] = fitness(x[i])
y[i] = x[i]
# 初始化粒子群最优解
pg = x[-1]
for i in range(N-1):
if fitness(x[i]) < fitness(pg):
pg = x[i]
# 主循环
for t in range(M):
for i in range(N):
# 更新粒子的速度和位置
v[i] = w * v[i] + c1 * np.random.random() * (y[i] - x[i]) + c2 * np.random.random() * (pg - x[i])
x[i] += v[i]
# 更新粒子的历史最优解
if fitness(x[i]) < p[i]:
p[i] = fitness(x[i])
y[i] = list(x[i])
# 更新粒子群的最优解
if p[i] < fitness(pg):
pg = y[i]
# 返回待优化函数的最优解和最优值
return pg, fitness(pg)
def func(x):
x1, x2, x3 = x
return x1 ** 2 + x2 ** 2 + x3 ** 2
xm, fv = pso(func, 3)
print(xm, fv)
# [8.900130642125157e-17, 1.810901815514498e-17, 4.631944512800519e-17] 1.039466008019917e-32
算法(一)粒子群算法
猜你喜欢
转载自blog.csdn.net/lolimostlovely/article/details/82389578
今日推荐
周排行