非线性规划中的修正拉格朗日法
好的,我们开始讲解“非线性规划中的修正拉格朗日法”。我会按照从基础概念到具体方法的顺序,循序渐进地为你解析。
首先,我们需要理解这个方法的“上下文”和它要解决的“根本问题”。
第一步:问题背景与核心困境
我们考虑一个标准的非线性规划问题:
最小化
f(x)
满足于g_i(x) <= 0(i = 1, ..., m),
以及h_j(x) = 0(j = 1, ..., p)。
其中,f, g_i, h_j 都是连续可微的函数。解决这类问题的一个经典框架是拉格朗日对偶理论。我们构造拉格朗日函数:
L(x, λ, μ) = f(x) + Σ_{i=1}^{m} λ_i g_i(x) + Σ_{j=1}^{p} μ_j h_j(x)。
这里,λ_i >= 0 是不等式约束的拉格朗日乘子,μ_j 是等式约束的乘子。在理想情况下(如满足强对偶性),原始问题的最优值等于其对偶问题的最大值。然而,直接通过拉格朗日函数求解会面临一个核心困境:对偶函数 q(λ, μ) = inf_x L(x, λ, μ) 在某些情况下(特别是当原问题非凸时)可能不光滑,甚至难以稳定地求解其极小化子 x。这就催生了增广拉格朗日法。
第二步:从标准拉格朗日到增广拉格朗日
为了克服上述困境,增广拉格朗日法(或称乘子法)被提出。其核心思想是在标准拉格朗日函数上增加一个“惩罚项”,构造增广拉格朗日函数。对于以等式约束 h(x)=0 为例的问题,其增广拉格朗日函数为:
L_ρ(x, μ) = f(x) + μ^T h(x) + (ρ/2) ||h(x)||^2。
这里的 ρ > 0 是惩罚参数。增加惩罚项 (ρ/2) ||h(x)||^2 带来了两个关键好处:
- 改善收敛性:即使对偶函数不光滑,在适当的
ρ下,关于x最小化L_ρ(x, μ)通常是一个良态的问题,更容易求解。 - 放宽约束可微性要求:该方法对约束规格的要求比标准的拉格朗日对偶理论更低。
算法的基本步骤是交替进行:
- x-子问题:固定乘子 μ^k,求解
x^{k+1} = argmin_x L_ρ(x, μ^k)。- 乘子更新:
μ^{k+1} = μ^k + ρ h(x^{k+1})。
第三步:修正拉格朗日法的动机与核心思想
虽然增广拉格朗日法很强大,但它仍然存在一个潜在缺点:x-子问题(即最小化 L_ρ(x, μ^k))本身可能依然是一个复杂的非线性约束优化问题(当原问题包含不等式约束时,处理起来更复杂)。标准的处理方式是将不等式约束通过引入松弛变量转化为等式约束,但这增加了问题的维度和复杂度。
修正拉格朗日法的核心动机,就是改造增广拉格朗日函数的形式,使得x-子问题变成一个无约束优化问题,或者约束形式极其简单的问题,从而大幅降低每一步迭代的计算成本。
其核心思想是:重新设计“惩罚项”的形式,使其能自动处理不等式约束的可行性。一个经典且重要的修正拉格朗日函数形式(对于不等式约束 g(x) <= 0)是:
M_ρ(x, λ) = f(x) + (1/(2ρ)) Σ_{i=1}^{m} { [max(0, λ_i + ρ g_i(x))]^2 - λ_i^2 }。
这个形式看起来很复杂,但我们可以分步理解它。
第四步:修正拉格朗日函数的推导与剖析
我们重点看如何处理单个不等式约束 g(x) <= 0。标准的增广拉格朗日法需要引入松弛变量s,将其写为 g(x) + s = 0, s >= 0,然后对等式约束进行增广。这导致了带边界约束的x-子问题。
修正拉格朗日法采用了更巧妙的思路。考虑关于松弛变量s的极小化操作。我们将包含松弛变量的增广拉格朗日函数先写出来,然后“提前”解出最优的s:
- 构造带松弛变量的拉格朗日函数:
L(x, s, λ) = f(x) + λ(g(x)+s) + (ρ/2)(g(x)+s)^2, 其中s >= 0,λ >= 0。 - 关键步骤:对于固定的
x和λ,我们先求解关于s >= 0的最小化问题。这是一个关于s的二次函数在非负象限上的极小化,其解析解可以直接求出:s^* = max(0, - (λ/ρ + g(x)) )。 - 代入消元:将这个最优的
s^*代回原函数L(x, s, λ)中,经过代数运算(完成平方项),就得到了上面给出的修正拉格朗日函数M_ρ(x, λ)。
M_ρ(x, λ) 的神奇之处在于:最小化它时,变量x不再带有显式的约束 s >= 0 或 g(x) <= 0。原问题的不等式约束,通过函数max(0, ·) 的形式被“吸收”进了目标函数。因此,x-子问题 min_x M_ρ(x, λ^k) 变成了一个无约束优化问题(尽管目标函数不可微,但具有简单的分段光滑结构)。
第五步:修正拉格朗日法的算法流程
基于上述函数,修正拉格朗日法的算法步骤非常清晰:
- 初始化:选择初始乘子向量
λ^0 >= 0, 惩罚参数ρ > 0, 以及缩放系数β > 1(用于在需要时增大ρ)。 - 迭代循环 (k = 0, 1, 2, ...):
a. 求解无约束子问题:求解(近似求解)x^{k+1} ≈ argmin_x M_ρ(x, λ^k)。这是算法的核心计算步骤,但因为它无约束,可以使用拟牛顿法、共轭梯度法等高效算法。
b. 更新乘子:λ_i^{k+1} = max(0, λ_i^k + ρ g_i(x^{k+1}) ), 对于所有不等式约束 i = 1, ..., m。这个更新公式与标准增广拉格朗日法在形式上是统一的,但注意这里g_i(x)可以大于0。
c. 检查收敛:如果约束违反度||max(g(x^{k+1}), 0)||和对偶变量的变化足够小,则停止迭代,输出(x^{k+1}, λ^{k+1})作为近似解。
d. 自适应调整惩罚参数(可选):如果约束违反度下降不够快,可以增大惩罚参数ρ = β * ρ以加强惩罚力度,加快可行性进程。
第六步:方法特性与总结
- 优点:将复杂的约束优化问题,转化为一系列相对简单的无约束(或简单约束)子问题。这极大简化了每一步迭代的计算,特别适用于约束较多但结构允许高效无约束优化的情况。
- 与标准增广拉格朗日法的关系:可以视为标准方法的一个等价但计算上更便利的变体。它本质上是将标准方法中关于原始变量和松弛变量的联合优化问题,通过解析地消去松弛变量而得来。
- 应用场景:广泛应用于处理大规模非线性规划问题,特别是在最优控制、结构优化、机器学习模型训练(带有不等式约束的模型)等领域。当约束为简单的上下界约束时,该方法有特别高效的表现。
总而言之,修正拉格朗日法 是增广拉格朗日法家族中一个注重计算便利性的重要成员。它通过函数形式的巧妙修正,将带约束的子问题转化为无约束问题,在保持算法收敛性的同时,显著提升了每一步迭代的求解效率。