使用python搭建粒子群算法----原理版以及调库版

粒子群算法:

粒子群算法(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的优势在于很容易编码,需要调整的参数也很少。所以粒子群算法也比较使用,也可以进行优化神经网络。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值