基于学习因子变异的粒子群优化算法 (LF-PSO)
项目简介
本项目实现了一套基于MATLAB的高效全局优化工具,核心在于引入了学习因子变异机制的粒子群优化(PSO)算法。针对标准粒子群算法在进化后期容易丧失种群多样性、陷入局部最优以及收敛精度不足的问题,本项目采用了线性时变加速系数(TVAC)结合高斯变异策略。通过动态对学习因子(个体认知系数 $c_1$ 和社会认知系数 $c_2$)进行随机扰动,算法能够更灵活地平衡全局勘探(Exploration)与局部开发(Exploitation)能力。
主要功能特性
- 增强型核心算法:集成线性递减权重策略与时变学习因子,并叠加随机变异机制,有效跳出局部最优。
- 多维度参数控制:支持自定义种群规模、最大迭代次数、搜索维度、速度限制及变异概率。
- 动态可视化监控:在运行过程中实时显示收敛曲线、二维平面粒子分布图以及学习因子的动态变化轨迹。
- 多场景适应性:内置多种标准测试函数(单峰/多峰),验证算法在不同地形下的鲁棒性。
- 详细结果分析:运行结束后自动输出最优解、收敛精度、运行时间,并生成最终的静态分析图表。
算法实现细节
本项目的主要脚本(main.m)完整封装了算法的所有流程,具体实现逻辑如下:
1. 参数配置与种群初始化
- 基础参数:设定种群规模为50,最大迭代次数为1000,决策变量维度为30。
- 初始化策略:在通过
GetTestFunction 获取的搜索空间界限(lb, ub)内,利用均匀分布随机生成粒子的初始位置。 - 速度限制:为了防止粒子飞出搜索空间,将最大速度 $V_{max}$ 限制为搜索范围的15%。
- 初始评估:计算初始种群的适应度,并据此确立初始的个体最优(pbest)和全局最优(gbest)。
2. 惯性权重与基础学习因子更新
采用线性时变策略来控制核心参数:
- 惯性权重 ($w$):随迭代次数从 0.9 线性递减至 0.4。在初期保持较大的$w$有利于全局搜索,后期减小$w$有利于精确收敛。
- 基础学习因子:
*
自我认知系数 ($c_1$):从
2.5 线性降低至
0.5。初期强调个体认知,保持群体多样性。
*
社会认知系数 ($c_2$):从
0.5 线性增加至
2.5。后期强调社会经验,加速向全局最优收敛。
3. 学习因子变异策略 (核心创新)
在每一代迭代中,引入概率性的变异机制来干扰学习因子:
- 变异触发:设定变异概率
mut_prob 为 0.1(10%的概率)。 - 高斯变异:当触发变异时,对当前的 $c_1$ 和 $c_2$ 叠加标准正态分布噪声(高斯噪声),扰动幅度由
mut_scale (0.5) 控制。
* 逻辑:
c_new = c_old + randn * 0.5
- 边界保护:为防止参数失控导致算法发散,强制将变异后的 $c_1, c_2$ 限制在 [0.1, 4.0] 区间内。
4. 粒子状态更新
依据标准PSO公式进行位置和速度的迭代:
- 速度更新:结合当前惯性、个体历史最优方向(由 $c_1$ 加权)和群体全局最优方向(由 $c_2$ 加权)计算新速度。
- 位置更新:利用新速度更新粒子位置。
- 边界处理:对越界的速度和位置进行强制截断(Clamping),确保粒子始终在合法解空间内。
5. 可视化与交互
具备强大的实时监控能力:
- 收敛曲线:实时绘制对数坐标下的适应度下降曲线。
- 种群分布:在二维平面(前两个维度)上动态展示粒子的聚集与扩散过程,用红色五角星标记全局最优位置。
- 参数追踪:实时绘制 $c_1$ 和 $c_2$ 的变化曲线,直观展示线性变化趋势下的随机变异波动。
- 防卡死机制:通过
mod(t, 20) == 0 控制绘图刷新频率,通过 drawnow limitrate 保证运算效率。
6. 测试函数集
代码内部集成了以下标准测试函数,用于评估算法性能:
- Sphere:单峰函数,测试收敛速度。
- Rosenbrock:病态函数,测试陷入局部最优后的逃逸能力。
- Rastrigin(默认):多峰函数,存在大量局部极值,测试全局寻优能力。
- Griewank:多峰函数,测试在复杂波形表面的搜索能力。
使用方法
- 确保计算机上安装了 MATLAB (推荐 R2016b 及以上版本)。
- 直接运行主程序脚本。
- 程序将自动开始迭代,并弹出 "LF-PSO 优化过程" 窗口实时显示动画。
- 运行结束后,MATLAB 命令行窗口将打印运行时间、最优适应度、最优位置坐标等信息。
- 程序会生成第二张图表 "LF-PSO 最终分析",展示完整的收敛历史和参数变异历史。
修改配置
若需调整测试环境,可在代码顶部的 参数设置 区域修改:
- 修改
f_select = 3 中的数字(1-4)来切换测试函数。 - 修改
algo_params.PopSize 调整种群数量。 - 修改
algo_params.mut_prob 调整变异概率。