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

  • Post author:
  • Post category:其他




导读

运筹学第一课会给你讲

线性规划

,也就是从初中以来我们拿多元一次方程组做的“

旅游叫车问题

”、“

投资问题

”等等。相信在这个时候,每个人的第一印象是:

我感觉我行了

。然后老师就开始讲

单纯形法

。从那时候起,

理智直接归零

,再也没恢复,于是便

带着满脑子问号开始了除了上课以外的其他任何事情

这里就简单梳理一下单纯形法的

概念



步骤



单纯形法简介

单纯形法是求解线性规划问题最常用、最有效的算法之一。单纯形法最早由 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.































































5



x










1
























3



x










1

























x










1













































+

















,





























6



x










2
























2



x










2

























x










2





























































































1


0








6








0

























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





z

m

a

x

=

9

x

1

+

8

x

2

z_{max}=9x_1+8x_2







z











m


a


x





















=








9



x










1




















+








8



x










2





















如果单纯使用

线性规划

做,

两个

未知数的情况下是可以做的。但是

四个

呢?

十个

呢?这些就没有办法了。

而矩阵就是高维的抽象表达,可以参考我之前写的

多元函数的梯度下降

。所以,这里就用我们大学里面最熟悉的

增广矩阵

来解决这些

非线性的多元一次方程组

但是直接做肯定是不可以的,因为使用条件是

方程组

,这就规定了

必须

得是

等式

。所以,人为的添加变量:





{

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.































































5



x










1
























3



x










1

























x










1


















,





























+


6



x










2



























2



x










2

























x










2


















,





























+



x










3































x










3


















,







































x










4

























x










4













































=








=






































1


0








6








0

























虽然第三个式子依然是不等式,但是这个

没什么影响

。我们可以

不考虑第三个不等式

然后

求出所有的解

,最后根据第三个不等式

筛选出全都是正数的解

就好了。

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





{

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.








{














5



x










1
























3



x










1













































+


6



x










2



























2



x










2













































+



x










3





























































x










4













































=








=





























1


0








6

























我们做出增广矩阵





[

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]








[













5








3





























6











2





























1








0





























0











1





























1


0








6




















]







但是我们的目标是

找出最优

,而不是

求出解

。所以再加上一些行列:




x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ







x

3

x_3







x










3























x

4

x_4







x










4























λ

j

\lambda_j







λ










j




















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



单纯形法的一些说明

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

由于市面上不同的书有着不同的版本,我这里就选择

西安邮电大学史新峰老师的教学视频

里使用的矩阵格式进行说明,因为

这个矩阵是我认为最简洁最好懂的

另外说明一点:我会把需要说明的部分

高亮

标记,但是这

并不代表文字对应的意义

,而应当

是表格的该位置对应的意义



决策变量

以下表格中


标红


的便是


决策变量





x

1

x_1







x










1

























x

2

x_2







x










2

























x

3

x_3







x










3

























x

4

x_4







x










4
























b

b






b







θ

\theta






θ







x

3

x_3







x










3























x

4

x_4







x










4























λ

j

\lambda_j







λ










j






















基变量

下面这个表格中


标蓝


的是


基变量




x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ








x

3

x_3







x










3

























x

4

x_4







x










4
























λ

j

\lambda_j







λ










j






















工艺常数

下面这个矩阵中


标绿


了的地方就是


工艺常数





x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ







x

3

x_3







x










3
























5

5






5









6

6






6









1

1






1









0

0






0








x

4

x_4







x










4
























3

3






3









2

-2









2









0

0






0









1

-1









1








λ

j

\lambda_j







λ










j






















右端常数

下面这张表中标记为

冷铜色

的地方就是右端常数




x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ







x

3

x_3







x










3
























10

10






1


0








x

4

x_4







x










4
























6

6






6








λ

j

\lambda_j







λ










j






















空白处

下面表格中使用



Φ

\Phi






Φ





填充的格子中,

并没有

可以填的数据,所以一般都

空着




x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ







x

3

x_3







x










3























x

4

x_4







x










4























λ

j

\lambda_j







λ










j























Φ

\Phi






Φ







Φ

\Phi






Φ









θ

\theta






θ





下面表格中


标紫


了的地方就是




θ

\theta






θ








x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ







x

3

x_3







x










3
























2

2






2








x

4

x_4







x










4
























2

2






2








λ

j

\lambda_j







λ










j






















检验数

下面表格中


标蓝


了的地方就是


检验数




x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ







x

3

x_3







x










3























x

4

x_4







x










4























λ

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







z











m


a


x





















=








9



x










1




















+








8



x










2





















,那么就应当是

填成表格上所显示的那样



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

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



约束方程

在这里其实约束方程

并不是一开始题目所给的不等式方程组



而是我们人工添加变量后拿到的等式方程组

也就是

工艺常数

部分加上

右端常数

部分。




x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ







x

3

x_3







x










3
























5

5






5









6

6






6









1

1






1









0

0






0









10

10






1


0








x

4

x_4







x










4
























3

3






3









2

-2









2









0

0






0









1

-1









1









6

6






6








λ

j

\lambda_j







λ










j






















典则形式



约束方程

部分加上

检验数

部分,也就是

工艺常数



右端常数

以及

检验数




x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ







x

3

x_3







x










3
























5

5






5









6

6






6









1

1






1









0

0






0









10

10






1


0








x

4

x_4







x










4
























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







x










1





















列。接着我们用



x

1

x_1







x










1





















列的数字

根据行对应

分别除以

右端常数

,bin并将得出来的数字一一根据行对应填在



θ

\theta






θ





列内,得:




x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ







x

3

x_3







x










3























5

5






5







6

6






6







1

1






1







0

0






0







10

10






1


0







2

2






2







x

4

x_4







x










4























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







x










3























),也就是



x

3

x_3







x










3





















。于是,



x

1

x_1







x










1























成为

了基变量,叫

进基





x

3

x_3







x










3























不再是

基变量,叫

出基

于是矩阵稍微改写(将

基变量

部分中的



x

3

x_3







x










3





















改为



x

1

x_1







x










1





















):




x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ







x

1

x_1







x










1























5

5






5







6

6






6







1

1






1







0

0






0







10

10






1


0







2

2






2







x

4

x_4







x










4























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







e










1























e

2

e_2







e










2























\cdots














e

n

e_n







e










n























e

1

e_1







e










1























1

1






1







0

0






0







\cdots














0

0






0







e

2

e_2







e










2























0

0






0







1

1






1







\cdots














0

0






0







\vdots


















\cdots














\cdots














\cdots














\cdots














e

n

e_n







e










n























0

0






0







0

0






0







\cdots














1

1






1




所以,如果



x

1

x_1







x










1





















作为基变量,那么我们刚刚确认的



x

1

x_1







x










1





















列和



x

3

x_3







x










3





















行交界处应当通过

初等行变换

改成



1

1






1





,同时



x

1

x_1







x










1























其余所有位置

应当改为



0

0






0





。别忘了,

初等行变换



只能行与行

之间进行加减乘除,

列与列之间的任何变换都是不允许的

。当然,像右下角两个

本来就没有值

的地方不需要变换,因为

没有任何意义

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




x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ







x

1

x_1







x










1























1

1






1







6

5

6\over5


















5
















6


























1

5

1\over5


















5
















1


























0

0






0







2

2






2




需刷新



x

4

x_4







x










4























0

0






0







28

5

-\frac{28}{5}





















5
















2


8


























3

5

-\frac{3}{5}





















5
















3


























1

-1









1







0

0






0




需刷新



λ

j

\lambda_j







λ










j























0

0






0







14

5

-\frac{14}{5}





















5
















1


4


























9

5

-\frac{9}{5}





















5
















9


























0

0






0







Φ

\Phi






Φ







Φ

\Phi






Φ






判断条件(二)

如何判断计算是否

结束

了?那就是最后的



λ

\lambda






λ





行是不是

没有正数

了。我们现在看到确实没有正数了,但是这样

直接算

还是太麻烦了。所以,强行继续,再来第二次:




x

1

x_1







x










1























x

2

x_2







x










2























x

3

x_3







x










3























x

4

x_4







x










4























b

b






b







θ

\theta






θ







x

1

x_1







x










1























1

1






1







0

0






0







1

14

1\over14


















1


4
















1


























3

14

-\frac{3}{14}





















1


4
















3


























2

2






2







5

3

5\over3


















3
















5


























x

2

x_2







x










2























0

0






0







1

1






1







3

28

3\over28


















2


8
















3


























5

28

\frac{5}{28}


















2


8
















5


























0

0






0







0

0






0







λ

j

\lambda_j







λ










j























0

0






0







0

0






0







3

2

-\frac{3}{2}





















2
















3


























1

2

1\over2


















2
















1


























Φ

\Phi






Φ







Φ

\Phi






Φ




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



写出结果

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

认定





{

x

1

=

2

x

2

=

0

\left\{\begin{matrix} x_1=2\\x_2=0 \end{matrix}\right.








{















x










1




















=




2









x










2




















=




0

























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





z

m

a

x

=

9

x

1

+

8

x

2

=

18

z_{max}=9x_1+8x_2=18







z











m


a


x





















=








9



x










1




















+








8



x










2




















=








1


8







总结

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

  • 首先根据题目所给的条件填入矩阵中;
  • 其次选择

    最大的




    λ

    \lambda






    λ





    ,根据这一列和

    右端常数

    计算出



    θ

    \theta






    θ





    ,接着选出

    最小的




    θ

    \theta






    θ







    可以横竖各画一道杠,做个标记

    ),最后该



    所代表的基变量

    出基

    、该



    所代表的决策变量

    进基

  • 将做标记的列化成

    单位列向量

    ,要求是

    交点

    处为



    1

    1






    1







    其他

    位置是



    0

    0






    0








  • λ

    \lambda






    λ





    列有正数吗?

    有还要继续



    基变量部分如果还存在人为添加的辅助变量也要继续



    即没有正数又没人工变量就可以结束了

  • 最后,把此时的

    右端常数

    当作结果抄下来。

这就是运筹学的

单纯形法

。是不是有点能理解了呢?



版权声明:本文为ordinary_brony原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。