《再探线性规划对偶在信息学竞赛中的应用》 - 学习笔记
学习自 丁晓漫,再探线性规划对偶在信息学竞赛中的应用,2021集训队论文。当然很多公式和图片是直接抄下来的。
被迫营业
定义什么的全都跳过。
如果一开始就讲对偶的定义,那做到最后一题的时候多半已经忘记定义了(比如我),所以学习笔记的写作顺序会和原论文不同。
因为是被迫营业,所以很多简单的东西不会被略过,可能讲得较慢。
通用解法
OI 中能用到的暂时只有单纯形法。
可以在这里学习。
标准型对偶
(目前看来)最常用的对偶。
先把原线性规划写成标准形式:
其中 是长度为 的向量,分别表示变量和目标函数系数。 是 的矩阵,表示 个约束。 是长度为 的向量,表示约束中的常数。
这可以对偶成
其中 是新的变量。
方便背诵的形式:限制和变量对调,目标函数系数和约束常数对调,约束中的系数不变。
可以证明其中一边有解时另一边也一定有解,且目标函数的最优解相同。注意对偶是双向的。
一个弱点是从对偶形式的 较难还原出原形式的 (论文没写,我不会),所以对偶形式的 所具有的性质不能在 上找到对应的性质,并且在要求输出方案时不太能做。
最小费用流模型
建议全文背诵,比每次重新推一遍快很多。
设 分别表示流量、流量上界、代价。 表示 的流量需求,即流出减流入至多是 (论文中用了等号,效果略有不同,下面会讲)。
直接把线性规划写出来,得到
设 是边流量约束的对偶变量, 是点流量约束的对偶变量。有
注意到 的系数是非正数(这要求 是非负数),而且它只在一个约束中出现,所以容易发现它一定要取到下界 。然后把负号提出去,变成
其中 都必须是非负数, 没有限制。
另外,如果要求“流出减流入恰好是 ”,就会使得 非负的限制被删除。这是因为一个 要被拆成两个相反的约束,对偶之后就是两个相减的变量,也就相当于取值任意。
因为对偶是双向的,所以如果题目可以转化成最后这个形式,就一定可以用费用流求解。
整数性的探讨
虽然费用流在流量都是整数的时候最优解也一定是整数,但这并不代表它的对偶问题也一定有整数最优解。
不过事实证明整数最优解是一定存在的:
把非整数的 拿出来,按照本质不同的非零小数部分分类,设有 种。
随便拿一部分出来,考虑把它调大或者调小 。
分类讨论一下发现调大调小的 之和恰好为 0 ,所以必然有一边不劣。往这边一直调直到 减小即可。
所以在这个模型中不再需要考虑整数解的存在性了。
例题
设置变量的一些技巧可以自己揣摩。
默认所有设出的变量都会带 的限制。
[ZJOI2013] 防守战线
直接设 表示前 个位置一共建了几个塔,就是
直接转化成
[Aizu 2230] How to Create a Good Game
设 表示到 的最长路。设原图 到 的最长路长度是 。设 是增长的边权。
虽然不能限制 恰好等于最长路,但是如果取到比最长路更长一定不优,所以只需要限制它不是太短,即满足三角不等式。
仍然注意到 只在一个约束中出现,所以它必然取到上界 ,而且这东西必须 。
该取反的取反,得到
动态规划模型
对偶时贡献系数会变成约束的常数,那么如果贡献系数很小,对偶之后的操作空间就很小。此时可能可以用 DP 解决。
当然还是逃不过证明整数最优解存在的这一步。
例题
[XX Open Cup. GP of Moscow] Circles
限制是一个环,要求相邻两个相加不超过 ,贡献系数是 1 。
容易发现对偶之后仍然是一个环,要求相邻两个相加至少是 1 ,贡献系数是 ,求最小值。
容易发现每个变量的取值都是 。进一步地,可以发现所有变量都应当取 ,或者是全部 。
证明:
对于偶环,可以奇数位置减、偶数位置加,或者反过来,则一定有一种调整方法不劣。调到出现 0 为止,那么它两边都是 1 ,与剩下的位置独立,可以删去。然后对剩下的位置接着操作即可。对于奇环,拿一个最优解出来,考虑是否有相邻两个位置相加大于 1 。如果不存在那么必须全都是 ,否则从这里断开之后可以一样的方法操作。为了保证最优性,两个方向调整都不会改变总和,所以奇数加偶数减直到出现 0 即可。
然后随便 DP 。
[ZJOI2020] 序列
二三类操作是类似的,而一类操作和它们不太一样。二三类操作之间又是独立的。
如果只有其中一种操作,都很容易知道答案是差分之后 位置的和。
那么设做完一类操作之后每个位置的值是 ,则答案显然是
转化成最大费用流就是
(稍微注意一点:我们其实弄出了一个新的变量 。为了保证 就会在目标函数中加上 ,也就相当于从 连向 的流量无穷的边。那么 与 都有流量无穷的边,所以它就是 的化身。连边中所有不存在的变量都会视语境变成 或 。)
注意我们是最大费用流,所以 的边肯定是能不流就不流。而其他边的流量非常小,跨度也很小,直接 DP 即可。
显然这比贪心做法简单一万倍。唯一的坏处就是做完之后啥也没学到(
拉格朗日对偶
一般的拉格朗日对偶
引入拉格朗日乘子 ,要求 。设 。(注意 也可以同时是向量。)
由定义容易得到 。
由于 的 里面关于 线性,而外面套一层 ,所以容易发现 ,即满足凸性。
(不过暂时没有看出凸性有什么用)
注意此时我们甚至不知道 的等号是否能取到。
线性规划中的拉格朗日对偶
设 ,其中 是对偶问题中的最优解。
那么就有 。因为 ,所以 时取到最大值 ,恰好是 。
可以看出在线性规划中对偶和拉格朗日对偶有着奥妙重重的关系。论文说它们本质相同,我头脑愚钝不知何为本质(
有什么用呢?可以正着做,也就是设出 然后乱搞;也可以倒着做,见到 的形式时反着推回普通线性规划的形式。
例题
[POJ Monthly 2015.5] Min-Max
没有太多可解释的。
直接对偶也是可以的。有两个限制
根据前面所说, 的限制对偶之后的变量可以在 中任取,所以对偶之后的限制是半平面交,最值会在凸包顶点处取到。
[Utpc2012.10] きたまさの逆襲
设 表示给 加的 buff 层数, 表示这条边是否存在于完美匹配中,则答案显然是
里层拆成两部分,分别是
第一部分就是代价函数,第二部分就是限制函数。对偶的结果就是
可以看出是满足一些条件的最小费用流,直接做即可。
最后还有整数性的问题。前面证明拉格朗日对偶时说的是 ,而由于费用流的对偶变量都是整数,所以一定存在合法的整数 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
2019-06-25 Codeforces 1179D Fedor Runs for President [DP,斜率优化]