一、单纯形表的标准形式
相信很多学习过运筹学的小伙伴都曾经被单纯形法和单纯形法表惹恼过,究竟怎样计算检验数,怎样进行最优性检验,怎样选择出基变量、入基变量,怎样得到解等一系列流程,为什么这样这样、那样那样我们就得到最优解了呢?今天我们就从头开始构建单纯形表,并在构建过程中推导单纯形法的底层逻辑。
1、为什么需要单纯形表?
单纯形表只是一个辅助工具,其本质就是利用矩阵的形式表示原有线性模型(各个等式),从单纯形表中获得解、改进方向、目标函数值等信息。为了让我们更直观地观察迭代的具体情况,更方便地进行换基、线性变换、判断最优解等操作。接下来我们通过Excel为大家展示如何构建单纯形表的标准形式以及怎样在单纯形表上进行迭代。
2、单纯形法表的标准形式
首先声明,并不存在所谓的“单纯形表的标准形式”,在不同的教材上看到不一样的单纯形表是非常正常的。这也从侧面说明,单纯形表只是一个辅助工具,用于表达原有线性模型,我们只是通过改变(线性变换)单纯形表的模样,从而获得解、改进方向、目标函数值等信息。
(1)首先进行标准化;【运筹学】线性规划问题的标准化及其意义(针对单纯形法)
(2)接着我们来看标准线性模型的矩阵表达形式:
主要约束与目标函数的矩阵表达形式:
(3)紧接着,我们用矩阵将其A(约束系数矩阵),b(约束值),c(目标函数系数)裱起来:
这样,我们就把 单纯形表的形式给确定了,单纯形法的迭代过程无非是在这个表上 进行矩阵线性变换而已。
x1 x2 x3 x4 x5 b 约束1 1 1 0 1 0 18 约束2 -2 0 1 0 0 -2 约束3 0 3 5 0 -1 15 目标函数 -2 -1 -9 0 0
二、利用单纯形表进行迭代
1、从单纯形表中得到解的情况
我们在单纯形法的理解中讲到,单纯形法的迭代就是寻找下一个顶点(确定紧约束集),同时我们也讲了确定紧约束的方法:现在相当于有五个约束,五个变量,因此我们需要五个紧约束(也就是确定五个等式约束);
现在已有三个等式约束,所以我们需要任选两个决策变量使其等于0(成为紧约束),现在我们x3=0,x5=0,通过解线性方程组得到解(x1=1,x2=5,x3=0,x4=12,x5=0),上一节中让大家自己求解一边方程组会有大用,就在此显现了。为了将解方程组的过程和单纯形表结合起来,我们还用矩阵相乘的方式表示方程组;
将x3=0,x5=0带入方程组,得到线性方程组的矩阵表达形式如下
方程组如下:
同时我们观察方程组在单纯形表中的表达形式 :
x1 | x2 | x4 | b | |
约束1 | 1 | 1 | 1 | 18 |
约束2 | -2 | 0 | 0 | -2 |
约束3 | 0 | 3 | 0 | 15 |
现在我们思考,求解方程组的结果是(x1=1,x2=5,x4=12),我们再用矩阵相乘的形式表达,不就是:
我们再考虑转换成单纯形表的形式表达,不就是:
x1 | x2 | x4 | b | |
约束1 | 1 | 0 | 0 | 1 |
约束2 | 0 | 1 | 0 | 5 |
约束3 | 0 | 0 | 1 | 12 |
那我们现在明白了,我们想要在单纯形表中得到解的结果,不就是要把这几个变量对应的列转化成单位矩阵的形式吗。因此,我们得到了基矩阵的概念,对应的决策变量就是基变量(x1,x2,x4),那么不是基变量的变量就是非基变量(x3,x5)啦!
学过线性代数的我们都知道,要将方程组的矩阵转化成单位矩阵,就只是通过简单的线性变化而已,具体流程可见附件;所以,我们得到一个不那么显而易见的结论:求解方程组的过程就是线性变换的过程。
那我们接着思考,我们对线性方程组的矩阵进行线性变换,线性方程组的矩阵就是原有问题的一部分呀,那么我们能不能直接在原来的单纯形表上进行线性变换呢?当然是可以的,因为其本质都是对矩阵进行线性变换而已。那么我们在原来的单纯形表上操作,具体流程可见附件,得到结果如下:
x1 | x2 | x3 | x4 | x5 | b | |
约束1 | 1 | 0 | -1/2 | 0 | 0 | 1 |
约束2 | 0 | 1 | 5/3 | 0 | -1/3 | 5 |
约束3 | 0 | 0 | -6/7 | 1 | 1/3 | 12 |
这样,我们就明白了,当我们想要在单纯形表中找到某个顶点解的时候,共用三个步骤:①令非基变量等于0;②将基变量对应的矩阵通过线性变换为单位矩阵;③对应的b列的值就是解的值。
2、从单纯形表中得到目标函数值
上一节中我们将A(系数矩阵)矩阵进行了变化,但是没有对目标函数进行操作,那目标函数对应的系数行有什么用呢。我们先将解(x1=1,x2=5,x3=0,x4=12,x5=0)带入目标函数,可以得到目标函数值等于-7。
目标函数如下,
现在我们想用x3,x5表示目标函数,我们先不思考为什么,先操作,怎么操作?由我们经过线性变换后的方程组可以得到,
将其带入目标函数可以得到如下表达,将解(x1=1,x2=5,x3=0,x4=12,x5=0)带入目标函数,可以得到目标函数值仍然等于-7。
我们再将其带入单纯形表,现在我们相当于用非基变量表示目标函数了,这样我们就可以非常直观的从表中获取我们想要的所有信息了。这个信息就是:当我们令x3=0,x5=0时,x1=1,x2=5,x4=12,并且目标函数值等于-7
这里我们再次重申单纯形表的本质,单纯形表只是由等式组成的矩阵,相信大家的印象应该更深刻了。
x1 | x2 | x3 | x4 | x5 | b | |
约束1 | 1 | 0 | -1/2 | 0 | 0 | 1 |
约束2 | 0 | 1 | 5/3 | 0 | -1/3 | 5 |
约束3 | 0 | 0 | -6/7 | 1 | 1/3 | 12 |
目标函数 | 0 | 0 | -25/3 | 0 | -1/3 | z+7 |
此处我们已知令x3=0,x5=0可以获得可行解,但是有些时候我们并不知道该怎样选择非基变量得到初始基可行解。因此我们可以采取两阶段法和大M法。
3、计算检验数、最优性检验
当我们用非基变量表示目标函数时,其实已经完成了计算检验数的过程,现在目标函数如下:
目标函数是求最小值,且x3=0,x5=0,x3、x5对应的目标函数系数都是负数,说明只要x3或x5增加,目标函数就能减小。
那么我们就知道该怎样进行最优性检验了,那就是:将目标函数用非基变量表示,当非基变量对应的系数都非负,那么令非基变量的值等于0便能得到最优解。
4、确定入基变量、出基变量
我们已经明白怎样在单纯形表里看出解的情况了,我们现在就考虑怎么迭代了。迭代的过程就是确定下一个顶点的过程,我们需要放宽一个约束,收紧一个约束。也就是需要确定入基变量、出基变量。
目前我们的基变量式(x1,x2,x4),非基变量是(x3,x5)。
(1)确定入基变量
例题中,我们选择了x3,x5作为紧约束,因此我们要选择放宽一个约束。目标函数中x3对应的系数是-25/3,增加相同量时,增加x3能够比增加x4更大程度上,因此我们选择增加x3,也就是放宽x3对应的约束。(其实也不一定选择x3,只不过为了确定一个准则,放宽x5同样可行;因为变化多少还需要根据步长确定)
因此我们确定了如何选择入基变量:选择目标函数中对应系数最小且为负数的非基变量。
(2)确定出基变量
入基变量后,我们思考该怎么选择出基变量呢?也就是应该使x1,x2,x4哪个变量的值等于0呢?这里我们就需要用到最小比值法来判断了。
我们先介绍最小比值法,这样我们就能保证每次迭代的时候都是可行解,其原理我们下一篇文章再详细介绍。最小比值法的步骤如下:①首先判断入基变量对应的系数值是否都是正数,如果没有正数,那么证明该问题存在无界解;②如果有正数,那么我们用b列的值除以对应的系数值,并选择最小值对应的变量作为出基变量。我们直接通过例题讲解:
第一代:解为(x1=1,x2=5,x3=0,x4=12,x5=0),目标函数值为-7;
x1 | x2 | x3 | x4 | x5 | b | |
约束1 | 1 | 0 | -1/2 | 0 | 0 | 1 |
约束2 | 0 | 1 | 5/3(3,出) | 0 | -1/3 | 5 |
约束3 | 0 | 0 | -6/7 | 1 | 1/3 | 12 |
目标函数 | 0 | 0 | -25/3(入) | 0 | -1/3 | z+7 |
第二代 :解为(x1=2.5,x2=0,x3=3,x4=15.5,x5=0),目标函数值为-32;
x1 | x2 | x3 | x4 | x5 | b | |
约束1 | 1 | 0.3 | 0 | 0 | -0.1 | 2.5 |
约束2 | 0 | 0.6 | 1 | 0 | -0.2 | 3 |
约束3 | 0 | 0.7 | 0 | 1 | 0.1(155,出) | 15.5 |
目标函数 | 0 | 5 | 0 | 0 | -2(入) | z+32 |
第三代 :解为(x1=18,x2=0,x3=34,x4=0,x5=155),目标函数值为-342;
x1 | x2 | x3 | x4 | x5 | b | |
约束1 | 1 | 1 | 0 | 1 | 0 | 18 |
约束2 | 0 | 2 | 1 | 2 | 0 | 34 |
约束3 | 0 | 7 | 0 | 10 | 1 | 155 |
目标函数 | 0 | 19 | 0 | 20 | 0 | z+342 |
目前已到最优;