从代码学习数值优化算法 - 分片McCormick放松方法Python版
文章目录
- 前言
- 二、为什么要用 McCormick 放松?
- 三、分片 McCormick 放松的改进
-
- 3.1 一个直观的例子
- 3.2 形象理解
- 四、用代码实现分片 McCormick 放松
-
- 代码中的关键点解析
- 总结
前言
在数值优化领域,非凸问题的求解常常令人望而却步,尤其是当我们遇到双线性项(如 z = x ⋅ y z = x \cdot y z=x⋅y)时,问题的非凸性使得传统方法难以直接应对。McCormick 放松方法通过引入线性约束,将复杂的非凸问题转化为可求解的凸问题,为我们打开了一扇门。而分片 McCormick 放松(Piecewise McCormick Relaxation, PMR)作为其改进版本,通过将变量的定义域划分为多个子区间,进一步提升了近似精度。
本文将结合理论与 Python 代码,带你深入理解分片 McCormick 放松方法的核心思想,并通过一个具体的优化问题( minimize z = x ⋅ y − x + y \text{minimize } z = x \cdot y - x + y minimize z=x⋅y−x+y)展示其实现过程。无论你是优化算法的新手,还是希望通过代码加深理解的开发者,这篇博客都将为你提供一个清晰的学习路径。
二、为什么要用 McCormick 放松?
在数学优化中,我们经常需要处理 非凸 的双线性项,例如:
z = x ⋅ y z = x \cdot y z=x⋅y
这里的 z = x ⋅ y z = x \cdot y z=x⋅y 是非凸的,这意味着直接求解优化问题可能会变得异常困难,甚至陷入局部最优。McCormick 放松的核心思想是用 线性不等式来近似这个非凸关系,从而将问题转化为 线性规划(LP) 或 混合整数线性规划(MILP),这些线性问题相比非线性问题更容易求解。
McCormick 放松通过以下四个不等式,将 z = x ⋅ y z = x \cdot y z=x⋅y 约束在一个凸区域内:
z ≥ x L y + x y L − x L y L z \geq x_L y + x y_L - x_L y_L z≥xLy+xyL−xLyL
z ≥ x U y + x y U − x U y U z \geq x_U y + x y_U - x_U y_U z≥xUy+xyU−xUyU
z ≤ x U y + x y L