《再探线性规划对偶在信息学竞赛中的应用》 - 学习笔记
学习自 丁晓漫,再探线性规划对偶在信息学竞赛中的应用,2021集训队论文。当然很多公式和图片是直接抄下来的。
被迫营业
定义什么的全都跳过。
如果一开始就讲对偶的定义,那做到最后一题的时候多半已经忘记定义了(比如我),所以学习笔记的写作顺序会和原论文不同。
因为是被迫营业,所以很多简单的东西不会被略过,可能讲得较慢。
通用解法
OI 中能用到的暂时只有单纯形法。
可以在这里学习。
标准型对偶
(目前看来)最常用的对偶。
先把原线性规划写成标准形式:
其中 \(x,c\) 是长度为 \(n\) 的向量,分别表示变量和目标函数系数。 \(A\) 是 \(m\times n\) 的矩阵,表示 \(m\) 个约束。 \(b\) 是长度为 \(m\) 的向量,表示约束中的常数。
这可以对偶成
其中 \(y\) 是新的变量。
方便背诵的形式:限制和变量对调,目标函数系数和约束常数对调,约束中的系数不变。
可以证明其中一边有解时另一边也一定有解,且目标函数的最优解相同。注意对偶是双向的。
一个弱点是从对偶形式的 \(y\) 较难还原出原形式的 \(x\) (论文没写,我不会),所以对偶形式的 \(y\) 所具有的性质不能在 \(x\) 上找到对应的性质,并且在要求输出方案时不太能做。
最小费用流模型
建议全文背诵,比每次重新推一遍快很多。
设 \(f_{uv},c_{uv},w_{uv}\) 分别表示流量、流量上界、代价。\(b_u\) 表示 \(u\) 的流量需求,即流出减流入至多是 \(b_u\) (论文中用了等号,效果略有不同,下面会讲)。
直接把线性规划写出来,得到
设 \(z_{uv}\) 是边流量约束的对偶变量, \(p_u\) 是点流量约束的对偶变量。有
注意到 \(z_{uv}\) 的系数是非正数(这要求 \(c\) 是非负数),而且它只在一个约束中出现,所以容易发现它一定要取到下界 \(\max (0,p_v-p_u-w_{uv})\) 。然后把负号提出去,变成
其中 \(p_u,p_v,c_{uv}\) 都必须是非负数,\(b,w\) 没有限制。
另外,如果要求“流出减流入恰好是 \(b_u\)”,就会使得 \(p_u\) 非负的限制被删除。这是因为一个 \(=\) 要被拆成两个相反的约束,对偶之后就是两个相减的变量,也就相当于取值任意。
因为对偶是双向的,所以如果题目可以转化成最后这个形式,就一定可以用费用流求解。
整数性的探讨
虽然费用流在流量都是整数的时候最优解也一定是整数,但这并不代表它的对偶问题也一定有整数最优解。
不过事实证明整数最优解是一定存在的:
把非整数的 \(p_u\) 拿出来,按照本质不同的非零小数部分分类,设有 \(k\) 种。
随便拿一部分出来,考虑把它调大或者调小 \(\epsilon\)。
分类讨论一下发现调大调小的 \(\Delta\) 之和恰好为 0 ,所以必然有一边不劣。往这边一直调直到 \(k\) 减小即可。
所以在这个模型中不再需要考虑整数解的存在性了。
例题
设置变量的一些技巧可以自己揣摩。
默认所有设出的变量都会带 \(\ge0\) 的限制。
[ZJOI2013] 防守战线
直接设 \(p_i\) 表示前 \(i\) 个位置一共建了几个塔,就是
直接转化成
[Aizu 2230] How to Create a Good Game
设 \(p_i\) 表示到 \(i\) 的最长路。设原图 \(0\) 到 \(n-1\) 的最长路长度是 \(D\) 。设 \(x_{uv}\) 是增长的边权。
虽然不能限制 \(p\) 恰好等于最长路,但是如果取到比最长路更长一定不优,所以只需要限制它不是太短,即满足三角不等式。
仍然注意到 \(x_{uv}\) 只在一个约束中出现,所以它必然取到上界 \(p_v-p_u-w_{uv}\) ,而且这东西必须 \(\ge 0\) 。
该取反的取反,得到
动态规划模型
对偶时贡献系数会变成约束的常数,那么如果贡献系数很小,对偶之后的操作空间就很小。此时可能可以用 DP 解决。
当然还是逃不过证明整数最优解存在的这一步。
例题
[XX Open Cup. GP of Moscow] Circles
限制是一个环,要求相邻两个相加不超过 \(s_i\) ,贡献系数是 1 。
容易发现对偶之后仍然是一个环,要求相邻两个相加至少是 1 ,贡献系数是 \(s_i\) ,求最小值。
容易发现每个变量的取值都是 \([0,1]\) 。进一步地,可以发现所有变量都应当取 \(\{0,1\}\) ,或者是全部 \(0.5\) 。
证明:
对于偶环,可以奇数位置减、偶数位置加,或者反过来,则一定有一种调整方法不劣。调到出现 0 为止,那么它两边都是 1 ,与剩下的位置独立,可以删去。然后对剩下的位置接着操作即可。对于奇环,拿一个最优解出来,考虑是否有相邻两个位置相加大于 1 。如果不存在那么必须全都是 \(0.5\) ,否则从这里断开之后可以一样的方法操作。为了保证最优性,两个方向调整都不会改变总和,所以奇数加偶数减直到出现 0 即可。
然后随便 DP 。
[ZJOI2020] 序列
二三类操作是类似的,而一类操作和它们不太一样。二三类操作之间又是独立的。
如果只有其中一种操作,都很容易知道答案是差分之后 \(>0\) 位置的和。
那么设做完一类操作之后每个位置的值是 \(b_i\) ,则答案显然是
转化成最大费用流就是
(稍微注意一点:我们其实弄出了一个新的变量 \(t=0\) 。为了保证 \(t=0\) 就会在目标函数中加上 \(+\infty \cdot t\) ,也就相当于从 \(S\) 连向 \(t\) 的流量无穷的边。那么 \(t\) 与 \(S,T\) 都有流量无穷的边,所以它就是 \(S,T\) 的化身。连边中所有不存在的变量都会视语境变成 \(S\) 或 \(T\) 。)
注意我们是最大费用流,所以 \(S\to b_i\) 的边肯定是能不流就不流。而其他边的流量非常小,跨度也很小,直接 DP 即可。
显然这比贪心做法简单一万倍。唯一的坏处就是做完之后啥也没学到(
拉格朗日对偶
一般的拉格朗日对偶
引入拉格朗日乘子 \(\lambda\) ,要求 \(\lambda\ge 0\) 。设 \(L(\lambda)=\max f(x)-\lambda g(x)\) 。(注意 \(x,\lambda\) 也可以同时是向量。)
由定义容易得到 \(\max f(x)\le \min L(\lambda)\) 。
由于 \(L(\lambda)\) 的 \(\max\) 里面关于 \(\lambda\) 线性,而外面套一层 \(\max\) ,所以容易发现 \(L({a+b\over 2})\le {1\over 2}(L(a)+L(b))\) ,即满足凸性。
(不过暂时没有看出凸性有什么用)
注意此时我们甚至不知道 \(\max f(x)\le \min L(\lambda)\) 的等号是否能取到。
线性规划中的拉格朗日对偶
设 \(f(x)={c}^{T} {x}, g(x)={A} {x}-{b}, \lambda=y^{T}\) ,其中 \(y\) 是对偶问题中的最优解。
那么就有 \(L(\lambda)=\max c^Tx-y^T(Ax-b)=\max (c^T-y^TA)x+y^Tb\) 。因为 \(c^T\le y^TA\) ,所以 \(x=0\) 时取到最大值 \(y^Tb\) ,恰好是 \(\max f(x)\) 。
可以看出在线性规划中对偶和拉格朗日对偶有着奥妙重重的关系。论文说它们本质相同,我头脑愚钝不知何为本质(
有什么用呢?可以正着做,也就是设出 \(\lambda\) 然后乱搞;也可以倒着做,见到 \(\min \{\max\{\}\}\) 的形式时反着推回普通线性规划的形式。
例题
[POJ Monthly 2015.5] Min-Max
没有太多可解释的。
直接对偶也是可以的。有两个限制
根据前面所说,\(=\) 的限制对偶之后的变量可以在 \(\mathbb{R}\) 中任取,所以对偶之后的限制是半平面交,最值会在凸包顶点处取到。
[Utpc2012.10] きたまさの逆襲
设 \(\lambda_i\) 表示给 \(U_i\) 加的 buff 层数, \(f_{uv}\) 表示这条边是否存在于完美匹配中,则答案显然是
里层拆成两部分,分别是
第一部分就是代价函数,第二部分就是限制函数。对偶的结果就是
可以看出是满足一些条件的最小费用流,直接做即可。
最后还有整数性的问题。前面证明拉格朗日对偶时说的是 \(\lambda=y^T\) ,而由于费用流的对偶变量都是整数,所以一定存在合法的整数 \(\lambda\) 。