线性规划
线性规划原理
线性规划用于在某个约束条件下,优化某个线性函数。其标准型如下:
maxcTxs.t.Ax≤bx≥0我们可以通过加入一些松弛变量,将其变成松弛型:
maxcTxs.t.Ax=bx≥0其中所有涉及的数值都是实数,A∈Rm×n,c,x∈Rn,b∈Rm。定义P={x∣Ax=b∧x≥0},即所有可行解的集合。
我们下面的讨论均认为A的行向量是线性无关的,即m≤n。
转换为标准型
如果约束公式形式为∑jaijxj≥bi,那么我们可以记
a′ij=−aij并将约束公式替换为
∑ja′ijxj≤−bi如果约束条件为∑jaijxj=bi,可以拆分成两个约束条件∑jaijxj≤bi以及∑jaijxj≥bi。
如果某个变量xi没有约束,那么可以替换为xi=x′i−x″i,其中x′i,x″i≥0。
转换为松弛型
如果约束条件形式为∑jaijxj≤bi,我们可以增加一个松弛变量si,满足si≥0,并将约束公式替换为∑jaijxj+si=bi。
线性规划几何解释
所有满足线性规划的m+n个约束条件的向量集合P,我们可以将其理解为Rn−m空间中用半平面切出的凸包。凸包的特点就是P中任意两点a,b指定的直线上的所有点也是P中的点。
命题1:在凸包顶点处可以取得线性规划的最优解
假设我们在凸包非顶点处x上取到了最优解。那么一定存在某个非0向量d,满足x±d∈P,即A(x±d)=b⇒Ad=0。如果xi=0,那么一定有di=0。且由于x上是最优解,我们可以推出cTd=0。
由于d非0,因此一定存在某个i,满足xi,di>0(否则我们取−d即可),我们选择一个合适的λ,满足xi−λdi=0,即我们从x转移到x′=x−λd处,且x′≥0,这时候依旧能取到最优解,但是一个新的维度被赋值为0。
重复上面这个过程,直到找到某个顶点为止,很显然流程必定会终止。
命题2:对于任意x∈P,定义B=i∣xi>0。那么x是凸包上的某个顶点,当且仅当AB的列向量线性无关,这里AB表示由B中下标指定的A中的列组成的子阵。
比如
x=[2010]A=[213073210005]那么B=1,3,
AB=[237200]由于AB的列向量线性无关,因此x是凸包上的某个顶点。
这里给一下证明:
先证明充分性。假设x不是顶点,那么存在某个d,满足x±d∈P,即Ad=0,且xi=0⇒di=0。而Ad=0可以推出ABdB=0,其中dB≠0,这与AB的列线性无关相悖,因此假设不成立。
再证明必要性。如果AB线性无关,那么一定存在某个向量dB满足ABdB=0,我们用0填充d的其它维度,将其扩展为长度为n的向量,这样一定有Ad=0,即x±d∈P,即x不是顶点。
命题3:x是一个顶点,当且仅当存在存在某个C⊆N=1,…,n,满足|C|=m,且AC是非奇异矩阵,xC=A−1CbC≥0,xN/C=0。
证明:
必要性:由于行向量线性无关,因此如果x是顶点,我们可以将AB扩充为AC。
充分性:对应的如果我们找到这样一个C,由于Ax=b,且x≥0,因此x∈P,假如x不是顶点,就能找到这样的d,满足满足x±d∈P。当然根据dC非0且ACdC=0,可以推出AC的为奇异矩阵。
现在我们就得到了一个获取线性规划最优解的简单算法,遍历所有凸包上的顶点,并判断其是否是最优解。但是不幸的是,虽然我们可以O(m3)时间复杂度内判断矩阵是否奇异,但是C共有(nm)种可能的选择,而这是指数级别的。
单纯形算法
单纯形算法的实践表明,一般pivot执行次数为2(m+n)次以内。
整数规划与全幺模矩阵
定义:一个方矩是幺模矩阵(Unimodular matrix),当且仅当这个方阵的行列式值为±1
幺模矩阵的性质:
- 单位矩阵是幺模矩阵
- 置换矩阵是幺模矩阵
- 幺模矩阵的转置是幺模矩阵
- 幺模矩阵交换两行或两列后依旧是幺模矩阵
- 幺模矩阵的某一行(列)加上另外一行(列)乘上某个常数得到的矩阵还是幺模矩阵
- 幺模矩阵的逆矩阵是幺模矩阵
- 两个幺模矩阵的乘积是幺模矩阵
定义:一个矩阵是全幺模矩阵(Total Unimodular matrix),当且仅当这个矩阵的任意非奇异子阵都是幺模矩阵
全幺模矩阵的性质:
- 一个矩阵是全幺模矩阵的必要条件是矩阵的每个元素都是−1,0,1,但这不是充分条件,比如 [11−11] 就不是全幺模矩阵。
- 全幺模矩阵交换两行或两列后依旧是全幺模矩阵
- 全幺模矩阵的任意子阵还是全幺模矩阵
- 如果A是全幺模矩阵,那么[A,−A],[A,I],−A,AT都是全幺模矩阵
命题1:如果矩阵A,b都是整数上的矩阵,且A是全幺模矩阵,那么线性规划凸包上的所有顶点都是整数顶点
证明:
根据线性规划几何解释中的命题3可知,P中的任意顶点x,可以找到A的某个非奇异子阵AC,满足xC=A−1Cb,且AN/C=0。由于A是全幺模矩阵,因此AC是幺模矩阵也是全幺模矩阵,利用伴随矩阵法我们对AC进行求逆,会发现A−1C中的所有元素都是整数。因此xC的所有元素也是整数。
命题2:如果矩阵A,b都是整数上的矩阵,且A是全幺模矩阵,那么线性规划的最优解x是整数向量
证明:
线性规划的最优解在某个顶点取到,而所有顶点都是整数顶点,因此命题得证。
命题3:无向二分图的关联矩阵是全幺模矩阵
(无向二分图的关联矩阵为行表示结点,列表示边,如果结点和边关联,则单元格值为1,否则为0)
证明:
根据归纳法进行证明,考虑大小为1的子阵,其行列式取值只能为0,±1。
现在假设所有大小小于n的子阵都是全幺模矩阵。现在考虑大小为n+1的子阵。这里考虑三种情况:
- 如果存在一列全为0,那么行列式值只能为0。
- 如果存在一列只有一个1,那么我们可以得出行列式值为去除这一列这一行的代数余子式,而余子式的取值仅可能为0,±1(根据归纳法)。
- 否则所有列都有两个1,那么如果我们将所有行都加总,但是左边子图顶点对应的行的系数为1,右边子图的顶点对应的行的系数为-1,那么加总和为0,这意味着矩阵的行线性相关,因此行列式值为0。
命题4:有向图的关联矩阵是全幺模矩阵
(有向图的关联矩阵为行表示结点,列表示边,每条边与入点的单元格值为1,与出点的单元格值为-1,否则为0)
证明:
与命题3相同,第二步的条件是存在一列只有一个数非0,第三步的证明中所有行的系数都为1。
提供一道题目。
命题5:线性规划求解二分图最大匹配的系数矩阵是全幺模矩阵
举个例子,左右各有两个顶点,其中左1和左2均与右1和右2有连边,那么它们系数矩阵为:
A=[1100001110100101]向量b为:
b=[1111]这时候满足Ax≤b。之后我们加入松弛变量,得到
[A,I]x′=b其中A的左边是一个二分图的关联矩阵,右边是单位矩阵,满足全幺模矩阵的条件。
命题5:线性规划求解最大流的系数矩阵是全幺模矩阵
举个例子,源点是1,汇点是4,1到2连容量为c1,2的边,1到3连容量为c1,3的边,2到4连容量为c2,4的边,3到4连容量为c3,4的边。那么它们的约束方程为:
A=[−10100−1011000010000100001]向量b为:
b=[00c1,2c1,3c2,4c3,4]这时候满足Ax≤b,我们加入松弛变量后得到:
[A,I]x′=b这里A的前两行是有向边关联矩阵的子阵,下面是4行是单位矩阵,因此A是全幺模矩阵,对应的系数矩阵[A,I]也是全幺模矩阵。
命题6:线性规划求解最小费用最大流的系数矩阵是全幺模矩阵
举个例子,源点是1,汇点是4,1到2连容量为c1,2的边,费用为C1,2,1到3连容量为c1,3的费用为C1,3边,2到4连容量为c2,4的费用为C2,4边,3到4连容量为c3,4的费用为C3,4边。首先可以求出最大流为f,那么系数矩阵为:
A=[1100−1−100−10100−1011000010000100001]向量b为:
b=[f−f00c1,2c1,3c2,4c3,4]这时候满足Ax≤b,我们加入松弛变量后得到:
[A,I]x′=b这里A的第1行、第2行、第3到4行,第5到8行全是全幺模矩阵的子阵,因此矩阵A是全幺模矩阵,故[A,I]也是全幺模矩阵。
对偶线性规划
线性规划的原始型:
maxcTxs.t.Ax≤bx≥0它的对偶型:
minbTys.t.ATy≥cy≥0对偶型有以下性质:
- 设x是线性规划最优值对应的解,而y是对偶型最优值对应的解,那么一定有cTx=bTy。
- 如果原始型无解,那么对偶型则无界。
- 对偶线性规划的对偶是原始线性规划。
这里稍微提一个对偶的技巧。
对于一类线性规划:
maxcTxs.t.Ax=bx≥0其对偶后的形式为
minbTys.t.ATy≥c注意对偶形式中y≥0这个约束条件不见了。
对偶线性规划的应用
最大流和最小割
最大流的线性规划形式为:
maxft,ss.t.fi,j≤ui,j∑(j,i)∈E′fj,i=∑(i,j)∈E′fi,j,∀i∈Vfi,j≥0这里E′=E+(t,s),ui,j表示边(i,j)的容量。
其对偶形式为:
min∑(i,j)∈Eui,jdi,js.t.di,j+yi−yj≥0yt−ys≥1di,j≥0我们可以理解di,j表示是否要删除边(i,j),删除为1,不删除为0。而yi表示从s到i的最短路径。很显然在最小割后,不存在从s到t的路径(即至少需要经过一条被割去的边)。因此下面的公式就是最小割的线性规划公式。
二分图最大权匹配和最小顶标和
对于二分图,其顶点分成两个集合L和R。
二分图最大权匹配的线性规划形式为:
max∑(i,j)∈Ewi,jfi,js.t.∑(i,j)∈Efi,j≤1,∀i∈L∑(i,j)∈Efi,j≤1,∀j∈Rfi,j∈{0,1}其对偶形式为:
min∑i∈Lpi+∑i∈Rpis.t.pi+pj≥wi,jpi≥0下面这个对偶形式实际上是最小顶标和的线性规划形式。
最小费用最大流和最短路
对于给定的费用网络G=(V,E),最小费用流问题(不要求最大)对应的线性规划形式为:
max∑(i,j)∈E−ci,jfi,js.t.fi,j≤ui,jft,s=F∑(j,i)∈E′fj,i=∑(i,j)∈E′fi,j,∀i∈Vfi,j≥0将其转换为对偶形式:
min∑(i,j)∈Eui,jyi,j+Fyt,ss.t.yi,j+zi−zj≥−ci,jyt,s+zt−zs≥0yi,j≥0,∀(i,j)∈E题目1:给定一个连同无向图G=(V,E),n=|V|。其中边(u,v)有一个非负长度lu,v和非负的费用cu,v。现在我们允许将每条边的长度延长某个非负距离yu,v,每单位的费用为cu,v。现在要求计算通过延长边,使得从顶点1到顶点n最短距离不小于m,要求计算最小的总费用∑icixi。其中1≤V,E≤103,0≤li,j,ci,j≤102
建立线性规划公式可以得出:
min∑(i,j)∈Eci,jyi,js.t.yi,j+zi−zj≥−li,jzt−zs≥Uyi,j≥0,∀(i,j)∈E考虑它的对偶形式:
max∑(i,j)∈E−li,jfi,j+Uft,ss.t.fi,j≤ci,jft,s≤+∞∑(j,i)∈E′fj,i=∑(i,j)∈E′fi,j,∀i∈Vfi,j≥0即要求找到一个网络的最小费用流(注意不一定最大)。我们可以建立网络流来求解。
题目2:给定一个连同无向图G=(V,E),n=|V|。其中边i有一个非负长度li和非负的费用ci。现在我们允许将每条边的长度延长某个非负距离xi,每单位的费用为ci。要求回答m个请求,每个请求给定费用上限C,要求总费用且总费用∑icixi≤C,问从顶点1到顶点n的最远距离是多大。其中2≤V≤100,V−1≤E≤103。1≤m,C≤105。其中li和ci都是非负整数,且1≤li,ci≤10。
提供一道题目。
我们可以用二分法来校验,即我们只需要负责计算最远距离为d的时候,最小的费用是多少。这就转换为题目1了。这样还是比较慢的。
注意观察我们最后得到的公式:∑(i,j)∈E−ci,jfi,j+Uft,s。这等价于我们在计算最大流的时候按照最小费用路径增广,且只要费用路径的总费用不超过U我们就继续增广。由于所有li,ci都是整数,因此边上的流量以及整个网络的流量都是整数。且根据最小费用流的性质知道,当我们按照最小费用路径增广的时候,最小费用路径的总费用是递增的。因此我们可以发现对于U∈[x,x+1)的时候,ft,s以及∑(i,j)∈E−ci,jfi,j都是常数,扩容费用和U的关系为cost(U)=aU+b,即是一个线性函数,且cost函数在整个定义域中都是递增函数。
因此我们可以不断沿着最短路径进行增广。由于流量上限最多为10m,因此我们可以用费用流算法求解的时间复杂度为O(10mn2+qlog2q)。
题目3:给定一个连同无向图G=(V,E),n=|V|。其中边(u,v)有一个非负长度lu,v和非负的费用cu,v。现在我们允许将每条边的长度延长某个非负距离yu,v,延长的上限为tu,v,每单位的费用为cu,v。现在要求计算通过延长边,使得从顶点1到顶点n最短距离不小于m,要求计算最小的总费用∑icixi。其中1≤V,E≤103,0≤li,j,ci,j≤102
建立线性规划公式可以得出:
min∑(i,j)∈Eci,jyi,js.t.yi,j+zi−zj≥−li,jzt−zs≥U−yi,j≥−ti,jyi,j≥0,∀(i,j)∈E考虑它的对偶形式:
max∑(i,j)∈E−li,jfi,j+Uft,s+∑(i,j)∈E−ti,jpi,js.t.fi,j−pi,j≤ci,jft,s≤+∞∑(j,i)∈E′fj,i=∑(i,j)∈E′fi,j,∀i∈Vfi,j≥0pi,j≥0由于ti,j≥0,因此当pi,j=max(fi,j−ci,j,0)的时候目标公式可以取到最大值。因此我们可以删除p。得到
max∑(i,j)∈E−li,jfi,j+Uft,s+∑(i,j)∈E−ti,jmax(fi,j−ci,j,0)s.t.ft,s≤+∞∑(j,i)∈E′fj,i=∑(i,j)∈E′fi,j,∀i∈Vfi,j≥0我们可以理解为对于任意网络中的边(i,j),我们能支付额外的ti,j单位费用将其扩容。这个可以通过加入一条费用为li,j+ti,j且容量为无穷的边来实现。
提供一道题目。