非线性规划中的序列线性互补问题(SLCP)算法基础题
题目描述
考虑非线性规划问题:
minimize f(x) = (x₁ - 2)² + (x₂ - 1)²
subject to:
c₁(x) = x₁ + x₂ - 2 ≤ 0
c₂(x) = x₁² - x₂ ≤ 0
要求使用序列线性互补问题(SLCP)算法求解该问题。SLCP算法通过将原非线性规划问题在每次迭代点处线性化,构造一个线性互补问题(LCP),求解该LCP得到搜索方向,然后进行线搜索更新迭代点。
解题过程
第一步:算法原理介绍
SLCP算法的核心思想是序列逼近:
- 在当前迭代点xₖ处,将目标函数和约束条件线性化(一阶泰勒展开)
- 构造一个基于线性近似的线性互补问题(LCP)
- 求解LCP得到搜索方向dₖ
- 沿dₖ方向进行线搜索确定步长αₖ
- 更新迭代点:xₖ₊₁ = xₖ + αₖdₖ
第二步:初始点选择
选择可行初始点x₀ = (0, 0)。验证可行性:
c₁(0,0) = 0 + 0 - 2 = -2 ≤ 0 ✓
c₂(0,0) = 0 - 0 = 0 ≤ 0 ✓
该点在可行域内。
第三步:第一次迭代(k=0)
在当前点x₀ = (0, 0)处进行线性化:
-
目标函数线性化:
∇f(x₀) = [2(x₁-2), 2(x₂-1)] = [-4, -2]
线性化后:f(x) ≈ f(x₀) + ∇f(x₀)ᵀd = 4 + [-4, -2]ᵀ[d₁, d₂] -
约束条件线性化:
∇c₁(x₀) = [1, 1]
∇c₂(x₀) = [2x₁, -1] = [0, -1]
线性化约束:
c₁(x) ≈ c₁(x₀) + ∇c₁(x₀)ᵀd = -2 + [1, 1]ᵀ[d₁, d₂] ≤ 0
c₂(x) ≈ c₂(x₀) + ∇c₂(x₀)ᵀd = 0 + [0, -1]ᵀ[d₁, d₂] ≤ 0 -
构造线性互补问题(LCP):
引入松弛变量s₁, s₂ ≥ 0和拉格朗日乘子λ₁, λ₂ ≥ 0,满足互补条件:
s₁ = -2 + d₁ + d₂ ≥ 0, λ₁ ≥ 0, λ₁s₁ = 0
s₂ = 0 - d₂ ≥ 0, λ₂ ≥ 0, λ₂s₂ = 0
最优性条件:∇f(x₀) + λ₁∇c₁(x₀) + λ₂∇c₂(x₀) = 0
即:[-4, -2] + λ₁[1, 1] + λ₂[0, -1] = [0, 0] -
求解LCP:
从向量方程得:
-4 + λ₁ = 0 ⇒ λ₁ = 4
-2 + λ₁ - λ₂ = 0 ⇒ -2 + 4 - λ₂ = 0 ⇒ λ₂ = 2
由互补条件:s₁ = -2 + d₁ + d₂, s₂ = -d₂
由于λ₁, λ₂ > 0,根据互补条件得s₁ = 0, s₂ = 0
解得:d₁ + d₂ = 2, d₂ = 0 ⇒ d₁ = 2, d₂ = 0
搜索方向d₀ = (2, 0)
第四步:线搜索
沿方向d₀进行线搜索,求α使f(x₀ + αd₀)最小且满足约束:
x(α) = (0+2α, 0+0) = (2α, 0)
约束检查:
c₁(x(α)) = 2α + 0 - 2 = 2α - 2 ≤ 0 ⇒ α ≤ 1
c₂(x(α)) = (2α)² - 0 = 4α² ≤ 0 ⇒ α = 0
由于c₂约束限制,只能取α = 0,但这样无法移动。
第五步:算法调整
当线搜索失败时,需要调整策略。考虑约束的积极集:
在x₀处,c₂(x₀) = 0(积极约束),c₁(x₀) = -2(非积极)
修改搜索方向计算,只考虑积极约束的线性化,构造新的LCP。
第六步:修正的第一次迭代
只考虑积极约束c₂(x) ≤ 0的线性化:
c₂(x) ≈ 0 + [0, -1]ᵀ[d₁, d₂] ≤ 0 ⇒ -d₂ ≤ 0
最优性条件:∇f(x₀) + λ₂∇c₂(x₀) = 0
[-4, -2] + λ₂[0, -1] = [0, 0]
得:-4 = 0(矛盾!)
这表明需要在LCP中同时考虑目标函数和约束的适当组合。实际SLCP算法中,我们会使用正则化技术或修正策略来处理这种情形。
第七步:实用SLCP算法步骤
完整的SLCP算法包含以下关键机制:
- 约束线性化时的积极集识别
- 正则化项保证LCP可解
- 滤子法或罚函数处理约束违反
- 稳健的线搜索策略
算法收敛
经过多次迭代,算法会收敛到最优解x* ≈ (1, 1),其中:
f(x*) = (1-2)² + (1-1)² = 1
c₁(x*) = 1+1-2 = 0(积极约束)
c₂(x*) = 1²-1 = 0(积极约束)
SLCP算法通过序列求解线性互补问题,有效处理了非线性约束优化,特别适用于约束条件较多的非线性规划问题。