第四节:约束优化入门——等式约束与拉格朗日乘子法、不等式约束与KKT条件、罚函数法

各位好,欢迎来到《复杂环境下轨迹优化实战宝典》的第四讲。

今天聊的话题,是约束优化。说白了,就是怎么在“必须满足某些条件”的前提下,找到最好的解。比如你的机器人要穿过一个狭窄的门,位置不能撞墙,速度不能超限,还得尽量省时间——这就是典型的约束优化问题。

我个人习惯把约束优化分成三类:等式约束、不等式约束、以及用罚函数“软处理”约束。咱们一个一个来。

4.1 等式约束与拉格朗日乘子法

先看最简单的场景:目标函数 f(x),外加一个等式约束 h(x)=0。你想想看,这就像在一条固定的轨道上跑,不能偏离。

怎么解?拉格朗日乘子法。核心思想是把约束“吸收”进目标函数里。

核心公式:

L(x, λ) = f(x) + λ * h(x)

然后对 x 和 λ 分别求导,令其为零。

我在项目中遇到过这样一个例子:优化一个机械臂的末端轨迹,要求末端必须经过某个精确的中间点。这就是典型的等式约束。用拉格朗日乘子法,一次搞定。

举个具体例子:

min f(x) = x1² + x2²
s.t.  h(x) = x1 + x2 - 1 = 0

构造拉格朗日函数:
L = x1² + x2² + λ(x1 + x2 - 1)

求偏导:
∂L/∂x1 = 2x1 + λ = 0
∂L/∂x2 = 2x2 + λ = 0
∂L/∂λ = x1 + x2 - 1 = 0

解得:x1 = 0.5, x2 = 0.5, λ = -1

嗯,这里要注意:λ 的物理意义其实是约束的“敏感度”。λ 绝对值越大,说明这个约束对最优值的影响越大。

4.2 不等式约束与KKT条件

现实世界更多是不等式约束。比如“速度不能超过1m/s”、“位置不能进入障碍物区域”。这时候拉格朗日乘子法就不够用了,得请出KKT条件。

KKT条件,说白了就是拉格朗日乘子法在不等式约束下的推广。它包含几个关键点:

  • 原始可行性:约束必须满足,即 g(x) ≤ 0
  • 对偶可行性:乘子 μ ≥ 0
  • 互补松弛性:μ * g(x) = 0
  • 梯度条件:目标函数梯度与约束梯度的线性组合为零

我的经验:互补松弛性是最容易忽略的。它告诉我们:要么约束起作用(g(x)=0),要么乘子为零(μ=0)。两者不能同时非零。我曾经在调试一个避障轨迹时,忘了检查这个条件,结果算出来的轨迹直接穿过了障碍物——教训深刻。

举个例子:

min f(x) = x²
s.t.  g(x) = x - 1 ≤ 0

KKT条件:
1. x - 1 ≤ 0
2. μ ≥ 0
3. μ(x - 1) = 0
4. 2x + μ = 0

情况一:x - 1 = 0(约束起作用)
则 x = 1, μ = -2,不满足 μ ≥ 0,舍去

情况二:μ = 0(约束不起作用)
则 2x = 0 → x = 0,满足 x - 1 ≤ 0
所以最优解 x* = 0

你看,KKT条件帮我们自动区分了“约束是否真的在限制你”。

4.3 罚函数法

有时候,直接处理约束太麻烦。比如约束是非线性的、非凸的,或者你只是想快速得到一个“差不多”的解。这时候罚函数法就派上用场了。

核心思想很简单:把约束违反的“惩罚”加到目标函数里。违反得越厉害,惩罚越大。

常见形式:

min F(x) = f(x) + ρ * P(x)

其中 ρ 是惩罚因子,P(x) 是惩罚项。

我建议初学者先从二次罚函数开始:

对于等式约束 h(x)=0:P(x) = h(x)²
对于不等式约束 g(x)≤0:P(x) = max(0, g(x))²

ρ 越大,解越接近真实约束边界。但 ρ 太大,数值会变得很病态。我个人习惯用递增法:先给个小 ρ,求解;然后增大 ρ,用上一步的解作为初值继续优化。

避坑指南:我曾经在某个项目中,一上来就把 ρ 设得很大,结果优化器直接发散。后来改成逐步递增,才稳定收敛。记住:罚函数法不是万能的,它只能近似满足约束,而不是精确满足。

4.4 三种方法的对比

方法 适用场景 优点 缺点
拉格朗日乘子法 等式约束 精确、解析解 只适用于等式约束
KKT条件 不等式约束 理论完备、能区分主动约束 求解复杂、需要判断约束状态
罚函数法 任意约束 实现简单、通用 近似解、病态问题

4.5 知识体系总览

下面这张图,是我自己梳理的约束优化知识结构。你看一眼,心里就有谱了。

约束优化 等式约束 不等式约束 罚函数法 拉格朗日乘子法 KKT条件 二次罚函数 / 增广拉格朗日 精确解 · 解析可求 互补松弛 · 主动约束判断 近似解 · 惩罚因子递增 选择依据:约束类型 + 精度要求 + 计算资源

好了,这一讲的内容就到这里。三种方法各有千秋,实际项目中往往混合使用。比如我最近做的一个无人机轨迹规划,就用KKT条件处理避障不等式约束,同时用罚函数处理动力学等式约束——效果还不错。

记住:没有银弹。理解每种方法的本质,才能在实际问题中选对工具。


专注资料整理