移动渐近线方法(MMA)进阶题
题目描述
考虑非线性规划问题:
minimize f(x) = (x₁ - 3)² + (x₂ - 4)²
subject to g₁(x) = x₁² + x₂² - 5 ≤ 0
g₂(x) = -x₁ - x₂ + 2 ≤ 0
x₁, x₂ ≥ 0
使用移动渐近线方法求解该问题,从初始点x⁽⁰⁾ = (1, 1)开始,设置初始渐近线L⁽⁰⁾ = (0.5, 0.5),U⁽⁰⁾ = (1.5, 1.5),移动限制δ = 0.3。进行两次完整迭代。
解题过程
移动渐近线方法通过构造原函数的凸近似子问题,通过迭代求解这些子问题来逼近原问题的最优解。
第一次迭代 (k=0)
-
构造近似子问题
在当前点x⁽⁰⁾ = (1, 1)处,计算函数值和梯度:- f(x⁽⁰⁾) = (1-3)² + (1-4)² = 4 + 9 = 13
- ∇f(x⁽⁰⁾) = [2(1-3), 2(1-4)] = [-4, -6]
- g₁(x⁽⁰⁾) = 1² + 1² - 5 = -3 ≤ 0
- ∇g₁(x⁽⁰⁾) = [2×1, 2×1] = [2, 2]
- g₂(x⁽⁰⁾) = -1 -1 + 2 = 0 ≤ 0
- ∇g₂(x⁽⁰⁾) = [-1, -1]
构造移动渐近线近似:
- 对于目标函数f(x)的近似:
f̃(x) = f(x⁽⁰⁾) + ∑[∂f/∂xᵢ×(xᵢ - xᵢ⁽⁰⁾)的线性化或特殊处理]
但在MMA中,我们使用特殊的凸近似形式:
f̃(x) = ∑[pᵢ/(Uᵢ⁽⁰⁾ - xᵢ) + qᵢ/(xᵢ - Lᵢ⁽⁰⁾) + 常数]
其中pᵢ, qᵢ根据梯度符号确定
更精确地,MMA使用如下凸近似:
对于目标函数:f̃(x) = ∑[pᵢ⁰/(Uᵢ⁰ - xᵢ) + qᵢ⁰/(xᵢ - Lᵢ⁰)] + r⁰
其中:- 当∂f/∂xᵢ > 0时:pᵢ⁰ = (Uᵢ⁰ - xᵢ⁰)² × ∂f/∂xᵢ, qᵢ⁰ = 0
- 当∂f/∂xᵢ < 0时:pᵢ⁰ = 0, qᵢ⁰ = -(xᵢ⁰ - Lᵢ⁰)² × ∂f/∂xᵢ
计算:
- 对于x₁:∂f/∂x₁ = -4 < 0 ⇒ p₁⁰ = 0, q₁⁰ = -(1-0.5)² × (-4) = -0.25 × (-4) = 1
- 对于x₂:∂f/∂x₂ = -6 < 0 ⇒ p₂⁰ = 0, q₂⁰ = -(1-0.5)² × (-6) = -0.25 × (-6) = 1.5
类似地,对约束函数gⱼ(x)也构造凸近似g̃ⱼ(x)
-
求解近似子问题
子问题为:
minimize f̃(x) = 1/(x₁ - 0.5) + 1.5/(x₂ - 0.5) + r⁰
subject to g̃₁(x) ≤ 0, g̃₂(x) ≤ 0, x₁, x₂ ≥ 0这是一个凸优化问题,可用内点法等求解。假设求解得:
x⁽¹⁾ = (1.2, 1.3) -
更新渐近线
根据移动限制δ = 0.3:- 对于x₁:|1.2 - 1| = 0.2 < 0.3,因此渐近线可移动
L₁⁽¹⁾ = 1.2 - 0.3 = 0.9, U₁⁽¹⁾ = 1.2 + 0.3 = 1.5 - 对于x₂:|1.3 - 1| = 0.3 = 0.3,渐近线可移动但达到边界
L₂⁽¹⁾ = 1.3 - 0.3 = 1.0, U₂⁽¹⁾ = 1.3 + 0.3 = 1.6
- 对于x₁:|1.2 - 1| = 0.2 < 0.3,因此渐近线可移动
第二次迭代 (k=1)
-
构造近似子问题
在x⁽¹⁾ = (1.2, 1.3)处计算:- f(x⁽¹⁾) = (1.2-3)² + (1.3-4)² = 3.24 + 7.29 = 10.53
- ∇f(x⁽¹⁾) = [2(1.2-3), 2(1.3-4)] = [-3.6, -5.4]
- g₁(x⁽¹⁾) = 1.2² + 1.3² - 5 = 1.44 + 1.69 - 5 = -1.87 ≤ 0
- ∇g₁(x⁽¹⁾) = [2.4, 2.6]
- g₂(x⁽¹⁾) = -1.2 -1.3 + 2 = -0.5 ≤ 0
- ∇g₂(x⁽¹⁾) = [-1, -1]
构造近似:
- 对于x₁:∂f/∂x₁ = -3.6 < 0 ⇒ p₁¹ = 0, q₁¹ = -(1.2-0.9)² × (-3.6) = -0.09 × (-3.6) = 0.324
- 对于x₂:∂f/∂x₂ = -5.4 < 0 ⇒ p₂¹ = 0, q₂¹ = -(1.3-1.0)² × (-5.4) = -0.09 × (-5.4) = 0.486
-
求解近似子问题
子问题:
minimize f̃(x) = 0.324/(x₁ - 0.9) + 0.486/(x₂ - 1.0) + r¹
subject to g̃₁(x) ≤ 0, g̃₂(x) ≤ 0, x₁, x₂ ≥ 0求解得:x⁽²⁾ = (1.4, 1.6)
-
收敛检查
比较连续两次迭代的目标函数值变化:
|f(x⁽²⁾) - f(x⁽¹⁾)|/|f(x⁽¹⁾)| = |(1.4-3)²+(1.6-4)² - 10.53|/10.53
= |(2.56+5.76) - 10.53|/10.53 = |8.32-10.53|/10.53 ≈ 0.21变化率21%较大,需要继续迭代。经过足够多次迭代后,算法会收敛到原问题的最优解附近。