原计划基于 TSR 学长的博客 补充知识点的,由于《应用运筹学基础》将“上课笔记整理”也作为了考核方式之一,于是我把 TSR 学长的部分内容也结合进来了。这篇文章是系列之二,还有两个系列分别是:
原始对偶方法
基本思想:
- 灵活运用了互补松弛条件 (y∗TA−cT)x∗=0 且 y∗T(Ax∗−b)=0.
- 给出一组对偶的解,强行去满足互补松弛条件。每次观察 x 是否满足原问题的约束,若不满足就不断地修正 y。
原始对偶算法 流程

- 我们先列出原问题(P)的对偶问题(DP),并找到 y 的一组可行解。
- 如果 c≥0,直接取 y=0 即可。
- 否则我们给原问题增加一个变量与一条约束 x1+x2+⋯+xn+xn+1=bm+1,其中 bm+1 需要足够大,至少要大等于 x1+x2+⋯+xn 可能的最大值。
- 加入新约束后,对偶问题的约束变成了 ATy+ym+1[1,1,…,1]T≤c,目标函数变成了 maxbTy+bm+1ym+1,ym+1≤0。取可行解 yi(i∈[1..m])=0,ym+1=minci
- 现在我们需要寻找一个原问题的可行解 x 满足互补松弛定理。设 Aj 表示矩阵 A 的第 j 列,定义 J={j∣AjTy=cj}。根据原问题的定义和互补松弛定理,我们想要找到符合要求的 x 使得 xj=0,∀j∈J 且 xj≥0,∀j∈J 。
- 构造一个带限制的原问题(RP)。如果 RP 的目标值取 0,我们就找到了符合要求的 x。
- 再构造 RP 的对偶问题(DRP),设 yˉ 是DRP的最优解。显然 yˉ=0 是一组可行解,若其也是最优解,则当前对偶可行的 y 就是对偶问题的最优解。
- 若 y 目前不是最优解,则 yˉ>0 ,我们想办法用 yˉ 改进 y:设 y^=y+θyˉ(其中 θ≥0)。注意到,y^ 仍然需要是对偶可行的,即 ATy^=ATy+θATy^≤c 仍要满足。
- 考虑 θ 的取值范围。对于 j∈J,因为 AjTyˉ≤0,无论 θ 取多大,都不会超过 c 的限制,所以这些项不会限制 θ 的取值;对于 j∈J,我们选择 θ=minj∈J,AjTyˉ>0AjTyˉcj−AjTy 。这样就能让 j∈J 中的一条限制变紧,且其它限制则不会超过。
- 将 y 调整为 y^ 之后,进入下一轮迭代调整,直到 DRP 的最优解让目标函数值为 0
经典例子:最短路问题

- 我们用图的点 - 弧关联矩阵表示 s 到 t 的线性规划问题。因为矩阵 A 是全幺模矩阵,解出的实数最优解必然是整数解。下面我们尝试用原始对偶方法解这个线性规划。
- A 矩阵显然是线性相关的(把 A 的每一行加起来得到零向量)不妨从 A 中去掉代表终点 t 的那一行,得到新矩阵 Aˉ。即新的线性规划是原问题(P)。
- 我们写出对偶问题(DP)(它其实就是差分约束系统)和带限制的对偶问题(DRP)。
- 这个 DRP 非常得清晰。如果想要让 πs 取成 0,必须保证 t 也在和 s 相关的连通块(右πi−πj=we 的 e 组成的连通块)里。所以我们不断更新 π ,每次把 J 里的点的 πi 集体提升到尽可能的大。每次提升 J 里的元素单调增加,复杂度为 O(NM)。

对偶问题 DP 优化的函数值就是最短路的直接证明(作业题)
- 找到 s 到 t 的任意一条最短路。向量 f 满足:fi 是这条最短路从 s 到 i 经过的边的权值和,同时记 F=ft.
- 设向量 g 是该对偶问题取到最大值时的一组解,记 G 为最大值。
- 因为 f 表示一条最短路,由最短路性质,我们发现 f 是满足上述线性规划限制的一组可行解。由 g 是一组最优解,所以 F≤G.
- 现在只需证明 F≥G 即可说明 F=G。反证,假设 F<G.
- 由 fs≥gs=0,ft<gt,f 表示的最短路径上必然存在一条边 e=(u→v,w),满足 fu≥gu, fv<gv. 所以 fv−fu<gv−gu. 因为 f 表示最短路径,所以 fv−fu=w,即 gv−gu>w,这和 g 是该线性规划的一组可行解矛盾。所以假设不成立,即 F≥G。
- 最终我们得到 F=G,原命题得证。
tsr 讲解原始对偶方法
整数线性规划
TSP 问题
- 考虑如何用线性规划表示
- mine=(i,j)∑ci,jxi,j
- 其中 xi,j∈{0,1},xi,j=1 当且仅当 (i,j) 是环上的相邻两点。
- 尝试更形式化地表达
- 构成环的必要条件:∀ij=1∑nxi,j=1 且 ∀ji=1∑nxi,j=1。
- 若只有这两个限制,会导致多个不相交圈的情况:要强制让所有点都与 1 号点同圈。
- 因此,新增 u1,…,un 这 n 个辅助变量并加一个新约束:ui−uj+nxi,j≤n−1,其中 1≤i≤n,2≤j≤n,i=j.
- 证明以上约束的正确性
- 对于一个多圈的解,必然存在一个圈不包含 1。沿圈上走一圈,上述限制 xi,j 都会取 1。将这些不等式全部加起来,会得到 kn≤k(n−1)(k 是圈的长度),产生矛盾。说明必然有约束不能满足。
- 对于一个单圈的解,一种 ui 的可行取法是:u1=0,up2=1,up3=2,…,upn−1=n−1,其中 pi 表示TSP问题里从 1 出发顺次访问到的第 i 个点。对比上一条,约束能满足的原因是:j 是从 2 开始取的,upn−1 到 u1=1 是没有限制的。
- 对于不在圈上的边,xi,j=0,即 ui−uj≤n−1。审视上一条,最大的 ui 也是 n−1,所以可行。
- ui 就像是每个点在环上的“势”,可以集体地增减。我认为只要限制 ui≥0 就能正确地求出一组解(无需 ui 是整数的限制,因为也可以 ui 全体是实数)。如果加一条适当的限制(如 ∑ui=2n×(n−1)),跑出来的最优解必然是整数。
01 背包
- 线性规划模型
- max∑i=1nvixi
- s.t. xi∈{0,1},∑i=1nwixi≤C
- 贪心解及其近似度分析
- 朴素贪心做法:将物品按 wivi 从大到小排序,依次塞入背包直到装不下。
- 该算法近似比是无穷大,分析如下:
- 我们求上述线性规划的实数解,记为 LP(I)。
- 观察 LP(I) 解的结构:性价比前 m 大的物品一定是完整地取走,剩下的某一个物品取了“分数”个(可以用调整法证明)。不妨设前 m 个物品的总价值是 α,剩下取的那个物品价值是 β,我们可以得到 OPT(I)≤LP(I)≤α+β,Greedy(I)≥α
- 基于以上分析,贪心解近似比 =Greedy(I)OPT(I)≤αα+β=1+αβ
- 若前 m 个物品体积和是 2ϵ、单位价值是 v0,剩下选的物品是 C−ϵ、2v0,则 αβ=4ϵC−ϵ→+∞
- Trick:我们修改一下上述贪心做法:当 α<β 时我们只取后者。这样 Greedy(I)≥max(α,β),近似比为 =Greedy(I)OPT(I)≤αmax(α,β)≤2,即近似比为 2.
- 近似做法
- 朴素反向背包算法:设 fj,i 表示前 j 个物品中,选的价值总和恰好是 i,最少需要的空间。直接做的复杂度是 O(n2Vmax),能得到最优解。
- 现在对价值进行 Scaling:把每个物品的价值调整成 ⌊kVi⌋后再DP,k 是某个常数。
- 下面证明:该 Scaling 做法是完全多项式算法。
- 完全多项式算法:既是读入规模的多项式,也是近似比ϵ 的多项式。
- 设原问题最优集合是 S,答案是 O;小规模问题最优集合是 S′,答案是 O′.
- O′=j∈S′∑Vj′≥kj∈S′∑Vj≥j∈S∑(kVj−1)≥O−nk
- 令 k=nϵVmax,则 O′≥(1−ϵ)O,且复杂度是 O(ϵn3)
匹配问题
- 设图的点集为 V,边集为 E, (i,j)∈E 表示从第 i 个点连到第 j 个点的一条有向边,xi,j 表示这条边是否为匹配边。那么一般无向图的最大匹配问题可以写成:
- max(i,j)∈E∑xi,j
- s.t.(i,j)∈E∑xi,j≤1∀i∈V 且 (i,j)∈E∑xi,j≤1∀j∈V
- 其中 xi,j∈{0,1}。
- 我们也可以用图的点 - 边关联矩阵来描述匹配问题。设图中有 n 个顶点,m 条边,那么图的点 - 边关联矩阵是一个 n×m 的矩阵。该矩阵每列对应一条边,每行对应一个顶点。若第 i 个顶点是第 j 条边的端点,那么矩阵第 i 行第 j 列为 1,否则为 0(可以看出,这个矩阵描绘的是无向边)。这样,一般无向图的最大匹配问题写为:
- (i,j)∈Emax∑xi,j
- s.t.Ax≤b,其中 xi,j∈{0,1}.
- 注意,用线性规划求解二分图的最大匹配问题,最优解的 xi 取值非 0 即 1。因为可以证明(数学归纳法),二分图的点-边关联矩阵是全幺模矩阵。
- 二分图最大匹配的对偶问题是二分图的最小点覆盖。
Gomory 割平面法
- 基本思想:不断增加限制平面,直到某一次求得的最优解为整数。
- 若我们用单纯形法求解后获得的不全是整数解,选择一个非整数的变量 xi,其必然满足:
xi+j=m+1∑nai,jˉxj=biˉ①
- 既然 xi 不是整数且 xm+1∼n=0,说明 biˉ 一定不是整数,则加入以下限制不会影响原来的整数解空间:
xi+j=m+1∑n⌊ai,jˉ⌋xj≤⌊biˉ⌋②
- 现在我们就多了②这个限制,把它加进约束里进一步求解即可。一般我们会加入①-②,这样限制更简单些:
j=m+1∑n(ai,jˉ−⌊ai,jˉ⌋)xj≥biˉ−⌊biˉ⌋①−②
分枝定界法
-
分枝定界法的思想和最优性剪枝或者 min-max 搜索树类似。
-
我们先解实数线性规划,得到了整数规划最优解的上界。假设最优解中 xi(k<xi<k+1) 不是整数,就会有两种可能:xi≤k 或 xi≥k+1,对两种情况分别进行搜索。
-
如果在某一枝内算出了一个整数解,我们就得到了原整数规划最优解的下界。
-
某个搜索分支结束有三种可能:
- 当前线性规划无可行解(死枝)。
- 当前(实数)最优解未超过下界(枯枝)。
- 当前已经是整数解(活枝)。
-
tsr 讲解割平面法和分枝定界法
基于线性规划的近似算法
带权点覆盖问题的 LP 解法
- 设 xi 表示第 i 个点是否选,我们可以列出一个整数线性规划问题;每条边 (u,v) 即为一个限制 xu+xv≥1,目标函数即为 W=∑vixi.
- 将这个线性规划一般化: 0≤xi≤1。这样能在多项式内求出一个最优解 W∗,其优于原来的最优解。
- 现在我们把 W∗ 对应的 x 做这样的改动:xi′=[xi](四舍五入)。
- 显然,x′ 也是符合该线性规划的一组解(对于任意一组限制,至少存在一个 xi≥0.5;这时候对应的 xi′ 取成 1,满足限制要求)
- 然后,每一个取 1 的 xi′ 增幅最多只有 0.5,即新的 W′ 满足 W′≤2W∗。
- 所以该做法的近似度是 2。
带权点覆盖问题的对偶解法
- 接下来这种 2-近似做法只需用到原始对偶的思想,可以避开线性规划求解。
- 原问题的对偶问题是:求 e∈Emaxye,使得对于所有的 i∈V,i∈e∑ye≥wi 且 ye≥0.
- 列出互补松弛条件
- PCS: xi(e∈E∑ye−we)=0
- DCS: ye(xi+xj−1)=0 其中 e=(i,j)
- 在整数线性规划上考虑一个弱化后的互补松弛条件:
- PCS成立:xi=0 或 xi=0 且 wi=i∈e∑ye
- DCS不太差:ye=0 或 ye=0 且 1≤xi+xj≤2
- 首先我们证明:若该条件成立,近似比为 2(x∗ 表示原问题的最优解)。
- i=1∑n(i∈e∑ye)xi=e∈E∑ye(xi+xj)≤2e∈E∑ye≤2i=1∑nwixi∗≤2OPT
- 算法
- 初始设 x=0,y=0,所有边未标记。此时 x 不可行但是 y 可行。
- 任选一条未标记的边 e,增加 ye 的值直到某一端点 i 约束变紧。
- 设 xi=1,将 i 放入顶点覆盖集,并把与 i 相关的边都标记。
- 重复以上两步直到所有边都被标记。
- 引用 MCL 大佬的图

Unrelated Parallel Machine Scheduling 问题
- tsr 的 UPMS问题讲解
- 有 m 台机器和 n 件物品,每件物品都要在一台机器上加工,第 i 台机器加工第 j 件物品的时间为 ai,j。求一种把物品分配给机器的方案,使得加工总时长最长的机器加工时间最短。
- 优化模型很简单:
- x,tmint
- s.t.i=1∑mxi,j=1∀j∈{1,2,…,n}
j=1∑nai,jxi,j≤t∀i∈{1,2,…,m}
- xi,j∈{0,1}
- 注意到 t 有二分性。现在我们二分 t,每次直接解实数线性规划来判是否存在可行解。设最终稳定的值是 T,对应的实数解是 x∗。显然 T 是答案的一个下界,即 T≤OPT.
- 对于第 j 件物品,若 ∃i xi,j∗=1 那么称该物品为“整数物品”,否则称为“分数物品”。设共有 n1 个“整数物品”,n2 个“分数物品”,显然有 n1+n2=n
- 若第 j 件物品为“分数物品”,那么 xi,j 中至少有两个非零值。原问题有 n+m 条限制,根据单纯形法,非零的变量至多有 n+m 个,那么 n1+2n2≤n+m,得到 n2≤m。
- 下面我们给每台机器分配物品,使得每台机器的加工总时长都不超过 2T,以此说明近似比是 2。
- 先做一个小处理:把用时大于 T 的物品都移除(显然是等价的)。
- 构造一张二分图:左边有 m 个点,每个点表示一台机器;右边有 n 个点,每个点表示一件物品。若 xi,j>0 则连接第 i 台机器和第 j 件物品。
- 一个重要的性质:该二分图边数不超过点数。
- 首先考虑“整数物品”。很显然,每个“整数物品” j 都只和一台机器 i 有连边 (i,j),那就把“整数物品” j 放在机器 i 中加工,并去掉物品 j 和边 (i,j)。由于每次恰好去除一个点和一条边,性质依然成立。
- 这样,图中就只剩机器和“分数物品”了。考虑所有度数为 1 的机器 i。假设唯一连接机器 i 的边是 (i,j),那么我们把“分数物品” j 放在机器 i 中加工,并去掉机器 i、物品 j 和物品 j 的所有连边。由于每件“分数物品”都有至少两条连边(度数至少为 2),所以我们每次都会去掉两个点以及至少两条边,性质依然成立。
- 反复操作直到最后不存在度数为 1 的机器为止,剩下的图一定是由若干个偶环构成。所以从始至终,我们总能通过合理分配,使得每台机器至多分配到一个“分数物品”。每台机器在完成原来若干整数任务的同时,独立地把分配给自己的那个“分数物品”做完。注意一件物品的加工时间至多为 T,所以现在的用时最多是 2T。