• 数学杂谈 #22


    线性规划基础

    线性规划的定义

    前置定义

    Definition.

    对于实自变量 \(x_1,x_2,\dots,x_n\) 和一组实常数 \(c_1,c_2,\dots,c_n\)​,定义一个线性函数:

    \[f(x_1,x_2,\dots,x_n)=\sum_{k=1}^nc_kx_k \]

    简洁的写法是,我们将这两组数都看作 \(\mathbb R^n\)​​ 内的向量,则有:

    \[f(x_1,x_2\dots,x_n)=\vec{c}^T\vec x \]

    Definition.

    对于上述若干对象以及另一实常数 \(b\),我们将等式 \(f(x_1,x_2,\dots,x_n)=b\) 和不等式 \(f(x_1,x_2,\dots,x_n)\le b,f(x_1,x_2,\dots,x_n)\ge b\) 统称为线性约束。

    那么,线性规划也就是受限于若干条线性约束时,对于某个线性函数求最值的规划问题

    关于线性规划的解,我们还有一些定义:

    Definition.

    \(x_1,x_2,\dots,x_n\) 为线性规划的可行解,当且仅当它满足该线性规划的所有线性约束。

    称一个线性规划的解空间为它的所有可行解构成的集合。

    称一个线性规划是有解的,当且仅当它的解空间非空。

    称一个线性规划是有界的,当且仅当对于存在一个 \(r\in \mathbb R\)​​,使得对于任何一个可行解 \(x_1,x_2,\dots,x_n\),都有目标函数的值 \(f(x_1,x_2,\dots,x_n)\le r\)​​。


    为了后续描述的方便,此处我们另作一个定义:

    Definition.

    对于两个向量 \(\vec a,\vec b\in \mathbb R^n\)​,我们定义关系 \(\vec a\le \vec b\)​​ 和关系 \(\vec a\ge \vec b\) 为:

    \[\vec a\le \vec b\Leftrightarrow \forall 1\le k\le n,\vec a[k]\le \vec b[k]\\ \vec a\ge \vec b\Leftrightarrow \forall 1\le k\le n,\vec a[k]\ge \vec b[k] \]

    容易验证这两种关系满足实数上的 \(\le,\ge\)​ 的性质相仿(除了它们不是全序关系外)。

    标准型线性规划

    我们定义一个有 \(n\) 个自变量、\(m\) 条限制的标准型线性规划为:

    \[\begin{matrix} \max&\displaystyle\sum_{k=1}^{n}c_kx_k\\ \text{s.t.}&\displaystyle\sum_{j=1}^na_{kj}x_j\le b_k&k=1,2,3,\dots,m\\ &x_k\ge 0&k=1,2,3,\dots,n \end{matrix} \]

    很明显,需要最大化的目标函数和下面的限制都是线性的形式。

    类似地,我们其实还有一个更简洁的写法:

    \[\begin{matrix} \max&\vec c^T\vec x\\ \text{s.t.}&A\vec x\le \vec b\\ &\vec x\ge \vec 0 \end{matrix} \]

    其中 \(\vec c,\vec x\in\mathbb R^n,\vec b\in \mathbb R^m,A\in \mathbb R^{m\times n}\)​,且 \(\vec x\)​​ 作为自变量存在。

    留一个伏笔:标准型线性规划的直观上的意义是?


    当然,还有很多奇形怪状的线性规划,但是我们可以通过下面的方法,将它们规约到标准型上去:

    • 对于目标函数求 \(\min\) 的,乘上 \(-1\) 变成求 \(\max\)​。
    • \(\ge\) 可以通过两边同时乘上 \(-1\) 变成 \(\le\)
    • 线性等式约束可以拆成两个不同方向的线性不等式约束。
    • 无限制变量可以拆分为两个 \(\ge 0\) 的自由变量做差。相应的,两个 \(\ge 0\)​ 的自由变量做差也可以转换成一个无限制变量。

    松弛型线性规划

    简单来说,松弛型线规将所有的限制全部转移到了变量上,这样可以规避在解线规的过程中遇到的“乘负系数”导致的变号问题。

    一个有 \(n\)​ 个自变量,\(m\) 条限制的松弛性线性规划为:

    \[\begin{matrix} \max&\displaystyle\sum_{k=1}^nc_kx_k\\ \text{s.t.}&\displaystyle x_{k+n}=b_k-\sum_{j=1}^na_{kj}x_j&k=1,2,3,\dots,m\\ &x_k\ge 0&k=1,2,3,\dots,n+m \end{matrix} \]

    其中 \(x_1,x_2,x_3,\dots,x_n\) 被称为“非基变量”,而 \(x_{n+1},x_{n+2},x_{n+3},\dots,x_{n+m}\)​ 都被称为“基变量”。

    个人认为这叫法比较神奇。应该是 \(x_1,x_2,x_3,\dots x_n\)​ 被称为“基变量”,而之后的那 \(m\)​​ 个变量被称为“非基变量”。

    不过这不重要,毕竟我们要在很后面才会真正用上“松弛型”线性规划。

    相对来说,松弛型线规的直观含义没有标准型显然,我们也一般是在解线规的时候才会用到它。

    整数线性规划

    整数线性规划,顾名思义,就是我们在线性约束的基础上,还要求自变量必须取到整数才行。

    整数线性规划是 NP-hard 问题,自然也没有高效的算法可以来解决它。


    不过,我们需要做一点区分:整数线性规划和一般线性规划有整数解是不同的概念。

    比如,我们之后可以看到,所有的网络流都可以写成线性规划的形式。然而,我们知道,只要所有的容量都是整数,网络流就存在整数最优解。这和网络流对应的线性规划本身可以是实数线规并不矛盾。并且,在这种情况下整数线规和实数线规最优解相同。

    举个例子

    你今天吃了没?—— sh

    假如你今天中午可以选择蔬菜、肉、米饭任意比例搭配,每种食物每单位可以提供若干的维生素、蛋白质和热量,且提供的营养元素的量正比于食物的量。

    营养自然是要跟上的,但是你在“减肥”,不希望摄入太多热量。所以你查了一下,列了一个表:

    蔬菜 米饭
    维生素 \(2\) \(1\) \(1\)
    蛋白质 \(3\) \(6\) \(1\)
    热量 \(2\) \(3\) \(6\)

    话是这么说的,这些数据还是我瞎编的。

    思考了一下,你决定要求摄入维生素量不少于 \(2\)​​​​,摄入蛋白质量不少于 \(4\)​​​。那么,在满足上述条件的情况下,你能够摄入的最小热量为?

    答案

    设选择的蔬菜、肉和米饭的量分别为 \(x_1,x_2,x_3\)​,我们可以直接列出线性规划:

    \[\begin{matrix} \min&2x_1+3x_2+6x_3\\ \text{s.t.}&2x_1+x_2+x_3\ge 2\\ &3x_1+6x_2+x_3\ge 4\\ &x_1,x_2,x_3\ge 0 \end{matrix} \]

    当然也可以将它转成标准型,但是转换后实在是不太美观,算了。

    解线性规划?

    这里我们都是讨论解标准型线性规划。

    朴素的方法:对于特别的线性规划,用特别的算法解决,将线性规划特化解决:

    • 比如一个变量肯定可以用手算嘛(笑)。

    • 两个变量的话,每条线性限制可以转化成一个半平面,交出来的是一个平面上的一个凸形(不一定是封闭的)。而 \(\vec c^T\vec x\)​ 其实就是向量 \(\vec c\)​​​ 内积的结果。

      转换一下,\(\vec c^T\vec x\)​​ 其实对应了某条直线的纵截距,那么求过凸形内点的最大截距是经典问题,方法多样。

    • 某些线性规划可以转化成网络流问题,此时我们就可以用网络流算法解决。

      某些线性规划可以转化成二分图相关问题,此时我们就可以用相应算法解决。


    不过,对于线性规划,我们还是有通用的解法的。比较简单的做法是单纯性法,虽然复杂度并不是多项式的,但是运行效率相当优秀。理论复杂度更低的包括椭球算法内点算法,实际运行效率感人。

    椭球算法:“奇怪的是,椭球算法虽然有着更优秀的理论复杂度,但是人们发现几乎在所有情境下,单纯形法都比它来得更加优秀。”

    内点算法:“内点法是最新的设计,理论上它比椭球法还要有效,实际应用上它也可以与单纯形法‘相抗衡’,不少商业化软件已经上市,前景甚佳。”

    笑拉了。实际上 OI 中的线性规划通常有比较紧的限制,几乎不可能被卡成指数级复杂度。所以一般来说没有什么特殊性质的线性规划都可以拿单纯形来解。

    此处我们不加证明地指出:

    Theorem.

    任何一个标准型线性规划都可以在与变量个数和限制个数相关的多项式复杂度内解决。

    线性规划对偶

    解线性规划的基本手法

    仍然考虑一下之前的那个例子:

    \[\begin{matrix} \min&2x_1+3x_2+6x_3\\ \text{s.t.}&2x_1+x_2+x_3\ge 2\\ &3x_1+6x_2+x_3\ge 4\\ &x_1,x_2,x_3\ge 0 \end{matrix} \]

    不等式求最值大家都喜欢做吧(笑。我们看看朴素的不等式手法怎么解决这道题。

    不等式并不容易进行变量替换,但是我们可以凑系数求下界。由于所有变量非负,我们可以得到:

    \[2x_1+3x_2+6x_3\ge 2x_1+x_2+x_3\ge 2 \]

    对比系数即可。相似地:

    \[2x_1+3x_2+6x_3\ge \frac{1}{2}(3x_1+6x_2+x_3)\ge 2 \]

    但是我们还可以把限制的不等式求和。比如说:

    \[2x_1+3x_2+6x_3\ge \frac{3}{4}(2x_1+x_2+x_3)+\frac{1}{6}(3x_1+6x_2+x_3)\ge \frac{13}{6} \]

    注意到了吗?我们这个求下界的过程其实也是有规律可寻的。如果我们设两个线性不等式的组合系数为 \(y_1,y_2\)​,那么我们需要保证:

    • \(y_1,y_2\ge 0\),不能变号。
    • \(2y_1+3y_2\le 2,y_1+6y_2\le 3,y_1+y_2\le 6\)​,这样才能对比系数建立不等关系​。

    同时还需要最大化 \(2y_1+4y_2\)

    注意到了吗?这个过程其实也是在求解另一个线性规划!我们把它写出来:

    \[\begin{matrix} \max&2y_1+4y_2\\ \text{s.t.}&2y_1+3y_2\le 2\\ &y_1+6y_2\le 3\\ &y_1+y_2\le 6\\ &y_1,y_2\ge 0 \end{matrix} \]

    画个图,这个线性规划的最优解在 \(D(\frac 1 3,\frac{4}{9})\)​​​ 处取得,为 \(\frac{22}{9}\)​​。通过其它手段(比如使用单纯形)我们也可以得到这个线性规划的最优解的确是 \(\frac{22}{9}\)​​​!

    对偶线规.png

    这样一个例子的朴素想法最终汇总成了下面的内容。

    线性规划对偶

    虽然这个朴素的手法并没有办法帮助我们解决线性规划,但是我们可以根据拼凑的关系延伸出一个想法:

    Definition.

    对于线性规划:

    \[\begin{matrix} \min&\vec{b}^T\vec y\\ \text{s.t.}&A^T\vec{y}\ge \vec c\\ &\vec y\ge \vec 0 \end{matrix} \]

    我们称它和以下线性规划“互为对偶”:

    \[\begin{matrix} \max&\vec{c}^T\vec{x}\\ \text{s.t.}&A\vec{x}\le \vec{b}\\ &\vec x\ge \vec 0 \end{matrix} \]

    在这一部分中,我们将称上面的线规为“原线规”,下面的线规为“对偶线规”。

    并且,根据上面的讨论,我们可以直接推广得到:

    Theorem.

    线性规划弱对偶性

    如果 \(\vec x,\vec y\)​​​​ 各自是对偶线规和原线规是可行解,则必然有如下关系成立:

    \[\vec b^T\vec y\ge \vec c^T\vec x \]


    Proof.

    直接推广我们的做法。由于 \(\vec x\)​ 是对偶线规的可行解,则:

    \[b_k\ge \sum_{j=1}^na_{kj}x_j \]

    而通过对比系数可以得到:

    \[\begin{aligned} \sum_{k=1}^mb_ky_k &\ge \sum_{k=1}^m\left(\sum_{j=1}^na_{kj}x_j\right)y_k\\ &=\sum_{j=1}^n\left(\sum_{k=1}^ma_{kj}y_k\right)x_j\\ &\ge\sum_{j=1}^nc_jx_j \end{aligned} \]

    其中最后一个不等号由原线规的限制得到。因此有弱对偶性成立。

    不过,根据我们得到的结果,我们不难猜测原线规和对偶线规的最优解是相同的。事实也确实如此。在这里,我们不加证明地指出:

    Theorem.

    线性规划强对偶性

    如果原线规和对偶线规均有解且有界,则对于原线规的任何一个最优解 \(\vec y^*\) 和对偶线规的任何一个最优解 \(\vec x^*\) ,都有:

    \[\vec b^T\vec y^*=\vec c^T\vec x^* \]


    虽然我们只需要证明另一个方向的不等号,但是证明过程并不简单,此处略去了。实在想看的,请查阅 refs 里面的那本英文教材的 Chapter 2。

    再来观察一下解的性质。在弱对偶性的证明中,如果 \(y_k\neq 0\)​​,则由于等号取得,我们必须有 \(\sum_{j=1}^na_{kj}x_j=b_k\)​​,否则没有限制。下面这个定理指出了更加一般的情况:

    Theorem.

    互松弛定理

    如果原线规和对偶线规均有界且有解,设 \(\vec x,\vec y\) 分别为对偶线规和原线规的可行解,则它们分别是各自线规的最优解充要条件是:

    \[(\vec b-A\vec x)^T\vec y+(\vec c-A^T\vec y)^T\vec x=\vec 0 \]

    转换成比较自然的语言为:

    • 对于 \(k=1,2,3,\dots,n\)​​,\(x_k=0\)​​ 和 \(\sum_{j=1}^ma_{jk}y_j=c_k\)​​ 中有至少一条成立。
    • 对于 \(k=1,2,3,\dots,m\)​,\(y_k=0\)​ 和 \(\sum_{j=1}^na_{kj}x_j=b_k\)​ 中有至少一条成立。

    这个定理在已知对偶线规的一组最优解,求原线规的一组最优解中可以起到桥梁作用。


    需要补充说明的一点是,我们可以通过经验对于非标准型的线规直接对偶。实际上,我们基本只会多处理一种限制:线性等式。

    由于线性等式可以被拆成 \(\le,\ge\) 两个方向的两条线性不等式,对于这两个不等式分别对偶后,设得到的变量为 \(a,b\)。则在所有限制中,\(a,b\)​​ 要么同时出现,要么同时不出现,且必然异号,因此我们可以用一个新的无限制变量来替代。进而得到:

    Corollary.

    线性等式的对偶变量为无 \(\ge 0\) 下界的自由变量。

    常见的线性规划例子

    在这一部分的末尾,让我们用两个经典的线性规划例子作结。

    若干网络流

    对于一个有源汇流网络 \(G=(V,E,c,s,t)\)​​​​​​,我们尝试写出它的最大流对应的线性规划。

    其实只需要加入边 \((t,s)\)​​​​,容量为 \(+\infty\)​ 即可实现所有点流量平衡。设自变量 \(f_{uv}\)​ 表示从 \(u\) 直接流向 \(v\) 的流量,如果 \((u,v)\not\in E\) 则认为容量为 \(0\)。因此我们有:

    \[\begin{matrix} \max&f_{ts}\\ \text{s.t.}&f_{uv}\le c_{uv}&(u,v)\in E\\ &\displaystyle\sum_{(v,u)\in E\cup(t,s)}f_{vu}=\sum_{(u,v)\in E\cup(t,s)}f_{uv}&u\in V\\ &f_{uv}\ge 0&(u,v)\in E\cup(t,s) \end{matrix} \]

    好生记住这个线规,以后会考的!


    我们都知道,最大流和最小割互为对偶问题。通过线性规划的对偶,我们来考察一下它们的对偶性。

    首先尝试写一下最小割的线性规划。回忆一下,一个割为 \(V\)​​​ 的划分 \([S,T]\)​​​,满足 \(s\in S,t\in T\)​,它的代价为 \(c[S,T]=\sum_{u\in S,v\in T}c_{uv}\)​​​​​。很容易想到用 01 变量来表示 \([u\in S]\)​,只需要限制为整数线规即可。

    根据上面的说法,我们不难得到:

    \[\begin{matrix} \min&\displaystyle\sum_{(u,v)\in E}c_{uv}d_{uv}\\ \text{s.t.}&d_{uv}-\varphi_u+\varphi_v\ge 0&(u,v)\in E\\ &\varphi_s-\varphi_t\ge 1\\ &\varphi_u,d_{uv}\in\{0,1\}&u,v\in V \end{matrix} \]

    在这里,我们技术性地引入了 \(d_{uv}\)​ 来表示 \([u\in S]\land [v\not\in S]\)。实际上,后面这个条件等价于 \(\max(0,\varphi_u-\varphi_v)\),而令 \(d_{uv}\ge 0,d_{uv}\ge \varphi_u-\varphi_v\),在最小化背景下即可令 \(d_{uv}=\max(0,\varphi_u-\varphi_v)\)​​ 。

    现在,我们对着最大流的线规对偶。设第一类条件的对偶变量为 \(\delta_{uv}\),第二类条件的对偶变量为 \(\phi_u\),可以得到:

    \[\begin{matrix} \min&\displaystyle\sum_{(u,v)\in E}c_{uv}\delta_{uv}\\ \text{s.t.}&\delta_{uv}-\phi_u+\phi_v\ge 0&(u,v)\in E\\ &-\phi_t+\phi_s\ge 1\\ &\delta_{uv}\ge 0 \end{matrix} \]

    这已经和最小割的模型非常接近了,只不过我们没有 \(\phi\in\{0,1\}\)​ 的限制。不过可以证明,该线性规划必然有整数最优解满足所述性质,此处略去不证。如有希望进一步了解者,详见 refs 里面董克凡论文的附录部分。


    另一个值得一提的内容是多物网络流问题。

    在一个多源汇网络 \(G=(V,E,c,\{s_k,t_k\}_{k=1}^r)\)​​ 中,我们要求运输 \(r\) 种物品。对于每个源汇 \(s_k,t_k\)​​,第 \(k\) 种物品必须从 \(s_k\) 至少运输 \(d_k\) 个到 \(t_k\)​,且它们共享同一个网络限制。我们需要构造一组解。

    设第 \(k\) 种物品从 \(u\) 输送了 \(f_{k,u,v}\)\(v\),则该问题可以写成如下线规:

    \[\begin{matrix} \max&0\\ \text{s.t.}&\displaystyle\sum_{v}f_{k,v,u}=\sum_{v}f_{k,u,v}&u\in V,k=1,2,3,\dots,r\\ &\displaystyle\sum_{k=1}^rf_{k,u,v}\le c_{uv}&(u,v)\in E\\ &f_{k,t_k,s_k}\ge d_k&k=1,2,3,\dots,r\\ &f_{k,u,v}\ge 0 \end{matrix} \]

    目前已知的该问题的多项式解法仅有转化成线性规划后再使用线性规划算法求解一种途径。

    二分图最大权匹配

    设有带权二分图 \(G=(V,E,w)\)​​,其中 \(V=L\cup R,L\cap R=\varnothing,E\subseteq L\times R\)​​,\(w\) 是表示权值的矩阵​​。

    已有经验不难帮助我们写出如下线性规划:

    \[\begin{matrix} \max&\displaystyle\sum_{(u,v)\in E}w_{uv}d_{uv}\\ \text{s.t.}&\displaystyle\sum_{(u,v)\in E}d_{uv}\le 1&u\in L\\ &\displaystyle\sum_{(v,u)\in E}d_{vu}\le 1&u\in R\\ &d_{uv}\ge 0 \end{matrix} \]

    类似于最小割,这里可以证明存在一组最优解,使得 \(d_{uv}\) 均为整数。因此我们在考察最值的时候大可去掉 \(d_{uv}\in \{0,1\}\) 这样的性质。

    将它对偶,设第一类限制的对偶变量为 \(p_u\),第二类限制的对偶变量为 \(q_u\)

    \[\begin{matrix} \min&\displaystyle\sum_{u\in L}p_u+\sum_{u\in R}q_u\\ \text{s.t.}&p_u+q_v\ge w_{uv}&(u,v)\in E\\ &p_u,q_v\ge 0 \end{matrix} \]

    记得 KM 算法吗?在 KM 算法中,我们需要维护的顶标其实就是这里的 \(p,q\)

    由此,我们可以得出结论:

    Theorem.

    在一张带权二分图中,最大带权匹配的权值恰好为最小顶标和的和。

    并且,考虑 \(w\) 全为 \(1\) 的情况,这样就可以得到推论:

    Corollary.

    在二分图中,最大匹配的大小等于最小点覆盖的大小。

  • 相关阅读:
    【梦断代码】与我们队的相似之处
    梦断代码 之 你失败过吗
    梦断代码 之 程序人生
    C#中父类转换为子类
    C#中Dictionary泛型集合7种常见的用法
    Linux 常见命令 目录处理指令
    使用XSLT+XML生成网页
    我心目中的Asp.net核心对象
    配色速成
    VS.NET中JavaScript隐藏特性
  • 原文地址:https://www.cnblogs.com/crashed/p/16567449.html
Copyright © 2020-2023  润新知