线性规划

线性规划问题

线性规划问题指的是:给定若干个变量,这些变量满足一系列线性等式关系或线性不等式关系,要在满足这些关系的前提下求出某个这些变量的线性函数的最大值或最小值。

我们可以用“归约”的思想把线性规划问题的描述统一为标准的形式,称为“标准型”:首先我们可以把问题归约为所有自变量都是正数的情况,如果存在一个自变量\(x\)可以取负数,那么我们就定义两个新的变量\(x^+\)\(x^{-}\),并永远用\(x^{+}-x^-\)来替换\(x\)。这样就保证了所有变量的取值范围都\(\geq 0\)。任何一个线性规划给出的约束的不等关系\(a_1x_1+a_2x_2+\cdots+a_nx_n \geq 0\)可以写作\(a_1x_1+\cdots+a_nx_n-s_n=0\)\(s_n \geq 0\),这样就在所有自变量都\(\geq 0\)的基础上,把所有的不等式约束都转化为了“等式约束”。对于要求的目标函数,如果是求最小值,我们就给它取个负号,最后再取回来,这样就转化为了求最大值。因此,一切线性规划问题都可以转化为标准型——变量非负,等式约束,求最大值。

我们可以通过作图来求解线性规划问题:如果变量的数量为2,那么等式关系就对应着平面上的一条直线。令目标函数等于某个量,这个量的变化可以看作确定斜率的直线的平移。所以我们的点在直线围成的多边形的边上运动,同时经过该点做该斜率的直线,直线能达到使目标函数最小的地方就是我们的最优解。变量个数为3的情况同理,此时可行域是空间中的多面体,平移的直线变成了平移的平面, 其它情况都类似。

如果变量的个数达到\(n\)个,我们难以用“作图”来描述。但我们注意到这样一个事实:在二维中我们的答案一定对应着目标函数的极值点,假设可行域是一个凸多边形,我们的答案总是在其某个顶点上取到,并且在最终的顶点上,它相对于我们的平移直线一定是最高的点;三维情形也是类似的,我们最终答案的顶点一定是在目标函数意义下最高的。

我们用“单纯形法”来描述这一事实,并由此在\(n\)维的线性规划中也得出了一个可行的算法:我们把所有“空间多面体的顶点”想象为“节点”,“空间多面体的棱”想象为“边”。从任意某个节点出发,如果它周围有一个节点,在那上面目标函数的取值更大,就走到那个节点,直到无法走到任何节点,即此时到达了一个极值点。那么可以证明这个极值点就是最优解。但到目前位置我们对它的理解只是基于几何直觉的。我们先暂且假设我们的几何直觉是正确的,后面我们会严格地证明它。

值得注意的是,线性规划的正确性是由“实数”这一定义域保证的,对于很多的应用性问题,尽管给出的约束都是整数,但最优解不一定在整数处取到。如果要加上“解必须是整数”这一限制,问题就会变得非常复杂——它已经不再是“线性规划”问题而是“整数规划”问题了。

网络流

在一张只有一个源点和一个汇点的有向图上,边权代表“最大容量”。想象单位时间内有水流从源点流向汇点,每个节点没有储存水流的能力,因此流进的流量必须等于流出的流量,并且每条边上的流量不能超过最大容量,问单位时间最多能流过多大的水流?

这就是最大流问题。我们发现它其实就是一个线性规划的问题:有\(|E|\)个变量,代表每条边的流量,每条边的流量不能超过最大容量是线性不等式约束,每个节点流进等于流出是线性等式约束,要求的目标函数是从源点出发的流量总和(或流入汇点的流量总和)是线性函数。因此我们只需要在这些约束的基础上执行“单纯形法”就可以求出最大流了。

流出源点的流量总和等于流入汇点的流量总和相等很符合直觉,证明却不是显然的。我们依据每个节点流入等于流出这一条件,把所有流入“中间节点”的流量累加,流出“中间节点”的流量累加,显然这二者是相等的,做替换即可。 而它们相减又可以理解为减去了中间节点内部的流量,因此这个差就是流出源点的流量减去流入汇点的流量,这个差值为0,因此就证明了它们相等。

我们想更仔细地看一看,“单纯形法”对应到“网络最大流”这个具体的问题上是如何工作的。在单纯形法中,我们每次要走到一个某个使得目标函数更大的节点上。在这里,“目标函数更大”就对应着“流过了更多的水流”。如果把最终的“最大流的解”拆分成若干从源点到汇点的单一路径,那么这种“目标函数变得更大”就对应着在原先的水流分布上找到了一条新的从源点到汇点的路径可以流通。因此,我们可以记下每条边还最多可以通过多少流量,然后以这个流量为边权找一条从源点到汇点的边权始终为正的路径(用BFS就可以完成),取路上经过的最小边权作为流量,这就是一条通路了。不停执行这个过程,就是在执行“单纯形法”,因此直到我们找不到任何通路,我们就一定到达了最大流。这就是网络最大流的“增广路算法”。

但是,单单在“残量网络”上寻找增广路这种转化和数学上的“单纯形法”还是存在出入的,很容易举出反例以上算法中一条路径有可能堵住了别的路径,导致最终无法成功找出最大流。原因在于我们在线性规划问题中“叠加两个解”的时候是在实数上操作的,而在增广路上一旦我们选定了某个流量,就不能再添加反向的流量了。我们在“增加流量”这一操作上抹去了原本应该存在的其它选择——一条容量为5的边,假设我们已经正向给了它大小为3的流量, 那么接下来它可以选择继续正项增加2的流量,也可以选择反向增加3的流量——残量网络应当是包括两个方向的!这样我们就得到了一个完整的残量网络来执行我们的单纯形算法。

最大流最小割定理

对于一个网络流,我们把点划分成集合\(L,R\),其中源点在\(L\)中,汇点在\(R\)中。有若干边是横跨\(L,R\)的,有从\(L\)\(R\)的也有从\(R\)\(L\)的,这些边就称为一个“割”。我们定义割的大小是所有从\(L\)\(R\)的边的容量之和

任意一个流的大小都不可能超过任意一个割的大小。因为割的大小本身就限制了最大的流的大小。这是直觉上的理解,如果要严格的话,我们可以补充证明“任何一个流都等于某个割上从左往右的总流量减去从右往左的总流量”,方法与证明流出源点等于流入汇点是类似的——我们把\(L\)集合中所有流出某点的流量累加,减去所有流入某点的流量累加,内部的流量全部被抵消,留下的项恰好是我们要的项。因此我们证明了最大流小于等于最小割。

现在我们要证明,存在一个割的大小等于最大流。考虑执行完了增广路算法的残量网络,在这张图上一定不再存在从源点到汇点的路径了(如果存在就又找到了一条增广路),即在此时的残量网络上源点到汇点是不连通的。那么我们令集合\(P\)中存放所有从源点出发可达的节点,余下的节点存放在集合\(Q\)中。我们证明\(P,Q\)形成的割的大小就等于最大流——对于原图中从\(P\)\(Q\)的所有边,它们在残量网络中一定被设为了0,不然就找到了一条到达\(Q\)中某个点的路径,与\(P,Q\)的定义矛盾,因此在原图中从\(P\)\(Q\)的边都被流满了;原图中从\(Q\)\(P\)的边必须流量为0,否则就会出现从\(P\)\(Q\)的残量边,再次矛盾。因此这个割的大小就恰好等于\(P\)\(Q\)的流量——最大流。 满足这个取等条件的割根据性质一定就是最小割。

综上,最小割等于最大流。

二分图匹配

我们想说,二分图匹配是一个线性规划问题。而我们不直接找出二分图匹配所对应的变量和不等式约束,而是把它归约为网络流问题,因为网络流问题是线性规划问题。

我们构造一个网络流,源点一一向左侧节点连容量为1的边, 右侧节点一一向汇点连容量为1的边,二分图原本的边都对应的改造为从左边节点到右边节点的容量为1的边。我们断言:如果二分图的最大匹配等于该网络的最大流。

先证最大匹配小于等于最大流。对于任意一个最大匹配,每条匹配的边都是独立的,因此我们直接按照匹配的结果构造\(M\)条(设最大匹配为\(M\))从源点到汇点的大小为1的通路就得到了一个大小为\(M\)的流。

再来证最大流小于等于最大匹配。如果我们规定了最终所有边的流量都只能取整数,那么这也是容易的。这时最大流的每条边要么流量为1要么流量为0,这意味着从左侧节点流出的最多只有一条边,流入右侧节点的也最多只有一条边,换言之有流量的边在图中是独立的,因此这些流就自动构成了一个匹配。但我们特别强调过规定“变量只能取整数”就不再是“线性规划”而是“整数规划”了,我们对线性规划的讨论要求所有自变量都能够取实数。所以想要我们的证明成立,我们必须证明在这张图上“一定存在一个所有边的流量都是整数的最大流”。

事实上我们可以证明一个更一般的结论:一个所有边的容量都是整数的网络流上,一定存在一个所有流量都是整数的最大流。我们只需回顾增广路算法,归纳地,我们在每一步执行的时候假设之前得到的残量网络上都是整数,那么我们所找到的瓶颈边所能通过的流量也是整数, 因此我们增广的量一定也是整数。所以归纳假设成立。

这样我们就用最大流解决了二分图匹配问题。

我们可以证明d-regular的二分图一定有完美匹配。因为把每条边的流量都设置为1/d我们就能得到大小为\(n\)的流,而\(n\)已经是最大流了。根据增广路算法,我们一定存在一个整数流大小也为\(n\),而这个整数流一定对应了一个完美匹配。

对偶

我们通过网络流来具体看到了线性规划的一些特点,其中最突出的就是“最大流最小割定理”。设想我们如果我们先定义的是“割”而不是“流”,它同样也是一个线性规划问题,那么我们如果找到某种实施线性规划的方法求出了“最小割”,我们也可以通过证明“最小割最大流定理”来直接得到“最大流”。在数学的其它领域,我们也不断看到这样的称为“Min-Max定理”的结论,例如在这学期的组合数学中看到的偏序集中Dilworth定理等等。事实上,我们把“最小割”称为“最大流”的对偶问题。更一般的,所有的线性规划问题都存在着“对偶规划”。

我们可以直接从“严格化单纯形法”的角度出发来看“对偶规划”究竟是什么。它可以用来验证我们由单纯形法求得的答案就是最优解。如果我们求出的是目标函数的最大值,那么我们只需要证明目标函数的取值范围不能超过这个值。我们用一个非常简单非常具体的例子来看我们应该怎么做:假设我们的线性规划问题给定的约束分别为\(x_1+x_2 \leq 400;x_1 \leq 200;x_2 \leq 300\)(我们默认所有自变量都是非负的,这其实也是约束,但由于通过标准型所有线性规划都有这个约束, 我们就不专门写出它),目标为最大化\(x_1+6x_2\)。一个直接的求解\(x_1+6x_2\)的取值范围的方法是对不等式整体做线性组合,如果左式能凑出目标函数,那么右式的值就可以用来bound目标函数。那么做一个一般的线性组合,得到\(y_1(x_1+x_2)+y_2(x_1)+y_3(x_2) \leq 400y_1+200y_2+300y_3\)(我们再次默认所有的\(y_i\)也是非负的)。整理得到\((y_1+y_2)x_1+(y_1+y_3)x_2 \leq 400y_1+200y_2+300y_3\)。如果加上对\(y\)的约束\(y_1+y_2 \geq 1;y_1+y_3 \geq 6\),那么一定成立\(x_1+6x_2 \leq (y_1+y_2)x_1+(y_1+y_3)x_2\),也即\(x_1+6x_2 \leq 400y_1+200y_2+300y_3\)。由于这个式子恒成立,只要我们能求出\(400y_1+200y_2+300y_3\)的最小值,它就给出一个bound。我们发现,我们抛开了\(x\)给出了一个\(y\)的线性规划问题,如果这个线性规划的最优解恰好等于我们单纯形法得出的解,那么就证明了单纯形法得到的解等于某个上界,所以这个解就是最优值。 在这个例子中我们发现,这一点恰好成立!

这个结论一般来说也是成立的。(但由于涉及复杂的知识,我们不能给出证明。)\(y\)的这个线性规划问题就被称为是“对偶规划”。

我们在线性代数课中已经见过“对偶”这个词——对偶空间的矩阵是原矩阵的转置。我们已经能从上面的问题中看到“转置”的影子,因为在\(y\)的线性规划中,目标函数的系数是原来的约束,而新的约束是原来目标函数的系数。线性规划既然是线性问题,我们就一定能用矩阵来表达。\(x\)的约束可以写作某个矩阵\(A\)满足\(Ax \leq b\),规定\(x \geq 0\),要最大化\(c^\top x\)。(其中\(c\)就是目标函数的系数的向量)而我们的对偶规划恰好就是\(A^\top y \geq c,y \geq 0\),要最小化\(b^\top y\)。我们的对偶定理就是指出:\(c^\top x\)的最大值就等于\(b^\top y\)的最小值。

\[\max\limits_{Ax \leq b}{c^\top x} = \min\limits_{A^\top y \leq c}{b^\top y} \]

零和博弈

我们先用一个例子来展示博弈的一些基本特点,然后再讨论它与线性规划的关系。

石头剪刀布

石头剪刀布的游戏规则可以写作收益矩阵\(G=\begin{bmatrix}0&-1&1\\1&0&-1\\-1&0&1\end{bmatrix}\),每行每列分别依次代表自己和对手出石头、剪刀、布得到的收益,例如自己出剪刀对手出布就对应着第二行第三列的\(-1\),代表“自己输了”。

在石头剪刀布这样一个“博弈”问题中,唯一的策略就是决定自己出某个拳的“概率”。因此我们可以用三元组\((x_1,x_2,x_3)\)来表示自己的决策,分别表示出石头、出剪刀、出布的概率分布情况。同样,也用\((y_1,y_2,y_3)\)来表示对手的决策。 由此我们可以计算出在这样的决策下己方的博弈期望\(E=\sum\limits_{i=1}^{3}\sum\limits_{j=1}^{3}G_{ij}x_iy_j\)。在对方的视角下收益矩阵的每一项都要取相反数,因此期望为\(-E\)。站在自己的视角我们希望最大化\(E\),对应地对手希望最小化\(E\)

如果我们的策略是“纯随机”,即取\(x_1=x_2=x_3=\dfrac{1}{3}\),那么可得无论对手策略如何,都有\(E=\dfrac{1}{3}\sum\limits_{j=1}^{3}G_{ij}y_j=0\)。这说明只要我们纯随机地出拳,对手无论采用怎样的策略都不可能保证获胜,如果对手能保证获胜,就说明\(-E\)为正,说明\(E\)在最大化后依然不能达到\(0\),而我们的“纯随机”已经给出了一种达到0的方案了。同样,我们也不能保证获胜,因为那样就说明\(E\)能达到整数,这就说明\(-E\)能达到负数,对面就有一种保证能赢的策略了。所以我们发现在我们的博弈下\(E\)最终只能取0,这说明石头剪刀布这个游戏是公平的。

Min-Max定理

石头剪刀布的收益矩阵是对称的,因此我们的讨论可能存在特殊性。下面来看一个非对称的收益矩阵\(G=\begin{bmatrix}3&-1\\-2&1\end{bmatrix}\)。如果己方策略为\((x_1,x_2)\),对方策略为\((y_1,y_2)\),我们直接写出博弈的期望\(E=3x_1y_1-x_1y_2-2x_2y_1+x_2y_2\)

对于己方的每个策略\(x\),敌方会做出做优的抵抗。假定敌方知道我们的决策,因为我们要做好最坏的打算,那么敌方会想要最小化\(E=(3x_1-2x_2)y_1+(-x_1+x_2)y_2\)。这是个很简单的线性规划,对\(y\)的约束条件有\(0\leq y_1,y_2 \leq 1;\)\(y_1+y_2=1\)。而\(E\)就是目标线性函数。通过简单的几何作图就能发现,只要目标函数对应的斜率不是\(-1\),那么最优解一定在\(y_1=0,y_2=1\)\(y_1=1,y_2=0\)这两种策略上取到。这其实意味着如果\(x\)方的决策体现某种倾向,\(y\)方应当倾尽全力去攻击这种倾向。如果没有什么倾向,那么任何一种决策都是最优的。由于\(y\)是要最小化\(E\),可以把\(E\)改写为\(\min\{3x_1-2x_2,-x_1+x_2\}\)。而己方的任务是最大化期望,那么我们的目标就是找出最优的\(x\)使得这个项最大化——求出\(\max \min\{3x_1-2x_2,-x_1+x_2\}\)

我们知道\(\min\)函数实际上只是一个初等的线性函数(平凡恒等式),因此求出\(\max \min\{3x_1-2x_2,-x_1+x_2\}\)这个最大值依然是线性规划问题!我们单独设目标函数为\(z\),那么它满足约束\(z \leq 3x_1-2x_2;z \leq -x_1+x_2\),还有\(x\)本身性质的约束\(0 \leq x_1,x_2 \leq 1,x_1+x_2=1\)。我们只要求出目标函数(同时也是自变量)\(z\)的最大化即可。求解出来的答案\(z\)的最大值为\(1/7\),在\(x_1=3/7,x_2=4/7\)时取到。因此我们可以期望己方获胜。

从敌人的视角看怎么样呢?敌方假定我们知道他的决策,那么对于他的每个决策\(y\)博弈的期望是\(E=(3y_1-y_2)x_1+(-2y_1+y_2)x_2\),敌方的目标是要最小化\(\max\{3y_1-y_2,-2y_1+y_2\}\)。转化为线性规划得到的约束是\(w \geq 3y_1-y_2;w \geq -2y_1+y_2\),还有\(0 \leq y_1,y_2 \leq 1,y_1+y_2=1\)。最小化\(w\)。求解出来的答案\(w\)的最小值为\(1/7\),在\(y_1=2/7,y_2=5/7\)时取到。

其实我们早就该意识到\(z\)的最大值就等于\(w\)的最小值了——因为这两个线性规划正好是对偶的!

对于更一般的矩阵,我们也有这个结论,称为博弈论的Min-Max定理:

\[\max\limits_{x} \min\limits_{y} \sum\limits_{i,j}G_{ij}x_iy_i=\min\limits_{y} \max\limits_{x}\sum\limits_{i,j}G_{ij}x_iy_i=V \]

在这里,线性规划的对偶性告诉了我们无论从己方的视角看还是从敌方的视角看,在双方都采取最优的策略下博弈的结果是确定的。

我们还发现,即便我们公开自己的决策,对手也不能得到一个比\(V\)更优的值。因为我们已经假设了敌方知道我们的决策了。反过来,如果敌方公开自己的决策,我们也不能做得更好。我们直觉总感觉如果暴露了自己的决策似乎是对敌方有利的一件事,但我们看到无论公不公开在数学上结果都是一样的。

单纯形法的严格化

下面我们来严格地描述单纯形法的数学过程。为了方便起见,我们只讨论这样的一个线性规划问题(用矩阵的语言描述):\(x \geq 0, Ax \le b\),最大化\(c^\top x\)。(注意它不是标准型)

单纯形法是在每个节点判断是否为极大值,如果不是就走到相邻的更大的点上的算法。因此我们首先需要在给定的数学条件下给出“节点”和“相邻节点”的定义。我们讨论的空间维数就是自变量的个数(向量\(x\)的维数)。我们发现,线性规划的一个约束不等式(等式)是一个\(n-1\)维“超平面”,在二维空间是直线,在三维空间是平面。二维空间需要两条直线来唯一确定一个点,三维空间需要三个平面来唯一确定一个点(两个平面只能确定一条交线),这个结论于是被推广为“\(n\)维空间需要\(n\)个‘超平面’来确定一个唯一的点”。这其实是线性代数问题,一个“超平面”的方程其实是某个向量\(v\)\(x\)的内积等于0。\(n\)个超平面构成了一个矩阵\(D\)要求它满足\(Dx=0\)有唯一解,这要求\(D\)满秩。 在给定的约束条件\(Ax \leq b\)中,我们知道\(A\)的列数必须是\(n\),而\(A\)的行数就是约束的个数。因此对于约束的任意某个子集,如果这些约束(超平面)唯一确定了一个点(至少需要\(n\)个约束),这个点就是单纯形法中的一个“节点”。同样的道理,根据线性代数基本定理,\(D\)的秩加上零空间的维数等于\(n\),因此唯一确定一个\(n\)维空间里的一维空间(直线,棱)的话\(D\)的秩为\(n-1\)。因此一条棱上的任意两个点一定至少共同处于\(n-1\)个约束的超平面上。所以我们定义如果两个“节点”共同满足至少\(n-1\)个约束超平面,则它们是相邻的。

我们的约束条件\(x \geq 0, Ax \le b\)给出了\(2n\)个约束超平面,其中\(x=0\)一定是一个节点,确定它的\(n\)个超平面就分别是\(x_i=0\)。因此与它相邻的节点必须满足\(n-1\)\(x_i=0\),也即相邻节点必须有\(n-1\)维坐标是0。按照单纯形法,我们首先要判断原点是否是最优解,因为我们要最大化\(c^\top x\),我们下面证明:当且仅当\(c_i \leq 0\)恒成立时\(x=0\)是最优解。左推右,由于\(x_i \geq 0\),因此\(c^\top x \leq 0\),而\(x=0\)\(c^\top x = 0\),因此\(x=0\)是最优解;右推左,反证法,如果存在\(c_k >0\),那我们可以令\(x_k\)取一个正值,其它都取0,这一定是能做到的,否则意味着\(x_k\)只能等于0,它就不是一个“合法的维度”了。增大多少呢?我们只需要在不破坏所有约束的前提下慢慢增大\(x_k\),直到某个约束变“紧”,这意味着这个变紧的约束取代了原本的约束\(x_k \geq 0\),我们来到了一个新的“节点”,即单纯形法沿着一条棱走到了一个“相邻节点”。因此我们我们看到\(x=0\)不是最优解了。事实上这也就是单纯形法接下来要做的事,找到一个相邻的更大的节点,我们已经说明了怎么做。

下一步,我们要继续找相邻节点。但由于失去了“原点”这一特殊性,描述变得非常困难。我们采用的方法是,进行适当地坐标变换,用一个新的线性规划代替目前的线性规划,使得当前点再次变为原点,这样我们就只需要重复一模一样的讨论就行了。设新的坐标为\(y\),并且在单纯形刚刚走了那一步以后我们当前处在\(u=(0,0,\cdots,\varepsilon,0,\cdots,0)\)的位置,其中\(x_k=\varepsilon\)。注意我们的坐标变换后一切必须和原先有相同的形式,我们知道\(x_k=\varepsilon\)满足一个处于\(Ax \leq b\)的某一行中的紧的约束\(a_i^\top x =b_i\)。假如我们令\(y_k=b_i-a_i^\top x\),其余满足\(y_i=x_i\),那么在\(a_i^\top x \leq b_i\)代入坐标变换后直接变成\(y_k \geq 0\),成了矩阵外的某个约束;而原本的\(x_k \geq 0\)变成了\(\dfrac{y_k-b_i+a_i^\top y-a_i(k)y_k}{-a_i(k)} \geq 0\),成了矩阵内的某个约束。因此原本的一切形式依然成立!

现在来考虑一般的标准型。它写作\(Ax=b\)\(x \geq 0\),最小化\(c^\top x\)。现在的问题时,执行单纯形法我们需要一个起点,在刚才的过程中因为原点“一定是节点”,所以我们的单纯形一律从原点出发。但现在原点可能是不可行的,那么如何找到一个起点呢?我们可以构造一个线性规划来寻找起点——假设原本的线性规划共有\(m\)个约束(即\(A\)\(m\)行的),那么我们构造\(z_1,\cdots,z_m\),把它依次加到每个约束上得到\(Ax+z=b\),并要求\(x \geq 0,z \geq 0\),现在最小化\(z_1+z_2+\cdots+z_m\)。这样一个线性规划我们是容易找到起点的,只需令所有的\(x\)取0,\(z_i\)\(b_i\)即可。由它出发做单纯形我们就能得到\(\sum z_i\)的最小值。如果这个最小值是0,即如果所有\(z_i\)都取0是一个可行解, 那么我们就找到了原本线性规划的一个“节点”(可以验证有\(n\)个不等式是紧的),起点就找到了!如果这个最小值大于0,则意味着在原线性规划里满足所有约束的点是不存在的,如果存在我们就可以得到\(z_i \equiv 0\)在新的线性规划里是一个可行解,那样最小值就可以是0了,矛盾。因此当且仅当这个最小值是0我们能够找出一个起点。从这个起点出发做单纯形法(需要坐标变换,上面证明的坐标变换是当一个不等式取紧时的变换,当同时有多个坐标取紧的时候只需多次使用单个不等式的变换方法即可)我们就解决了一般标准型的单纯形法的问题。

还要解决的一个问题是,有可能单纯形上的一个节点是由超过\(n\)个方程同时确定的,此时可能出现的情况是尽管我们走到一个新的节点上使我们依然保证有\(n\)个方程满足,但它有可能破坏了另一个不在原来的\(n\)个约束里的不等式。于是在单纯形法的执行过程中就会出现即使一个点原本不是极大值点,但它也没有办法被转移到任何相邻节点,因为这样的转移破坏了约束所以被认为是不合法的。这样的问题称为“退化”的问题。解决的方法是对于那样的“退化”情况,我们给确定这个节点的各个方程的系数加上一个十分微小的扰动,通过这样的扰动来保证每个节点都是恰好被\(n\)个方程确定的,这样在转移的时候就不会破坏其它没有被考虑在内的不等式了。

单纯形法的时间复杂度分析

对于线性规划问题\(x \geq 0, Ax \le b\),最大化\(c^\top x\)。假设\(A\)\(m \times n\)的,那我们有\(m+n\)个约束不等式。现在我们来分析复杂度。

对于每个点,我们认为我们此时处于“原点”。由于我们定义了它的邻居是与它恰好有\(n-1\)个相同不等式确定的点,因此此时我们要一个不等式\(x_i \geq 0\)的不等式,新增一个不等式。踢掉的不等式有\(n\)种选择,加入的不等式有\((n+m)-n\)种选择,故共有\(n \times m\)种选择。我们需要根据新的不等式求出节点,由于只需要解一个方程,复杂度为\(O(n)\)。其次我们需要检验目标函数的值是否更大,也同样消耗\(O(n)\)的复杂度。接着我们要进行坐标变换,它相当于修改\(A\)的系数,因此也不超过\(O(nm)\)。综上,对于每个点需要\(O(nm)\)的复杂度来转移到下一个点。

而总共的节点数达到了\(\dbinom{n+m}{n}\)个,因此单纯形法的复杂度达到了\(O(nm\dbinom{n+m}{n})\)。根据Stirling公式这达到了指数级别,这表明单纯形法是指数级的算法。但这并不意味着单纯形法是不优秀的线性规划算法,它恰恰是多年来应用最广的算法——尽管我们分析了最坏情况下单纯形法是指数级别的,但人们(好像是交大学长)严格分析出了在大多数情况下单纯形法的复杂度都是多项式级别的,因为单纯形法的复杂度分布只在少数点出陡然增长为极大值,而在大多数区域都在较低的区域。我们在具体的线性规划中几乎不会遇到那样极端的例子,即便遇到了我们只需做轻微扰动就可以转化为多项式复杂度的问题。这就是为什么单纯形法应用如此广泛。另外应当指出,人们已经发现了多项式复杂度的算法(比如“内点法”)来解决线性规划问题了。

门电路

最后我们来看一个门电路的例子。一个由与门、或门、非门构成的网络是DAG,有多个输入和一个输出。我们现在要说明,在门电路上给定输入求解输出本质上是一个线性规划问题。每个门对应着一个变量,由于取值范围必须是实数,我们给约束\(0 \leq x \leq 1\)。输入就是等式约束。而\(x_1,x_2\)做与操作得到\(x_3\)只需用三个约束来描述:\(x_3 \leq x_1,x_3 \leq x_2,x_3 \geq x_1+x_2-1\)。同样的,或操作的约束为:\(x_3 \geq x_1,x_3 \geq x_2, x_3 \leq x_1+x_2\)。非操作对应为:\(x'=1-x\)。由于最终的输出其实是一个确定的值,所以最大化它或最小化它都无所谓。这样我们就把门电路问题转化为线性规划问题了。

而我们知道,计算机最底层的运行方式就是门电路。因此这也就说明计算机最底层的逻辑可以用线性规划来解释。

posted @ 2023-04-30 12:57  DennyQi  阅读(162)  评论(2编辑  收藏  举报