1.背景
实际上网上关于pso算法的这个呢有很多,也不乏代码实现,包括matlab和python实现。但是查看各位大佬的代码,发现或多或少存在一些问题,下面就基于@大灰狼学编程的博客,对其代码进行部分纠正,希望大家多批评指正(ps:对于原理的讲解,我更推荐博客https://blog.csdn.net/m0_60307882/article/details/123864693)。
2.修改后的代码
# 使用粒子群算法计算:f(x)=x^2+y^2+x的最小值
import numpy as np
X = np.arange(-5, 5, 0.1)
Y = np.arange(-5, 5, 0.1)
X, Y = np.meshgrid(X, Y)
Z = X ** 2 + Y ** 2 + X
def fitness_func(X):
"""适应度,也就是函数的值"""
x = X[:, 0]
y = X[:, 1]
return x ** 2 + y ** 2 + x
#更新速度,根据公式V(t+1)=w*V(t)+c1*r1*(pbest_i-xi)+c2*r2*(gbest_xi)
def v_update(V, X, c1, c2, pbest, gbest, w, max_val):
"""
Parameters
----------
V:公式中的V(t),t时刻的粒子的速度(这里好像是批处理)
X:批样本的t时刻的位置
c1:惯性系数
c2:惯性系数
pbest:单个粒子i历史最优位置
gbest:群体粒子的历史最优位置
w:惯性系数
max_val:防止速度过大而设定的最大值
Returns
-------
更新后的速度V
"""
size = X.shape[0] # 样本个数
r1 = np.random.random((size, 1))
r2 = np.random.random((size, 1))
V_ = w * V + c1 * r1 * (pbest - X) + c2 * r2 * (gbest - X)
V_[V_ < -max_val] = -max_val
V_[V_ > max_val] = max_val
return V_
def p_update(X, V):
"""更新粒子位置"""
return X + V
def pso():
"""粒子群算法主函数"""
w = 1
c1 = 2
c2 = 2
r1 = None
r2 = None
dim = 2
size = 20 # 使用20个粒子
iter_num = 1000 # 最大迭代次数
max_val = 0.5
best_fitness = float(9e10)
fitness_val_list_group = [] # 存放每次的全局最优位置
# 初始化各个粒子的位置
X = np.random.uniform(-5, 5, size=(size, dim))
# 初始化各个粒子的初试速度
V = np.random.uniform(-0.5, 0.5, size=(size, dim))
p_fitness = fitness_func(X) # 初始化个体适应度
g_fitness = p_fitness.min() # 初始化集体适应度
fitness_val_list_group.append(g_fitness) # 初始化群体最优位置列表
pbest = X # 初始化个体最优位置,每行对应一个个体的最优位置
gbest = X[p_fitness.argmin()] # 初始化种群最优位置,为标量
# 迭代
for i in range(1, iter_num):
# 更新粒子位置与速度
V = v_update(V, X, c1, c2, pbest, gbest, w, max_val=max_val)
X = p_update(X, V)
p_fitness2 = fitness_func(X) # 更新后的粒子的适应度,针对这一次中的所有群体
g_fitness2 = p_fitness2.min() # 更新后的种群的最佳适应度,针对这一次中的所有群体
# 现在需要与之前所有迭代中的个体最优位置和群体最优位置作对比,对二者进行更新
# 这里直接与上一次的结果进行比较即可:
for j in range(size): # 对每个样本做遍历
if p_fitness[j] > p_fitness2[j]:
pbest[j] = X[j] # 更新各个个体的最优位置,所有次数
p_fitness[j] = p_fitness2[j] # 各个个体的最优位置更新了,其对应的适应度也要跟上
if g_fitness > g_fitness2:
gbest = X[p_fitness2.argmin()] # 更新后的群体最优点,所有次数
g_fitness = g_fitness2 # 对应的适应度跟上
# 记录最佳迭代记录
fitness_val_list_group.append(g_fitness)
# 输出迭代结果
print("最优值是:%.5f" % fitness_val_list_group[-1])
print("最优解是:x=%.5f,y=%.5f" % (gbest[0], gbest[1]))
pso()
by——神采的二舅
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。