参考自:
《再探线性规划对偶在信息学竞赛中的应用》,丁晓漫,IOI2021中国国家集训队论文集
《浅谈线性规划与对偶问题》,董克凡,IOI2016中国国家集训队论文集
1 定义
定义 1.1(线性函数和线性约束) :对于一组变量 x 1 , ⋯ , x n x 1 , ⋯ , x n 。
称一个函数 f ( x 1 , ⋯ , x n ) f ( x 1 , ⋯ , x n ) 是线性函数,当且仅当存在 a 1 , ⋯ , a n a 1 , ⋯ , a n 使得 f ( x 1 , ⋯ , x n ) = n ∑ i = 1 a i x i f ( x 1 , ⋯ , x n ) = ∑ i = 1 n a i x i 。
等式 f ( x 1 , ⋯ , x n ) = b f ( x 1 , ⋯ , x n ) = b ,不等式 f ( x 1 , ⋯ , x n ) ≤ b , f ( x 1 , ⋯ , x n ) ≥ b f ( x 1 , ⋯ , x n ) ≤ b , f ( x 1 , ⋯ , x n ) ≥ b 统称为线性约束。
定义 1.2(线性规划问题) :线性规划问题要求最大化或最小化一个受限于一组有限的线性约束的线性函数。
称满足所有限制的解 ( x 1 , ⋯ , x n ) ( x 1 , ⋯ , x n ) 为可行解,使目标函数达到最优的可行解称为最优解,所有可行解构成的区域为解空间。
定义 1.3(标准型线性规划) :标准型线性规划是满足如下形式的线性规划问题:
max n ∑ j = 1 c j x j s.t. n ∑ j = 1 a i , j x j ≤ b i ∀ i ∈ [ 1 , m ] x j ≥ 0 ∀ j ∈ [ 1 , n ] max ∑ j = 1 n c j x j s.t. ∑ j = 1 n a i , j x j ≤ b i ∀ i ∈ [ 1 , m ] x j ≥ 0 ∀ j ∈ [ 1 , n ]
也可以用矩阵表示成:
max c T x s.t. A x ≤ b x ≥ 0 max c T x s.t. A x ≤ b x ≥ 0
其中向量 x ≤ y x ≤ y 当且仅当对于向量的每一维 x i , y i x i , y i 都有 x i ≤ y i x i ≤ y i 。
经过简单的变换,任何线性规划问题都可以转化成标准型线性规划问题:可以通过系数取负修正最优化方向和不等号方向,对于等式可以拆成两个不等式,对于无非负性限制的变量 x x 拆成 x = x 0 − x 1 x = x 0 − x 1 得到有非负性限制的 x 0 , x 1 x 0 , x 1 。
定义 1.4(松弛型线性规划) :标准型线性规划是满足如下形式的线性规划问题:
max n ∑ j = 1 c j x j s.t. x i + n = b i − n ∑ j = 1 a i , j x j ∀ i ∈ [ 1 , m ] x j ≥ 0 ∀ j ∈ [ 1 , n + m ] max ∑ j = 1 n c j x j s.t. x i + n = b i − ∑ j = 1 n a i , j x j ∀ i ∈ [ 1 , m ] x j ≥ 0 ∀ j ∈ [ 1 , n + m ]
容易将标准型转化为松弛型。
2 单纯形法
//有将这节重写的打算
前言
考察一个线性规划的解空间,这个解空间是多个线性不等式解空间的交。可以证明每个线性不等式的解空间都是一个凸形区域(凸形区域的一个直观定义是,区域内任意两点连线上的点都属于这个区域),那么它们的交也是一个凸形区域。
因为解空间是凸形的,所以考虑在解空间内从一个初始解开始,进行爬山算法,这样所找到的局部最优解一定是全局最优解,因为 “山顶” 只有一个。
现在我们来描述单纯形法的具体过程。它针对于某个松弛型线性规划:
maximize n ∑ j = 1 c j x j s . t . x i + n = b i − n ∑ j = 1 a i , j x j i ∈ [ 1 , m ] x j ≥ 0 j ∈ [ 1 , n + m ] maximize ∑ j = 1 n c j x j s . t . x i + n = b i − ∑ j = 1 n a i , j x j i ∈ [ 1 , m ] x j ≥ 0 j ∈ [ 1 , n + m ]
称 x 1 , ⋯ , x n x 1 , ⋯ , x n 为基变量,x n + 1 , ⋯ , x n + m x n + 1 , ⋯ , x n + m 为非基变量。可以看出,非基变量都是由基本量线性组合再加上一个常数得到。
对于 j ∈ [ 1 , n ] j ∈ [ 1 , n ] 和 i ∈ [ 1 , m ] i ∈ [ 1 , m ] 满足 a i , j ≠ 0 a i , j ≠ 0 ,定义一次转轴 pivot ( j , i ) pivot ( j , i ) 为:把 x i + n = b i − n ∑ k = 1 a i , k x k x i + n = b i − ∑ k = 1 n a i , k x k 变为 x j = 1 a i , j ( b i − ∑ k ≠ j a i , k x k − x i + n ) x j = 1 a i , j ( b i − ∑ k ≠ j a i , k x k − x i + n ) 。然后利用这条式子,把原来所有其他式子中的 x j x j 都替换。这样,我们相当于把 x i + n x i + n 变成了基变量,x j x j 变成非基变量。
b i b i 非负
先不妨假设 b i b i 均非负,那么令 x i = 0 , i ∈ [ 1 , n ] x i = 0 , i ∈ [ 1 , n ] 即可得到一组初始解,此时答案 n ∑ j = 1 c j x j = 0 ∑ j = 1 n c j x j = 0 。
归纳地假设 b i b i 非负,那么当前 x i = 0 , i ∈ [ 1 , n ] x i = 0 , i ∈ [ 1 , n ] 仍为一组合法的解。然后每次找到某个 j j 使得 c j > 0 c j > 0 ,接着:
若存在 i ∈ [ 1 , m ] i ∈ [ 1 , m ] 使得 a i , j > 0 a i , j > 0 ,找到这些 i i 中使 b i / a i , j b i / a i , j 最小的那个。
然后执行转轴操作 pivot ( j , i ) pivot ( j , i ) 。
此时仍有 b ′ i ≥ 0 b i ′ ≥ 0 ,否则若存在某个 i ′ i ′ 使得 b ′ i ′ < 0 b i ′ ′ < 0 即 b i ′ − a i ′ , j b i a i , j < 0 b i ′ − a i ′ , j b i a i , j < 0 ,发现这需要 a i ′ , j > 0 a i ′ , j > 0 且 b i ′ a i ′ , j < b i a i , j b i ′ a i ′ , j < b i a i , j ,那么与我们的假设矛盾。
此时需要最大化的值变成了 c j b i a i , j + ∑ k ≠ j c ′ k x k + c ′ i + n x i + n c j b i a i , j + ∑ k ≠ j c k ′ x k + c i + n ′ x i + n 。
由于 b ′ i b i ′ 仍非负,所以 x i = 0 , i ∈ [ 1 , n ] x i = 0 , i ∈ [ 1 , n ] 仍为一组合法的解,那么把当前答案加上 c j b i a i , j c j b i a i , j 。
然后再从找 j j 开始重复。
若对于任意 i ∈ [ 1 , m ] i ∈ [ 1 , m ] 都有 a i , j ≤ 0 a i , j ≤ 0 。这意味着 x j x j 可以取无限大而使得解仍然合法,那么需要最大化的式子也可以取到无限大。
所以该线性规划的答案无界。
若对于任意 j j 都有 c j ≤ 0 c j ≤ 0 ,此时最优解应当就是所有 x i ( i ∈ [ 1 , n ] ) x i ( i ∈ [ 1 , n ] ) 都取 0 0 ,那么我们之前累加得到的答案就是最优解。
以下是个人的阿巴阿巴,十分不严谨:
对于单纯形法的几何理解,我们以二维的为例。相当于我们要在基坐标 x ≥ 0 , y ≥ 0 x ≥ 0 , y ≥ 0 以及一堆 z i = f i ( x , y ) ≥ 0 z i = f i ( x , y ) ≥ 0 的限制下最大化 c x x + c y y c x x + c y y 。然后归纳假设的条件相当于当前坐标系的原点(当前解)在解空间内。如左上图:
不妨设 c x > 0 c x > 0 ,那么我们将当前解考虑沿 x x 轴正方向移动,答案不断变大,直到被某个 z = f ( x , y ) ≥ 0 z = f ( x , y ) ≥ 0 限制住了。
然后我们考虑换坐标系,即将所有关于 x , y x , y 的式子用关于 z , y z , y 的式子表示。考虑这在几何上的表现:考虑 z = z 0 z = z 0 这条直线,它应该平行于新的 y y 轴,而它原来平行于 f ( x , y ) = 0 f ( x , y ) = 0 ,于是新的 y y 轴沿 f ( x , y ) = 0 f ( x , y ) = 0 的方向。同理考虑 y = y 0 y = y 0 ,它应该平行于新的 z z 轴,而它原来平行于 x x 轴,于是新的 z z 轴沿 x x 轴方向。而具体 y y 轴应该往上指还是往下指,应该看 y = a ( a > 0 ) y = a ( a > 0 ) 这条线原来在上面还是下面。同理,新的 z z 轴应该往左指还是往右指,应该看 z = a ( a > 0 ) z = a ( a > 0 ) 这条线原来在左边还是右边。
最后,如右下图,我们得到新的坐标系。
若任意维度的 c c 都小于等于 0 0 ,意味着我们找到了最优解。
存在 b i b i 为负
考虑辅助线性规划:
maximize − x 0 s . t . x i + n = b i − n ∑ j = 1 a i , j x j + x 0 i ∈ [ 1 , m ] x j ≥ 0 j ∈ [ 0 , n + m ] maximize − x 0 s . t . x i + n = b i − ∑ j = 1 n a i , j x j + x 0 i ∈ [ 1 , m ] x j ≥ 0 j ∈ [ 0 , n + m ]
显然,若 ( x 1 , ⋯ , x n + m ) ( x 1 , ⋯ , x n + m ) 是原线性规划的一组可行解,那么辅助线性规划的最优解 ( x 0 , ⋯ , x n + m ) ( x 0 , ⋯ , x n + m ) 应当使 x 0 = 0 x 0 = 0 。另一方面,若辅助线性规划的最优解 ( x 0 , ⋯ , x n + m ) ( x 0 , ⋯ , x n + m ) 满足 x 0 = 0 x 0 = 0 ,那么 ( x 1 , ⋯ , x n + m ) ( x 1 , ⋯ , x n + m ) 就是一组原线性规划的可行解。
从而我们只需求出辅助线性规划的最优解即可。
而对于辅助线性规划,找到 i ∈ [ 1 , m ] i ∈ [ 1 , m ] 中 b i b i 最小的那个。然后执行转轴操作 pivot ( 0 , i ) pivot ( 0 , i ) 。此时对于任意 k ≠ i k ≠ i 有 b ′ k = b k − b i ≥ 0 b k ′ = b k − b i ≥ 0 ,从而转换成 b ′ k b k ′ 均非负的线性规划问题。
有关时间复杂度
显然一次 pivot pivot 的时间复杂度是 O ( n m ) O ( n m ) 的。对于整个算法的时间复杂度,引用论文中的一段话:
在最坏情况下,单纯形算法的时间复杂度为指数级。然而要将单纯形卡到指数级需要指数级大小的权值,而算法竞赛中涉及的问题一般都有一个具体的模型,并且权值也大多都是一定范围内的整数,在满足如此之多条件下就不可能把单纯形卡到指数级了。
卡线性规划比实现线性规划困难得多,不可能每道题的出题人都精通卡单纯形的技巧。而随机情况下,单纯形算法的期望调用 pivot pivot 的次数为 O ( m ) O ( m ) 次,也就是说单纯形算法的期望时间复杂度为 O ( n m 2 ) O ( n m 2 ) 。
代码实现
咕。
3 对偶
标准型对偶
标准型线性规划与其对偶线性规划互为对偶。
引理 3.2(弱对偶定理) :延续 3.1 中的定义,有:
max c T x ≤ min b T y max c T x ≤ min b T y
证明 :标准型线性规划的对偶可以理解为:将原线性规划的线性约束进行线性组合(组合系数记为 y y ),使得每个变量的系数大于等于 c c 中的系数,那么 ∑ c i x i ∑ c i x i 就应当小于等于对应的 b i b i 的线性组合。
∑ i c i x i ≤ ∑ i ( ∑ j A j , i y j ) x i ≤ ∑ j y j ∑ i A j , i x i ≤ ∑ j y j b j ∑ i c i x i ≤ ∑ i ( ∑ j A j , i y j ) x i ≤ ∑ j y j ∑ i A j , i x i ≤ ∑ j y j b j
引理 3.3(强对偶定理) :延续 3.1 中的定义,有:
max c T x = min b T y max c T x = min b T y
证明 :略。
引理 3.4(互松弛定理) :延续 3.1 中的定义,设 x , y x , y 分别是两个问题的解。那么它们是最优解当且仅当下面两个条件同时满足:
对于任意 i i ,要么 x i = 0 x i = 0 ,要么 c i = ∑ j A j , i y j c i = ∑ j A j , i y j 。
对于任意 j j ,要么 y j = 0 y j = 0 ,要么 b j = ∑ i A j , i x i b j = ∑ i A j , i x i 。
证明 :略。
最小费用流模型
先声明网络流增广路算法的直接推论:当流量上限全为整数时,网络流对应的线性规划问题一定存在整数最优解。
设 f , c , w f , c , w 分别表示边的流量、容量、单位费用,b u b u 表示 u u 点恰需要流出多少流量(当 b u b u 为正时,可以看成 u u 向 T T 连了一条容量为 b u b u 的边;当 b u b u 为负时,可以看成 S S 向 u u 连了一条容量为 b u b u 的边。然后要求满流)。注意这些变量中只有 f f 是变量。
把该问题用线性规划表示为:
min ∑ e ∈ E f e w e s.t. f e ≤ c e ∀ e ∈ E ∑ ( v , u ) ∈ E f v , u − ∑ ( u , v ) ∈ E f u , v = b u ∀ u ∈ V f e ≥ 0 ∀ e ∈ E min ∑ e ∈ E f e w e s.t. f e ≤ c e ∀ e ∈ E ∑ ( v , u ) ∈ E f v , u − ∑ ( u , v ) ∈ E f u , v = b u ∀ u ∈ V f e ≥ 0 ∀ e ∈ E
将其对偶后得到:
max − ∑ e ∈ E p e c e − ∑ u ∈ V q u b u s.t. − p u , v + q u − q v ≤ w u , v ∀ ( u , v ) ∈ E p e ≥ 0 ∀ e ∈ E max − ∑ e ∈ E p e c e − ∑ u ∈ V q u b u s.t. − p u , v + q u − q v ≤ w u , v ∀ ( u , v ) ∈ E p e ≥ 0 ∀ e ∈ E
发现一定取 p u , v = max ( 0 , q u − q v − w u , v ) p u , v = max ( 0 , q u − q v − w u , v ) 最优,于是化简为:
− { min ∑ e ∈ E c e max ( 0 , q u − q v − w u , v ) + ∑ u ∈ V b u q u } − { min ∑ e ∈ E c e max ( 0 , q u − q v − w u , v ) + ∑ u ∈ V b u q u }
那么只要题目出现的是这个形式的式子,就可以考虑转为最小费用最大流求解。使用时有几点需要注意的:
对于 max ( 0 , q u − q v − w u , v ) max ( 0 , q u − q v − w u , v ) ,除了题目直接出现外,目前遇到的有两种其他利用方法:
将 c e c e 设为 ∞ ∞ ,使得 max ( 0 , q u − q v − w u , v ) max ( 0 , q u − q v − w u , v ) 转为 q u − q v − w u , v ≤ 0 q u − q v − w u , v ≤ 0 即 q u ≤ q v + w u , v q u ≤ q v + w u , v 的三角形不等式。
通过 max ( 0 , q u − q v ) + max ( 0 , q v − q u ) max ( 0 , q u − q v ) + max ( 0 , q v − q u ) 构造出 | q u − q v | | q u − q v | 。
如果题目要求 q u q u 都是整数,只需满足 w e w e 都是整数即可。
证明:考虑将最优解调整。设所有 q u q u 的非零的本质不同小数部分的个数为 k k 。
若 k = 0 k = 0 则结论成立。
否则任取一个小数部分 x x 。然后记 S S 为所有 q u q u 小数部分为 x x 的 u u 的集合。
取极小量 ε > 0 ε > 0 。设 Δ + Δ + 表示将所有 u ∈ S u ∈ S 的 q u q u 都 + ε + ε 后解的变化量,Δ − Δ − 表示将所有 u ∈ S u ∈ S 的 q u q u 都 − ε − ε 后解的变化量。
对于 ∑ u ∈ V b u q u ∑ u ∈ V b u q u ,易知这部分的 Δ + + Δ − = 0 Δ + + Δ − = 0 ;
对于 ∑ e ∈ E c e max ( 0 , q u − q v − w u , v ) ∑ e ∈ E c e max ( 0 , q u − q v − w u , v ) ,只有在 q u , q v q u , q v 一者属于 S S 一者不属于 S S 时才会有变化,而 w u , v w u , v 是整数,所以 q u − q v − w u , v q u − q v − w u , v 的正负性在 ± ε ± ε 后不会改变,那么就易证此部分仍有 Δ + + Δ − = 0 Δ + + Δ − = 0 。
于是 Δ + + Δ − = 0 Δ + + Δ − = 0 ,这样我们就能选出至少一个方向使得 Δ ≥ 0 Δ ≥ 0 。而且发现,只要不出现小数部分等价类的合并,我们一直朝这个方向变化,过程中仍然是保持 Δ ≥ 0 Δ ≥ 0 的。于是我们就这么做递归到 k − 1 k − 1 的问题。
如果题目要求 q u ≥ 0 q u ≥ 0 ,那么对偶到原来的费用流问题时是要求
∑ ( v , u ) ∈ E f v , u − ∑ ( u , v ) ∈ E f u , v ≤ b u ∑ ( v , u ) ∈ E f v , u − ∑ ( u , v ) ∈ E f u , v ≤ b u
b u b u 为正时是一条连到 T T 的容量为 [ 0 , b u ] [ 0 , b u ] 的边和一条 S S 连来的容量为 [ 0 , ∞ ] [ 0 , ∞ ] 的边;b u b u 为负时是一条 S S 连来的容量为 [ − b u , ∞ ] [ − b u , ∞ ] 的边。
跑有源汇上下界最小费用可行流即可。
4 例题
【ZJOI2013】防守战线
题意:
战线可以看成一个长度为 n n 的序列,现在要在每个位置建若干座塔,在第 i i 个位置建一座塔的费用为 c i c i ,每个位置可以建很多座塔。有 m m 个要求,每个形如位置 [ l i , r i ] [ l i , r i ] 内至少要共建了 D i D i 座塔。求最小花费。
n ≤ 1000 n ≤ 1000 ,m ≤ 10 4 m ≤ 10 4 。
题解:
设第 i i 个位置建了 x i x i 座塔,那么用线性规划表示为:
min ∑ i x i c i s.t. r j ∑ i = l j x i ≥ D j ∀ j x i ≥ 0 ∀ i min ∑ i x i c i s.t. ∑ i = l j r j x i ≥ D j ∀ j x i ≥ 0 ∀ i
对偶后得到:
max ∑ j y j D j s.t. ∑ j y j [ l j ≤ i ≤ r j ] ≤ c i ∀ i y j ≥ 0 ∀ j max ∑ j y j D j s.t. ∑ j y j [ l j ≤ i ≤ r j ] ≤ c i ∀ i y j ≥ 0 ∀ j
直接 i i 向 i + 1 i + 1 连容量为 c i c i 的边,r j + 1 r j + 1 向 l j l j 连费用为 D j D j 的边,跑最大费用最大流即可。
【CodeChef-CHEFBOOK】Chefbook
题意:
给定一张 n n 个点 m m 条边的有向图,每条边 e e 有初始边权 L e L e ,和目标范围 [ S e , T e ] [ S e , T e ] 。你需要给每个点 u u 设定两个非负数权值 P u , Q u P u , Q u ,然后每条边 ( u , v ) ( u , v ) 的边权会变成 L ∗ u , v := L u , v + P u − Q v L u , v ∗ := L u , v + P u − Q v 。你需要保证每条边的新边权在该边的目标范围内,且需要最大化所有边的新边权和。要求输出方案。
n ≤ 100 n ≤ 100 ,m ≤ 10000 m ≤ 10000 。
题解:
用线性规划表示为:(其中 A u , B u A u , B u 分别是 u u 的出度和入度)
max ∑ u P u A u − Q u B u s.t. S u , v ≤ L u , v + P u − Q v ≤ T u , v ∀ ( u , v ) ∈ E P u , Q u ≥ 0 ∀ u ∈ V max ∑ u P u A u − Q u B u s.t. S u , v ≤ L u , v + P u − Q v ≤ T u , v ∀ ( u , v ) ∈ E P u , Q u ≥ 0 ∀ u ∈ V
即:
− min ⎧ ⎨ ⎩ ∑ u Q u B u − P u A u + ∑ ( u , v ) ∈ E ∞ max ( 0 , P u − Q v + L u , v − T u , v ) + ∞ max ( 0 , Q v − P u + S u , v − L u , v ) ⎫ ⎬ ⎭ P u , Q u ≥ 0 ∀ u ∈ V − min { ∑ u Q u B u − P u A u + ∑ ( u , v ) ∈ E ∞ max ( 0 , P u − Q v + L u , v − T u , v ) + ∞ max ( 0 , Q v − P u + S u , v − L u , v ) } P u , Q u ≥ 0 ∀ u ∈ V
转为最小费用流即可,这张图是个类似二分图的形式:
min ∑ ( u , v ) ∈ E f u , v ( T u , v − L u , v ) + g v , u ( L u , v − S u , v ) s.t. ∑ ( u , v ) ∈ E f u , v − g v , u ≤ B v ∀ v ∈ V ∑ ( u , v ) ∈ E g v , u − f u , v ≤ − A u ∀ u ∈ V f u , v , g v , u ≥ 0 ∀ ( u , v ) ∈ E min ∑ ( u , v ) ∈ E f u , v ( T u , v − L u , v ) + g v , u ( L u , v − S u , v ) s.t. ∑ ( u , v ) ∈ E f u , v − g v , u ≤ B v ∀ v ∈ V ∑ ( u , v ) ∈ E g v , u − f u , v ≤ − A u ∀ u ∈ V f u , v , g v , u ≥ 0 ∀ ( u , v ) ∈ E
考虑我们求出了该费用流的一组解 f u , v , g v , u f u , v , g v , u ,如何构造原问题的一组解。利用互松弛定理,可得:
f u , v = 0 ∨ P u − Q v = T u , v − L u , v g v , u = 0 ∨ Q v − P u = L u , v − S u , v f u , v = 0 ∨ P u − Q v = T u , v − L u , v g v , u = 0 ∨ Q v − P u = L u , v − S u , v
那么当 f u , v > 0 f u , v > 0 或 g v , u > 0 g v , u > 0 时,我们就有了一组关于 P u , Q v P u , Q v 的约束。然后再和原来的约束 S u , v ≤ L u , v + P u − Q v ≤ T u , v S u , v ≤ L u , v + P u − Q v ≤ T u , v 放在一起跑差分约束,最终跑出来的解就是一组最优解。(为什么?)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话