跳到主要内容

KKT 条件

一、直观理解:等式乘子 + 不等式「该不该出手」的规则​

KKT 条件(Karush–Kuhn–Tucker conditions)是带等式与不等式约束的非线性规划在最优点必须满足的一阶条件(在约束规范下)。可以把它想成拉格朗日乘子法的完整版:

  • 对等式约束:照旧有自由乘子 λ\lambda;
  • 对不等式约束:乘子 μ≥0\mu\ge 0,并且遵守互补松弛——约束没顶满(不活跃)时,乘子必须为 0;乘子为正时,约束必须顶满。

就像交通罚单:只有你真的压线(约束活跃),交警(乘子)才会出手;没压线就没有「价格」信号。

KKT 既是检验候选点是否可能最优的工具,也是内点法、SQP 等算法的设计靶心。凸问题中,KKT 往往成为充分必要条件。

二、适用场景与优缺点​

类型说明
适用场景有不等式约束的 NLP;推导解析最优性条件;验证 fmincon 解是否满足一阶条件;理解活跃集与影子价格;凸优化理论证明。
核心优点统一等式/不等式框架;互补松弛有清晰含义;凸时与全局最优紧密联系;乘子可解释。
局限与缺点非凸时仅为必要(需规范)而非充分;约束规范失败时可能「无 KKT 乘子」;手算仅限低维;数值上互补松弛需容差判断。

使用前确认:

  1. 问题是否写成 min⁡f\min f s.t. g=0, h≤0g=0,\ h\le 0 的标准形;
  2. 是否(近似)凸;
  3. 需要手推还是数值验证;
  4. 活跃约束集合是否可枚举(小问题)。

三、核心原理:平稳、原可行性、对偶可行、互补​

1. 标准问题​

min⁡xf(x)s.t.gi(x)=0,i=1,…,mhj(x)≤0,j=1,…,p\begin{aligned} \min_x\quad & f(x) \\ \text{s.t.}\quad & g_i(x)=0,\quad i=1,\ldots,m \\ & h_j(x)\le 0,\quad j=1,\ldots,p \end{aligned}

2. 拉格朗日函数​

L(x,λ,μ)=f(x)+∑iλigi(x)+∑jμjhj(x)\mathcal{L}(x,\lambda,\mu)=f(x)+\sum_i\lambda_i g_i(x)+\sum_j\mu_j h_j(x)

3. KKT 条件(x∗,λ∗,μ∗x^*,\lambda^*,\mu^*)​

  1. 平稳性:∇xL(x∗,λ∗,μ∗)=0\nabla_x\mathcal{L}(x^*,\lambda^*,\mu^*)=0
  2. 原可行性:g(x∗)=0, h(x∗)≤0g(x^*)=0,\ h(x^*)\le 0
  3. 对偶可行性:μ∗≥0\mu^*\ge 0
  4. 互补松弛:μj∗hj(x∗)=0, ∀j\mu_j^* h_j(x^*)=0,\ \forall j

在 LICQ 等约束规范下,局部最优解处存在乘子满足 KKT。

4. 活跃集​

A(x∗)={j∣hj(x∗)=0}\mathcal{A}(x^*)=\{j\mid h_j(x^*)=0\}

互补松弛意味着 j∉A⇒μj∗=0j\notin\mathcal{A}\Rightarrow\mu_j^*=0。不活跃约束仿佛不存在;活跃不等式在局部可当等式处理。

5. 凸问题中的充分性​

若 ff 凸,gg 仿射,hjh_j 凸,则满足 KKT 的点就是全局最优。这是凸优化「好用」的根本原因之一。

6. 与线性规划对偶​

LP 的互补松弛、影子价格是 KKT 的特例。读 linprog 的 lambda 与读 fmincon 的 lambda 结构体,思想一脉相承。

四、关键决策​

1. 标准形方向​

MATLAB 与许多教材对不等式默认 c(x)≤0c(x)\le 0。若你的约束是 h≥0h\ge 0,先变号,否则 μ\mu 符号解释全反。

2. 活跃集枚举(低维)​

小问题可分类讨论哪些不等式取等,化为等式拉格朗日,再验证 μ≥0\mu\ge 0 与未取等约束可行。

3. 数值容差​

∣hj∣≤10−6|h_j|\le 10^{-6} 可视为活跃;∣μjhj∣≤10−6|\mu_j h_j|\le 10^{-6} 视为互补近似成立。

4. 非凸多解​

多个 KKT 点可能对应不同局部极小/鞍点,需比较 ff 或用全局方法。

5. 与算法输出对照​

fmincon 返回的 lambda.ineqnonlin、lambda.lower 等可用于验 KKT,是建模报告加分项。

五、MATLAB 示例​

例 1:解析型小问题​

min⁡ (x−2)2+(y−2)2s.t. x+y≤2, x,y≥0\min\ (x-2)^2+(y-2)^2\quad\text{s.t.}\ x+y\le 2,\ x,y\ge 0

无约束极小在 (2,2)(2,2) 不可行;最优点应在边界 x+y=2x+y=2 上靠近 (1,1)(1,1)。

fun = @(z) (z(1)-2)^2 + (z(2)-2)^2;
x0 = [0.5; 0.5];
A = [1, 1];
b = 2;
lb = [0; 0];
opts = optimoptions("fmincon", "Display", "final", ...
"ConstraintTolerance", 1e-10);
[x, fval, ef, out, lambda] = fmincon(fun, x0, A, b, [], [], lb, [], [], opts);

fprintf("x=(%.6f,%.6f), f=%.6f, exit=%d\n", x(1), x(2), fval, ef);
disp("线性不等式乘子 lambda.ineqlin:"); disp(lambda.ineqlin);
disp("下界乘子 lambda.lower:"); disp(lambda.lower);

% 数值检查平稳性:grad f + A' * mu_ineq - mu_lower ≈ 0
grad = 2*([x(1);x(2)] - [2;2]);
stationarity = grad + A' * lambda.ineqlin - lambda.lower;
fprintf("平稳性残差范数 = %.3e\n", norm(stationarity));
fprintf("互补: mu*(Ax-b) = %.3e\n", lambda.ineqlin'*(A*x-b));

例 2:非线性不等式​

min⁡ x12+x22s.t. (x1−1)2+(x2−1)2≤1\min\ x_1^2+x_2^2\quad\text{s.t.}\ (x_1-1)^2+(x_2-1)^2\le 1
fun = @(x) x(1)^2 + x(2)^2;
nonlcon = @(x) deal( (x(1)-1)^2 + (x(2)-1)^2 - 1, [] ); % c<=0
x0 = [0.2; 0.2];
opts = optimoptions("fmincon", "Display", "iter");
[x, fval, ef, out, lambda] = fmincon(fun, x0, [], [], [], [], [], [], nonlcon, opts);
fprintf("解=(%.6f,%.6f), f=%.6f\n", x(1), x(2), fval);
disp(lambda.ineqnonlin); % 非线性不等式乘子

例 3:低维活跃集手检框架​

% 对候选 x,检查 h<=0, mu>=0, mu.*h≈0, 平稳性
% 此处仅演示互补松弛判定
h = @(x) [x(1)+x(2)-2; -x(1); -x(2)]; % <=0 形式
x = [1; 1];
hv = h(x);
active = abs(hv) < 1e-7;
fprintf("h = "); disp(hv');
fprintf("活跃掩码 = "); disp(active');

六、如何解释结果​

报告建议包含:

  1. 标准形下的 f,g,hf,g,h;
  2. 最优点 x∗x^* 与 f(x∗)f(x^*);
  3. 哪些不等式活跃、哪些松弛;
  4. 乘子数值及其非负性;
  5. 平稳性残差、互补残差、可行性残差;
  6. 若问题凸,明确「KKT ⇒ 全局最优」;否则称「满足一阶必要条件的局部候选」;
  7. 灵敏度:活跃约束乘子的业务含义。

七、常见误区​

1. 认为任何局部最优都自动有 KKT 乘子​

约束规范失败时可能例外(异常例子存在)。

2. 忽略 μ≥0\mu\ge 0​

乘子符号错误常来自约束方向写反。

3. 把 KKT 点都当成全局最优​

非凸时 KKT 点可能是局部极大(对 max 问题)或鞍点型驻点,需二阶或全局信息。

4. 互补松弛理解反了​

「μ>0⇒h=0\mu>0\Rightarrow h=0」与「h<0⇒μ=0h<0\Rightarrow\mu=0」是同一件事的两面。

5. 数值上要求 μh\mu h 机器零​

应设合理容差,并同时看约束违反。

6. 只会背条件不会用求解器​

建模竞赛中,KKT 更多用于解释与验证;求解仍靠 fmincon 等,二者结合最佳。

八、小结​

KKT 条件的核心思想可以概括为:

在约束规范下,有约束局部最优必满足平稳性、可行性、乘子符号与互补松弛;在凸问题中这些条件往往也是充分的。

它是连接拉格朗日乘子法、对偶理论与现代约束优化算法的枢纽。使用时写清标准形、检查活跃集与乘子解释,并在非凸场合保持「局部/必要」的表述克制。数值上用 fmincon 的 lambda 做 KKT 残差检验,能显著提升结果可信度。