项目:求解约束优化问题的改进粒子群优化算法
项目简介
本项目实现了一套基于反向学习与自适应权重的改进粒子群优化(PSO)算法框架,旨在解决带有复杂非线性约束的数值优化问题。代码采用 MATLAB 编写,通过引入 Deb 的可行性规则(Feasibility Rules)来处理约束条件,不仅追求目标函数的极小值,更保证解的严格可行性。该项目以经典的 Rosenbrock 函数在受限区域内的搜索为例,展示了算法在处理非线性不等式约束和边界限制时的有效性。
功能特性
- 改进的惯性权重策略:采用线性递减权重的自适应机制,在迭代初期保持较高的全局搜索能力,后期增强局部开发能力。
- 鲁棒的约束处理机制:摒弃传统的罚函数法,采用 Deb 可行性规则,通过优先层级(可行解优于不可行解、违反度低的优于违反度高的)来引导粒子向可行域进化。
- 边界反弹与阻尼机制:在粒子触碰边界时采用了“反弹并减速”的策略,有效防止粒子飞出搜索空间并保留其部分动量信息。
- 全过程可视化:集成实时绘图功能,能够展示适应度收敛、约束违反度下降趋势以及粒子在等高线图上的最终分布。
系统要求
- MATLAB R2016b 或更高版本
- 无需额外的工具箱,完全基于原生 MATLAB 函数实现
使用方法
本项目包含一个主脚本文件,直接运行该脚本即可启动优化过程。程序将自动执行以下操作:
- 初始化种群及参数。
- 执行粒子群迭代优化。
- 在命令行输出关键迭代节点的收敛信息。
- 运行结束后弹出图形窗口,展示分析结果。
关键算法与实现细节
本项目的核心逻辑完全封装在主函数及其子函数中,具体实现细节如下:
1. 优化问题定义
- 目标函数:针对二维 Rosenbrock 函数(香蕉函数)求极小值。
- 决策变量:包含两个变量 x1 和 x2,搜索空间限制在 [-2.0, 2.0] 之间。
- 约束条件:代码内部实现了两个非线性不等式约束:
* 非线性约束:(x1 - 1)^3 - x2 + 1 <= 0
* 线性约束:x1 + x2 - 2 <= 0
2. 改进 PSO 核心逻辑
- 种群初始化:在给定的变量上下界内利用均匀分布随机初始化粒子位置,初始速度设为零。
- 自适应权重:在主循环中,惯性权重
w 随着迭代次数 it 从 w_max (0.9) 线性递减至 w_min (0.4)。公式为:w = w_max - ((w_max - w_min) * it / MaxIt)。 - 速度更新:标准 PSO 速度公式,包含惯性部分、个体认知部分(c1=1.5)和社会群体部分(c2=2.0)。此外,实现了速度钳制(Clamping),限制最大速度不超过搜索范围的 20%,防止粒子发散。
- 位置更新与边界处理:
* 更新位置后,立即检查是否越界。
* 对于越界的维度,执行
反弹策略:将速度反向并乘以 0.5(模拟撞墙后的能量损失)。
* 强制将位置限制在可行域边界上(截断处理)。
3. 约束处理机制 (Deb's Rules)
项目通过
CheckConstraints 和
CheckBetter 两个子函数实现了基于可行性规则的比较逻辑,这是处理约束优化的核心:
- 违反度计算:计算所有不等式约束 g(x) > 0 的部分(归零处理后求和)作为总违反度。
- 择优策略:在比较两个解(如个体历史最优与当前位置,或全局最优与个体最优)时,遵循以下逻辑:
1. 若两个解都可行,选择目标函数值较小的解。
2. 若一个可行一个不可行,直接选择可行解。
3. 若两个解都不可行,选择约束违反度较小的解。
这种机制确保了种群首先会快速收敛到可行域,然后在可行域内寻找最优解。
4. 结果可视化
程序运行结束后会生成包含三个子图的分析窗口:
- 适应度收敛曲线:绘制全局最优目标函数值随迭代次数的变化。
- 约束违背度演化:使用对数坐标展示全局最优解的约束违反程度,观察算法如何从不可行域进入可行域(违反度降为0)。
- 最终粒子分布与可行域:
* 绘制 Rosenbrock 函数的等高线背景。
* 利用虚线勾勒出非线性约束和线性约束的边界。
* 散点图标注最终迭代后的粒子群位置(绿色)和全局最优解位置(红色五角星),直观展示解是否落在两约束围成的可行区域内。