介绍单纯形法的引例。
如果觉得对运筹学学习和教学有用,请关注和转发!
01单纯形法的概述
之前提到,对于LP问题,如果它有最优解,肯定可以在顶点上取到最优值。
因此,找LP问题的最优解,也就转换为找最优顶点。那么,如何寻找LP问题的最优顶点呢?有三种基本思路:
1)穷举法:我们知道,LP问题的个数有限。因此,可以把所有的顶点按某种顺序都找出来,一一比较,直到找到最优的顶点;
2)单纯形法:单纯形法本质上还是穷举法,但穷举的时候用了点智慧,就是每次去找比当前更好的顶点,直到找到最优的顶点。
3)内点法:穷举法和单纯形法只在顶点中找最优解。而内点法,是从LP问题可行域的内点出发,不断去靠近边界,直到找到最优顶点为止。
关于单纯形法的基本发展历史如下:
我们已经知道,单纯形法是每次找更好的顶点。那么,问题也就来了:
1)如何找到初始顶点?既然单纯形法是在顶点集合中找最优顶点。那么,如何找到一个初始顶点呢?顶点和基可行解是对应的,换句话说,需要找到一个初始基可行解,而找基可行解就是解线性方程组AX=b;
2)如何判断是否达到最优?给了一个顶点,怎么去判断它是不是最优顶点,这需要有一个简单且有效的方法。
3)如何找到更好的顶点?如果当前顶点不是最优的,那么,怎么去找一个更好的顶点呢?这里面涉及两步:第一,指出更好顶点的方向;第二,在当前顶点基础上,把更好顶点找出来。
接下来,我们用一个引例来说明单纯形算法的基本思想。
02单纯形法的引入
比如,有这样一个资源利用问题。有甲、乙两种产品,单位利润分别为40和50,生产它们需要消耗资源A1、A2、A3。生产单位甲产品消耗1单位A1、3单位A2,生产单位乙产品消耗2单位A1、2单位A2、2单位A3。A1、A2和A3的资源总量是30、60、24。
问如何安排生产甲和乙,使得在不超过A1、A2、A3资源总量前提下,使得总利润最大?
1
问题建模
假定生产甲产品x1,乙产品生产x2,将A1、A2、A3的资源约束和目标函数写出来,就得到以下线性规划模型:
2
化为标准型
根据单纯形法的思路,需要先找到一个初始顶点,也就是初始基本可行解。为此,需要将它化为标准型,才有可能找到初始基本可行解。
3
找初始基本可行解
前面讲到,找基本可行解,首先找到基矩阵B对应的基变量XB,然后令非基变量XN为0,代入AX= b 或BXB+NXN=b,解出基变量XB= B^(-1)b。
其实质是对系数矩阵A=(B | N)进行初等变换,将基变量对应的矩阵B变成单位阵I,这样就找到了一个基本解XB= B^(-1)b。
对于上面的标准型,可找到初始基本可行解如下:
4
判断是否最优
可以看出,对于初始可行解(0,0,30,60,24)而言,该方案表示不生产甲、乙两种产品,总利润为0。
从直觉上来讲,这个方案导致了资源完全浪费,肯定不是最优方案。
从数学上来看,观察目标函数Z=0+40X1+50X2,0代表初始可行解(0,0,30,60,24)的利润,40和50分别代表每增加1单位甲产品(X1)和乙产品(X2)带来的利润增量。
换句话说,在当前方案(0,0,30,60,24)的基础上,无论是生产甲还是乙,都可以带来利润的增加。因此,当前方案不是最优的。
5
找更好的基本可行解
既然方案(0,0,30,60,24)不是最优的。那么,到底是生产甲还是生产乙呢?
因为50>40,从短期来看,每生产1单位乙产品增加的利润更大。
所以,在方案(0,0,30,60,24)的基础上,尽可能地生产乙产品更有利。那就意味着,我们要从方案(0,0,30,60,24)出发,找到一个更好的新方案。
方案(0,0,30,60,24)是不生产甲和乙,新的方案则需要在不生产甲产品的基础上(X1=0),尽可能多地生产乙产品。
但是,资源是有限制的。那么,究竟生产多少乙产品合适?一个基本条件就是要满足A1、A2、A3的剩余资源量X3、X4、X5>=0。
因此,在方案(0,0,30,60,24)的基础上,保持X1=0(不生产甲),做一个简单的计算:
可以发现:乙产品最多能生产X2=12。同时,A3的资源剩余量X5=0。
在这个过程中,最初的方案X2=0,X5=24,而新的方案X2=12,X5=0。换句话说,X2从非基变量变成基变量,X5从基变量变成非基变量。
换句话说,从一个基可行解变换到另外一个基可行解,必然涉及到基变量和非基变量的互换。这就涉及单纯形法的进基、出基和换基。
从非基变量变成基变量,称为进基;从基变量变成非基变量,称为出基。通过基变量和非基变量的一进一出,这个就是换基。
当然,哪个基变量换出来,这就涉及最小比例法则:X3、X4、X5对应的比例分别是30/2,60/2,24/2。因为24/2最小,所以X5出基。
将上面的过程从初等变换和解线性方程组的角度来重新表述,就是:
将上面的过程总结一下,单纯法的基本步骤就是:
1) 找初始基本可行解:找到初始基变量X3,X4,X5,对应的基矩阵为单位阵I,容易得到初始基本可行解(0,0,30,60,24);
2)判断是否最优:因为50>40>0,利润还能增加。(0,0,30,60,24)不是最优;
3) 基本可行解的变换:
(1)进基:50>40>0,X2进基(最大检验数原则);
(2)出基:60/2>30/2>>24/2,X5出基(最小比例原则);
(3)换基:X2:非基变量->基变量,X5:基变量->非基变量。通过初等变换,进行换基运算,就从初始基本可行解(0,0,30,60,24)变换到更好的基本可行解(0,12,6,36,0)。
7
继续迭代
按照前面的思路,考察目标函数Z= 600+40X1-25X5,600是(0,12,6,36,0)的目标值,可以看出X1的系数40>0,X5的系数-25<0。
这就意味着,增加1单位X1(生产甲产品)可以增加利润40,而增加1单位X5(X5是A3的剩余量,等价于节约1单位A3)会减少利润25。
因此,(0,12,6,36,0)不是最优,可以继续增加X1。
接下来的步骤跟前面是类似的,也就是继续进行进基、出基和换基的过程。具体过程如下:
目标函数Z=975-35/2X3 -15/2X4,X3和X4的系数-35/2<-15/2<0。换句话说,增加X3或X4(节约A1或A2)都是不明智的。
至此,我们就找到了最优解(15,15/2,0,0,9)。也就是,生产甲产品15,生产乙产品15/2,A3资源剩余量为9,最大的总利润是975。
为什么说单纯形法本质是在从一个初始顶点出发,不断去找更好的顶点,一直到找到最优顶点为止呢?
将上面的迭代过程在二维图形上显示如下:
可以看出,单纯形法确实是从顶点O出发,每次去找更好的顶点,直到找到最好的顶点C为止,而顶点D则在整个过程中没有被找过。
3从矩阵角度看单纯形法
回顾上述单纯形的迭代过程,可以发下: 1)一方面,尽管只有两个变量,但还是涉及到找初始基本可行解、进基、出基和换基等过程。如果变量再多一些,还能靠手算去实现上述迭代过程吗? 2)另一方面,除了选进基、出基涉及比较和除法运算,找初始基本可行解和换基运算都涉及到初等行变换和线性方程组的知识。 从代数角度来看,单纯形法的迭代过程其实是一个机械化的代数运算过程。 因而,我们可以从矩阵和初等行变换的角度来重新审视单纯形法的迭代过程,将其算法过程一般化和机械化,进而能够借助计算机的强大计算能力使用单纯形法求解实际问题。 从矩阵角度来看单纯形法的具体过程,可以参考如下: 1) 找到一个初始基本可行解。也就是在矩阵A找到一个单位阵I,得到初始基本可行解(0,0,30,60,24);然后,在此基础上找进基变量X2(检验数50>40>0)、出基变量X5(最小比例24/2);2) 找到了进基变量X2、出基变量X5,如何进行换基运算呢?本质上,是对矩阵A进行初等行变换,将进基变量X2的列向量(2 2 2 50)变换成(0 0 1 0);
3) 找到进基变量X1(检验数40>0)、出基变量X3(最小比例6/1);
4) 对变量X1和X3进行换基运算,通过初等行变换将进基变量X1的列向量(1 3 0 40)变换成(1 0 0 0);
5) 找到进基变量X5(检验数15>0)、出基变量X4(最小比例18/2);
6) 对变量X1和X3进行换基运算,通过初等行变换将进基变量X1的列向量(-1 2 1/2 15)变换成(0 1 0 0);
7) 非基变量X3和X4的系数-35/2
04 单纯形法总结将上面的过程总结一下,可以发现:
尽管单纯形法的基本思想比较简单,但单纯形法的代计算过程中,尤其是对实际问题来说,还是有一些技术细节需要在后续进一步讨论。
声明:本公众号致力于运筹学教学和运筹学知识科普,非商业行为。写作过程中难免会参考借鉴一些教材和其他资料。如无特殊说明,版权属于原作者。如有版权问题,请您后台留言,我们将进行相应处理。
如果觉得对运筹学学习和教学有用,请关注和转发!