线性规划

线性规划问题

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

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

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

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

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

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

网络流

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

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

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

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

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

最大流最小割定理

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

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

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

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

二分图匹配

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

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

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

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

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

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

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

对偶

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

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

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

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

maxAxbcx=minAycby

零和博弈

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

石头剪刀布

石头剪刀布的游戏规则可以写作收益矩阵G=[011101101],每行每列分别依次代表自己和对手出石头、剪刀、布得到的收益,例如自己出剪刀对手出布就对应着第二行第三列的1,代表“自己输了”。

在石头剪刀布这样一个“博弈”问题中,唯一的策略就是决定自己出某个拳的“概率”。因此我们可以用三元组(x1,x2,x3)来表示自己的决策,分别表示出石头、出剪刀、出布的概率分布情况。同样,也用(y1,y2,y3)来表示对手的决策。 由此我们可以计算出在这样的决策下己方的博弈期望E=i=13j=13Gijxiyj。在对方的视角下收益矩阵的每一项都要取相反数,因此期望为E。站在自己的视角我们希望最大化E,对应地对手希望最小化E

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

Min-Max定理

石头剪刀布的收益矩阵是对称的,因此我们的讨论可能存在特殊性。下面来看一个非对称的收益矩阵G=[3121]。如果己方策略为(x1,x2),对方策略为(y1,y2),我们直接写出博弈的期望E=3x1y1x1y22x2y1+x2y2

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

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

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

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

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

maxxminyi,jGijxiyi=minymaxxi,jGijxiyi=V

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

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

单纯形法的严格化

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

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

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

下一步,我们要继续找相邻节点。但由于失去了“原点”这一特殊性,描述变得非常困难。我们采用的方法是,进行适当地坐标变换,用一个新的线性规划代替目前的线性规划,使得当前点再次变为原点,这样我们就只需要重复一模一样的讨论就行了。设新的坐标为y,并且在单纯形刚刚走了那一步以后我们当前处在u=(0,0,,ε,0,,0)的位置,其中xk=ε。注意我们的坐标变换后一切必须和原先有相同的形式,我们知道xk=ε满足一个处于Axb的某一行中的紧的约束aix=bi。假如我们令yk=biaix,其余满足yi=xi,那么在aixbi代入坐标变换后直接变成yk0,成了矩阵外的某个约束;而原本的xk0变成了ykbi+aiyai(k)ykai(k)0,成了矩阵内的某个约束。因此原本的一切形式依然成立!

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

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

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

对于线性规划问题x0,Axb,最大化cx。假设Am×n的,那我们有m+n个约束不等式。现在我们来分析复杂度。

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

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

门电路

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

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

posted @   行而上  阅读(343)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示