非线性规划中的割平面法基础题
1. 问题描述
我们考虑以下非线性规划问题:
\[\begin{aligned} \min_{x} \quad & f(x) \\ \text{s.t.} \quad & g_i(x) \le 0, \quad i = 1, 2, \dots, m \\ & x \in \mathbb{R}^n \end{aligned} \]
其中,目标函数 \(f(x)\) 和约束函数 \(g_i(x)\) 都是凸的、可微的。特别地,我们假设 \(f(x)\) 和 \(g_i(x)\) 的表达式可能很复杂,但有一个关键性质:在任意点 \(x_k\) 处,我们能容易地计算其函数值和梯度。
割平面法(Cutting Plane Method)的核心思想是:用一个由线性不等式(割平面)组成的集合,来逐渐逼近原问题的可行域。这种方法特别适用于约束条件复杂,但目标函数和约束函数在给定点处易于求值、求导的问题。我们的任务是利用割平面法,求解这个凸非线性规划问题。
2. 解题思路
割平面法是一种外逼近方法。其核心步骤是:
- 构建主问题:从一个相对简单的初始可行域(比如一个包含原问题最优解的大区域,如一个“盒子约束”)开始,建立第一个逼近原问题可行域的多面体(由一组线性不等式定义)。
- 求解线性主问题:在当前线性不等式定义的近似可行域内,求解一个线性规划(主问题),其目标函数是原目标函数 \(f(x)\) 在当前最优解处的线性近似(即一阶泰勒展开)。
- 生成割平面:检查上一步求得的解对于原非线性约束的违反程度。对于违反的约束,在该点处添加一个线性不等式(割平面),这个不等式能够“切割”掉当前不可行的点,同时保证不切割掉原问题的任何可行点。
- 迭代更新:将新生成的割平面加入到主问题的约束集中,形成一个新的、更紧地逼近原问题可行域的多面体,然后重复步骤2-3,直到满足收敛条件。
3. 解题步骤详解
步骤1:初始化
- 选择一个初始点 \(x_0\)。这个点不需要满足原问题的约束 \(g_i(x) \le 0\),但它应该在一个我们可以定义的、包含原问题最优解的初始多面体 \(P_0\) 内。一个简单而保守的选择是定义一个足够大的盒子区域:\(l \le x \le u\),其中 \(l\) 和 \(u\) 是各维度的下界和上界向量。因此,初始约束集为 \(x \in P_0 = \{ x | l \le x \le u \}\)。
- 设置迭代计数器 \(k = 0\)。
- 设定收敛容差 \(\epsilon > 0\)(用于判断约束违反程度)。
步骤2:求解当前线性主问题
在第 \(k\) 次迭代,我们已经有一个由一组线性不等式定义的多面体 \(P_k\),它是对原问题可行域 \(\{x | g_i(x) \le 0\}\) 的一个外逼近(即 \(P_k\) 包含原可行域)。
我们求解以下线性规划(称为主问题):
\[\begin{aligned} \min_{x} \quad & f(x_k) + \nabla f(x_k)^T (x - x_k) \\ \text{s.t.} \quad & x \in P_k \end{aligned} \]
这里,目标函数是原凸目标函数 \(f(x)\) 在点 \(x_k\) 处的一阶泰勒展开(即线性近似)。由于 \(f(x)\) 是凸函数,这个线性近似是 \(f(x)\) 的一个全局下估计。记此线性规划的最优解为 \(x_{k+1}\)。
步骤3:可行性检验与割平面生成
计算解 \(x_{k+1}\) 对于原问题约束的违反量:
- 对于每个约束 \(i\),计算 \(g_i(x_{k+1})\)。
- 找到违反最严重的那个约束,即找到索引 \(j\) 使得 \(g_j(x_{k+1}) = \max_{i} g_i(x_{k+1})\)。
- 如果 \(g_j(x_{k+1}) \le \epsilon\),说明 \(x_{k+1}\) 对于所有约束的违反程度都在容忍范围内,可以近似认为 \(x_{k+1}\) 是可行的。算法收敛,输出 \(x_{k+1}\) 作为近似最优解。
如果 \(g_j(x_{k+1}) > \epsilon\),说明 \(x_{k+1}\) 对于约束 \(g_j\) 是不可行的。由于 \(g_j(x)\) 是凸函数,根据凸函数的一阶性质(函数值在其切线之上),我们有:
\[g_j(z) \ge g_j(x_{k+1}) + \nabla g_j(x_{k+1})^T (z - x_{k+1}), \quad \forall z \in \mathbb{R}^n \]
因为 \(g_j(x_{k+1}) > 0\),并且我们希望找到一个 \(z\) 使得 \(g_j(z) \le 0\),那么满足 \(g_j(z) \le 0\) 的点 \(z\) 必然满足:
\[0 \ge g_j(z) \ge g_j(x_{k+1}) + \nabla g_j(x_{k+1})^T (z - x_{k+1}) \]
整理得:
\[\nabla g_j(x_{k+1})^T (z - x_{k+1}) + g_j(x_{k+1}) \le 0 \]
这个不等式定义了一个半空间。关键在于:
- 当前不可行点 \(x_{k+1}\) 不满足这个不等式(代入左边得到 \(g_j(x_{k+1}) > 0\))。
- 原问题的所有可行点都满足 \(g_j(z) \le 0\),因此根据上述凸函数性质,它们也一定满足这个线性不等式。
因此,这个线性不等式 \(\nabla g_j(x_{k+1})^T (x - x_{k+1}) + g_j(x_{k+1}) \le 0\) 被称为一个割平面。它像一把刀,从当前逼近多面体 \(P_k\) 中“割掉”了包含 \(x_{k+1}\) 的一部分不可行区域,同时没有割掉原问题的任何可行点。
步骤4:更新主问题并迭代
将生成的割平面添加到约束集中,定义新的多面体:
\[P_{k+1} = P_k \cap \{ x | \nabla g_j(x_{k+1})^T (x - x_{k+1}) + g_j(x_{k+1}) \le 0 \} \]
然后,令 \(k = k+1\),返回步骤2,求解更新后的线性主问题。
4. 算法流程总结与注意事项
- 初始化:设定初始多面体 \(P_0\)(如盒子约束),初始点 \(x_0\),容差 \(\epsilon\),\(k=0\)。
- 循环开始:
a. 线性化与求解:在当前最优解 \(x_k\) 处,线性化目标函数 \(f(x)\)。求解线性规划:\(\min_{x \in P_k} [f(x_k) + \nabla f(x_k)^T (x - x_k)]\),得到新解 \(x_{k+1}\)。
b. 可行性检验:计算 \(g_i(x_{k+1})\),找到最大违反量 \(g_j(x_{k+1}) = \max_i g_i(x_{k+1})\)。
c. 收敛判断:若 \(g_j(x_{k+1}) \le \epsilon\),则停止,输出 \(x_{k+1}\)。
d. 生成割平面:构造并添加割平面:\(\nabla g_j(x_{k+1})^T (x - x_{k+1}) + g_j(x_{k+1}) \le 0\) 到约束集,得到 \(P_{k+1}\)。
e. 迭代:\(k = k+1\),重复循环。
关键点与特点:
- 外逼近:每一步的 \(P_k\) 都包含原问题可行域,因此主问题的解提供了原问题最优值的一个下界(因为目标函数被线性下估计,且在更大的区域内求最小)。
- 凸性要求:算法的有效性严重依赖于 \(f\) 和 \(g_i\) 的凸性。凸性保证了生成的线性不等式是有效的“割”,不会切除可行点,并且线性化目标提供了真实目标的下界。
- 收敛性:在凸性、有界性等温和条件下,割平面法是全局收敛的。每次添加割平面都严格减少了不可行区域,最终逼近最优解。
- 优势与局限:优势在于将复杂的非线性规划问题转化为一系列相对容易求解的线性规划问题。局限是迭代次数可能较多,且随着割平面增多,主问题的规模(约束条数)会线性增长,可能影响后期求解效率。在实际中,可以结合“约束池管理”策略,移除一些旧的或不活跃的割平面以控制规模。
通过以上步骤,割平面法系统地利用凸函数的局部梯度信息,构建线性近似来逼近并最终求解原非线性凸优化问题。