MATLAB最优化算法综合工具箱
项目介绍
本项目是一个基于MATLAB平台开发的综合性最优化算法程序库。项目旨在演示和对比从经典数值优化到现代智能计算的多种算法。代码通过模块化的设计,针对非线性规划、线性规划及整数规划等不同类型的问题提供了相应的求解方案。
主要演示的核心问题是一个非线性规划问题:
- 目标函数:Min f(x) = (x1 - 2)^4 + (x1 - 2*x2)^2
- 约束条件:x1^2 - x2 <= 0
- 同时包含用于线性规划和整数规划演示的特定算例。
功能特性
本项目集成了以下九大核心功能模块:
- 外点罚函数法:用于求解带约束非线性规划,演示了从不可行域逼近最优解的过程。
- 内点罚函数法(障碍函数法):通过对数障碍函数限制搜索在可行域内,演示了需要可行初值的算法特性。
- 乘子法(增广拉格朗日法):结合罚函数与拉格朗日乘子,解决了纯罚函数法数值不稳定的问题。
- 坐标轮换法:一种无需梯度的直接搜索方法,通过沿着坐标轴方向轮流搜索来寻找极值。
- 复合形法:针对约束问题的直接搜索法,通过多面体顶点的反射与收缩逼近最优解。
- 粒子群算法 (PSO):集成群体智能算法,适用于求解多峰或非光滑的全局优化问题。
- 遗传算法 (GA):基于生物进化机制的随机搜索算法,演示了其在约束优化中的应用。
- 单纯形法:专门用于求解标准形式的线性规划(LP)问题。
- 割平面法:用于求解纯整数或混合整数规划(IP)问题。
此外,项目包含完善的可视化功能,能够绘制目标函数等高线、算法收敛路径以及线性规划的几何求解过程。
系统要求
- MATLAB R2016b 或更高版本
- 无需额外工具箱(算法均为原生代码实现)
使用方法
直接运行根目录下的
main.m 文件即可启动所有算法的演示。
程序运行时会弹出两个图形窗口:
- 最优化算法收敛路径对比:展示非线性规划算法(1-7)在二维平面上的迭代轨迹和收敛情况。
- 线性与整数规划演示:展示单纯形法和割平面法的求解结果及性能指标。
代码实现逻辑与算法详解
本项目核心逻辑位于 main.m 中,各功能模块的实现细节如下:
1. 全局设置与问题定义
在
main 函数开头,定义了一个标准的非线性优化结构体
ObjParams,包含目标函数句柄、不等式约束句柄、变量维度、初始点及变量上下界。这套参数被统一传递给随后的非线性优化算法。
2. 外点罚函数法 (ExteriorPenalty)
- 原理:构造增广目标函数
F(x) = f(x) + M * sum(max(0, g(x))^2)。 - 实现细节:
* 初始罚因子
M 设为 1,增长倍数
sigma 设为 10。
* 内部使用简化的直接搜索法(
SimpleHookeJeeves)寻找子问题的最优解。
* 循环迭代直到前后两次解的距离小于
epsilon 且满足约束条件。
3. 内点罚函数法 (InteriorPenalty)
- 原理:构造障碍函数
B(x) = f(x) - r * sum(log(-g(x)))。 - 特殊处理:由于内点法要求初始点必须在可行域内,代码中显式将初始点从
[0, 0] 修改为 [0, 1](满足 $0^2 - 1 < 0$)。 - 实现细节:
* 初始障碍因子
r 设为 10,衰减系数
beta 设为 0.5。
* 当点靠近边界时函数值趋于无穷大,迫使搜索路径保持在可行域内部。
4. 乘子法 (MultiplierMethod)
- 原理:采用 PHR (Powell-Hestenes-Rockafellar) 形式的增广拉格朗日函数。
- 公式:
L = f(x) + 1/(2*sigma) * [(max(0, lambda + sigma*g(x)))^2 - lambda^2]。 - 实现细节:
* 引入拉格朗日乘子
lambda 和罚因子
sigma。
* 在每次子问题求解后,根据
lambda = max(0, lambda + sigma * g(x)) 更新乘子。
* 相比普通罚函数法,该方法在较小的
sigma 下也能获得高精度解。
5. 坐标轮换法 (CoordinateDescent)
- 原理:将约束问题转化为带罚函数的无约束问题,然后进行单变量轮换搜索。
- 实现细节:
* 采用简单的步长策略:沿各轴试探,如果函数值下降则移动,否则回退。
* 当一轮搜索无法改进时,将步长
h 减半,直到满足精度要求或达到最大迭代次数。
6. 复合形法 (ComplexMethod)
- 原理:扩展了单纯形法(Simplex method for unconstrained optim),适用于有界约束问题。
- 初始化:
* 根据变量维度
N,生成
2*N 个顶点。
* 包含一个随机生成算法,确保所有初始顶点均位于可行域内且满足上下界限制。
* *注:代码主要展示了可行顶点的生成逻辑。*
7. 启发式算法 (PSO 与 GA)
- PSO_Algorithm:调用粒子群优化逻辑,利用群体协作寻找全局最优。
- GA_Algorithm:调用遗传算法逻辑,通过选择、交叉和变异算子进行演化搜索。
- 这两部分在
main 中被调用并绘图,用于对比传统算法与智能算法的收敛路径差异。
8. 单纯形法 (SimplexMethod)
- 针对问题:代码中硬编码了一个线性规划算例(Max Z = 2x1 + x2, s.t. x1+x2<=5)。
- 标准化:将最大化问题转化为最小化问题,并将不等式约束转化为等式约束(标准型:Min -2x1 -x2, s.t. Ax=b)。
- 输出:通过
VisualizeLP 函数直观展示单纯形法的求解结果。
9. 割平面法 (Cutting Plane)
- 针对问题:解决整数规划问题(Max z = x1 + x2, s.t. 2x1 + 2x2 <= 9)。
- 输出:在图形窗口的子图中以文本形式输出最优整数解、目标值、迭代次数及耗时。
辅助功能
- 可视化 (PlotResult):该函数负责在三维曲面图上叠加等高线,并绘制各类算法从初始点到最优解的迭代轨迹,即
history 变量记录的数据。 - 性能计时:
main 函数中对每种算法都使用了 tic 和 toc 进行计时,以便对比不同算法的时间复杂度。