《再探线性规划对偶在信息学竞赛中的应用》 - 学习笔记

学习自 丁晓漫,再探线性规划对偶在信息学竞赛中的应用,2021集训队论文。当然很多公式和图片是直接抄下来的。

被迫营业

定义什么的全都跳过。

如果一开始就讲对偶的定义,那做到最后一题的时候多半已经忘记定义了(比如我),所以学习笔记的写作顺序会和原论文不同。

因为是被迫营业,所以很多简单的东西不会被略过,可能讲得较慢。

通用解法

OI 中能用到的暂时只有单纯形法。

可以在这里学习。

标准型对偶

(目前看来)最常用的对偶。

先把原线性规划写成标准形式:

maxcTxAxbx0

其中 x,c 是长度为 n 的向量,分别表示变量和目标函数系数。 Am×n 的矩阵,表示 m 个约束。 b 是长度为 m 的向量,表示约束中的常数。

这可以对偶成

minyTbATycy0

其中 y 是新的变量。

方便背诵的形式:限制和变量对调,目标函数系数和约束常数对调,约束中的系数不变。

可以证明其中一边有解时另一边也一定有解,且目标函数的最优解相同。注意对偶是双向的。

一个弱点是从对偶形式的 y 较难还原出原形式的 x (论文没写,我不会),所以对偶形式的 y 所具有的性质不能在 x 上找到对应的性质,并且在要求输出方案时不太能做。

最小费用流模型

建议全文背诵,比每次重新推一遍快很多。

fuv,cuv,wuv 分别表示流量、流量上界、代价。bu 表示 u 的流量需求,即流出减流入至多是 bu (论文中用了等号,效果略有不同,下面会讲)。

直接把线性规划写出来,得到

minuvwuvfuvfuvcuvvfvuvfuvbu

zuv 是边流量约束的对偶变量, pu 是点流量约束的对偶变量。有

maxubupuuvcuvzuvpvpuzuvwuv

注意到 zuv 的系数是非正数(这要求 c 是非负数),而且它只在一个约束中出现,所以容易发现它一定要取到下界 max(0,pvpuwuv) 。然后把负号提出去,变成

min{ubupu+uvcuvmax(0,pvpuwuv)}

其中 pu,pv,cuv 都必须是非负数,b,w 没有限制。

另外,如果要求“流出减流入恰好是 bu”,就会使得 pu 非负的限制被删除。这是因为一个 = 要被拆成两个相反的约束,对偶之后就是两个相减的变量,也就相当于取值任意。

因为对偶是双向的,所以如果题目可以转化成最后这个形式,就一定可以用费用流求解。

整数性的探讨

虽然费用流在流量都是整数的时候最优解也一定是整数,但这并不代表它的对偶问题也一定有整数最优解。

不过事实证明整数最优解是一定存在的:

把非整数的 pu 拿出来,按照本质不同的非零小数部分分类,设有 k 种。

随便拿一部分出来,考虑把它调大或者调小 ϵ

分类讨论一下发现调大调小的 Δ 之和恰好为 0 ,所以必然有一边不劣。往这边一直调直到 k 减小即可。

所以在这个模型中不再需要考虑整数解的存在性了。

例题

设置变量的一些技巧可以自己揣摩。

默认所有设出的变量都会带 0 的限制。

[ZJOI2013] 防守战线

直接设 pi 表示前 i 个位置一共建了几个塔,就是

minpi(CiCi+1)pi+1pi0pRipLi1Di

直接转化成

vpv(CvCv+1)+vmax(0,pvpv+1)+imax(0,pLi1pRi+Di)

[Aizu 2230] How to Create a Good Game

pi 表示到 i 的最长路。设原图 0n1 的最长路长度是 D 。设 xuv 是增长的边权。

虽然不能限制 p 恰好等于最长路,但是如果取到比最长路更长一定不优,所以只需要限制它不是太短,即满足三角不等式。

maxuvxuvpn1p0Dpvpuwuv+xuv

仍然注意到 xuv 只在一个约束中出现,所以它必然取到上界 pvpuwuv ,而且这东西必须 0

该取反的取反,得到

minuvmax(0,pupv+wuv)+pupv+wuv

动态规划模型

对偶时贡献系数会变成约束的常数,那么如果贡献系数很小,对偶之后的操作空间就很小。此时可能可以用 DP 解决。

当然还是逃不过证明整数最优解存在的这一步。

例题

[XX Open Cup. GP of Moscow] Circles

限制是一个环,要求相邻两个相加不超过 si ,贡献系数是 1 。

容易发现对偶之后仍然是一个环,要求相邻两个相加至少是 1 ,贡献系数是 si ,求最小值。

容易发现每个变量的取值都是 [0,1] 。进一步地,可以发现所有变量都应当取 {0,1} ,或者是全部 0.5

证明:
对于偶环,可以奇数位置减、偶数位置加,或者反过来,则一定有一种调整方法不劣。调到出现 0 为止,那么它两边都是 1 ,与剩下的位置独立,可以删去。然后对剩下的位置接着操作即可。

对于奇环,拿一个最优解出来,考虑是否有相邻两个位置相加大于 1 。如果不存在那么必须全都是 0.5 ,否则从这里断开之后可以一样的方法操作。为了保证最优性,两个方向调整都不会改变总和,所以奇数加偶数减直到出现 0 即可。

然后随便 DP 。

[ZJOI2020] 序列

二三类操作是类似的,而一类操作和它们不太一样。二三类操作之间又是独立的。

如果只有其中一种操作,都很容易知道答案是差分之后 >0 位置的和。

那么设做完一类操作之后每个位置的值是 bi ,则答案显然是

min{max(0,bibi2)+max(0,(aibi)(ai1bi1))+max(0,biai)}

转化成最大费用流就是

bi2bi,[0,1],0bibi1,[0,1],aiai1Sbi,[0,+),aibiT,[0,+),0

(稍微注意一点:我们其实弄出了一个新的变量 t=0 。为了保证 t=0 就会在目标函数中加上 +t ,也就相当于从 S 连向 t 的流量无穷的边。那么 tS,T 都有流量无穷的边,所以它就是 S,T 的化身。连边中所有不存在的变量都会视语境变成 ST 。)

注意我们是最大费用流,所以 Sbi 的边肯定是能不流就不流。而其他边的流量非常小,跨度也很小,直接 DP 即可。

显然这比贪心做法简单一万倍。唯一的坏处就是做完之后啥也没学到(

拉格朗日对偶

一般的拉格朗日对偶

maxf(x)g(x)0

引入拉格朗日乘子 λ ,要求 λ0 。设 L(λ)=maxf(x)λg(x) 。(注意 x,λ 也可以同时是向量。)

由定义容易得到 maxf(x)minL(λ)

由于 L(λ)max 里面关于 λ 线性,而外面套一层 max ,所以容易发现 L(a+b2)12(L(a)+L(b)) ,即满足凸性。

(不过暂时没有看出凸性有什么用)

注意此时我们甚至不知道 maxf(x)minL(λ) 的等号是否能取到。

线性规划中的拉格朗日对偶

f(x)=cTx,g(x)=Axb,λ=yT ,其中 y 是对偶问题中的最优解。

那么就有 L(λ)=maxcTxyT(Axb)=max(cTyTA)x+yTb 。因为 cTyTA ,所以 x=0 时取到最大值 yTb ,恰好是 maxf(x)

可以看出在线性规划中对偶和拉格朗日对偶有着奥妙重重的关系。论文说它们本质相同,我头脑愚钝不知何为本质(

有什么用呢?可以正着做,也就是设出 λ 然后乱搞;也可以倒着做,见到 min{max{}} 的形式时反着推回普通线性规划的形式。

例题

[POJ Monthly 2015.5] Min-Max

没有太多可解释的。

直接对偶也是可以的。有两个限制

piμi=Cμi=1

根据前面所说,= 的限制对偶之后的变量可以在 R 中任取,所以对偶之后的限制是半平面交,最值会在凸包顶点处取到。

[Utpc2012.10] きたまさの逆襲

λi 表示给 Ui 加的 buff 层数, fuv 表示这条边是否存在于完美匹配中,则答案显然是

maxλ1,,λk0min|f|=|V|i(uUiv(wuv+λi)fuvbiλi)

里层拆成两部分,分别是

uvwuvfuvi(biuUivfuv)λi

第一部分就是代价函数,第二部分就是限制函数。对偶的结果就是

minuvwuvfuvbiuUivfuv0

可以看出是满足一些条件的最小费用流,直接做即可。

最后还有整数性的问题。前面证明拉格朗日对偶时说的是 λ=yT ,而由于费用流的对偶变量都是整数,所以一定存在合法的整数 λ

posted @   p_b_p_b  阅读(1947)  评论(0编辑  收藏  举报
编辑推荐:
· 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,斜率优化]
点击右上角即可分享
微信分享提示