本页目录

优化 IV · 线性规划与动态规划

两大经典算法范式收官运筹线。线性规划是约束优化理论的完全体标本——几何清晰、对偶完美、算法成熟;动态规划则是另一种完全不同的求解哲学:把时间/阶段结构变成递推。两者也各自通向 AI 的一条大动脉(LP 对偶 → 组合优化;DP → 强化学习的 Bellman 方程)。

学习层:一个可行点,为什么还不能交卷?

1. 具体实例:产品配额的两个账本

工厂生产两种产品,数量分别为 \(x,y\),单位利润为 \(3,5\)。原料与工时给出

\[ \max\;3x+5y\quad\text{s.t.}\quad x\le4,\quad 2y\le12,\quad 3x+2y\le18,\quad x,y\ge0. \]

先不要画图。给出一个满足全部不等式的点并不难,难的是回答:它是不是利润最大的点?如果把产品改成整件发货,连续解还能不能直接当作答案?如果把“阶段”换成背包容量,为什么要写状态 \(V(i,w)\),而不是继续找一个连续顶点?

2. 先预测:哪两条边会同时绷紧?

在打开实验前,预测默认实例的最优点,并勾出全部取等号的约束,包括资源边和 \(x=0,y=0\) 两条下界。退化时可以有三条甚至更多约束同时紧。同时写下你认为对偶目标值会不会与原目标值相等。滑块改变容量后再预测一次;只看“可行”不能替代最优性判断。

3. 最小模型:连续 LP 的双重证书

对一般形式

\[ \max\;c^\top x\quad\text{s.t.}\quad Ax\le b,\quad x\ge0, \]

对偶是

\[ \min\;b^\top u\quad\text{s.t.}\quad A^\top u\ge c,\quad u\ge0. \]

一个完整的最优证书要同时检查:原始可行 \(Ax\le b,\ x\ge0\);对偶可行 \(A^\top u\ge c\);原始目标与对偶目标的间隙为零;以及互补松弛

\[ u_i\bigl(b_i-A_i x\bigr)=0,\qquad x_j\bigl((A^\top u)_j-c_j\bigr)=0. \]

默认实例的连续答案是 \((x,y)=(2,6)\),利润 \(36\);对偶证书可取 \(u=(0,\frac32,1)\),其目标 \(12\cdot\frac32+18=36\)。原始松弛是 \((2,0,0)\),对偶松弛是 \((0,0)\);不是全部松弛都为零,而是每个乘积为零。有两单位资源 1 剩余,其价格 \(u_1=0\),恰好使乘积消失。

为什么零间隙能证明最优?对任意双侧可行点,

\[ b^\mathsf Tu-c^\mathsf Tx =u^\mathsf T(b-Ax)+x^\mathsf T(A^\mathsf Tu-c)\ge0. \]

两类项都非负,故任意对偶可行值是所有原始可行值的上界。若某个原始点达到这个上界,就已最优;互补松弛是该非负和为零的逐项表达,不是还需要独立添加的第三种神秘条件。

4. 正式桥:顶点、整数与状态不是同一个对象

对本例这样的非空有界多面体,线性目标至少有一个顶点最优解;一般多面体还须核对是否含有直线,不能无条件套用顶点结论。强对偶把两个可行账本的相等变成最优性证书。把 \(x,y\) 改成整数后,可行集变成格点,连续对偶值仍是整数问题的上界,却不必由整数点达到;四舍五入也可能破坏约束。动态规划则把阶段和资源写成离散状态,例如

\[ V(0,w)=0,\qquad V(i,w)= \begin{cases} V(i-1,w), & w<w_i,\\ \max\bigl(V(i-1,w),\;V(i-1,w-w_i)+v_i\bigr), & w\ge w_i, \end{cases} \]

它依靠最优子结构和重叠子问题,不是把整数状态误当作连续 LP 的顶点。

5. 误区与边界:证书能证明什么,不能证明什么?

  • 可行不等于最优。 本页用双侧可行加零间隙提供最优性证明;也可以用完整顶点枚举或其他有效论证,单凭“图上这个点可行”不够。
  • 互补不等于任意活动集。 约束绷紧时乘子可以为零;变量为零时对应的对偶约束可以有正松弛。
  • 连续证书不自动解决整数问题。 LP 松弛的对偶值是界,分支定界还要处理整数性;DP 的表格状态也要保留离散转移。
  • 退化、多解与舍入要分开。 一个顶点可有多组基,一个最优面可包含多个点,一个最优点也可能有多个对偶证书;这些不是同一个概念。通用浮点求解器需报告残差及容差,本实验的整数容量和固定系数则允许用整数分子作精确判断。

6. 可迁移问题:换一个资源,先保留哪条检查?

若目标系数或容量改变,先重算候选顶点,再用原始/对偶账本核验;若加入整数约束,另解整数候选或 DP 递推。问自己:当前图形是在证明连续模型,还是只是在展示一个 toy 的几何直觉?这条区分会一路跟到组合优化和强化学习。

迁移题参考答案:只改容量,哪些证书仍可行?

保持 \(A,c\) 不变,只改右端容量 \(b\) 时,原始可行域改变,但对偶约束 \(A^\mathsf Tu\ge c,u\ge0\) 没变。旧对偶解仍可行,却可能不再最优;它给新问题的上界 \(b_{\rm new}^\mathsf Tu_{\rm old}\)。

默认容量下 \(u=(0,3/2,1)\)。固定前两项容量为 \(4,12\),只把混合资源容量记为 \(C\),枚举三个对偶转折点可得

\[ V(C)=\min\{42,\ 18+C,\ 2.5C\} =\begin{cases} 2.5C,&0\le C\le12,\\ 18+C,&12\le C\le24,\\ 42,&C\ge24. \end{cases} \]

在 \(C=18\) 附近,一单位混合资源增加一单位利润;从 \(C=24\) 再增加资源,利润却不变。折点处左右导数不同,对偶影子价格可能不唯一。因此旧价格能给增量上界,不能承诺任意幅度变化都带来线性收益。若再加整数约束,还要另解格点或 DP;连续价格不直接等于整件生产的边际利润。

无 JavaScript 时的静态 fallback:默认连续 LP 的最优点为 \((2,6)\),原始目标为 \(36\);对偶变量为 \((0,\frac32,1)\),对偶目标也为 \(36\),原始松弛为 \((2,0,0)\)、对偶松弛为 \((0,0)\),五个互补乘积均为零。页面开启脚本后,可改变三个容量,先勾出全部活动约束再揭示几何、连续与整数解、对偶值和精确证书账本;完整 DP 表可选格查看前驱。整数约束与 DP 状态仍需单独判断;可行点本身不代表最优。

1. 线性规划:最优点不一定只有一个顶点

左图画实际可行五边形、最优点和利润线;右图画混合容量变化时的分段最优利润

图 4.1左图是本页产品模型;右图说明影子价格有适用区间,在容量 12 和 24 处发生改变。图框可用方向键横向阅读。

标准形常写成

\[ \min c^\mathsf Tx\quad\text{s.t.}\quad Ax=b,\quad x\ge0. \]

不等式可以加松弛变量,自由变量可拆为两个非负变量之差。可行域是有限个闭半空间及超平面的交,称为多面体;若还有界,则为多胞体。

准确的顶点结论:非空多面体不含整条直线,并且线性目标有有限最优值时,至少有一个最优顶点。标准非负形的可行域不含直线,所以满足这一结论;有界非空多面体也满足。注意是“至少有一个”,不是“所有最优点都是顶点”。

两个反例:没有顶点,以及整条边都最优

在直线 \(P=\{(x,0):x\in\mathbb R\}\) 上最小化零函数,每一点都最优,却没有顶点,因为任一点都是左右两个不同可行点的中点。

在正方形 \([0,1]^2\) 上最大化 \(x\),整条边 \(\{1\}\times[0,1]\) 都最优,只有两端是顶点。这解释了平行等值线“推到边界”时可能贴住整条面;零目标甚至让整个区域最优。

标准形的证明线索:若一个最优解的正分量所对应的列线性相关,取只支撑在这些分量上的非零向量 \(d\),使 \(Ad=0\)。足够小的正负步都保持非负;最优性迫使 \(c^\mathsf Td=0\)。选择一个方向移动,直到某个正分量变零,保持目标不变而缩小支撑。重复有限次后,正分量对应列独立,可扩充为一组基,得到最优基本可行解。这同时说明“方向上不能再改进”不代表最优解只有一个。MIT 线性规划讲义。

2. 单纯形法:换基有时不移动

先去除冗余等式,使 \(A\) 有满行秩 \(m\)。选 \(m\) 个独立列组成 \(B\),解 \(Bx_B=b\),令非基变量为零;若 \(x_B\ge0\),这就是基本可行解。实际求解线性系统,而非显式算逆矩阵。不同基可对应同一个退化顶点。

对最小化问题,非基列 \(A_j\) 的检验数(约化成本)为

\[ \bar c_j=c_j-c_B^\mathsf TB^{-1}A_j. \]

若所有 \(\bar c_j\ge0\),当前原始可行基和 \(y=B^{-\mathsf T}c_B\) 组成对偶证书,可停机。否则选一个 \(\bar c_j<0\),让 \(x_j=t\) 增长,基本变量变成 \(x_B-tq\),其中 \(Bq=A_j\)。

  1. 若存在 \(q_i>0\),可行步长由 \(t_{\max}=\min_{q_i>0}(x_B)_i/q_i\) 决定,相应变量出基。
  2. 若没有 \(q_i>0\),则 \(t\) 可无限增大且目标持续下降,说明问题无界。
  3. 若 \(t_{\max}=0\),发生退化换基,点和目标都可能不变。不能声称每次换基都严格改善。

初始化还需要一个可行基,可用第一阶段辅助问题寻找;找不到可能意味着原问题不可行。某些选基规则在退化时会循环,Bland 规则用固定最小下标选择打破循环。某些单纯形规则有指数最坏例子;这不妨碍它在许多实际问题中高效。具有复杂度保证的内点法提供另一类方法,通常沿内部或相对内部的中心路径近似推进,但不可行起始变体不要求每一步原始可行。

3. LP 对偶:先核对不等号和乘子的符号

本页实验使用最大化不等式形,其对偶 \(u\ge0\) 已在学习层推导。标准等式最小化形则有

\[ \max b^\mathsf Ty\quad\text{s.t.}\quad A^\mathsf Ty\le c,\qquad y\in\mathbb R^m. \]

等式对应的 \(y\) 是自由变量,不能强加非负。弱对偶来自 \(c^\mathsf Tx-b^\mathsf Ty=x^\mathsf T(c-A^\mathsf Ty)\ge0\)。原始等式已经恒紧,互补条件剩下 \(x_j(c-A^\mathsf Ty)_j=0\),不能把不等式形的资源乘子口诀机械搬来。

有限维 LP 强对偶:若一侧可行且有有限最优值,另一侧也取得最优解,且两值相等,不需要 Slater 严格可行条件。若原始无界则对偶不可行;原始不可行时,对偶既可能无界也可能不可行,不能简单把两种状态一一对换。

对实验中的最大化资源模型,记最优利润为 \(V(b)\)。任意在 \(b\) 处最优的对偶解 \(u^*\),对新的非负容量 \(b'\) 给出

\[ V(b')\le b'^\mathsf Tu^* =V(b)+(b'-b)^\mathsf Tu^*. \]

这说明 \(u^*\) 是凹价值函数的一个上支撑斜率(超梯度)。在同一对偶解持续最优的区间内等号成立;可微时它才给出通常的边际导数。折点的多重影子价格、容量大幅变化和整数批量都会使“一单位资源总值这个价格”的说法失效。学习层的分段例子和右侧静态图可逐段验证。

4. 整数规划一瞥

变量限整数(选址、排班、背包)。难点:可行域不再凸,许多整数规划是 NP 难的,连续 LP 结论不能直接搬过来。两个思想级武器:LP 松弛(去掉整数约束解 LP;最大化问题得到上界,最小化问题得到下界,同时常给出分数解);分支定界(对分数变量分两支 \(x_j \leq \lfloor v \rfloor\) / \(\geq \lceil v \rceil\) 递归,用 LP 界剪枝——"用松弛问题的界导航穷举")。

5. 动态规划:先把状态和边界写完整

状态必须包含决定未来可行动作、转移及代价所需的信息。如果未来依赖“之前是否买过某项许可”,仅用当前地点作状态就不够;要把许可状态也纳入。最优子结构是:固定一个充分状态后,最优方案的后段也必须解决该状态的子问题。

有限阶段为什么可以倒着算?

对阶段 \(t=0,\dots,T-1\),终端代价 \(g_T\)、阶段代价 \(\ell_t\)、确定转移 \(F_t\),Bellman 递推为

\[ V_T(s)=g_T(s),\qquad V_t(s)=\min_{a\in\mathcal A_t(s)} \{\ell_t(s,a)+V_{t+1}(F_t(s,a))\}. \]

先知道终端值,才能从 \(T-1\) 倒推。这里假设可行动作非空且最小值取得,例如有限状态、有限动作的情形;否则应分别处理无可行动作、用下确界代替最小值及策略存在性。阶段下标和终端条件不能省略后仍声称能直接“倒着算”。

本页有界背包的每一格是什么?

产品 \(x\) 最多有 \(a\) 份、每份占混合资源 \(3\)、利润 \(3\);产品 \(y\) 最多有 \(\lfloor b/2\rfloor\) 份、每份占资源 \(2\)、利润 \(5\)。把每份视为一件可取或不取的物品,便得到 \(n=a+\lfloor b/2\rfloor\) 件物品、容量 \(C=c\) 的 0/1 背包。

\(V(i,w)\) 表示只用前 \(i\) 件、重量至多为 \(w\) 的最高价值。允许什么也不取,所以 \(V(0,w)=0\);若要求恰好装满,就应把 \(V(0,w>0)\) 改为不可达,而不能继续用零。

第 \(i\) 件重 \(w_i\)、值 \(v_i\),两种选择为

\[ \text{不取: }V(i-1,w),\qquad \text{取: }V(i-1,w-w_i)+v_i\quad(w\ge w_i). \]

取较大者。两项都读上一行,保证每件只用一次;若压成一行数组却从小容量向大容量更新,会意外重复使用同一件物品,变成另一种问题。实验保留完整表,选格后会指出两个前驱及取舍;并列时示范保留“不取”,这只决定输出哪一个最优方案。

复杂度 \(O(nC)\) 对容量的数值是多项式,但整数 \(C\) 的二进制输入长度只有 \(O(\log C)\),所以通常称为伪多项式。重叠子问题让缓存有用,不保证状态总数对输入长度是多项式;状态维度增加还会遇到维数灾难。MIT 背包与伪多项式讲义。

与最短路、强化学习的连接

有向无环图的最短路可按拓扑序递推;Bellman–Ford 可以用“允许经过的边数”作阶段;Dijkstra 还利用非负边权的贪心性质,不能把任何带负边的图直接交给它。若存在从起点可达且能通向终点的负环,最短路价值可能为 \(-\infty\),不再有有限最短路径。

随机转移时把后续值改为条件期望。对有限状态和动作、奖励有界、折扣 \(0\le\gamma<1\) 的无限期 MDP,

\[ (TV)(s)=\max_a\left\{r(s,a)+\gamma\sum_{s'}P(s'|s,a)V(s')\right\}. \]

由 \(\|TV-TW\|_\infty\le\gamma\|V-W\|_\infty\),Bellman 算子有唯一不动点,价值迭代收敛。这与没有折扣的无限期问题不是同一套保证;Q-learning 还需要自己的采样与步长条件,不能只写出 Bellman 方程就宣布学会最优策略。Bertsekas 动态规划课程讲义。

6. 典型例题:从最优值追到选择本身

例 1:列全顶点。 默认产品模型的可行顶点是 \((0,0),(4,0),(4,3),(2,6),(0,6)\),对应利润 \(0,12,27,36,30\),所以 \((2,6)\) 最优。这里连续和整数最优恰好相同,不是整数问题的一般性质。

例 2:从互补解对偶。 默认点在资源 1 上有正松弛,故 \(u_1=0\);两个产品数量都正,故对偶两条约束取等号:

\[ u_1+3u_3=3,\qquad 2u_2+2u_3=5. \]

解得 \(u_3=1,u_2=3/2\),目标 \(4u_1+12u_2+18u_3=36\)。在混合容量保持 \(12<C<24\) 的区间内,边际价格为 \(1\);超出区间需重新判断,加班成本还需与适用区间内的实际增量收益比较。

例 3:分数解为什么不能直接四舍五入? 改成 \(a=4,b=11,c=18\)。连续解为 \((7/3,11/2)\),目标 \(69/2=34.5\)。普通四舍五入得到 \((2,6)\),违反 \(2y\le11\);整数最优为 \((2,5)\),利润 \(31\)。本例向下取整恰好成功,但它不是一般整数规划算法;本页由完整枚举和 DP 另行证明整数最优。

例 4:手填背包表。 容量 \(5\),物品 \((w_i,v_i)=(2,3),(3,4),(4,5)\)。先预测最优价值和选中物品,再展开。

完整状态表与回溯
已考虑物品 \(w=0\) \(1\) \(2\) \(3\) \(4\) \(5\)
无 0 0 0 0 0 0
第 1 件 0 0 3 3 3 3
前 2 件 0 0 3 4 4 7
前 3 件 0 0 3 4 5 7

\(V(3,5)=\max(V(2,5),V(2,1)+5)=\max(7,5)=7\),不取第 3 件;\(V(2,5)\) 选择 \(V(1,2)+4=7\),取第 2 件;剩余容量 \(2\) 再取第 1 件。总重 \(5\)、总值 \(7\)。若只有一件 \((2,3)\) 却用同一行从小到大更新,容量 \(4\) 会错误得到 \(6\),相当于把同一件拿了两次。


下一步可连接图与最短路、最大流与匹配,或回到数值误差区分精确证书与浮点残差。