基于MATLAB的粒子群算法求解Shaffer函数全局最优
项目简介
本项目是一个基于MATLAB环境开发的智能优化算法演示程序。它完整实现了标准粒子群优化算法(Particle Swarm Optimization, PSO),专门用于求解复杂的Shaffer基准测试函数(Schaffer F6)。Shaffer函数因其具备强烈的振荡特性和无数个局部极值点,常被用来检验优化算法跳出局部最优、寻找全局最优的能力。
本项目不仅实现了核心算法逻辑,还提供了丰富的可视化界面,能够实时展示粒子群在三维空间中的搜索动态以及适应度收敛曲线,帮助用户直观理解群智能算法的运行机制。
功能特性
- 标准PSO算法实现:不依赖MATLAB工具箱,从底层构建完整的粒子群迭代逻辑。
- 复杂多峰函数寻优:封装了Shaffer F6函数,精确模拟非凸、非线性优化场景。
- 动态参数调整:实现了线性递减权值策略(Linear Decreasing Inertia Weight),在迭代初期侧重全局搜索,后期侧重局部开发。
- 实时可视化:
*
收敛曲线:实时绘制适应度进化曲线,监控算法收敛速度。
*
3D寻优动态:在三维地形图上以散点形式展示粒子群的移动轨迹和分布情况。
- 边界约束控制:包含完善的速度限制和位置边界处理机制。
系统要求
- MATLAB R2016a 或更高版本(代码使用基础绘图和数学函数,兼容性较好)。
- 无需额外的工具箱(Optimization Toolbox 不是必须的,因为算法是原生实现的)。
使用方法
- 将项目文件保存到MATLAB的工作路径中。
- 在MATLAB命令行窗口输入
main 并回车,或在编辑器中点击“运行”。 - 程序将弹出一个图形窗口,展示粒子群寻找最优解的动态过程。
- 运行结束后,命令行窗口将输出全局最优解坐标、最优适应度值及理论参考值。
---
代码实现逻辑详解
本项目核心逻辑包含在 main 函数中,整个程序的执行流程如下:
1. 参数设置与环境初始化
程序首先定义了算法的关键参数:
- 种群规模:设定为50个粒子。
- 迭代次数:最大迭代200次。
- 算法因子:学习因子 $c1$(自我认知)和 $c2$(社会认知)均设为1.5;惯性权重 $w$ 设定为从0.9线性递减至0.4。
- 搜索空间:X和Y轴范围均被限制在 [-100, 100] 之间,最大飞行速度被限制为搜索范围的20%。
2. 种群初始化
在进入迭代之前,程序在设定的搜索空间内随机生成粒子的初始位置和初始速度。同时,计算每个粒子的初始适应度值,初始化个体历史最优(Pbest)为当前位置,并从中筛选出初始的全局最优(Gbest)。
3. 可视化界面构建
利用MATLAB的绘图功能预设两个子图:
- 左图:用于绘制迭代次数与适应度值的关系曲线。
- 右图:通过网格化采样生成Shaffer函数的3D曲面背景,并叠加初始粒子散点。
4. 迭代优化循环
这是程序的核心部分,包含以下步骤:
- 权重更新:根据当前迭代次数 $t$,线性降低惯性权重 $w$,公式为 $w = w_{max} - (w_{max} - w_{min}) times t / max_iter$。
- 速度更新:依据标准PSO公式更新速度,结合了上一刻速度、个体最优方向引导和全局最优方向引导。同时对速度进行截断处理,防止粒子飞行过快飞出搜索空间。
- 位置更新:根据更新后的速度移动粒子位置。若粒子超出边界,程序采用强制边界策略(Clamping),将其拉回至边界值。
- 适应度评估与更新:计算新位置的Shaffer函数值。如果优于历史记录,则更新体最优(Pbest);如果优于全局历史记录,则更新全局最优(Gbest)。
5. 动态结果展示
为了平衡运行效率和视觉效果,程序设置为每2次迭代(以及首次和末次)刷新一次绘图:
- 更新左侧收敛曲线的数据。
- 更新右侧3D散点的坐标(X, Y)以及其在曲面上的高度(Z),使用户能观察到粒子逐渐向中心点 (0,0) 聚集的过程。
6. 结果输出
循环结束后,程序在控制台打印统计信息,包括实际运行的迭代次数、找到的全局最优解坐标 $(x, y)$ 以及对应的函数极小值。
---
关键算法与函数分析
Shaffer基准函数 (shaffer_func)
代码末尾定义的子函数实现了Schaffer F6函数的数学模型。
- 数学特性:该函数在 $(0,0)$ 处取得全局最小值0。其特点是极值点分布呈同心圆状,随着距离中心越远,振荡幅度越小,且在全局最优解附近存在大量局部极小点,极易导致算法早熟收敛。
- 实现细节:
* 分子部分:$(sin(sqrt{x_1^2 + x_2^2}))^2 - 0.5$
* 分母部分:$(1 + 0.001 times (x_1^2 + x_2^2))^2$
* 最终输出:$0.5 + text{分子} / text{分母}$
线性递减权重策略
代码中实现了动态惯性权重:
w = w_max - (w_max - w_min) * t / max_iter;
这一策略是PSO算法的重要改进点。较大的 $w$ 有利于全局探索(Exploration),防止陷入局部最优;较小的 $w$ 有利于局部开发(Exploitation),提高收敛精度。随时间线性递减的设置使得算法在初期具备广阔的搜索能力,而在后期能精细搜索最优解。
边界处理机制
代码采用了硬约束(Absorbing boundary condition)的方式处理越界粒子:
pop_pos(i, pop_pos(i,:) > x_max) = x_max;
当粒子试图飞出设定区域 [-100, 100] 时,其坐标会被直接重置为边界值。这保证了所有解都在有效的定义域内。