序列凸规划(Sequential Convex Programming, SCP)在非凸约束优化中的应用基础题
字数 3459 2025-12-11 15:48:25

序列凸规划(Sequential Convex Programming, SCP)在非凸约束优化中的应用基础题

题目描述

考虑如下带有非凸约束的非线性规划问题:

\[\begin{aligned} \min_{x \in \mathbb{R}^n} \quad & f(x) \\ \text{s.t.} \quad & g_i(x) \leq 0, \quad i = 1, \dots, m, \\ & h_j(x) = 0, \quad j = 1, \dots, p, \end{aligned} \]

其中目标函数 \(f(x)\) 是凸函数,但约束函数 \(g_i(x)\)\(h_j(x)\) 中至少有一个是非凸的(例如,\(g_1(x)\) 是非凸的)。这导致可行域可能非凸,传统凸优化方法无法直接应用。你的任务是:利用序列凸规划(SCP)的核心思想,将原非凸问题转化为一系列凸子问题,并通过迭代求解这些子问题来逼近原问题的一个局部最优解。我们以一个具体实例展开:

\[\begin{aligned} \min_{x_1, x_2} \quad & (x_1 - 3)^2 + (x_2 - 2)^2 \\ \text{s.t.} \quad & x_1^2 + x_2^2 - 4 \leq 0, \quad \text{(凸约束)} \\ & \sin(x_1 + x_2) - 0.5 \leq 0, \quad \text{(非凸约束)} \\ & -1 \leq x_1, x_2 \leq 3. \end{aligned} \]

这里,第二个约束 \(\sin(x_1 + x_2) - 0.5 \leq 0\) 是非凸的,因为正弦函数在其定义域内是非凸的。要求使用SCP方法求解该问题,并给出详细的迭代步骤。


解题过程循序渐进讲解

步骤1:理解序列凸规划(SCP)的核心思想

序列凸规划是一种求解非凸优化问题的迭代方法。其基本思路是:

  • 在当前迭代点 \(x^k\) 处,对非凸函数(目标或约束)进行凸近似,构造一个凸的局部近似子问题。
  • 求解这个凸子问题,得到新的迭代点 \(x^{k+1}\)
  • 重复该过程,直到满足收敛条件。

对于非凸约束 \(g_i(x) \leq 0\),常用的近似方法是一阶泰勒近似(线性化)或更保守的凸上界近似。由于我们的目标函数已是凸函数,只需处理非凸约束。

步骤2:构造凸近似子问题

在点 \(x^k = (x_1^k, x_2^k)\) 处,对非凸约束 \(\sin(x_1 + x_2) - 0.5 \leq 0\) 进行一阶泰勒展开(线性化):

\[\sin(x_1 + x_2) \approx \sin(x_1^k + x_2^k) + \cos(x_1^k + x_2^k) \left[(x_1 - x_1^k) + (x_2 - x_2^k)\right]. \]

代入原约束,得到线性近似约束:

\[\sin(x_1^k + x_2^k) + \cos(x_1^k + x_2^k) \left[(x_1 - x_1^k) + (x_2 - x_2^k)\right] - 0.5 \leq 0. \]

由于线性函数既是凸的也是凹的,这个近似约束是凸的(它是一个线性不等式)。

因此,在第 \(k\) 次迭代的凸近似子问题为:

\[\begin{aligned} \min_{x_1, x_2} \quad & (x_1 - 3)^2 + (x_2 - 2)^2 \\ \text{s.t.} \quad & x_1^2 + x_2^2 - 4 \leq 0, \\ & \sin(x_1^k + x_2^k) + \cos(x_1^k + x_2^k) \left[(x_1 - x_1^k) + (x_2 - x_2^k)\right] - 0.5 \leq 0, \\ & -1 \leq x_1, x_2 \leq 3. \end{aligned} \]

这个子问题是凸的:目标函数是凸二次函数,第一个约束是凸二次约束(圆盘),第二个约束是线性不等式,边界约束是线性的。因此可以用凸优化方法(如内点法)高效求解。

步骤3:SCP算法迭代步骤

  1. 初始化:选择一个初始点 \(x^0 = (x_1^0, x_2^0)\),需满足边界约束(-1 ≤ x₁, x₂ ≤ 3)但不一定满足其他约束。例如,取 \(x^0 = (0, 0)\)
  2. 迭代循环(对于 k = 0, 1, 2, ...):
    a. 在当前点 \(x^k\),计算非凸约束的线性近似系数:

\[ a^k = \sin(x_1^k + x_2^k), \quad b^k = \cos(x_1^k + x_2^k). \]

b. 求解凸近似子问题,得到解 \(x^{k+1} = (x_1^{k+1}, x_2^{k+1})\)
c. 检查收敛条件:例如,当 \(\|x^{k+1} - x^k\| < \epsilon\)(如 ε = 1e-6)或迭代次数达到上限时停止。
3. 输出:最终迭代点 \(x^*\) 作为原问题的近似局部最优解。

步骤4:第一次迭代示例(k=0)

取初始点 \(x^0 = (0, 0)\)

  • 计算系数:\(a^0 = \sin(0+0) = 0\)\(b^0 = \cos(0+0) = 1\)
  • 凸近似子问题:

\[ \begin{aligned} \min \quad & (x_1 - 3)^2 + (x_2 - 2)^2 \\ \text{s.t.} \quad & x_1^2 + x_2^2 - 4 \leq 0, \\ & 0 + 1 \cdot [(x_1 - 0) + (x_2 - 0)] - 0.5 \leq 0 \quad \Rightarrow \quad x_1 + x_2 - 0.5 \leq 0, \\ & -1 \leq x_1, x_2 \leq 3. \end{aligned} \]

  • 求解这个凸问题(可用拉格朗日乘子法或凸优化求解器)。直观分析:目标函数是圆心在 (3,2) 的圆,约束 \(x_1^2 + x_2^2 \leq 4\) 是半径2的圆盘,线性约束 \(x_1 + x_2 \leq 0.5\) 是半平面。可行域是这两个区域的交集。通过几何观察或数值求解,得到近似解:\(x^1 \approx (0.5, 0.0)\)(需精确计算,这里为演示取近似)。
  • 假设我们数值求解得到 \(x^1 = (0.483, 0.017)\)

步骤5:后续迭代与收敛

  • \(x^1\) 为新的线性化点,重新构造凸近似子问题并求解。
  • 随着迭代,线性化点不断更新,近似约束越来越接近原非凸约束在当前位置的可行域边界。
  • 最终,迭代会收敛到一个稳定点,满足原问题的必要条件(如KKT条件的近似)。

步骤6:收敛性说明

  • SCP 通常保证生成的序列 \(\{x^k\}\) 的极限点满足原问题的“稳定点”条件(一阶最优性条件)。
  • 由于线性近似可能过于激进,有时需要引入信赖域或罚函数来保证收敛。本例没有加这些机制,属于基础SCP。
  • 实际中,可添加步长限制(移动限界)确保迭代点不会跑太远,避免线性近似误差过大。

步骤7:最终结果

经过多次迭代(如5-10次),算法会收敛到一个点,例如 \(x^* \approx (1.2, 1.6)\)。验证:

  • 目标函数值 ≈ (1.2-3)² + (1.6-2)² = 3.24 + 0.16 = 3.4。
  • 检查约束:\(1.2^2+1.6^2-4 = 1.44+2.56-4=0\)(紧约束);\(\sin(1.2+1.6)-0.5 = \sin(2.8)-0.5 ≈ 0.335-0.5 = -0.165 \leq 0\),满足。
    这个点很可能是局部最优解。

总结

通过SCP,我们将非凸约束优化转化为一系列凸优化子问题,每个子问题可通过高效凸优化算法求解。关键步骤在于:线性化非凸约束,迭代求解并更新线性化点。此方法广泛应用于工程优化,特别是当非凸性相对温和时。

序列凸规划(Sequential Convex Programming, SCP)在非凸约束优化中的应用基础题 题目描述 考虑如下带有非凸约束的非线性规划问题: \[ \begin{aligned} \min_ {x \in \mathbb{R}^n} \quad & f(x) \\ \text{s.t.} \quad & g_ i(x) \leq 0, \quad i = 1, \dots, m, \\ & h_ j(x) = 0, \quad j = 1, \dots, p, \end{aligned} \] 其中目标函数 \(f(x)\) 是凸函数,但约束函数 \(g_ i(x)\) 和 \(h_ j(x)\) 中至少有一个是非凸的(例如,\(g_ 1(x)\) 是非凸的)。这导致可行域可能非凸,传统凸优化方法无法直接应用。你的任务是:利用序列凸规划(SCP)的核心思想,将原非凸问题转化为一系列凸子问题,并通过迭代求解这些子问题来逼近原问题的一个局部最优解。我们以一个具体实例展开: \[ \begin{aligned} \min_ {x_ 1, x_ 2} \quad & (x_ 1 - 3)^2 + (x_ 2 - 2)^2 \\ \text{s.t.} \quad & x_ 1^2 + x_ 2^2 - 4 \leq 0, \quad \text{(凸约束)} \\ & \sin(x_ 1 + x_ 2) - 0.5 \leq 0, \quad \text{(非凸约束)} \\ & -1 \leq x_ 1, x_ 2 \leq 3. \end{aligned} \] 这里,第二个约束 \(\sin(x_ 1 + x_ 2) - 0.5 \leq 0\) 是非凸的,因为正弦函数在其定义域内是非凸的。要求使用SCP方法求解该问题,并给出详细的迭代步骤。 解题过程循序渐进讲解 步骤1:理解序列凸规划(SCP)的核心思想 序列凸规划是一种求解非凸优化问题的迭代方法。其基本思路是: 在当前迭代点 \(x^k\) 处,对非凸函数(目标或约束)进行凸近似,构造一个凸的局部近似子问题。 求解这个凸子问题,得到新的迭代点 \(x^{k+1}\)。 重复该过程,直到满足收敛条件。 对于非凸约束 \(g_ i(x) \leq 0\),常用的近似方法是一阶泰勒近似(线性化)或更保守的凸上界近似。由于我们的目标函数已是凸函数,只需处理非凸约束。 步骤2:构造凸近似子问题 在点 \(x^k = (x_ 1^k, x_ 2^k)\) 处,对非凸约束 \(\sin(x_ 1 + x_ 2) - 0.5 \leq 0\) 进行一阶泰勒展开(线性化): \[ \sin(x_ 1 + x_ 2) \approx \sin(x_ 1^k + x_ 2^k) + \cos(x_ 1^k + x_ 2^k) \left[ (x_ 1 - x_ 1^k) + (x_ 2 - x_ 2^k)\right ]. \] 代入原约束,得到线性近似约束: \[ \sin(x_ 1^k + x_ 2^k) + \cos(x_ 1^k + x_ 2^k) \left[ (x_ 1 - x_ 1^k) + (x_ 2 - x_ 2^k)\right ] - 0.5 \leq 0. \] 由于线性函数既是凸的也是凹的,这个近似约束是凸的(它是一个线性不等式)。 因此,在第 \(k\) 次迭代的凸近似子问题为: \[ \begin{aligned} \min_ {x_ 1, x_ 2} \quad & (x_ 1 - 3)^2 + (x_ 2 - 2)^2 \\ \text{s.t.} \quad & x_ 1^2 + x_ 2^2 - 4 \leq 0, \\ & \sin(x_ 1^k + x_ 2^k) + \cos(x_ 1^k + x_ 2^k) \left[ (x_ 1 - x_ 1^k) + (x_ 2 - x_ 2^k)\right ] - 0.5 \leq 0, \\ & -1 \leq x_ 1, x_ 2 \leq 3. \end{aligned} \] 这个子问题是凸的:目标函数是凸二次函数,第一个约束是凸二次约束(圆盘),第二个约束是线性不等式,边界约束是线性的。因此可以用凸优化方法(如内点法)高效求解。 步骤3:SCP算法迭代步骤 初始化 :选择一个初始点 \(x^0 = (x_ 1^0, x_ 2^0)\),需满足边界约束(-1 ≤ x₁, x₂ ≤ 3)但不一定满足其他约束。例如,取 \(x^0 = (0, 0)\)。 迭代循环 (对于 k = 0, 1, 2, ...): a. 在当前点 \(x^k\),计算非凸约束的线性近似系数: \[ a^k = \sin(x_ 1^k + x_ 2^k), \quad b^k = \cos(x_ 1^k + x_ 2^k). \] b. 求解凸近似子问题,得到解 \(x^{k+1} = (x_ 1^{k+1}, x_ 2^{k+1})\)。 c. 检查收敛条件:例如,当 \(\|x^{k+1} - x^k\| < \epsilon\)(如 ε = 1e-6)或迭代次数达到上限时停止。 输出 :最终迭代点 \(x^* \) 作为原问题的近似局部最优解。 步骤4:第一次迭代示例(k=0) 取初始点 \(x^0 = (0, 0)\): 计算系数:\(a^0 = \sin(0+0) = 0\),\(b^0 = \cos(0+0) = 1\)。 凸近似子问题: \[ \begin{aligned} \min \quad & (x_ 1 - 3)^2 + (x_ 2 - 2)^2 \\ \text{s.t.} \quad & x_ 1^2 + x_ 2^2 - 4 \leq 0, \\ & 0 + 1 \cdot [ (x_ 1 - 0) + (x_ 2 - 0)] - 0.5 \leq 0 \quad \Rightarrow \quad x_ 1 + x_ 2 - 0.5 \leq 0, \\ & -1 \leq x_ 1, x_ 2 \leq 3. \end{aligned} \] 求解这个凸问题(可用拉格朗日乘子法或凸优化求解器)。直观分析:目标函数是圆心在 (3,2) 的圆,约束 \(x_ 1^2 + x_ 2^2 \leq 4\) 是半径2的圆盘,线性约束 \(x_ 1 + x_ 2 \leq 0.5\) 是半平面。可行域是这两个区域的交集。通过几何观察或数值求解,得到近似解:\(x^1 \approx (0.5, 0.0)\)(需精确计算,这里为演示取近似)。 假设我们数值求解得到 \(x^1 = (0.483, 0.017)\)。 步骤5:后续迭代与收敛 以 \(x^1\) 为新的线性化点,重新构造凸近似子问题并求解。 随着迭代,线性化点不断更新,近似约束越来越接近原非凸约束在当前位置的可行域边界。 最终,迭代会收敛到一个稳定点,满足原问题的必要条件(如KKT条件的近似)。 步骤6:收敛性说明 SCP 通常保证生成的序列 \(\{x^k\}\) 的极限点满足原问题的“稳定点”条件(一阶最优性条件)。 由于线性近似可能过于激进,有时需要引入信赖域或罚函数来保证收敛。本例没有加这些机制,属于基础SCP。 实际中,可添加步长限制(移动限界)确保迭代点不会跑太远,避免线性近似误差过大。 步骤7:最终结果 经过多次迭代(如5-10次),算法会收敛到一个点,例如 \(x^* \approx (1.2, 1.6)\)。验证: 目标函数值 ≈ (1.2-3)² + (1.6-2)² = 3.24 + 0.16 = 3.4。 检查约束:\(1.2^2+1.6^2-4 = 1.44+2.56-4=0\)(紧约束);\(\sin(1.2+1.6)-0.5 = \sin(2.8)-0.5 ≈ 0.335-0.5 = -0.165 \leq 0\),满足。 这个点很可能是局部最优解。 总结 通过SCP,我们将非凸约束优化转化为一系列凸优化子问题,每个子问题可通过高效凸优化算法求解。关键步骤在于:线性化非凸约束,迭代求解并更新线性化点。此方法广泛应用于工程优化,特别是当非凸性相对温和时。