《再探线性规划对偶在信息学竞赛中的应用》学习笔记
零、开始之前的闲话
只学了一部分(指 \(16\) 年的都没学懂),所以可能比较跳跃,然后因为原文对我而言本身就比较跳跃,所以有些东西是按我自己的想法写下来的,所以也不一定对
壹、定义与对偶定理
定义浅抄一下
对于一组变量 \(x_1,x_2,\ldots,x_n\) 来说,不等式 \(\sum\limits_{i=1}^n a_i x_i \le\) 、\(=\) 或 \(\ge b\) 被称为一个线性约束,而 \(\sum\limits_{i=1}^n c_i x_i\) 则是关于这组变量的线性目标函数。
规划问题可分为线性规划、整数规划、非线性规划、动态规划等,而线性规划是在一组线性约束条件下,求一线性目标函数最大或最小的问题。
适用性非常广泛,很多题目都可以规约到线性规划
不过 \(\le,=,\ge\) 同时出现太麻烦了,所以我们通过一些变换让线性约束都变成 \(\le\) ,同时再约束 \(x_i \ge 0\) ,这样就有了标准型,用向量表示可写成
怎么转换?若是 \(\ge\) 则两边取反,若是 \(=\) 则加个辅助变量 \(x_{i}' \ge 0\) 变为 \(\sum\limits_{i=1}^n a_i x_i -x_{i}' \le b_i\) ,若没有 \(x_i \ge 0\) 限制则把 \(x_i\) 改写为 \(x_i'-x_i'' \quad (x_i',x_i'' \ge 0)\)
然后我们有其对偶(两个互为对偶),为
我们称 \(y_i\) 为 \(\sum_{j=1}^n a_{i,j}x_j \ge c_i\) 这个约束条件的对偶变量
对于上面两个定义,有弱对偶定理(弱对偶定理貌似适用于大多数规划)
和强对偶定理(只适用于线性规划)
证明别找我,论文里也只贴了文献
注意对于 \(=\) 的条件,推一推会发现所有原本是等于的都会转化为 \(\le\) 的对偶变量减 \(\ge\) 的对偶变量,那么我们改写为无符号限制(也就是没有 \(\ge 0\) 限制)的 \(\varphi_i=y_{i}-y_{i}'\) ,也就是
与
对偶(反过来也是一样)
可能会疑惑为啥 \(A\mathbf{x}=\mathbf{b}\) 限制明显变强,但是为啥下面还少了一个限制,但是注意对偶后这会让最值取得相较于 \(\mathbf{y} \ge 0\) 更小,所以其实原本的线性规划的最值也是会变小的
P.S. 具体复杂问题如何推导?最好的就是按照上面的化为系数矩阵然后暴推,更直观的说明
贰、拉格朗日对偶
先咕咕咕了
叁、最小费用流模型
我们设每条边 \((u,v)\) 流量为 \(f_{u,v}\) ,其流量限制为 \(c_{u,v}\) ,单位流量代价为 \(w_{u,v}\) ,然后每个点流量需求(流出的总量减去流入的总量)为 \(b_u\)
那么这个限制对应的最小费用最大流模型只需要再让超级源点向 \(b_u>0\) 的点连流量限制为 \(b_u\) 的边, \(b_u<0\) 的点向超级汇点连流量限制为 \(|b_i|\) 的边,这些边单位流量代价都是 \(0\)
那么我们如果能把最小费用流表示为一个线性规划,那么若有问题能规约到答案等价的问题,就可以用最小费用流解决
先列出其线性规划
令 \(z_{u,v}\) 为 \(-f_{u,v} \ge -c_{u,v}\) 条件的对偶变量, \(p_u\) 为 \(\sum_{v}f_{v,u}-\sum_{v}f_{u,v}=-b_u\) 的对偶变量,则有上面问题的对偶
显然假设 \(p\) 已确定,则 \(z_{u,v}\) 取 \(\max(0,p_v-p_u-w_{u,v})\) 最优,所以最小费用流的答案等价于对于变量 \(p_i\) (无符号限制)最优化
对于此类问题有一个很强的结论,直接贴原文吧(证明直接读原文吧)
在最后得出的那个等价的式子中,如果满足所有 \(w_{u,v}\) 均为整数,那么一定可以在所有 \(p_u\) 都为整数时取到最优解。也就是说,每条边的单位流量代价都为整数的费用流的对偶一定有整数最优解。
[ZJOI2013] 防守战线
区间和限制还是转化为差分比较好,我们设前 \(i\) 个建了 \(S_i\) 个塔,那么就是问题就是( \(C_0=0\) )
我们考虑将限制化到 \(\min\) 中,怎么搞?考虑若不满足限制就有 \(\infty\) 的代价即可,所以变为
那么就转化为了费用流形式,直接按照上述建图即可,不过貌似要原始对偶才能过
How to Create a Good Game
差不多的题,直接贴份代码吧
Cow and Exercise
设 \((u,v)\) 的增加量为 \(w_{u,v}\) , \(d_u\) 为最短路,可列出其线性规划
其对偶为
首先有互补松弛性
我们知道后面那个问题的第二个约束条件的对偶变量为 \(d_u\) ,又因为原问题在 \(\forall i \in [1,n],d_i \not=0\) 时可取到最优解,所以可以改写为
这个 \(bX\) 形式比较诡异,我们考虑把 \(b\) 提出来,让 \(a_{u,v}'=\frac{a_{u,v}}{b}\) ,则有
可以发现若 \(b\) 固定,先忽略 \(X\) 这个常数,剩下的问题就是一个以 \(1\) 为源点, \(n\) 为汇点,所有边流量限制为 \(1\) ,总流量为 \(\frac{1}{b}\) 的最小费用流问题
我们令 \(F=\frac{1}{b}\) 那么答案其实就是 \(\min \frac{cost+X}{F}\)
\(F\) 的整数性是好证明的,因为流量限制都为 \(1\) ,考虑 \(\text{EK}\) 的过程,当 \(F \in (k,k+1],k \in \mathbb{Z}\) 时,式子可改写为 \(\frac{kF+c}{F}\) (因为这一条流的代价都为当前的最短路),那么必定是取 \(F=k+1\) 时最优
既然保证了整数性,且对于题中的图, \(\text{MaxFlow} < n\) ,先 \(\text{EK}\) 预处理出来流量为 \(F\) 时的 \(cost\) 然后每次询问暴力枚举即可,可以做到 \(O(n^2m+qn)\)
能不能更给力点啊?设从 \(F-1\) 到 \(F\) 这次拓展的总花费为 \(w\) ,有
设 \(w'\) 为 \(F-2\) 到 \(F-1\) 拓展的总花费,因为费用流是凸函数,故 \(w'<w\) ,所以有
所以 \(Fw-cost\) 不降,又因为我们只要找到最后一个 \(Fw-cost-X \ge 0\) 的位置就可以了,二分即可,费用流再套个原始对偶,时间复杂度 \(O(nm\log m+q \log n)\)
肆、动态规划模型
[XX Open Cup. GP of Moscow] Circles
考虑对于一个问题 \(f(s_1,s_2,\ldots,s_n)\) 列出其线性规划
然后有其对偶
可以发现把 \(y_i\) 界定在 \([0,1]\) 中时即可取到最优解,若能找到 \(y_i \in S\) 且 \(S\) 为有限集那么这个问题就能更轻松的解决
大胆猜测 \(S=\{0,\frac{1}{2},1\}\) ,也就是三个极值,可以证明必有一组最优解使得 \(y_i \in S\) ,具体可看原文
那么枚举一下第一个取值, \(\text{DP}\) 即可
「ZJOI2020」序列
显然如果只有一操作就是积木大赛,操作次数总共就是 \(\sum\limits_{i=1}^n{\max(0,a_i-a_{i-1})}\)
那么设第 \(i\) 个位置一操作个数为 \(x_i\) ,那么转化为求下面这个线性规划
发现这貌似和最小费用流模型很像?为了满足限制可以改写为
后面两个贡献为 \(\infty\) 不是边的样子也不是点的样子,我们多设个变量 \(s\) ,需要满足限制 \(s=0\) 然后再进一步改写为
注意到最小费用流时若是 \(\sum\limits_v f_{v,u}-\sum\limits_v f_{u,v} \ge -b_{u}\) 则能对偶出
也就是和上面的 \(s\) 一样,这就代表这个点的流量需求没有限制,所以其实这个点向源汇点连边的流量限制都为 \(\infty\) ,那么这个点就等价于源点与汇点,所以上面那个可以和之前的一样建图,然后源点向每个点 \(i\) 连 \([0,\infty),-a_i\) 的边(前一个是流量限制), \(i\) 向汇点连 \([0,\infty),a_i\) 的边,注意这两种边要满足的是 \(\sum\limits_v f_{v,s}-\sum\limits_v f_{s,v} \ge -\infty\) ,所以都不需要保证满流
显然不能直接跑费用流,全是负环,可以发现实际上对于一个 \(i\) ,源点向 \(i\) 流的流量 \(c_i \le 2\)
因为是最小费用流(没有要求最大流),直接走 \(s \rightarrow i \rightarrow t\) 肯定不优,通过上面的建图,剩下 \(i\) 能走的边一共就两条流量限制为 \(1\) 的边,所以最多就是 \(2\)
我们直接 \(\text{DP}\) ,设 \(f_{i,x,y,z}\) 表示考虑完了 \(i \sim n\) 的 \(s \rightarrow i\) 的边,然后 \(i-1 \rightarrow i+1\) 的流量为 \(x\) , \(i \rightarrow i+2\) 的流量为 \(y\) , \(i+1 \rightarrow i\) 的流量为 \(z\) ,直接转移即可,当前 \(s \rightarrow i\) 的边的流量可以算出来
更具体的可以看 \(\text{p}\color{red}{\_\text{b}\_\text{p}\_\text{b}}\) 的评测记录 (不过边有些许不同,连边的方式可以看他的博客)
不过这推起来太麻烦了(?),我们来点更无脑的!我们总是把变量消掉用 \(\max(0,\cdots)\) 代替,考虑反其道而行之,最初的线性规划可改写为
令 \(X_i\) 为 \(-x_i \ge -a_i\) 的对偶变量, \(Y_i\) 为 \(y_i-x_i+x_{i-1} \ge 0\) 的对偶变量, \(Z_i\) 为 \(z_i-x_{i-2}+x_i \ge a_i-a_{i-2}\) 的对偶变量,则有对偶
其实这就是最大费用流的线性规划形式,再把 \(X_i\) 消去,可转化为求
又因为有其为最大费用流的线性规划,所以能够保证整数性,所以 \(Y_i,Z_i \in \{0,1\}\) ,所以设 \(f_{x,y,z}\) 表示 \(Z_{i-2}=x,Y_{i-1}=y,Z_{i}=z\) ,直接枚举 \(Y_i\) 和 \(Z_{i+1}\) 转移即可,可以发现其实上下两个 \(\text{DP}\) 其实一模一样
什么时候更拉格朗日对偶还是个未知数,所以暂时完结撒花!