线性规划
不知道自己在干什么。
标准型
线性规划的标准形式通常写成:
如果有变量 \(y\) 没有 \(>0\) 的限制则将其拆成 \(x_1 - x_2\) 就可以了。
对偶
标准型的对偶:
若 \(A\) 是 \(B\) 的对偶,则 \(B\) 是 \(A\) 的对偶。
原问题和对偶问题中变量和限制关系一一对应。
例子
线性规划 \(\max\{ \mathbf{c}^{T} \mathbf{x}:A\mathbf{x} = \mathbf{b} ,\mathbf{x} \ge 0\}\) 的对偶是 \(\min\{ \mathbf{b}^{T} \mathbf{y}:A^T\mathbf{y} \ge \mathbf{c}\}\)。
这告诉我们某些取等的限制对偶之后就是没有限制。
弱对偶定理
对于原始问题的任意可行解 \(\mathbf{x}\) 和对偶问题的任意可行解 \(\mathbf{y}\),目标函数值始终满足:
证明:
这意味着任意一组对偶问题的可行解都是原始问题的上界。
如果原始问题的解无界(解是正无穷),那么对偶问题无解,反之亦然。
强对偶定理
如果原始问题和对偶问题中任意一个存在有限的最优解,那么另一个也必然存在有限的最优解,并且它们相等:
不会证明。
全幺模矩阵
一个矩阵的任意子式的值都是 \(-1,0,1\),那么就叫他全幺模矩阵。
如果线性规划的限制是全幺模矩阵,并且其他的参数都是整数,那么一定存在整数最优解。
常见的网络流等线性规划问题的约束都是全幺模矩阵。
几何意义
没学会,看不懂。
其他意义
AI 给我讲了很多东西,可惜我水平不足,没有看懂。
互补松弛定理
假设 \(\mathbf{x}\) 是原始问题的可行解,\(\mathbf{y}\) 是对偶问题的可行解。它们是最优解的充要条件是,对于所有的变量,以下等式成立:
意思就是说。任意一个原问题中的变量/限制,和对偶问题中的限制/变量,肯定有一个是紧的。
证明:
根据强对偶定理,左式 \(=0\),因此右式也 \(=0\)。右式两项一非负一非正,因此都是 \(0\)。
原始‑对偶方法
大概就是,先求出对偶问题的一个可行解,然后尝试找到满足互补松弛定理的原问题的解。如果找到就完成了,否则调整对偶问题的解。
现在有线性规划 \(P : \min\{\mathbf{c}^T \mathbf{x}: A\mathbf{x} = \mathbf{b} \ge 0,\mathbf{x}\ge 0\}\),它的对偶问题是 \(D: \max\{\mathbf{b}^T \mathbf{y}: A^T \mathbf{y} \le c\}\)。
这里写成等式的形式是为了更加方便,和上面的形式并没有区别。
先随便找出一组 \(D\) 的可行解 \(y\),我们找到紧的限制构成的集合:
根据互补松弛条件,如果找到 \(P\) 的一组可行解 \(x\) 满足 \(x_i > 0\) 仅在 \(i \in I\) 时成立,那么我们就找到了一组最优解。因此我们考虑问题 \(RP:\min\{\mathbf{1}^T \mathbf{s}: A\mathbf{x} + \mathbf{s} = \mathbf{b},\mathbf{x}\ge 0,\mathbf{s} \ge 0,\forall i \notin I,x_i = 0\}\)。
这里我们引入了一组松弛变量 \(s\),可以找到合法的 \(x\) 当且仅当 \(s\) 取到全 \(0\)。
写出他的对偶问题 \(DRP: \max\{\mathbf{b}^T \mathbf{y}:\forall i \in I, \sum\limits_{j}A_{j,i}y_j \le 0 ,\forall i, y_i \le 1\}\)。
假设我们求解出了 \(DRP\) 的一组解 \(y^{\prime}\),显然如果算法没有终止,那么 \(\mathbf{b}^T\mathbf{y^{\prime}} > 0\)。
我们尝试令新的 \(y\) 为 \(y + \varepsilon y^{\prime}\),根据 \(DRP\) 的限制,\(\varepsilon\) 一定可以取到一个正的值使得对偶问题的限制仍然满足,这样就让答案变大了。这个值可以简单计算出来。如果 \(\varepsilon\) 没有上界那么对偶问题无界,原问题无解。\(I\) 对应变化,就这样求解下去。
随着算法的进行,\(RP\) 的最小值一定是单调递减的。因为 \(I\) 中会逐渐加入新的元素,而被踢出的元素,即 \(\sum\limits_{j}A_{j,i}y_j < 0\) 的 \(i\),根据互补松弛定理,\(x_i\) 一定是 \(0\),因此没有影响。并且 \(RP\) 问题的答案只由 \(I\) 决定。因此算法只会迭代 \(2^n\) 次。
至于怎么求 \(RP\) 或者 \(DRP\) 的答案……具体问题具体分析吧,\(RP\) 问题看起来已经很简化了。
其实这个东西用处并不大,大部分时候只需要考虑何时/如何满足互补松弛条件就可以了。
原始-对偶的应用
Dijkstra
Dijkstra 其实就是流量为 \(1\) 的费用流。
费用流
我们写出费用流的线性规划形式:
对偶得到:
定义一条边的折合费用为 \(c^p_{uv} = c_{uv} - p_v + p_u\),则有限制 \(\gamma_{uv} \ge -c^p_{uv}\)。
\(U\) 全部为正,也就是说,\(p\) 确定之后,\(\gamma_{uv} = \max(0, -c^p_{uv})\)。
另外,建出的反边 \(c^p_{vu} = -c^p_{uv}\)。
考虑互补松弛条件:
- 当 \(c^p_{uv} > 0\),\(\gamma_{uv}\) 一定为 \(0\),也就是 \(\gamma_{uv} \ge -c^p_{uv}\) 一定无法取等,这意味着对应的 \(f_{uv} = 0\)。
- 如果 \(\gamma_{uv} > 0\),则必定有 \(f_{uv} = U_{uv}\),也就是说如果 \(c^p_{uv} < 0\) 边必然满流。
有了这些结论我们就可以知道:在残量网络中,一组流量是最优的(最小费用),当且仅当存在一组节点势 \(p\),使得残量网络中的所有边(包含正向和反向)满足 \(c^p \ge 0\)。
费用流的原始-对偶算法就是在不断增加流量的同时更新节点势 \(p\),使其一直保持 \(c^p \ge 0\)。
初始的时候如果全是正权就可以把势能设为全 \(0\),有负权则必须跑一边 SPFA 求出 \(d_x\) 作为势能。
每一轮根据前面的条件我们只能够选择 \(c^p_{uv} = 0\) 的边增广,并且新产生的反向边 \(c^p_{vu}\) 同样 \(= 0\),不违反互补松弛条件。但是不一定有这样的增广路径,这就需要我们更新势能使得他有一条增广路径。直接以 \(c^p\) 为边权跑最短路,令 \(p_i = p_i + d_i\),令 \(c^{p^{\prime}}\) 为新的折合费用即可。新的边权仍然满足 \(>0\)。
感觉这像是凑出来的,但是为了维持 \(c^p_{uv} \ge 0\),我们必须这样改变势能。设 \(p_i\) 的变化量为 \(\Delta_i\),有有限制 \(c^p_{uv} + \Delta_u - \Delta_v \ge 0\),也就是 \(\Delta_v \le c^p_{uv} + \Delta_u\),这就是最短路的限制。
一些例子
P3337 [ZJOI2013] 防守战线
设 \(p_i\) 为 \([1,i]\) 中的塔的数量,那么写出线性规划:
整理一下可以写成:
也就是说我们不用对偶这个线性规划把它写成费用流形式,可以直接改写成费用流的对偶形式,这样更方便一点。
P3980 [NOI2008] 志愿者招募
对偶得到:
给 \(q\) 做前缀和,和上一个题一样了。
其实就是说原形式就可以直接费用流。
Codechef CHEFBOOK
题意:有一个 \(n\) 个点 \(m\) 条边的有向图,每条边有初始权值 \(w_i\) 和目标权值 \([L_i,R_i]\)。要给每个点钦定两个非负权值 \(a_i,b_i\) 使得每条边的新权值 \(w^{\prime}_{x,y} = w_{x,y} + a_x - b_y\) 落在目标范围内,在满足这个限制的情况下使得所有边的新权值和最大。
设 \(out_i,in_i\) 分别为点 \(i\) 的出度,入度。
写出线性规划:
直接得到原线性规划就是:
就是一张二分图。本题要求构造方案,直接跑原始对偶得到的势能数组就是费用流的对偶问题,也就是原问题的答案。原因前面已经说明。
P6631 [ZJOI2020] 序列
设 \(S\) 是所有可以修改的集合构成的集族。
那么原问题可以写成:
对偶之后得到:
我们假设 \(b_i\) 可以全部取整数(我也没搞明白为什么,不过我也没找到什么全部取整数的证明,限制矩阵并不是全幺模的)。发现 \(b_i \in \{-1,0,1\}\)(取 \(>1\) 不符合条件,取 \(<-1\) 不优),直接 DP,记录此时三种操作对应 \(\sum b_i\) 后缀最小的 \(T\) 就可以了。时间复杂度 \(O(n)\)。
参考资料
- 线性规划基础 - OI Wiki
- 浅谈线性规划 - xiaoziyao - 博客园
- Google Gemini
- Deepseek

浙公网安备 33010602011771号