粒子群算法:
粒子群算法(Particle Swarm Optimization,PSO)是一种优化算法,灵感源自鸟群或鱼群等群体行为的模拟。它是一种进化计算技术,用于解决优化问题,特别是那些涉及搜索、优化、迭代改进的复杂问题。PSO模拟了鸟群或鱼群在空间中搜索食物或资源时的行为方式。在PSO中,解决方案被视为在解空间中移动的“粒子”,每个粒子都有自己的位置和速度。这些粒子根据自身的经验和群体中其他粒子的经验进行调整,以寻找最优解。PSO通过不断更新粒子的位置和速度来探索解空间,并试图找到全局最优解或接近最优解的解决方案。PSO的核心概念包括个体最优(局部最优)和全局最优。每个粒子都记住了在搜索过程中发现的个体最优解,同时也考虑到全局最优解。通过不断调整粒子的速度和位置,使得粒子能够沿着更有可能导向最优解的方向移动,以达到问题的最优解或接近最优解的目标。PSO算法简单易实现,通常适用于连续优化问题,并且相对于其他优化算法来说具有较少的参数需要调整。它已经被广泛应用于多个领域,例如工程优化、机器学习、神经网络训练等。
python代码实现
import numpy as np
#计算适应值
def cal_y(X):
Y=np.sum(np.square(X), axis=1)
return Y
#初始化
max_iter=10 #迭代次数
n_dim=2 # X数据维度
pop=6 #种群个数
w=0.8 #速度因子
c1=0.5 #局部优化因子
c2=0.5 #全局优化因子
low=0 #最小值
high=10 #最大值
X = np.random.uniform(low=low, high=high, size=(pop, n_dim)) #初始化X
V = np.random.uniform(low=low, high=high, size=(pop, n_dim)) #初始化V
# print(V)
Y = cal_y(X) #通过X计算Y
pbest_x = X.copy() #初始化局部最优位置
pbest_y = np.array([[np.inf]] * pop)
pbest_y = Y#初始化局部最优值
# print(pbest_y)
gbest_x = X[np.argmin(pbest_y)]#初始化全局最优位置
gbest_y = np.inf
gbest_y = np.min(pbest_y) #初始化全局最优值
# print(gbest_x)
# print(gbest_y)
###################################################
#更新速度
def update_V(V,X,pbest_x,gbest_x):
r1 = np.random.rand(pop,n_dim)
r2 = np.random.rand(pop,n_dim)
V = w*V+c1*r1*(pbest_x-X)+c2*r2*(gbest_x-X)
return V
#更新X
def update_X(X,V):
X = V + X
return X
#更新局部最优点
def update_pbest(pbest_x,pbest_y,X,Y):
update_id = np.greater(pbest_y,Y)
# print(update_id)
pbest_x[update_id] = X[update_id]
pbest_y[update_id] = Y[update_id]
# print(pbest_x,pbest_y)
return pbest_x,pbest_y
#更新全局最优点
def update_gbest(pbest_x,pbest_y,gbest_x,gbest_y):
if np.min(pbest_y) < gbest_y:
gbest_x = pbest_x[np.argmin(pbest_y)]
gbest_y=np.min(pbest_y)
return gbest_x,gbest_y
for iter_num in range(max_iter):
print(iter_num)
V=update_V(V,X,pbest_x,gbest_x)# update_V更新速度
X=update_X(X,V)# record_value记录粒子点位置
Y = cal_y(X)# Y=cal_y计算适应值
print(Y)#打印每代的适应值
pbest_x,pbest_y=update_pbest(pbest_x,pbest_y,X,Y)# update_pbest更新局部最优点
gbest_x,gbest_y=update_gbest(pbest_x,pbest_y,gbest_x,gbest_y)# update_gbest更新全局最优点
print(gbest_x,gbest_y)# 输出每代的最优值
print("PSO最优值:",gbest_x, gbest_y)
程序运行结果如下:
参数设置:max_iter=10, n_dim=2,种群个数为6,速度因子为0.8,
C1=0.5,C2=0.5,y=x1^2 + x2^2 + …+ xn^2(n=1,2,3…)作为cal_y
用scikit-opt进行一下相似的有哈:看看结果是否异同:
总结:
粒子群算法是模拟群体智能所建立起来的一种优化算法,主要用于解决最优化问题,
粒子群算法与遗传算法等进化算法有很多相似之处。也需要初始化种群,计算适应度值,通过进化进行迭代等。但是与遗传算法不同,它没有交叉,变异等进化操作。与遗传算法比较,PSO的优势在于很容易编码,需要调整的参数也很少。所以粒子群算法也比较使用,也可以进行优化神经网络。