线性规划对偶_成型笔记
JueFan 一只绝帆

线性规划对偶

刚刚去瞅了眼 HLPP,又去瞅了眼 KM,感叹还是学理论好。

概念

线性规划是在对一些实数变量的线性不等关系约束下,求解一个线性表达式的最值的过程。

标准型:

max:jcjxjs.t. i,jai,jxjbij,xj0\max:\sum_jc_jx_j\\\text{s.t. }\forall i,\sum_ja_{i,j}x_j\le b_i\\\forall j,x_j\ge 0

大于零其实是不重要的,你可以平移你的变量范围,体现在 a,ba,b 上。

同理,max/min\max/\min,大于小于也不重要。

标准型线性规划可以对偶为如下问题:

min:ibiyis.t. j,iai,jyicji,yi0\min:\sum_ib_iy_i\\\text{s.t. }\forall j,\sum_ia_{i,j}y_i\ge c_j\\\forall i,y_i\ge 0

有些时候一个问题的对偶问题会更好求一点,因为它可能会从一个没性质的问题变成一个流。

我们可以把对偶原理写成向量和矩阵描述的简洁形式:

maxcx:Axb,x0    minbTy:ATycT,y0\max c\cdot x:Ax\le b,x\ge 0\iff\min b^T\cdot y:A^T y\ge c^T,y\ge 0

可以理解为转化后 A,b,cA,b,c 全都变成了原来的转置,bT,cT,yb^T,c^T,y 都是列向量。

但暴力写出矩阵然后转置是极为低效的做法,并且对偶后的标准型也长成了一坨,很难化简。

(有的时候限制是多种多样的,但我们仍然给它们一个新的标号方式使得它们是上图中 AxbAx\le b 的形式,但对偶后你可能需要设多种变量,每条限制都需要对应一个变量,这些变量的最优化形式和原先限制的形式相同,所以如果原先限制的形式不同,那最优化这一步容易乱了阵脚。)

在 OI 中更易上手的线性规划对偶 这篇文章里,我们能找到一种很好的对偶方法,无需化成标准型,以下是摘抄。

工业化流程:

Step 1.

写出原始的限制,将所有限制移项,整理成 sth0sth\le 0 的形式。

Step 2.

给每条限制设定一个变元乘子 λi\lambda_i(可以理解为 yiy_i),乘上这个限制,加到要最优化的东西里面,并设定该变元乘子的范围。

设定 λ\lambda 范围规则:若 mincixi\min c_ix_i 则添加 λi0\lambda_i\ge 0max\max 则添加 λi0\lambda_i\le 0

Step 3.

L(λ,x)L(\lambda,x) 化成关于 xx 的主元式,并只保留这个式子的常数项(抹掉所有含 xx 的项),常数项就是我们要最优化的关于 λ\lambda 的式子,优化方向与 xx 相反,含 xx 的项中 xx 前面的系数就是新的限制,求 min\min 时系数 0\ge 0,求 max\max 时系数 0\le 0

解释/好的理解

上面的工业化流程你肯定看的云里雾里,下面是我对其的一些理解。

观察我们将所有限制和最优化的东西混合起来的这个柿子,我们称它为 L(λ,x)L(\lambda,x),假设原题目要求我们 mincixi\min c_ix_i,我们来考虑 maxλminxL(λ,x)\max_\lambda\min_xL(\lambda,x)

为什么要考虑这个奇怪的东西呢,线性规划对偶是把一个 min\min 问题变成一个 max\max 问题,所以我们要利用拮抗的两维来达到某种平衡。

你可以将其看作一个二元博弈,外层决策者为了不让内层决策者达到 -\infty 的目的,会对自己的 λ\lambda 设定一些范围。

你可以将外层决策者看作古希腊掌管限制的神,这些限制每个都发挥了至关重要的作用,以至于只要有一个限制消失了,内层决策者就可以让答案达到无穷优

他为了不让内层决策者跳出他所框定的限制,他利用不等式的可加性创造出了 L(λ,x)L(\lambda,x),并自己下场设定 λ\lambda,并且他的优化方向和内层决策者(也就是原题的最优化方向)是相反的,很容易直观理解,外层决策者越劣化 L(λ,x)L(\lambda,x),就证明内层决策者越好地遵循了限制。

由此我们可以看到 Step 2 中 λ\lambda 正负性的道理,求 min\min 可以看作二分答案后判断 mid\le mid,而不等式只有同向才有可加性,所以求 min\minλ0\lambda\ge 0,求 max\maxλ0\lambda\le 0,这保证了不等式的方向。

下文我们不妨认为内层决策者的方向是最小化。

此时外层决策者如何最大化这个式子呢?首先他化成了关于 xx 的主元式,接下来,他首先要避免某个 xx 前面的系数 <0<0,因为如果这样的话内层决策者可以轻松把这个式子变成 -\infty,所以 xx 前面的系数就成为了新的 λ\lambda限制

然后它会想办法最大化常数项,这是因为首先内层决策者可以让式子的值等于常数项,其次由于 xx 前面的系数都 0\ge 0,所以如果式子的值不等于常数项,必定对内层决策者来说会更劣,所以在 λ\lambda 满足限制的前提下,内层决策者一定会让式子的值变成常数项

所以问题转化成了对 λ\lambda 的相反方向的最优化问题。


关于对偶的一个例子,可以去 在 OI 中更易上手的线性规划对偶 查看。

#D. 安装软件包

给定 nn 个待安装的软件包,每个软件包有一个安装时间 tit_i

给定一个 nn 个点 mm 条边的有向无环图表示软件包之间的依赖关系(可能存在重边)。一条从 uuvv 的有向边表示软件包 uu 必须在软件包 vv 安装完成之后开始安装。在满足这些条件的前提下,没有依赖关系的软件包可以并行安装。

对于每个软件包 ii,都可以用 cic_i 的代价将其安装时间减小 1,但不可超过负数。

现在,给定一个预算 ww,求在支出的条件不大于 ww 的前提下,安装完所有软件包所需的最小时间。

n55,m400,ti103,ci104n\le 55,m\le 400,t_i\le 10^3,c_i\le 10^4

二分答案后最小化代价,神秘最优化问题,尝试写成线性规划的形式,设 PP 是 DAG 上的路径集合,xix_i 表示第 ii 个点降了多少。

minicixis.t.pP,ip(tixi)midxitixi0\min \sum_ic_ix_i\\s.t.\forall p\in P,\sum_{i\in p}(t_i-x_i)\le mid\\x_i\le t_i\\x_i\ge 0

来给限制分配变量 y,zy,z,我们写出 L(y,z,x)L(y,z,x)

L(y,z,x)=pPyp(ip(tixi)mid)+izi(xiti)+icixi=ixi(ci+zixpPyp)+pPyp(iptimid)iziti\begin{aligned}L(y,z,x)&=\sum_{p\in P}y_p(\sum_{i\in p}(t_i-x_i)-mid)+\sum _iz_i(x_i-t_i)+\sum_i c_ix_i\\&=\sum_ix_i(c_i+z_i-\sum_{x\in p\in P}y_p)+\sum_{p\in P}y_p(\sum_{i\in p}t_i-mid)-\sum_iz_it_i\end{aligned}

所以新的问题是:

maxpPyp(iptimid)izitis.t.ipPypci+ziy0,z0\max\sum_{p\in P}y_p(\sum_{i\in p}t_i-mid)-\sum_iz_it_i\\s.t.\sum_{i\in p\in P}y_p\le c_i+z_i\\y\ge0,z\ge 0

线性规划对偶多数时候要么转成流,要么转成贪心,肯定不会对偶完了再跑网络单纯形。

考虑给这个东西赋予一个意义。

DAG 上,我们要路径覆盖,每覆盖一条都会收获 timid\sum t_i-mid 的价值,每个点有经过次数限制 cic_i,每多经过一次就要花费 tit_i 的代价。

考虑拆点费用流,每单位流量表示覆盖一次,每个点拆成入点出点,入点向出点连 cic_i 的费用 tit_i 边,连 \infty 的费用为 00 的边,SS 向每个入点连 \infty 的免费边,出点向 TT\infty 的费用为 midmid 的边,原图中的边都是 \infty 的免费边。

这个图的最大费用流(不是最大费用最大流)就是答案。

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
总字数 231.7k 访客数 访问量