运筹学的第一课:单纯形法

导读

运筹学第一课会给你讲线性规划,也就是从初中以来我们拿多元一次方程组做的“旅游叫车问题”、“投资问题”等等。相信在这个时候,每个人的第一印象是:我感觉我行了。然后老师就开始讲单纯形法。从那时候起,理智直接归零,再也没恢复,于是便带着满脑子问号开始了除了上课以外的其他任何事情

这里就简单梳理一下单纯形法的概念步骤

单纯形法简介

单纯形法是求解线性规划问题最常用、最有效的算法之一。单纯形法最早由 George Dantzig于1947年提出,近70年来,虽有许多变形体已经开发,但却保持着同样的基本观念。如果线性规划问题的最优解存在,则一定可以在其可行区域的顶点中找到。基于此,单纯形法的基本思路是:先找出可行域的一个顶点,据一定规则判断其是否最优;若否,则转换到与之相邻的另一顶点,并使目标函数值更优;如此下去,直到找到某最优解为止 。

——摘自百度百科【单纯形法】

简单地说,单纯形法就是解决线性规划的另一种选择。毕竟,我们既然在大学的线性代数里面学习了多元一次方程增广矩阵,那么单纯形法就单纯的是用大学生的方法解决初中生的问题。那这个锅老师就不该背了,感觉难实际上是工具难用

单纯形法的步骤简介

题目一开始会给定约束方程,比如说:

{ 5 x 1 + 6 x 2 ≤ 10 3 x 1 − 2 x 2 ≥ 6 x 1 , x 2 ≥ 0 \left\{\begin{matrix} 5x_1&+&6x_2&\le&10\\ 3x_1&-&2x_2&\ge&6\\ x_1&,&x_2&\ge&0 \end{matrix}\right. 5x13x1x1+,6x22x2x21060

然后就让你求目标函数的最优解,就假设是:

z m a x = 9 x 1 + 8 x 2 z_{max}=9x_1+8x_2 zmax=9x1+8x2

如果单纯使用线性规划做,两个未知数的情况下是可以做的。但是四个呢?十个呢?这些就没有办法了。

而矩阵就是高维的抽象表达,可以参考我之前写的多元函数的梯度下降。所以,这里就用我们大学里面最熟悉的增广矩阵来解决这些非线性的多元一次方程组

但是直接做肯定是不可以的,因为使用条件是方程组,这就规定了必须得是等式。所以,人为的添加变量:

{ 5 x 1 + 6 x 2 + x 3 = 10 3 x 1 − 2 x 2 − x 4 = 6 x 1 , x 2 , x 3 , x 4 ≥ 0 \left\{\begin{matrix} 5x_1&+6x_2&+x_3&&=&10\\ 3x_1&-2x_2&&-x_4&=&6\\ x_1,&x_2,&x_3,&x_4&\ge&0 \end{matrix}\right. 5x13x1x1,+6x22x2x2,+x3x3,x4x4==1060

虽然第三个式子依然是不等式,但是这个没什么影响。我们可以不考虑第三个不等式然后求出所有的解,最后根据第三个不等式筛选出全都是正数的解就好了。

于是,整个方程组就剩下:

{ 5 x 1 + 6 x 2 + x 3 = 10 3 x 1 − 2 x 2 − x 4 = 6 \left\{\begin{matrix} 5x_1&+6x_2&+x_3&&=&10\\ 3x_1&-2x_2&&-x_4&=&6 \end{matrix}\right. {5x13x1+6x22x2+x3x4==106

我们做出增广矩阵

[ 5 6 1 0 10 3 − 2 0 − 1 6 ] \left[\begin{matrix} 5&6&1&0&10\\3&-2&0&-1&6 \end{matrix}\right] [53621001106]

但是我们的目标是找出最优,而不是求出解。所以再加上一些行列:

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 3 x_3 x3
x 4 x_4 x4
λ j \lambda_j λj

突然蒙圈了?没有关系,看看下面的说明

单纯形法的一些说明

简介不需要明白太多,毕竟几十年前的东西了。这里就直接开始说明矩阵的构成。

由于市面上不同的书有着不同的版本,我这里就选择西安邮电大学史新峰老师的教学视频里使用的矩阵格式进行说明,因为这个矩阵是我认为最简洁最好懂的

另外说明一点:我会把需要说明的部分高亮标记,但是这并不代表文字对应的意义,而应当是表格的该位置对应的意义

决策变量

以下表格中标红的便是决策变量

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 3 x_3 x3
x 4 x_4 x4
λ j \lambda_j λj

基变量

下面这个表格中标蓝的是基变量

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 3 x_3 x3
x 4 x_4 x4
λ j \lambda_j λj

工艺常数

下面这个矩阵中标绿了的地方就是工艺常数

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 3 x_3 x3 5 5 5 6 6 6 1 1 1 0 0 0
x 4 x_4 x4 3 3 3 − 2 -2 2 0 0 0 − 1 -1 1
λ j \lambda_j λj

右端常数

下面这张表中标记为冷铜色的地方就是右端常数

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 3 x_3 x3 10 10 10
x 4 x_4 x4 6 6 6
λ j \lambda_j λj

空白处

下面表格中使用 Φ \Phi Φ填充的格子中,并没有可以填的数据,所以一般都空着

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 3 x_3 x3
x 4 x_4 x4
λ j \lambda_j λj Φ \Phi Φ Φ \Phi Φ

θ \theta θ

下面表格中标紫了的地方就是 θ \theta θ

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 3 x_3 x3 2 2 2
x 4 x_4 x4 2 2 2
λ j \lambda_j λj

检验数

下面表格中标蓝了的地方就是检验数

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 3 x_3 x3
x 4 x_4 x4
λ j \lambda_j λj 9 9 9 8 8 8 0 0 0 0 0 0

其实这一行是人工添加的,就像是特征工程里面会人工添加特征让数据更清晰一样。这里原本应当填入的数据是我们的目标函数。我们一开始拿到的目标方程是 z m a x = 9 x 1 + 8 x 2 z_{max}=9x_1+8x_2 zmax=9x1+8x2,那么就应当是填成表格上所显示的那样

把其中的一些部分组合起来

到这里,表格的每个部分代表什么意思都已经介绍完了。接下来,一些特定部分组合起来也有特殊的意义。

约束方程

在这里其实约束方程并不是一开始题目所给的不等式方程组而是我们人工添加变量后拿到的等式方程组

也就是工艺常数部分加上右端常数部分。

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 3 x_3 x3 5 5 5 6 6 6 1 1 1 0 0 0 10 10 10
x 4 x_4 x4 3 3 3 − 2 -2 2 0 0 0 − 1 -1 1 6 6 6
λ j \lambda_j λj

典则形式

约束方程部分加上检验数部分,也就是工艺常数右端常数以及检验数

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 3 x_3 x3 5 5 5 6 6 6 1 1 1 0 0 0 10 10 10
x 4 x_4 x4 3 3 3 − 2 -2 2 0 0 0 − 1 -1 1 6 6 6
λ j \lambda_j λj 9 9 9 8 8 8 0 0 0 0 0 0

计算步骤

好了,全部介绍完了,接下来就是真正的计算了。

类似我们刚刚举例的“典则形式”应该是没有什么问题了吧?先完善一个增广矩阵,接着再根据目标函数把下面的检验数补齐。这都没什么问题。问题在下面的寻找最优

判断条件(一)

什么时候我们拿到了最优解?那就是检测数没有正数的时候。我们可以看到现在的典则形式还有 9 9 9 8 8 8两个正数,所以现在显然不是最优解。

出基和进基

既然不是最优解,那么我们就根据出基入基的规则进行判断。首先,我们选择检测数最大的一个,也就是 9 9 9,即 x 1 x_1 x1列。接着我们用 x 1 x_1 x1列的数字根据行对应分别除以右端常数,bin并将得出来的数字一一根据行对应填在 θ \theta θ列内,得:

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 3 x_3 x3 5 5 5 6 6 6 1 1 1 0 0 0 10 10 10 2 2 2
x 4 x_4 x4 3 3 3 − 2 -2 2 0 0 0 − 1 -1 1 6 6 6 2 2 2
λ j \lambda_j λj 9 9 9 8 8 8 0 0 0 0 0 0 Φ \Phi Φ Φ \Phi Φ

接着我们再 θ \theta θ列中选择一个最小的由于这里都是 2 2 2,所以我选择 x 3 x_3 x3),也就是 x 3 x_3 x3。于是, x 1 x_1 x1成为了基变量,叫进基 x 3 x_3 x3不再是基变量,叫出基

于是矩阵稍微改写(将基变量部分中的 x 3 x_3 x3改为 x 1 x_1 x1):

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 1 x_1 x1 5 5 5 6 6 6 1 1 1 0 0 0 10 10 10 2 2 2
x 4 x_4 x4 3 3 3 − 2 -2 2 0 0 0 − 1 -1 1 6 6 6 2 2 2
λ j \lambda_j λj 9 9 9 8 8 8 0 0 0 0 0 0 Φ \Phi Φ Φ \Phi Φ

矩阵变换

线性代数告诉我们:在研究高维度的时候,如果有几个相互垂直的单位向量,那么一定会这么写:

e 1 e_1 e1 e 2 e_2 e2 ⋯ \cdots e n e_n en
e 1 e_1 e1 1 1 1 0 0 0 ⋯ \cdots 0 0 0
e 2 e_2 e2 0 0 0 1 1 1 ⋯ \cdots 0 0 0
⋮ \vdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots
e n e_n en 0 0 0 0 0 0 ⋯ \cdots 1 1 1

所以,如果 x 1 x_1 x1作为基变量,那么我们刚刚确认的 x 1 x_1 x1列和 x 3 x_3 x3行交界处应当通过初等行变换改成 1 1 1,同时 x 1 x_1 x1其余所有位置应当改为 0 0 0。别忘了,初等行变换只能行与行之间进行加减乘除,列与列之间的任何变换都是不允许的。当然,像右下角两个本来就没有值的地方不需要变换,因为没有任何意义

这个中间计算步骤我们就省略了,直接看我们第一次执行的结果:

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 1 x_1 x1 1 1 1 6 5 6\over5 56 1 5 1\over5 51 0 0 0 2 2 2需刷新
x 4 x_4 x4 0 0 0 − 28 5 -\frac{28}{5} 528 − 3 5 -\frac{3}{5} 53 − 1 -1 1 0 0 0需刷新
λ j \lambda_j λj 0 0 0 − 14 5 -\frac{14}{5} 514 − 9 5 -\frac{9}{5} 59 0 0 0 Φ \Phi Φ Φ \Phi Φ

判断条件(二)

如何判断计算是否结束了?那就是最后的 λ \lambda λ行是不是没有正数了。我们现在看到确实没有正数了,但是这样直接算还是太麻烦了。所以,强行继续,再来第二次:

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 b b b θ \theta θ
x 1 x_1 x1 1 1 1 0 0 0 1 14 1\over14 141 − 3 14 -\frac{3}{14} 143 2 2 2 5 3 5\over3 35
x 2 x_2 x2 0 0 0 1 1 1 3 28 3\over28 283 5 28 \frac{5}{28} 285 0 0 0 0 0 0
λ j \lambda_j λj 0 0 0 0 0 0 − 3 2 -\frac{3}{2} 23 1 2 1\over2 21 Φ \Phi Φ Φ \Phi Φ

有些版本中的矩阵会看起来更复杂,实际上有这些就够了。

写出结果

我们这个时候基本上就可以认定

{ x 1 = 2 x 2 = 0 \left\{\begin{matrix} x_1=2\\x_2=0 \end{matrix}\right. {x1=2x2=0

最终,我们所需要求的最大结果就是:

z m a x = 9 x 1 + 8 x 2 = 18 z_{max}=9x_1+8x_2=18 zmax=9x1+8x2=18

总结

看出来了吗?最核心的几点就是:

  • 首先根据题目所给的条件填入矩阵中;
  • 其次选择最大的 λ \lambda λ,根据这一列和右端常数计算出 θ \theta θ,接着选出最小的 θ \theta θ可以横竖各画一道杠,做个标记),最后该所代表的基变量出基、该所代表的决策变量进基
  • 将做标记的列化成单位列向量,要求是交点处为 1 1 1其他位置是 0 0 0
  • λ \lambda λ列有正数吗?有还要继续基变量部分如果还存在人为添加的辅助变量也要继续即没有正数又没人工变量就可以结束了
  • 最后,把此时的右端常数当作结果抄下来。

这就是运筹学的单纯形法。是不是有点能理解了呢?

  • 30
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ordinary_brony

代码滞销,救救码农

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值