基本标准粒子群优化(Basic PSO)算法MATLAB实现
项目简介
本项目提供了一个基于MATLAB环境的完整基本标准粒子群优化(Basic Particle Swarm Optimization, PSO)算法实现。该算法通过模拟自然界中鸟群捕食的群体智慧行为,利用个体与群体的协作机制,在连续解空间中高效搜索全局最优解。
本代码针对高维函数优化问题进行了配置,默认使用经典的Rosenbrock函数(香蕉函数)作为测试目标,演示了PSO算法在解决非线性、多模态复杂优化问题时的收敛能力和寻优精度。
功能特性
本项目代码实现了以下核心功能特性:
- 参数化配置体系:算法的关键参数(如种群规模、迭代次数、惯性权重、学习因子)及问题参数(维度、边界)均集中定义,便于调整和实验。
- 种群初始化机制:在设定的多维搜索空间内均匀随机生成粒子的初始位置,并将初始速度设为零,确保搜索从合法区域开始。
- 标准PSO更新核心:实现了带有惯性权重的速度更新公式,平衡了算法的全局探索(Exploration)与局部开发(Exploitation)能力。
- 双重边界约束:
*
速度限制:限制粒子的最大飞行速度,防止粒子因步长过大飞越最优解区域。
*
位置限制:采用边界拉回(Clamping)策略,强制粒子始终在合法的搜索空间内由。
- 目标函数封装:内置了Rosenbrock测试函数,支持任意维度的适应度计算。
- 实时监控与可视化:
* 迭代过程中实时在控制台输出当前的全局最优适应度。
* 程序结合计时器统计算法总耗时。
* 运行结束后自动生成半对数坐标(Semilog)收敛曲线,清晰展示适应度下降趋势。
系统要求
- MATLAB R2016a 或更高版本(代码使用了一些标准的基础函数,对版本依赖性较低,但绘图和随机数生成函数需MATLAB环境支持)。
使用方法
- 打开MATLAB软件,将工作路径定位到包含本脚本的文件夹。
- 直接运行主函数。
- 程序将自动清理环境变量,开始迭代计算。
- 观察命令行窗口(Command Window)中的实时迭代日志。
- 运行结束后,查看生成的收敛曲线图窗以及命令行输出的最终优化结果(最优适应度值、计算耗时及部分最优解向量)。
实现逻辑详细说明
本项目的代码逻辑严格遵循标准PSO算法流程,具体实现细节如下:
1. 环境清理与参数设定
程序启动时首先清理工作区变量、关闭图窗及清空命令行。随后定义以下关键参数:
- 种群参数:种群规模设为50,最大迭代次数设为100。
- 权重与因子:惯性权重恒定为0.7298,个体学习因子(c1)和社会学习因子(c2)均设为1.4962。
- 搜索空间:针对Rosenbrock函数,维度设定为30维,变量搜索范围为[-5, 10]。
- 速度约束:最大速度动态设定为搜索空间范围的10%,以控制粒子活性。
2. 种群结构体初始化
代码通过结构体数组构建种群,每个粒子包含:
- Position:当前位置向量。
- Velocity:当前速度向量。
- Cost:当前适应度值。
- Best:记录该粒子历史最优位置和最优适应度(pBest)。
同时,初始化全局最优变量(GlobalBest),初始适应度设为无穷大。初始位置使用均匀分布随机函数在边界内生成,初始速度全零。
3. 核心迭代循环
算法进入主循环,执行以下步骤直至达到最大迭代次数:
- 速度更新:依据标准公式,结合上一时刻速度、个体历史最优方向(pBest - 当前位置)和全局历史最优方向(gBest - 当前位置)计算新速度。公式中引入了随机扰动项以增加随机性。
- 速度钳位:检查更新后的速度,若超过设定的最大/最小速度阈值,则将其强制限制在阈值范围内。
- 位置更新:将当前位置加上更新后的速度,得到新位置。
- 位置边界处理:采用简单的边界吸收策略,若粒子位置超出定义的搜索上下界,直接将其拉回到对应的边界值上。
- 适应度评估:调用局部函数计算新位置的Rosenbrock函数值。
- 最优解更新:
* 若当前适应度优于个体历史最优,更新pBest。
* 若更新后的pBest优于全局历史最优,更新gBest。
- 记录与显示:记录当次迭代的全局最优值,并在命令行打印进度。
4. 结果处理与可视化
迭代结束后,计算程序总运行时间并输出。绘制收敛曲线时,采用
semilogy函数(半对数坐标),这对于展示像Rosenbrock这类可能跨越多个数量级的适应度下降过程非常有效。图表中会标注最终收敛的数值。
关键算法与函数分析
目标函数:Rosenbrock (MyCostFunction)
代码中实现了一个局部辅助函数用于计算适应度。该函数计算的是通用的N维Rosenbrock函数(也称香蕉函数)。
- 公式逻辑:计算相邻变量间的关系
sum(100*(x(i+1) - x(i)^2)^2 + (1 - x(i))^2)。 - 特性:该函数是一个非凸函数,全局最小值位于
(1, 1, ..., 1) 处,函数值为0。由于其峡谷形状,算法很容易陷入局部最优,因此非常检验PSO算法的性能。
速度更新策略
代码采用了固定权重的更新策略:
- 惯性权重 (w = 0.7298):此特定值通常与学习因子配合使用,能较好地保持粒子的运动惯性,防止过早收敛。
- 学习因子 (c1 = c2 = 1.4962):这两个参数相等,意味着粒子同等重视“自身经验”和“群体经验”,有助于种群协同进化。
边界控制机制
代码采用了
硬约束(Absorbing Bound)方式。当粒子试图飞出边界时,代码直接使用
max 和
min 函数将其坐标重置为边界值。这种方法简单有效,能确保所有解都在可行域内,但通过将粒子“粘”在边界上,有时可能导致种群多样性的轻微降低。