基于隐式梯度与序列凸近似的混合整数非线性规划算法进阶题
1. 题目描述
考虑如下带有逻辑约束的混合整数非线性规划(MINLP)问题:
\[\begin{aligned} \min_{x, y} \quad & f(x, y) = \sin(x_1 + 2x_2) + (y_1 - 1)^2 + e^{-x_2} y_2 \\ \text{s.t.} \quad & g_1(x, y) = x_1^2 + x_2^2 - 4 \le 0, \\ & g_2(x, y) = -x_1 + y_1 x_2 \le 0, \\ & h(y) = y_1 + 2y_2 = 3, \\ & y_1, y_2 \in \{0, 1\}, \\ & x \in \mathbb{R}^2, \; x \in [-5, 5]^2. \end{aligned} \]
其中 \(f\) 非凸,\(g_1\) 为凸二次约束,\(g_2\) 由于含有乘积项 \(y_1 x_2\) 而引入逻辑耦合(当 \(y_1=0\) 时约束退化为 \(-x_1 \le 0\),否则为非线性)。目标是将离散变量与连续变量协同优化,并处理非凸性。
2. 解题思路
本题的难点在于:
- 离散变量与连续变量耦合;
- 目标函数与部分约束非凸;
- 逻辑约束导致可行域分段定义。
我们设计一种隐式梯度与序列凸近似混合算法,核心思想如下:
- 用序列凸近似(SCA)处理非凸函数,在每步迭代中构建凸替代模型。
- 用隐式梯度法处理离散变量,即通过连续松弛和舍入策略,并利用梯度信息指导离散变量的更新。
- 结合分支定界框架确保全局收敛性。
3. 解题步骤详解
步骤1:连续松弛与凸近似
首先将离散变量 \(y_i \in \{0,1\}\) 松弛为 \(y_i \in [0,1]\),得到连续松弛问题。在第 \(k\) 次迭代点 \((x^k, y^k)\),对非凸项进行凸近似:
- 目标函数 \(f\) 中,\(\sin(x_1+2x_2)\) 在 \(x^k\) 处一阶泰勒展开为线性函数:
\[\sin(x_1+2x_2) \approx \sin(a^k) + \cos(a^k)(x_1+2x_2 - a^k), \quad a^k = x_1^k + 2x_2^k. \]
- 约束 \(g_2\) 中,乘积项 \(y_1 x_2\) 在 \((y_1^k, x_2^k)\) 处线性化:
\[y_1 x_2 \approx y_1^k x_2 + x_2^k y_1 - y_1^k x_2^k. \]
线性化后,\(g_2\) 变为关于 \(x, y\) 的线性约束。
- 对 \(g_1\)(已凸)保持不变。
得到凸近似子问题:
\[\begin{aligned} \min_{x, y} \quad & \tilde{f}^k(x, y) = \cos(a^k)(x_1+2x_2) + (y_1-1)^2 + e^{-x_2^k} y_2 \\ \text{s.t.} \quad & g_1(x) \le 0, \\ & -x_1 + y_1^k x_2 + x_2^k y_1 - y_1^k x_2^k \le 0, \\ & y_1 + 2y_2 = 3, \\ & y_i \in [0,1], \quad x \in [-5,5]^2. \end{aligned} \]
步骤2:隐式梯度更新离散变量
在解凸子问题得到连续解 \((\tilde{x}^{k+1}, \tilde{y}^{k+1})\) 后,我们需要将松弛的 \(y\) 恢复到离散值。传统方法直接舍入可能破坏可行性,因此采用隐式梯度策略:
- 定义隐式函数 \(y^*(x) = \arg\min_{y \in [0,1]^2} L(x, y, \lambda)\),其中 \(L\) 是拉格朗日函数,\(\lambda\) 为等式约束乘子。
- 计算 \(y\) 关于 \(x\) 的隐式梯度 \(\nabla_x y^*\) 可通过解最优性条件的微分得到,但计算复杂。这里用简化方法:在凸子问题中固定 \(x = \tilde{x}^{k+1}\),解关于 \(y\) 的线性规划:
\[\begin{aligned} \min_{y} \quad & (y_1-1)^2 + e^{-\tilde{x}_2^{k+1}} y_2 \\ \text{s.t.} \quad & y_1 + 2y_2 = 3, \quad y_i \in [0,1]. \end{aligned} \]
该问题目标关于 \(y_1\) 凸二次、关于 \(y_2\) 线性,可解析求解。得到连续最优 \(y_c^{k+1}\) 后,进行概率舍入:以概率 \(y_{c,i}^{k+1}\) 取 1,否则取 0。这等价于在期望意义下保持可行性。
步骤3:序列凸近似框架与信赖域结合
为防止线性化误差过大,增加信赖域约束:
\[\|x - x^k\|_\infty \le \Delta^k, \quad \|y - y^k\|_\infty \le \Delta^k. \]
初始 \(\Delta^0=1\),根据近似质量调整:
- 定义实际下降量 \(\text{ared} = f(x^k, y^k) - f(x^{k+1}, y^{k+1})\),
预测下降量 \(\text{pred} = \tilde{f}^k(x^k, y^k) - \tilde{f}^k(\tilde{x}^{k+1}, \tilde{y}^{k+1})\)。 - 若 \(\text{ared}/\text{pred} > 0.3\),接受迭代并扩大信赖域 \(\Delta^{k+1} = 1.5 \Delta^k\);否则缩小 \(\Delta^{k+1} = 0.5 \Delta^k\) 并重解子问题。
步骤4:分支定界处理整数性
为得到全局最优解,在外层套用分支定界(B&B):
- 每个节点对应一组固定的整数变量(通过舍入或分支产生)。
- 在节点内运行上述 SCA 隐式梯度算法求解连续松弛问题,得到下界。
- 若节点松弛解中 \(y\) 已整数,计算目标值作为上界候选。
- 分支策略:选某个 \(y_i \in (0,1)\) 创建两个子节点,分别固定 \(y_i=0\) 和 \(y_i=1\)。
- 剪枝:若节点下界超过当前最好上界,剪枝。
步骤5:算法流程总结
- 初始化:设定初始点 \((x^0, y^0)\),信赖域半径 \(\Delta^0\),上界 \(UB=+\infty\),B&B 节点队列。
- 对每个 B&B 节点:
a. 在该节点整数限制下,运行 SCA 隐式梯度迭代直至收敛,得到松弛最优值(下界)和连续解。
b. 若解中 \(y\) 全为整数,更新 UB。
c. 若下界 < UB,选一个分数 \(y_i\) 分支。 - 当所有节点处理完毕,输出全局最优解。
4. 关键点与注意事项
- 隐式梯度通过解辅助优化问题隐式更新离散变量,避免直接舍入导致的不可行。
- 序列凸近似需保证逼近模型的凸性,否则子问题难解。
- 信赖域控制线性化误差,提升稳定性。
- 分支定界保证全局最优性,但计算量随整数变量数指数增长,可结合启发式早期剪枝。
5. 预期结果
该混合算法能有效处理非凸目标、逻辑约束和离散变量,在较小规模 MINLP 中可找到高质量可行解,并在一定条件下收敛到局部最优(或全局最优,若 B&B 完全搜索)。实际应用时可结合 warm-start 策略加速 SCA 迭代。