资讯动态

带约束最优化入门:从拉格朗日乘子法到KKT条件与对偶理论

发布时间:2026/10/15 9:45:45 来源:尧图企业网站定制
1. 从无约束到带约束为什么这一步是道分水岭很多人学最优化理论前面无约束部分学得挺顺——梯度下降、牛顿法、拟牛顿法公式推一推代码跑一跑看着损失函数曲线往下掉心里挺踏实。然后翻到带约束最优化这一章突然就懵了。拉格朗日乘子法、KKT条件、对偶问题、罚函数、内点法……一堆新概念砸过来感觉像是换了一门课。我当初也是这个感受。后来做项目多了才慢慢明白无约束优化是理想世界带约束优化才是真实世界。现实里的问题几乎都带约束——资源有限、预算封顶、物理规律不可违背、安全边界不能突破。你设计一个控制器输入电压不能超过额定值你训练一个模型推理延迟不能超过阈值你排一个生产计划机器产能就那么多。这些不能超过必须满足就是约束。所以这一节不是多学一个技巧而是从会算到会用的分水岭。无约束的时候你只需要关心往哪走能下降带约束的时候你还要关心走的方向会不会撞墙撞墙了怎么贴着墙走有没有可能绕到墙后面找到更好的解。这几个问题对应了带约束最优化的几套核心方法论。这篇文章我打算按自己的理解重新梳理一遍。不照搬教材的推导顺序而是按遇到问题—为什么难—怎么解决—实际怎么选的逻辑来组织。适合已经学过无约束优化基础、正在啃带约束部分的朋友也适合工作中需要用到优化但没系统学过理论的工程师。我会尽量把几何直觉讲清楚因为这块内容如果只记公式换个问题就不会用了。提示本文默认读者了解梯度、海森矩阵、凸集、凸函数这些基本概念。如果这些还不熟建议先补一下再回来看否则后面很多为什么会接不上。2. 约束到底给优化问题带来了什么本质困难2.1 可行域的形状决定了问题的难度等级带约束优化问题的一般形式长这样minimize f(x) subject to g_i(x) 0, i 1, ..., m h_j(x) 0, j 1, ..., p其中 f 是目标函数g 是不等式约束h 是等式约束。所有满足约束的 x 组成的集合叫可行域。关键洞察在这里可行域的形状直接决定了这个问题好不好解。如果可行域是一个凸集目标函数又是凸函数那这就是凸优化问题局部最优就是全局最优理论上很好处理。但如果可行域是非凸的——比如有几个分散的岛屿——那问题就麻烦了你找到的最优解可能只是某个岛上的最高点旁边那个更高的岛你根本没看到。我打个比方。无约束优化就像在一片开阔平原上找最低点你闭着眼睛往下走总能走到某个谷底。带约束优化呢像是把你扔进一个围栏里找最低点。围栏可能是圆的凸的也可能是奇形怪状的非凸的。圆围栏里你往下走就行奇形怪状的围栏里你可能被卡在某个角落以为到底了其实翻过那道坎后面还有更低的坑。2.2 最优解的位置内部解还是边界解这是带约束优化最核心的一个分类理解了它后面很多方法的存在意义就清楚了。情况一无约束最优解落在可行域内部。这时候约束根本没起作用你直接按无约束的方法求解就行约束是冗余的。这种情况叫内部解对应的约束叫非活跃约束。情况二无约束最优解落在可行域外面。这时候约束顶住了最优解一定在可行域的边界上。这叫边界解对应的约束叫活跃约束。为什么这个区分重要因为边界上的最优解梯度不一定为零。在无约束问题里最优解的必要条件是梯度等于零。但在带约束问题里如果最优解在边界上目标函数的负梯度方向可能指向可行域外面——你想继续下降但墙不让你走。这时候真正起作用的不是梯度为零而是梯度方向和约束边界的法方向满足某种关系。这个关系就是拉格朗日乘子法和KKT条件要刻画的东西。2.3 一个几何直觉等高线与约束边界的相切想象二维平面上的问题。目标函数 f(x,y) 的等高线是一圈一圈的曲线约束 g(x,y) 0 是一个区域。如果最优解在边界上那么在最优解那个点目标函数的等高线一定和约束边界相切。为什么因为如果不相切等高线就会穿过边界那就意味着沿着边界还能找到让 f 更小的点当前点就不是最优的。相切意味着什么意味着在切点处目标函数的梯度方向和约束函数的梯度方向是平行的共线。用公式写就是∇f(x*) λ · ∇g(x*), λ 0这个 λ 就是拉格朗日乘子。它的大小有实际含义——表示约束松一点能让目标函数改善多少也就是影子价格。这个解释在经济学和工程里非常有用后面会展开。对于等式约束 h(x) 0几何上是一条曲线或曲面最优解处目标函数梯度也垂直于约束曲面同样得到梯度共线的条件只是乘子符号没有限制。2.4 多个约束同时活跃时的复杂性单个约束的情况还算直观。但实际问题是多个约束可能同时活跃。比如你设计一个结构应力约束、位移约束、尺寸约束可能同时顶到边界。这时候最优解处有多个约束的梯度参与平衡KKT条件要把它们都考虑进去。更麻烦的是你事先不知道哪些约束会活跃。m 个不等式约束理论上活跃约束的组合有 2^m 种可能。暴力枚举在 m 大的时候完全不可行。这就是为什么需要一套系统的理论KKT和算法积极集法、内点法来处理。3. 拉格朗日乘子法把约束吸收进目标函数3.1 核心思想用乘子给约束定价拉格朗日乘子法的思路很巧妙既然约束让问题难解那我能不能把约束揉进目标函数里变成一个无约束问题对于等式约束 h(x) 0构造拉格朗日函数L(x, λ) f(x) λ · h(x)然后对 x 和 λ 分别求偏导令其为零∂L/∂x ∇f(x) λ · ∇h(x) 0 ∂L/∂λ h(x) 0第二个方程正好还原了约束条件第一个方程就是前面说的梯度共线条件。所以拉格朗日乘子法把带等式约束的优化转化成了无约束的方程组求解。这个转化的意义在于无约束方程组求解有成熟的数值方法牛顿法、拟牛顿法我们可以直接拿来用。不用再去专门设计处理约束的算法。3.2 乘子的实际含义影子价格λ 不只是一个数学符号它有明确的物理/经济含义。考虑把约束从 h(x) 0 放松到 h(x) ε最优目标值会变成 f* λ·ε一阶近似。也就是说λ 衡量的是约束放松一个单位目标函数能改善多少。举个例子。你有一个生产计划问题约束是总工时不超过 100 小时目标是最小化成本。如果算出来对应的 λ 5意思是如果我能多获得 1 小时工时总成本能降低 5 元。那这 1 小时工时值不值 5 元如果加班费低于 5 元那就值得加班如果高于 5 元那就不划算。这种影子价格思维在实际决策中极其有用。它把约束该不该放松这个模糊问题变成了一个可以算的账。3.3 等式约束的求解流程与实操细节具体怎么操作我按自己的习惯梳理一下写出拉格朗日函数。把目标函数和所有等式约束按 L f Σλ_j·h_j 组合起来。对所有变量求偏导令其为零。包括原始变量 x 和乘子 λ。解这个方程组。变量个数 n pn 个原始变量p 个乘子方程个数也是 n p理论上可解。验证解的性质。对于凸问题这个解就是全局最优对于非凸问题还需要比较多个驻点。实操中第 3 步往往是难点。方程组通常是非线性的解析解很难求需要数值方法。我一般会先用符号计算工具比如 Python 的 sympy尝试解析求解如果不行再上数值方法。注意拉格朗日乘子法只处理等式约束。如果问题里还有不等式约束需要先判断哪些不等式会活跃把它们当作等式处理其余忽略。但哪些会活跃本身就需要判断这就是下一节 KKT 条件要解决的。3.4 一个容易踩的坑乘子符号与约束方向等式约束的乘子 λ 符号没有限制可正可负。但不等式约束的乘子有符号要求后面 KKT 会讲。我见过不少人把等式约束的乘子符号习惯带到不等式约束里结果条件写错。还有一个坑约束写成 h(x) 0 还是 -h(x) 0会导致乘子符号相反。虽然最终解 x* 不变但乘子的解释会变。所以在报告结果时一定要说清楚约束是怎么写的否则别人看你的影子价格会一头雾水。4. KKT条件不等式约束的完整刻画4.1 从拉格朗日到KKT补上不等式这块拼图等式约束用拉格朗日乘子法就搞定了。但现实问题里大量是不等式约束——不超过至少在范围内。这些怎么处理KKT条件Karush-Kuhn-Tucker条件就是带不等式约束优化问题的一阶必要条件。它把拉格朗日乘子法推广到了不等式情形。对于问题minimize f(x) subject to g_i(x) 0, i 1, ..., m h_j(x) 0, j 1, ..., p构造拉格朗日函数L(x, μ, λ) f(x) Σ μ_i · g_i(x) Σ λ_j · h_j(x)KKT条件包含四组平稳性条件∇L 0即 ∇f Σμ_i·∇g_i Σλ_j·∇h_j 0原始可行性g_i(x) 0h_j(x) 0对偶可行性μ_i 0互补松弛条件μ_i · g_i(x) 04.2 互补松弛最优雅也最容易记错的条件互补松弛条件 μ_i · g_i(x) 0 是KKT的灵魂。它说的是对每个不等式约束要么约束活跃g_i 0要么乘子为零μ_i 0两者必居其一或都为零。翻译成人话如果一个约束没顶到边界g_i 0非活跃那它就不影响最优解对应的乘子为零不用管它。如果一个约束顶到边界了g_i 0活跃那它可能对最优解有影响乘子可以非零。这个条件把哪些约束活跃这个组合爆炸问题变成了一个可以用算法处理的条件。积极集法就是基于这个思路先猜一组活跃约束求解然后检查互补松弛是否满足不满足就调整活跃集迭代直到收敛。我当初记这个条件的时候老是搞混方向。后来用一句话记住不活跃的约束不配拥有乘子。约束都没起作用凭什么给它定价这样一想就不会记反了。4.3 对偶可行性为什么不等式乘子必须非负μ_i 0 这个条件也有几何直觉。不等式约束 g_i(x) 0 的梯度 ∇g_i 指向约束变紧的方向g 增大的方向。在最优解处目标函数的负梯度方向下降方向必须被约束挡住也就是说∇f 必须能表示成活跃约束梯度的非负组合。如果 μ_i 可以是负的那意味着约束的梯度在帮倒忙——它把下降方向往可行域外面推。这显然不对。所以 μ_i 必须非负。这个条件在经济学里的解释是约束放松不能让目标变差。如果放松约束反而让目标变差那这个约束就不该存在或者说问题建模有问题。4.4 KKT是必要条件什么时候也是充分条件必须强调KKT条件一般只是必要条件不是充分条件。满足KKT条件的点叫KKT点它可能是局部最优也可能是鞍点甚至可能什么都不是。但有一个重要例外如果问题是凸优化问题f 和 g_i 是凸函数h_j 是仿射函数那么KKT条件就是充要条件。满足KKT的点一定是全局最优。这个结论极其有用。实际中很多问题可以建模成凸问题一旦确认是凸的找到KKT点就大功告成不用再担心局部最优的坑。我判断一个问题是不是凸的一般看三点目标函数是不是凸的海森矩阵半正定、不等式约束是不是凸的g_i 是凸函数0 定义凸集、等式约束是不是线性的。三个都满足就是凸问题放心用KKT。4.5 手算KKT的完整案例拆解光说理论太干走一个具体例子。问题minimize f(x1, x2) x1^2 x2^2 subject to x1 x2 1先把约束写成标准形式 g(x) 1 - x1 - x2 0。拉格朗日函数L x1^2 x2^2 μ(1 - x1 - x2)平稳性∂L/∂x1 2x1 - μ 0 x1 μ/2 ∂L/∂x2 2x2 - μ 0 x2 μ/2互补松弛μ(1 - x1 - x2) 0分两种情况情况Aμ 0。则 x1 x2 0。检查约束1 - 0 - 0 1 0违反 g 0。不可行排除。情况B1 - x1 - x2 0。即 x1 x2 1。代入 x1 x2 μ/2得 μ/2 μ/2 1所以 μ 1x1 x2 0.5。检查对偶可行性μ 1 0满足。所以最优解是 (0.5, 0.5)最优值 0.5。这个例子很基础但完整展示了KKT的使用流程写拉格朗日、列条件、分情况讨论、验证可行性。实际问题的区别只是变量更多、约束更多、方程更难解但逻辑是一样的。5. 对偶理论换个角度看问题有时豁然开朗5.1 原始问题与对偶问题的构造对偶理论是带约束优化里最漂亮的部分之一。它的核心思想是同一个问题可以从两个角度去看有时候换个角度反而更好解。原始问题Primalminimize f(x) subject to g_i(x) 0 h_j(x) 0构造拉格朗日函数 L(x, μ, λ)然后定义对偶函数d(μ, λ) inf_x L(x, μ, λ)对偶问题就是maximize d(μ, λ) subject to μ 0注意对偶问题永远是一个凸优化问题因为 d 是仿射函数的下确界一定是凹函数最大化凹函数就是凸问题不管原始问题是不是凸的。这是对偶理论最强大的地方。5.2 弱对偶与强对偶什么时候两个问题等价弱对偶定理对偶问题的最优值 d* 永远不超过原始问题的最优值 p*。即 d* p*。这个差距叫对偶间隙。强对偶定理在一定条件下d* p*对偶间隙为零。这时候解对偶问题就等于解原始问题。强对偶成立的条件叫约束资格条件。最常用的是Slater条件如果原始问题是凸的且存在一个严格可行点所有不等式约束严格满足那么强对偶成立。Slater条件在实际中通常容易满足。所以对于凸问题我们基本可以放心地用对偶方法。5.3 对偶的实际价值什么时候该用它对偶不只是理论玩具它有实实在在的用处用处一降维。有时候原始问题变量多约束少对偶问题变量少变量个数等于约束个数解对偶更省事。支持向量机SVM就是典型例子——原始问题在高维空间对偶问题在样本数量维度通常样本数远小于特征维度对偶形式更高效。用处二处理复杂约束。有些约束很难直接处理但对偶问题里它们变成了简单的变量约束μ 0。内点法就是基于对偶思想设计的。用处三分布式优化。对偶分解可以把一个大问题拆成多个子问题并行求解这在多智能体、大规模网络中很有用。用处四敏感性分析。对偶变量就是影子价格直接告诉你哪个约束最值钱该优先放松哪个。我个人的经验是如果原始问题约束数量远小于变量数量或者约束结构有特殊分解性优先考虑对偶方法。否则直接用原始方法可能更直观。5.4 对偶间隙不为零时怎么办如果强对偶不成立对偶间隙大于零那对偶问题的解只能给原始问题一个下界不能直接当最优解用。这时候有几个选择检查问题是否真的非凸能否通过变量替换、松弛等手段转化成凸问题。使用分支定界等全局优化方法对偶下界可以作为剪枝依据。接受近似解用对偶解作为初始点再用局部方法精化。实际工程中如果对偶间隙不大有时候直接用对偶解也能接受。但如果是安全攸关的场景必须谨慎不能拿一个下界当最优解用。6. 罚函数与障碍函数把约束变成软的6.1 外点罚函数违反约束就罚你罚函数法的思路很直接既然约束不好处理那我把它变成目标函数里的一个惩罚项。你违反约束我就给你的目标函数加一个大惩罚逼你回到可行域。外点罚函数的构造P(x, σ) f(x) σ · Σ [max(0, g_i(x))]^2 σ · Σ h_j(x)^2其中 σ 是罚参数越大惩罚越重。当 σ → ∞ 时P 的最优解趋近于原始问题的最优解。外点法的特点是迭代点从可行域外面逐渐逼近边界。初始点可以不可行这是它的优点。缺点是 σ 要取得很大才能保证约束满足而 σ 太大又会导致数值病态海森矩阵条件数爆炸。实操中我一般用逐步增大 σ的策略先用小 σ 求一个粗略解然后增大 σ 以当前解为初始点继续求反复几次。这样比一上来就用巨大 σ 要稳定得多。6.2 内点罚函数障碍函数不让你靠近边界内点法也叫障碍函数法的思路相反它要求迭代点始终在可行域内部然后在边界附近设一道障碍越靠近边界惩罚越大让你不敢靠近。常用的障碍函数是对数障碍B(x, τ) f(x) - τ · Σ log(-g_i(x))当 x 靠近边界g_i → 0^-时-log(-g_i) → ∞形成一道无限高的墙。τ 是障碍参数越小障碍越弱解越接近真实边界。内点法的特点是迭代点始终可行这对很多工程问题很重要比如你不能让中间设计违反安全约束。缺点是必须从严格可行点出发找初始点本身可能就是个问题。6.3 罚参数的选择太大太小都是坑罚参数或障碍参数的选择是这类方法的命门。σ 太小约束违反严重解不可行没有实际意义。σ 太大数值病态收敛慢甚至不收敛。我的经验是初始 σ 取 1 到 10 之间然后每次乘以 2 到 10 倍逐步增大。同时监控约束违反量和目标函数值的变化如果约束违反量下降很慢说明 σ 增得不够快如果目标函数值剧烈震荡说明 σ 增得太快。对于内点法τ 的初始值一般取 1 左右然后逐步减小比如乘以 0.1。τ 减小的速度也要控制太快会导致数值不稳定。注意罚函数法和障碍函数法得到的都是近似解不是精确解。要得到高精度解需要让参数趋于极限但这在数值上很难做到。实际中通常结合KKT条件做后处理或者用序列二次规划SQP等方法精化。6.4 增广拉格朗日法罚函数与乘子法的结合纯罚函数法有个问题要得到精确解σ 必须趋于无穷数值上不可行。增广拉格朗日法也叫乘子法解决了这个问题。它的构造是L_A(x, λ, σ) f(x) Σ λ_j h_j(x) (σ/2) Σ h_j(x)^2注意它比普通拉格朗日函数多了一个二次罚项。这个二次项让方法在 σ 有限时就能收敛到精确解同时乘子 λ 通过迭代更新。更新公式λ_j^{k1} λ_j^k σ · h_j(x^k)这个方法的收敛性比纯罚函数好得多σ 不需要趋于无穷只需要大于某个阈值。实际中我用增广拉格朗日法比用纯罚函数法多因为它在精度和稳定性之间平衡得更好。7. 算法选型不同场景该用哪把刀7.1 问题规模与结构决定算法选择带约束优化的算法很多但没有一个万能最优的。选算法主要看几个维度维度选项影响问题规模小规模n100可以用二阶方法如SQP大规模n1000优先一阶方法或内点法约束类型只有等式拉格朗日牛顿法有不等式KKT积极集/内点法凸性凸问题内点法、对偶方法非凸问题SQP、增广拉格朗日全局策略精度要求高精度SQP、内点法中等精度罚函数、一阶方法实时性在线优化一阶方法、显式方法7.2 积极集法小规模问题的利器积极集法的思路是维护一个活跃约束集合在每次迭代中求解一个等式约束子问题然后检查是否有约束需要加入或移出活跃集。优点是对中小规模问题非常高效尤其是活跃约束数量不多的时候。缺点是活跃集变化时计算量可能较大大规模问题下效率下降。我一般在变量数几百以内、约束结构清晰的问题上用积极集法。MATLAB的fmincon默认算法之一就是积极集法Python的scipy.optimize也有实现。7.3 内点法大规模凸问题的首选内点法从可行域内部出发沿着中心路径逼近最优解。它的优点是多项式时间复杂度大规模问题上表现稳定。缺点是每步需要求解一个牛顿方程组计算量大且需要严格可行初始点。对于大规模凸问题比如线性规划、二次规划、二阶锥规划内点法基本是首选。很多商业求解器如某些线性规划求解器的核心就是内点法。7.4 序列二次规划SQP非凸问题的通用武器SQP的思路是在当前点把问题近似成一个二次规划目标函数二次近似约束线性近似求解这个QP得到搜索方向然后做线搜索或信赖域更新。它的优点是收敛速度快超线性能处理非凸问题对中小规模问题非常有效。缺点是每步要解一个QP子问题计算量不小且需要好的初始点。我在做轨迹优化、参数辨识这类非凸问题时SQP是默认选择。它的收敛性和鲁棒性在非凸场景下比较均衡。7.5 一阶方法大规模、低精度、实时场景如果问题规模特别大比如深度学习里的约束优化或者要求实时求解二阶方法就太慢了。这时候用一阶方法比如投影梯度法、近端梯度法、ADMM交替方向乘子法。这些方法每步计算量小适合大规模问题但收敛速度慢线性甚至次线性精度也不如二阶方法。不过在机器学习、信号处理这些领域中等精度往往就够了一阶方法反而更实用。ADMM特别值得提一下它把大问题拆成多个小问题交替求解天然适合分布式和并行计算。我在做大规模网络优化时经常用它。8. 实操中的经验与避坑指南8.1 约束缩放最容易被忽视但影响巨大这是我踩过的最大的坑之一。不同约束的量级差异很大时必须做缩放。比如一个约束是电压不超过 1000 伏另一个是误差不超过 0.001。如果不缩放求解器会把注意力全放在电压约束上因为数值大误差约束基本被忽略。结果就是电压约束满足得很好误差约束烂得一塌糊涂。解决办法把每个约束除以其典型量级让所有约束都在 1 附近。比如电压约束除以 1000误差约束除以 0.001。这样求解器对所有约束一视同仁。这个操作看起来简单但不做的话很多求解器会给你莫名其妙的结果。我现在养成的习惯是建模完成后第一件事就是检查所有约束和目标函数的量级差异超过两个数量级就缩放。8.2 初始点的选择可行还是不可行不同算法对初始点的要求不同内点法、障碍函数法必须严格可行。找初始点本身可能就需要解一个辅助优化问题。罚函数法、增广拉格朗日法可以不可行但不可行程度太大也会影响收敛。积极集法、SQP通常要求可行或接近可行。我的经验是如果问题有明显的物理意义用物理直觉给一个初始点往往比随机生成的好。比如做轨迹优化用直线轨迹作为初始猜测比随机点靠谱得多。如果实在找不到可行点可以先解一个最小约束违反问题minimize Σ [max(0, g_i(x))]^2 Σ h_j(x)^2这个无约束问题的最优解如果违反量为零就是可行点如果不为零说明原问题可能不可行约束矛盾。8.3 收敛判据不能只看目标函数很多人判断收敛只看目标函数值变化这不够。带约束问题的收敛判据应该包括目标函数变化量小于阈值约束违反量小于阈值KKT残差平稳性条件、互补松弛条件的违反程度小于阈值步长小于阈值我一般设三个判据同时满足才算收敛目标变化 1e-6约束违反 1e-6KKT残差 1e-6。具体阈值根据问题精度要求调整。只看目标函数变化的危险在于可能目标函数不怎么变了但约束违反还很严重这时候的解根本不能用。8.4 数值病态识别与处理带约束问题容易数值病态表现为求解器报错、迭代震荡、结果对初始点极度敏感。常见原因和对策约束线性相关两个约束实际上等价导致KKT矩阵奇异。对策是预处理去掉冗余约束。约束梯度接近零在某些点约束梯度消失导致乘子无法确定。对策是检查约束建模是否合理。罚参数过大导致海森矩阵条件数爆炸。对策是逐步增大罚参数不要一步到位。变量量级差异大和约束缩放类似变量也需要缩放。对策是对变量做归一化。我遇到数值病态时第一步永远是检查缩放第二步检查约束是否冗余第三步检查梯度计算是否正确解析梯度和数值梯度对比。这三步能解决大部分问题。8.5 从求解结果反推问题建模求解器给出的结果不理想时不要急着换算法先检查建模。我遇到过好几次求解器说不可行查了半天发现是约束写错了符号求解器说无界发现是漏了一个约束求解器收敛到奇怪的点发现目标函数写错了。求解结果是对建模的反馈。不可行说明约束可能矛盾无界说明约束不够收敛慢说明问题可能病态或非凸。学会读求解器的输出比盲目调参有用得多。9. 写在最后我在这块内容上的一些体会带约束最优化这块我学了不止一遍。第一遍学的时候满脑子公式考完就忘。第二遍做项目用到才慢慢把公式和实际问题对应起来。第三遍给别人讲才发现自己之前有些理解是错的。最大的体会是几何直觉比公式重要。KKT条件那一堆式子如果只记公式换个问题就不知道怎么写。但如果理解了梯度共线互补松弛对偶间隙这些概念的几何含义遇到新问题就能自己推出来。另一个体会是没有最好的算法只有最合适的算法。小问题用SQP大问题用内点法或一阶方法凸问题用对偶非凸问题用增广拉格朗日。选算法之前先分析问题结构比上来就调库要高效得多。最后说一个实用建议养成验证解的习惯。求出解之后代回原始约束检查可行性用数值方法验证KKT条件和已知的边界情况对比。这些检查花不了几分钟但能避免很多低级错误。我见过太多人拿着一个违反约束的最优解去做决策问题就出在没做验证。这块内容后续还可以往很多方向扩展——二阶充分条件、灵敏度分析、随机优化、鲁棒优化、分布式优化。每一个方向都够写好几篇。但核心的这套框架拉格朗日、KKT、对偶、罚函数是基础把这些吃透了后面的扩展都是在这个框架上做文章。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑