线性规划,充斥着运筹学,在图的单源最短路径求解差分约束系统就是用到线性规划。怎么样问题可以建模为线性规划来解决呢?在给定的有限的资源和竞争约束情况下,取得最大化或最小化目标的问题。导论中给出政治竞选问题、航空航线调度问题、钻井采油问题。最大化或最小化目标是函数的因变量,自变量就是资源的约束因素,其函数就是由这些制约因素构成的等式或不等式。下面数学定义下线性规划。
在一般线性规划问题中,最优化一个满足一组线性不等式约束的线性函数。已知一组实数a1,a2,…,an和一组变量x1,x2,…,xn,基于这些变量的一个线性函数f定义为:
如果b是一个实数而f是一个线性函数,则等式:
f(x1,x2,…,xn)=b是一个线性等式。
f(x1,x2,…,xn)≥b和f(x1,x2,…,xn)≤b是线性不等式。
线性约束就是函数f和b的关系,就是求解n个变量m个线性不等式的最大化,约束为线性不等式的线性函数最大化称为标准型;而约束为线性等式的线性函数的最大化称为松弛型。
基于上面描述可知,线性规划问题是要最小化或最大化一个受限于一组有限的线性约束的线性函数。最小化线性规划和最大化线性规划的分类,是基于目标的需求,同样是m个线性不等式约束,去求解n个变量的值,达到目标(最大化或最小化)。
凸形区域:区域内的任何两点之间连线上的点都属于这个区域。
线性规划中,二维空间(两个变量)所构成的凸形区域为可行区域,要最大化的函数为目标函数。可行区域内的每个点都会去评估目标函数x1+x2,将目标函数的一个特点点上的值称为目标值,识别出一个有最大目标值的点就是最优解。当然有二维线性规划不等式所构成的可行区域上是有无数个点,不可能都去求值,因此需要找出一个有效的方式来寻找最大目标值的点。线性规划的最优解必定是在可行区域的边界上,所以只要沿着边界寻找顶点就可以很快找到最大目标值的点。
如果有三个变量,则每个约束以三位空间的一个半空间来描述,三个半空间的交集构成了可行区域,目标函数取目标值的点集合是一个平面。因为可行区域也是凸的,取得最优目标值的点集合必然包含可行区域的一个顶点。延伸到n个变量的超平面,每个约束定义了n维空间中的一个半空间,这些半空间的交集形成的可行区域称作单纯形,目标函数是一个超平面,且是凸性,一个最优解也是在单纯形的一个顶点上取得。理解下,无论多少维,找出凸形区域,目标函数的最优解就是在凸形区域的顶点集合之一或多个。
单纯形算法输入一个线性规划(n个变量m个线性不等式),输出一个最优解。算法从单纯形的某个顶点开始,执行一系列迭代,每次迭代中,沿着单纯形的一条边从当前顶点移动到一个目标值不小于当前顶点的相邻顶点。当达到一个局部最大值,即一个顶点的目标值大于其所有相邻顶点的目标值时,算法终止。因为可行区域是凸的且目标函数是线性的,所以具备最优事实就是全局最优的。
单纯形算法需要指数时间。线性规划的第一类多项式时间算法是椭圆算法,运行缓慢;第二类指数时间的算法是内点法,在大型输入上,性能优于单纯形算法。如果在线性规划中,所有的变量都取整数值,即整数线性规划,对于该问题,找出一个可行解是NP难度的。目前还没有已知的多项式时间算法能NP难度问题,所以没有有效的整数线性规划多项式时间算法。当然,一般的线性规划可以在多项式时间内解决。
1)标准型和松弛型
标准型的线性规划所有的约束条件都是不等式,而松弛型中的约束是等式。要用单纯形算法求解线性规划,需要将所有线性规划转化为标准型,再将标准型转化为松弛型,线性方程组等式求解。
标准型定义:
已知n个实数c 1,c 2,…,c n;m个实数b 1,b 2,…,b m;以及mn个实数a ij,其中i=1,2,…,m,而j=1,2…,n,希望找出n个实数x1,x2,…,xn来最大化目标函数:用矩阵表示更紧凑:
最大化cTx,满足约束:Ax≤b,x≥0。
满足所有约束的变量xs设定为可行解,而不满足至少一个约束的变量xs设定为不可解。称一个解xs拥有目标值cTxs,在所有可行解中其目标值最大的一个可行解xs是一个最优解,称其为目标值cTxs的最优目标值。如果一个线性规划没有可行解,则称此线性规划不可行,否则是可行的。如果一个线性规划有一些可行解但没有有限的最优目标值,则称此线性规划是无界的。
已知一个最小化或最大化的线性函数受若干线性约束,总可以将这个线性规划转换为标准型。换句话说,要将非标准型的线性规划转化为标准型的。为什么会有非标准型的线性规划呢?可能目标函数是一个最小化而不是最大化;可能拥有的变量不具有非负性约束;可能有等式约束;可能有大于等于的不等式约束,而不是小于等于。
将非标准的线性规划转化线性规划,最重要是确保转换后的线性规划最优解也是转换前的线性规划最优解,转化前后的两个线性规划是等价的。转化思路就是对目标函数系数取负,并将不具有非负约束性的变量转换成具有非负性约束的变量。
为了利用单纯形算法高效地求解线性规划,需要将标准型转换成松弛型,就是非负约束是不等式,其他约束都是等式。转换思路就是利用松弛变量,就是将不等式的余量用s来接收,从而使不等式变成等式,形式如下:基于松弛型线性规划,就可以用单纯形算法求解。
2)将问题表达为线性规划:建模
既然定义了线性规划,也知道线性规划可以在多项式时间内求解,那么对于现实的问题,那些事如果形式化为线性规划的问题来求解呢?这就涉及到建模了,现实中的问题如何建模为线性规划来求解。建模:将问题转化成数学形式来求解。
算法导论中对单源最短路径变形的单对最短路径、最大流以及最大流变形的最小费用流和多商品流形式化为线性规划。这里描述下单对最短路径和最大流的线性规划形式化。
Ø 单对最短路径问题
在单对最短路径问题中,已知一个带权有向图G=(V,E),加权函数w:E->R将边映射到实数值的权值、一个源顶点s、一个目的顶点t,要计算从s到t的一条最短路径的权值d[t]。将该问题用线性规划表示,要确定变量和约束的集合。在Belleman-Ford算法终止时,对每个顶点v,都一个值d[v],使得每条边(u,v)∈E,有d[v]≤d[u]+w(u,v)。源顶点初始得到一个值d[s]=0,如此有计算从s到t的最短路径权值的线性规划:
最大化:d[t]
满足约束:d[v]≤d[u]+w(u,v),每条边(u,v)∈E成立
d[s]=0
共有|V|个变量d[v],每个顶点v∈V各有一个,有|E|+1个约束,每条边各有一个再加上源顶点d[s]=0的额外约束。
Ø 最大流问题
已知一个有向图G=(V,E),其中每条边(u,v)∈E有一个非负容量c(u,v)≥0,以及源点s和汇点t。流是一个实数值函数f:VXV->R,满足三个性质:容量限制、斜对称性、流守恒性。最大流是满足这些约束和最大化流流量的流,其中流量值是从源流出的总流量。因此,流满足线性约束,且流的值是一个线性函数。当然如果(u,v)∉E,则c(u,v)=0。可将最大流线性规划为:共有|V|2个变量,对应于每一对顶点之间的流,且有2|V|2+|V|-2个约束。
最小费用流是最大流的每条边上加一个费用权值,多商品流是最大流的每条边容量不止给一件商品是给多件商品。
3)单纯形算法
单纯形算法是求解线性规划的古典方法。单纯形算法和高斯消元法迭代原理类似,高斯消元法是从解未知的一个线性等式系统开始。可以将单纯形算法看成是线性不等式系统上的高斯消元法。
单纯形算法的迭代主要思想是:从线性规划的松弛型中得到每次迭代关联的基本解,将每个非基本变量设为0,并从等式约束中计算基本变量的值;一个基本解对应于单纯形的一个顶点;代数上,一次迭代将一个松弛型转换成一个等价的松弛型;相应的基本解的目标值不小于前一次迭代中的目标值,要实现迭代过程中目标值的递增,要选择一个非基本变量作为指示变量,从0开始增加这个变量的值,和目标值一起增加,增加到某个基本变量变为0为止再重写松弛型,将这个基本变量和所选的非基本变量进行角色互换,就是重写线性规划直到最优解很明显。
单纯形算法主要关键是主元选择,并且有三个关键点,第一确定线性规划是可行的;第二确定线性规划是具有可行解而不是无界;第三主元如何选择换入变量和换出变量。这些到导论伪码算法描述都有说明并证明。这里一般性地理解下,要通过单纯形算法来求解,在算法之前要肯定线性是可行(单纯性算法最初有一个初始化过程,会判断线性规划是否可行,返回一个初始基本解可行的松弛型),在算法之中要确保不陷入退化或说循环(目标值越迭代越小),能够终止返回最优解。单纯形算法输入一个标准型线性规划,返回线性规划一个最优解,能够顺利找到最优解并终止算法,后续对偶型可以说明。
单纯形整个算法过程是:
首先初始化标准型线性规划,返回一个初始基本解可行的松弛型,或者返回这个线性规划不可行,推出算法;
其次对松弛型线性规划开始主元操作,选择非负系数最紧约束的换出变量,和换入变量交换,得到新的线性规划(和原来的线性规划是等价的);
不断迭代这个过程,直到最优解确定,并终止返回一个最优解。
对于松弛型线性规划通过主元操作生成的新线性规划,二者是等价的证明可以看导论中说明。现在很重要的就是主元操作迭代,是如何选择换出变量的。选择一个在目标函数中系数为正值的非基本变量,尽可能增加其值而不违反任何约束。现在通过一个例子来理解单纯形算法的过程。
第一:标准型线性规划转化为松弛型线性规划
标准型:
最大化:3x1+x2+2x3
满足约束:x1+x2+3x3≤30
2x1+2x2+5x3≤24
4x1+x2+2x3≤36
x1,x2,x3≥0
松弛型:
最大化:z=3x1+x2+2x3
满足约束:x4=30-x1-x2-3x3
x5=24-2x1-2x2-5x3
x6=36-4x1-x2-2x3
确定基本解:把等式右边的所有变量设为0,可得基本解(x1,x2,x3,x4, x5, x6)=(0,0,0,30,24,36),目标值z=0;
第二:主元操作迭代第一次,选择增加x1的值。当增加x1值时,x4, x5, x6的值随之减小,但每个变量都有非负约束,所以不能减小到负值,这个时候就要在约束函数上选择最紧约束(就是选择最小增加值)。
如果x1值增加到30,那么x4是负值;增加到12,则x5是负值;增加到9,则x6是负值;这个就知道了,9是x1值所能增加的最大值,就是最紧约束,对约束函数x6=36-4x1-x2-2x3互换变量x1和x6的角色,得到:x1=9- x2/4- x3/2- x6/4,代入原线性规划据此可得新的松弛型线性规划,如下:
最大化:z=27+x2/4+ x3/2- 3x6/4
满足约束:
x1=9- x2/4- x3/2-x6/4
x4=21-3x2/4-5x3/2+x6/4
x5=6-3x2/2-4x3+x6/2
确定基本解,同样把等式右边的所有变量设为0,可得基本解(x1,x2,x3,x4, x5, x6)=(9,0,0,21,6,0),目标值z=27;
第三:主元操作迭代第二次,选择增加x3的值,最紧约束是x5=6-3x2/2-4x3+x6/2,最大增加到3/2,否则x5的值为负,和第一次迭代一样,互换x3和x5并代入线性等式获得新的线性规划,可得基本解(x1,x2,x3, x4, x5,x6)=(33/4,0,3/2,69/4,0,0),目标值z=111/4;
第四:主元操作迭代第三次,互换x2和x4并代入线性等式获得新的线性规划,可得基本解(x1,x2,x3, x4, x5,x6)=(8,4,0,18,0,0),目标值z=28,为最优解,(x1,x2,x3)=(8,4,0)。
最关心的问题还是具有可行解的线性规划经过这样的迭代,在算法终止时是否确实能找到最优解,这个就留给线性规划对偶性来说明。
4)单纯形算法分析
现在我们知道单纯形算法可以在多项式时间内求解线性规划最优解,那么关心两点:一是算法终止时,获得的是最优解,这个就是对偶性要回答;二是输入一个线性规划要判断出是可行可解的,这个就是辅助线性规划要回答的。任何线性规划都可能是不可行的,或是无界的,或有一个优先目标值得最优解,针对这些个情况,单纯形算法要能正确识别。
线性规划的基本定理:以标准型给出任意的线性规划L可能是以下三者之一:
第一:有一个有限目标值的最优解;
第二:不可行;
第三:无界;
如果L是不可行的,单纯形算法在初始化中就会返回不可行;如果L是无界的,单纯形算法返回无界,无界就是找不到最优解或者有无限个目标值;当然,满足第一情况的,就会返回有限目标值的最优解。
单纯形算法在初始化过程中,会确定线性规划是否有可行解,如果有,则给出一个基本解可行的松弛型线性规划。这个初始化过程其实就是对线性规划测试可行解。那么是如何来确认存在可行解呢?通过构造辅助线性规划,这个辅助线性规划,比较容易找到一个基本解可行的松弛型。只要辅助线性规划有可行解,则要输入的线性规划也就有可行解。如果线性规划L没有可行解,则初始化返回不可行,否则返回一个基本解可行的合法松弛型。怎么构造辅助线性规划呢?
辅助线性规划:令L是一个标准型的线性规划,令L aux是带有n+1个变量的线性规划:最小化:-x0
满足约束:则当且仅当Laux的最优目标值为0时,L是可行的。
辅助线性规划,增加一个x0变量,并且令目标值为0。对辅助线性规划求解可行解,也是按照主元操作,将标准型转换成松弛型后不断交换变量迭代。辅助线性规划较容易找到可行解。算法导论中证明了辅助线性规划存在可行解就是要求解的线性规划存在可行解。
现在我们要引进线性规划对偶性的概念。对偶性有一个很重要的性质:在一个最优化问题中,一个对偶问题的识别总是可以在一个多项式时间内发现。对偶性是用来证明某个解确实是最优解。还是动态规划思想:已知一个最大化问题,定义个相关的最小化问题,来让着两个问题有相同的最优目标值。如最大流问题的最大流最小割原理。对偶的字面意义,就是我的解也是你的解,大问题的解是小问题的解。
已知一个目标是最大化的线性规划,制定一个对偶线性规划,其目标是最小化,而且最优值与原始线性规划相同。给定一个标准的原线性规划,定义对偶线性规划为:构造对偶,将最大化改成最小化,将约束右边的与目标函数的稀疏角色互换,并且小于等于号变成大于等于号。在原问题的m个约束中,每一个在对偶问题中都一个对应的变量yi,在对偶问题的n个约束中,每一个在原问题中都一个对应的变量xj。
开始不是很能理解这个,对着文中例子看很久才知道主要是两点:1)原线性规划中的目标函数的系数变成对偶线性规划中约束函数的右边值,原线性规划中的约束函数的右边值变成对偶线性规划中目标函数的系数;2)原线性规划中每一个约束函数的左边等于对偶线性规划中的一个变量,就是原线性规划中的m个约束函数等于m个对偶线性规划中的变量,反之也是。
导论最后只能够证明了对偶线性规划的最优值总是等于原线性规划的最优值。
线性规划弱对偶性:原线性规划的任意可行解的数值不大于对偶线性规划的任意可行解的值。
基于线性规划弱对偶性,原问题可行解的目标值不会超过对偶问题的可行解的目标值。而原线性规划是一个最大化问题,对偶性线性规划是一个最小化问题,如果原线性规划的可行解等于对偶线性规划的可行解,那这个可行解就是原线性规划和对偶线性规划的最优解。
通过构造对偶性线性规划确认最优解,通过构造辅助线性规划来确定可行解,单纯形算法是可以对任意输入一个标准型线性规划,返回或不可行或无界或最优解的。