原理与经典应用——python实现(含完整代码))
粒子群算法PSO原理与经典应用一、算法简介粒子群算法Particle Swarm Optimization, PSO是一种模拟群体智能的全局优化算法由Kennedy和Eberhart于1995年提出。它通过模拟鸟群、鱼群等群体觅食行为协同搜索最优解广泛应用于函数优化、神经网络训练、路径规划等领域。二、基本原理PSO通过一群“粒子”在搜索空间中移动来寻找最优解。每个粒子代表一个潜在解具有位置和速度。粒子根据自身历史最优位置个体极值pbestp_{best}pbest和全体粒子历史最优位置全局极值gbestg_{best}gbest来调整自己的速度和位置。1. 速度与位置更新公式粒子iii在第kkk代的速度和位置更新如下vik1wvikc1r1(pbest,i−xik)c2r2(gbest−xik) v_{i}^{k1} w v_{i}^k c_1 r_1 (p_{best,i} - x_{i}^k) c_2 r_2 (g_{best} - x_{i}^k)vik1wvikc1r1(pbest,i−xik)c2r2(gbest−xik)xik1xikvik1 x_{i}^{k1} x_{i}^k v_{i}^{k1}xik1xikvik1其中www惯性权重平衡全局与局部搜索能力c1,c2c_1, c_2c1,c2学习因子通常取2r1,r2r_1, r_2r1,r2[0,1][0,1][0,1]之间的随机数2. 算法流程初始化粒子群的位置和速度计算每个粒子的适应度更新个体极值和全局极值更新速度和位置判断终止条件若未满足则返回第2步三、经典应用问题Sphere函数最小化Sphere函数是优化算法测试中最常用的基准函数之一f(x)∑i1nxi2 f(x) \sum_{i1}^n x_i^2f(x)i1∑nxi2其中xi∈[−5.12,5.12]x_i \in [-5.12, 5.12]xi∈[−5.12,5.12]nnn为变量维数。最优解为x(0,0,...,0)x (0, 0, ..., 0)x(0,0,...,0)此时f(x)0f(x) 0f(x)0。Python伪代码示例# ...粒子群算法主流程伪代码...foreach particle:update velocity update position evaluate fitness update pbestandgbest完整代码示例以Sphere函数最小化为例importnumpyasnp# 导入NumPy库用于科学计算importmatplotlib.pyplotasplt# 导入matplotlib的pyplot模块用于绘图# 设置matplotlib支持中文plt.rcParams[font.sans-serif][SimHei]# 设置中文字体为黑体plt.rcParams[axes.unicode_minus]False# 设置正常显示负号# 定义Sphere函数作为我们的目标函数defsphere(x):# 定义函数sphere输入参数为xreturnnp.sum(x**2)# 返回x中所有元素平方和# --- 粒子群算法参数设置 ---num_particles30# 设置粒子数量dim2# 设置问题维度max_iter100# 设置最大迭代次数bound5.12# 设置搜索空间的边界w0.7# 设置惯性权重c11.5# 设置个体学习因子c21.5# 设置社会学习因子# --- 初始化粒子群 ---# 在[-bound, bound]范围内随机初始化所有粒子的位置posnp.random.uniform(-bound,bound,(num_particles,dim))# 在[-1, 1]范围内随机初始化所有粒子的速度velnp.random.uniform(-1,1,(num_particles,dim))pbestpos.copy()# 初始化个体最优位置为当前位置# 计算每个粒子初始位置的适应度值pbest_valnp.array([sphere(x)forxinpos])gbest_idxnp.argmin(pbest_val)# 找到初始全局最优值的索引gbestpbest[gbest_idx].copy()# 初始化全局最优位置gbest_valpbest_val[gbest_idx]# 初始化全局最优值# 用于记录每次迭代的全局最优值以便后续可视化gbest_history[]# --- 主循环迭代更新粒子群 ---foriterinrange(max_iter):# 循环迭代指定的次数r1np.random.rand(num_particles,dim)# 生成随机数r1r2np.random.rand(num_particles,dim)# 生成随机数r2# 根据公式更新每个粒子的速度velw*velc1*r1*(pbest-pos)c2*r2*(gbest-pos)# 根据新速度更新每个粒子的位置posposvel# 对超出边界的粒子位置进行处理限制在边界内posnp.clip(pos,-bound,bound)# 计算更新后每个粒子位置的适应度值fitnessnp.array([sphere(x)forxinpos])# --- 更新个体和全局最优解 ---# 找到当前适应度值优于个体历史最优值的粒子maskfitnesspbest_val pbest[mask]pos[mask]# 更新这些粒子的个体最优位置pbest_val[mask]fitness[mask]# 更新这些粒子的个体最优值# 找到当前所有粒子中的最优值索引min_idxnp.argmin(pbest_val)# 如果当前最优值优于全局历史最优值ifpbest_val[min_idx]gbest_val:gbestpbest[min_idx].copy()# 更新全局最优位置gbest_valpbest_val[min_idx]# 更新全局最优值# 记录本次迭代的全局最优值gbest_history.append(gbest_val)# --- 输出结果 ---print(f最优解{gbest}, 最优值{gbest_val})# 打印最终找到的最优解和最优值# --- 可视化收敛曲线 ---plt.plot(gbest_history)# 绘制全局最优值的收敛曲线plt.xlabel(迭代次数)# 设置x轴标签plt.ylabel(全局最优值)# 设置y轴标签plt.title(PSO求解Sphere函数收敛曲线)# 设置图表标题plt.grid()# 显示网格plt.show()# 显示图表四、总结粒子群算法以其简单高效、参数少、易实现等优点在连续优化领域有广泛应用。通过合理设置参数和改进策略PSO可用于求解多种复杂优化问题。