非线性规划中的序列凸近似(SCA)算法进阶题
题目描述:
考虑非线性规划问题:
minimize f(x) = (x₁ - 2)⁴ + (x₁ - 2x₂)²
subject to g₁(x) = x₁² - x₂ ≤ 0
g₂(x) = x₁² + x₂² - 1 ≤ 0
其中 x = [x₁, x₂]ᵀ ∈ ℝ²。
使用序列凸近似(SCA)算法求解该问题,初始点 x⁽⁰⁾ = [0, 0]ᵀ,信赖域半径 Δ₀ = 0.5,收敛容差 ε = 10⁻⁴。
解题过程:
步骤1: 理解SCA算法原理
- SCA通过迭代求解一系列凸近似子问题来逼近原非凸问题
- 每步在当前点 xᵏ 对目标函数和约束进行凸近似(如一阶泰勒展开)
- 子问题需满足:近似函数在 xᵏ 与原函数值相等、梯度相等,且是全局下界(对凸化后的问题)
- 通过信赖域或线搜索保证收敛
步骤2: 构造凸近似子问题
在当前点 xᵏ = [x₁ᵏ, x₂ᵏ]ᵏ:
-
目标函数凸化:
f̃(x; xᵏ) = f(xᵏ) + ∇f(xᵏ)ᵀ(x - xᵏ) + (τ/2)‖x - xᵏ‖²
其中 τ ≥ 0 是强凸参数,确保 f̃ 强凸。本例取 τ = 1。 -
约束线性化(保守近似):
g̃₁(x; xᵏ) = g₁(xᵏ) + ∇g₁(xᵏ)ᵀ(x - xᵏ) ≤ 0
g̃₂(x; xᵏ) = g₂(xᵏ) + ∇g₂(xᵏ)ᵀ(x - xᵏ) ≤ 0 -
信赖域约束:
‖x - xᵏ‖ ≤ Δₖ
子问题形式:
minimize f̃(x; xᵏ)
subject to g̃₁(x; xᵏ) ≤ 0, g̃₂(x; xᵏ) ≤ 0, ‖x - xᵏ‖ ≤ Δₖ
步骤3: 计算初始点梯度
在 x⁽⁰⁾ = [0, 0]ᵀ:
- ∇f(x) = [4(x₁ - 2)³ + 2(x₁ - 2x₂), -4(x₁ - 2x₂)]ᵀ
∇f(x⁽⁰⁾) = [4(-2)³ + 2(0), -4(0)]ᵀ = [-32, 0]ᵀ - ∇g₁(x) = [2x₁, -1]ᵀ → ∇g₁(x⁽⁰⁾) = [0, -1]ᵀ
- ∇g₂(x) = [2x₁, 2x₂]ᵀ → ∇g₂(x⁽⁰⁾) = [0, 0]ᵀ
- f(x⁽⁰⁾) = (0-2)⁴ + (0-0)² = 16
- g₁(x⁽⁰⁾) = 0 - 0 = 0 ≤ 0(活跃约束)
- g₂(x⁽⁰⁾) = 0 + 0 - 1 = -1 ≤ 0
步骤4: 求解第一个子问题(k=0)
子问题:
minimize 16 + [-32, 0][x₁, x₂]ᵀ + 0.5(x₁² + x₂²)
= 16 - 32x₁ + 0.5x₁² + 0.5x₂²
subject to:
- 0 + [0, -1][x₁, x₂]ᵀ ≤ 0 → -x₂ ≤ 0 → x₂ ≥ 0
- -1 + [0, 0][x₁, x₂]ᵀ ≤ 0 → -1 ≤ 0(冗余)
- x₁² + x₂² ≤ 0.5² = 0.25
简化后:
minimize 0.5x₁² - 32x₁ + 0.5x₂²
subject to x₂ ≥ 0, x₁² + x₂² ≤ 0.25
步骤5: 分析子问题求解
- 目标函数可分离:关于 x₁ 的二次函数 0.5x₁² - 32x₁ 在 x₁ = 32 处最小,但受限于 |x₁| ≤ 0.5 → 在 x₁ = 0.5 处最小
- 关于 x₂ 的二次函数 0.5x₂² 在 x₂ = 0 处最小,且满足 x₂ ≥ 0
- 因此最优解为 x⁽¹⁾ = [0.5, 0]ᵀ
步骤6: 接受新解和更新
- 计算实际下降量:Δf_actual = f(x⁽⁰⁾) - f(x⁽¹⁾) = 16 - [(0.5-2)⁴ + (0.5-0)²]
= 16 - [(-1.5)⁴ + 0.25] = 16 - [5.0625 + 0.25] = 16 - 5.3125 = 10.6875 - 预测下降量:Δf_pred = f̃(x⁽⁰⁾; x⁽⁰⁾) - f̃(x⁽¹⁾; x⁽⁰⁾) = 0 - [0.5(0.5)² - 32(0.5) + 0.5(0)²]
= -[0.125 - 16] = 15.875 - 比值 ρ = Δf_actual / Δf_pred = 10.6875 / 15.875 ≈ 0.673 > 0.25(典型阈值)
- 因此接受 x⁽¹⁾,保持信赖域半径 Δ₁ = Δ₀ = 0.5
步骤7: 迭代至收敛
重复步骤2-6:
- 在 x⁽¹⁾ = [0.5, 0]ᵀ 计算梯度:
∇f(x⁽¹⁾) = [4(-1.5)³ + 2(0.5), -4(0.5)] = [4(-3.375) + 1, -2] = [-13.5 + 1, -2] = [-12.5, -2]ᵀ
∇g₁(x⁽¹⁾) = [2(0.5), -1] = [1, -1]ᵀ
∇g₂(x⁽¹⁾) = [2(0.5), 0] = [1, 0]ᵀ
构造新子问题并求解,直到 ‖x⁽ᵏ⁺¹⁾ - x⁽ᵏ⁾‖ < ε 且约束满足。经过多次迭代后,算法将收敛至近似最优解 x* ≈ [0.8, 0.6]ᵀ(满足 x₁² + x₂² = 1,在约束边界上),f(x*) ≈ 0.0256。
关键点:SCA通过序列凸逼近处理非凸性,信赖域控制近似质量,梯度信息保证局部收敛。