非线性规划中的分支定界-内点法混合算法基础题
题目描述
考虑一个非线性整数规划问题,它是非线性规划(NLP)与整数规划(IP)的结合,称为混合整数非线性规划(MINLP)。这类问题通常包含非线性目标函数、非线性约束以及部分或全部决策变量要求取整数值(例如整数或0-1变量)。这类问题因其非凸性和组合爆炸特性,求解难度极大。分支定界法是一种经典的组合优化框架,用于处理离散变量,而内点法是求解连续非线性规划的有效方法。本题目要求你理解如何将这两种方法结合,设计一个基础的混合算法,用于求解中等规模的凸MINLP问题。
具体问题如下:
最小化非线性目标函数 \(f(x, y) = (x_1 - 2)^2 + (x_2 - 3)^2 + y_1^2\),
满足约束:
- 非线性约束:\(x_1^2 + x_2^2 - 4 \leq 0\);
- 线性约束:\(y_1 + y_2 \leq 3\);
- 整数约束:\(y_1, y_2\) 为二进制变量(0或1);
- 连续变量范围:\(x_1, x_2 \in [0, 5]\)。
要求:使用分支定界-内点法混合算法,在分支定界树的每个节点上,固定整数变量后,剩下的连续变量子问题(一个连续非线性规划)用内点法求解,以此获得该节点的界限,从而系统地搜索整数解空间,最终找到满足所有约束的全局最优解。
解题过程循序渐进讲解
第一步:理解问题与算法框架
- 问题分析:
- 决策变量分为两组:连续变量 \(x = (x_1, x_2)\) 和整数变量 \(y = (y_1, y_2)\),其中 \(y\) 是二进制变量。
- 目标函数 \(f(x, y)\) 关于 \(x\) 是凸二次函数,关于 \(y\) 是线性项(因为 \(y_1^2 = y_1\) 当 \(y_1 \in \{0,1\}\))。非线性约束是凸的圆盘区域。因此,若固定 \(y\),剩下的是一个凸连续非线性规划(NLP),理论上内点法能高效求解。
- 算法框架:分支定界-内点法混合算法。
- 分支定界:是一种树形搜索方法。根节点对应原问题(整数约束松弛为连续,即允许 \(y \in [0,1]\))。每个节点代表一个子问题,其中部分整数变量的取值被固定(分支),其余整数变量被松弛。算法通过求解每个节点的连续松弛问题(用内点法)得到该节点的目标函数下界(对于最小化问题)。通过比较界限、剪枝、分支,逐步逼近最优整数解。
- 内点法:用于求解每个节点的连续非线性规划子问题。内点法通过在可行域内部引入障碍函数,将约束问题转化为一系列无约束或等式约束问题,用牛顿法迭代求解,适合处理凸连续问题。
第二步:初始化与根节点处理
- 建立根节点:
- 对应子问题:将整数约束 \(y_1, y_2 \in \{0,1\}\) 松弛为 \(0 \leq y_1, y_2 \leq 1\),其他约束不变。这是一个连续非线性规划:
\[ \begin{aligned} \min \quad & (x_1 - 2)^2 + (x_2 - 3)^2 + y_1^2 \\ \text{s.t.} \quad & x_1^2 + x_2^2 - 4 \leq 0, \\ & y_1 + y_2 \leq 3, \\ & 0 \leq x_1, x_2 \leq 5, \\ & 0 \leq y_1, y_2 \leq 1. \end{aligned} \]
- 用内点法求解此连续松弛问题:
- 内点法(障碍函数法)步骤简述:
a. 将不等式约束 \(g(x) \leq 0\) 通过对数障碍函数转化为目标函数的加性项:\(B(x, y; \mu) = f(x, y) - \mu \sum_i \ln(-g_i(x, y))\),其中 \(\mu > 0\) 是障碍参数,\(g_i\) 包括非线性约束和变量边界。
b. 从初始可行内点开始,固定 \(\mu\),用牛顿法求解无约束问题 \(\min B(x, y; \mu)\) 得到近似解。
c. 逐步减小 \(\mu\)(例如 \(\mu_{k+1} = 0.1 \mu_k\)),重复牛顿法,直到满足收敛条件(如KKT残差足够小)。 - 对于本例,假设内点法求得根节点最优解为 \((x_1^*, x_2^*, y_1^*, y_2^*) = (1.2, 1.6, 0.3, 0.7)\),目标函数值 \(L_0 = 5.8\)。
- 解释:由于整数约束被松弛,解中 \(y\) 非整数,但 \(L_0\) 是原MINLP问题的一个下界(因为松弛后可行域更大,目标值不会比原问题更差)。
- 内点法(障碍函数法)步骤简述:
- 记录全局上界 \(U = +\infty\)(目前无可行整数解),激活节点列表,将根节点加入。
第三步:分支定界迭代
- 选择节点:
- 从激活节点列表中选择下界最小的节点(本例只有根节点,下界 \(L_0 = 5.8\))。
- 检查整数可行性:
- 当前节点解中 \(y_1^* = 0.3, y_2^* = 0.7\) 不满足整数约束,需要分支。
- 分支操作:
- 选择分支变量:通常选分数部分最远离整数的变量,这里 \(y_1\) 的分数部分为0.3,\(y_2\) 为0.7,因此选 \(y_2\)(分数0.7更远)。
- 创建两个子节点:
- 子节点A:添加约束 \(y_2 = 0\)。
- 子节点B:添加约束 \(y_2 = 1\)。
- 将根节点标记为已探索,子节点A、B加入激活列表。
- 处理子节点A(\(y_2 = 0\)):
- 子问题:在根节点问题基础上固定 \(y_2 = 0\),但 \(y_1\) 仍松弛为 \(0 \leq y_1 \leq 1\)。
- 用内点法求解(此时问题只有连续变量 \(x_1, x_2, y_1\))。假设求得最优解 \((1.3, 1.5, 0.4, 0)\),目标值 \(L_A = 6.2\)。
- 由于 \(y_1 = 0.4\) 仍非整数,该节点需继续分支(但暂时保留,等比较界限后决定)。
- 处理子节点B(\(y_2 = 1\)):
- 固定 \(y_2 = 1\),用内点法求解。假设得到解 \((1.1, 1.7, 0.0, 1)\),注意 \(y_1 = 0.0\) 恰好是整数,因此这是一个可行整数解!
- 计算目标值:\(f = (1.1-2)^2 + (1.7-3)^2 + 0^2 = 0.81 + 1.69 = 2.5\)。所以 \(L_B = 2.5\)。
- 更新全局上界 \(U = \min(U, 2.5) = 2.5\)。
- 剪枝:
- 比较各节点下界与全局上界 \(U = 2.5\):
- 子节点A下界 \(L_A = 6.2 > U\),说明该节点不可能产生比当前最好整数解更优的解,因此剪枝(从激活列表移除)。
- 子节点B已得整数解,且目标值等于其下界,因此该节点也被剪枝(已探索完毕)。
- 激活列表现为空。
- 比较各节点下界与全局上界 \(U = 2.5\):
第四步:终止与输出
- 由于激活列表为空,算法终止。
- 当前全局上界对应的解即为最优整数解:\((x_1, x_2, y_1, y_2) = (1.1, 1.7, 0, 1)\),最优目标值 \(f^* = 2.5\)。
第五步:算法细节与注意事项
- 内点法求解子问题的关键点:
- 每个子问题是凸连续NLP,内点法可保证收敛到全局最优(凸性假设下)。
- 实践中,内点法需要选择初始可行点、障碍参数递减策略、牛顿法迭代精度等。
- 分支策略:
- 除了分数部分远近,也可基于伪成本(pseudo-cost)或影响力选择分支变量。
- 节点选择也可用最佳优先(选下界最小)或深度优先。
- 数值稳定性:
- 内点法涉及Hessian矩阵计算和线性系统求解,当问题非凸或尺度不良时需正则化。
- 扩展:
- 对于非凸MINLP,内点法可能只找到局部解,从而下界不严格,需结合全局优化技术(如空间分支)。
通过以上步骤,你应能理解分支定界-内点法混合算法的基本流程:在分支定界框架中,每个节点用内点法高效求解连续松弛,从而获得高质量的下界,通过系统剪枝减少搜索空间,最终找到全局最优整数解。