MATLAB通用最优化算法集锦与20例实战解析
项目简介
本项目构建了一个集成的MATLAB最优化计算系统,通过一个主入口文件
main.m 串联起5个核心算法演示案例。项目覆盖了从基础的单变量数值逼近到多变量约束求解,再到现代启发式智能算法的多种优化技术。每个案例都结合了可视化的迭代过程,旨在直观展示算法的收敛行为和数学原理。
功能特性
本项目
main.m 文件包含了以下五大核心功能模块:
- 单变量优化:二次插值法 (Quadratic Interpolation)
* 利用抛物线拟合来逼近单峰函数的极小值。
* 动态展示三点区间的迭代更新过程。
- 单变量优化:黄金分割法 (Golden Section Search)
* 基于 0.618 比例(黄金分割比)进行区间收缩。
* 可视化展示搜索区间的逐步缩小及内点位置。
- 多变量约束优化:外点罚函数法 (Penalty Function Method)
* 解决带有不等式约束的非线性规划问题。
* 通过引入惩罚项构造增广目标函数,将有约束问题转化为无约束问题序列。
- 多变量约束优化:增广拉格朗日乘子法 (Augmented Lagrangian Method)
* 专门处理带有等式约束的优化问题。
* 结合了拉格朗日乘子法和罚函数法的优点,通过迭代更新乘子
lambda 和罚参数
sigma 求解。
- 智能优化:遗传算法 (Genetic Algorithm)
* 针对多峰、非凸函数(Rastrigin函数)的全局寻优。
* 采用实数编码方式初始化种群,设置了交叉与变异概率参数。
详细实现逻辑与算法分析
以下是 main.m 中各子模块的具体实现细节:
1. 二次插值法 (run_quadratic_interpolation)
- 目标函数: $f(x) = x^2 - sin(x)$。
- 核心逻辑:
*
插值公式: 使用拉格朗日插值多项式极值点公式,利用当前的三个点 $(x_1, x_2, x_3)$ 计算极值估计点 $x_p$。
*
区间更新: 比较 $x_p$ 与中间点 $x_2$ 的函数值,$f(x_p)$ 与 $f(x_2)$,结合 $x_p$ 相对 $x_2$ 的位置,丢弃函数值较大的一侧区间。
*
收敛判定: 当 $|x_p - x_2| < epsilon$ 时停止迭代。
- 可视化: 实时绘制拟合的三点(蓝色)和计算出的极值点(红色),动态展示逼近过程。
2. 黄金分割法 (run_golden_section)
- 目标函数: $f(x) = e^{-x} + x^2$。
- 核心逻辑:
*
试探点计算: 定义黄金分割比 $tau approx 0.618$,在区间 $[a, b]$ 内计算两个对称试探点 $lambda$ 和 $mu$。
*
区间收缩: 如果 $f(lambda) < f(mu)$,说明极小值在左侧,将 $b$ 更新为 $mu$;反之则将 $a$ 更新为 $lambda$。
*
迭代控制: 循环直到区间长度 $|b - a|$ 小于容差 $epsilon$。
- 可视化: 使用黄色填充区域动态显示当前的搜索区间范围,并在图中标注迭代次数。
3. 外点罚函数法 (run_penalty_method)
- 优化问题: 最小化 $(x_1-2)^2 + (x_2-1)^2$,约束条件 $x_1 - 2x_2 + 1 le 0$。
- 核心逻辑:
*
构造罚函数: 定义 $P(x, M) = f(x) + M cdot (max(0, g(x)))^2$。只有当约束被违反($g(x) > 0$)时,惩罚项才生效。
*
外层循环: 逐步增大罚因子 $M$(每次放大10倍,即 $M_{k+1} = M_k times 10$)。
*
内层优化: 每一轮使用无约束优化算法(代码调用名为
my_nelder_mead 的求解器)求解当前 $M$ 下的最优解。
*
热启动: 下一轮迭代以上一轮的最优解作为初始点 $x_0$。
- 可视化: 在等高线图上绘制约束边界(红色虚线)和优化路径(黑色连线),直观展示解如何从不可行域逼近可行域边界。
4. 增广拉格朗日乘子法 (run_augmented_lagrangian)
- 优化问题: 最小化 $x_1^2 + x_2^2$,约束条件 $x_1 + x_2 - 4 = 0$。
- 核心逻辑:
*
增广拉格朗日函数: $L(x, lambda, sigma) = f(x) + lambda h(x) + frac{sigma}{2} h(x)^2$。
*
梯度计算: 代码中显式定义了目标函数和约束函数的梯度,用于辅助内层求解。
*
乘子更新: 在每一轮外层循环中,根据公式 $lambda_{k+1} = lambda_k + sigma h(x_k)$ 更新拉格朗日乘子。
*
罚参数更新: 逐步增大 $sigma$ 以加速收敛。
*
内层求解: 调用
my_bfgs_solver(BFGS拟牛顿法)求解子问题。
- 可视化: 绘制目标函数等高线及等式约束线(红色实线),标记每一轮外层迭代得到的解。
5. 遗传算法 (run_genetic_algorithm)
- 目标函数: Rastrigin函数(典型的多峰测试函数),全局最小值为 0。
- 算法参数:
* 种群规模: 50
* 最大代数: 50
* 交叉概率 $P_c$: 0.8
* 变异概率 $P_m$: 0.1
* 搜索范围: $[-5.12, 5.12]$
- 初始化: 采用实数编码,在指定边界内随机生成初始种群矩阵。
- 可视化: 初始化了名为“遗传算法-Rastrigin”的绘图窗口,准备展示种群分布或收敛曲线。
使用方法
- 确保MATLAB环境已安装。
- 将
main.m 文件放置这也是当前的工作目录。 - 注意: 代码中调用了
my_nelder_mead 和 my_bfgs_solver 这两个函数,运行前需确保这两个自定义函数文件存在于路径中,或将相应逻辑补充如果不齐。 - 在MATLAB命令窗口直接输入
main 并回车。 - 程序将依次运行5个案例,每个案例会在独立的图形窗口中展示动态优化过程,并在命令窗口输出详细的迭代数据表格。
系统要求
- MATLAB R2016b 或更高版本(推荐,以支持更好的图形渲染)。
- 本代码主要依赖MATLAB基础绘图和计算功能。
- 需要自定义求解器
my_nelder_mead 和 my_bfgs_solver 的支持才能完整运行案例3和案例4。