前言

我在学习这个知识点的时候,花了不少时间,苦于网上的教程要么和老师描述的方法不一致(当然应该也可以),要么不全,所以当时在做作业题的时候,花了不少时间(>10hours)。因此想写一篇博文来清晰的记录这两种方法的用法。

单纯形法

1. 停止条件

当检验数Ci - Zi 这一行的数都小于0时, 可以停止。


2. 选择主元标准

我总结了一个小技巧: 先选检验数 Ci-Zi 那一行最大的。然后再选择 b / ai (ai > 0)最小的。
这里的ai的意思呢,大家看下面这个例子哈。

单纯形法和对偶单纯形法

我们先看 Ci - Zi 最大的那一列,是3,即 X2 那一列,这个时候我们知道换入主元是 X2。然后再看选择哪一行,这里X1 和 x5那两行可以考虑,因为呢(这里a1 = 2, a4 = 0, a5 = 4), a4 = 0不能考虑。b1 /a1 = 8 / 2 = 4, b5 / a5 = 12 / 4 = 3,我们选择小的那个。
因此换入主元是 x2, 换出主元是 x5



3. 一道例题

    max Z=2x1+3x2 求~~~~max~Z = 2x_{1} + 3 x_{2}

s.t.{x1+2x284x1164x212xi0,i=1,2 s.t. \left\{ \begin{array}{l} x1 + 2x2 ≤ 8 \\ 4x1 ≤ 16 \\ 4x2 ≤ 12 \\ xi ≥ 0, i = 1,2 \end{array}\right.

我们先对其标准化,即
    max Z=2x1+3x2 求~~~~max~Z = 2x_{1} + 3 x_{2}

s.t.{x1+2x2+x3=84x1+x4=164x2+x5=12xi0,i=1,2,3,4,5 s.t. \left\{ \begin{array}{l} x1 + 2x2 + x3 = 8 \\ 4x1 + x4 = 16 \\ 4x2 + x5 = 12 \\ xi ≥ 0, i = 1,2,3,4,5 \end{array} \right.


我们画出一个单纯形表,这里选择的主元的值为4(红色标记部分)。然后呢,这里基变量选择x3, x4, x5 是因为选他们方便,朋友们看一下基变量那一列就明白选他们计算量比较少。

b x1 x2 x3 x4 x5
x3 8 1 2 1 0 0
x4 16 4 0 0 1 0
x5 12 0 4 0 0 1
检验数Ci - Zi 2 3 0 0 0

检验数 Ci - Zi 有些大于0 。再计算。



b x1 x2 x3 x4 x5
x3 2 1 0 1 0 -1/2
x4 16 4 0 0 1 0
x2 3 0 1 0 0 1/4
检验数Ci - Zi 2 0 0 0 -3/4

检验数 Ci - Zi 有些大于0 。再计算。



b x1 x2 x3 x4 x5
x1 2 1 0 1 0 -1/2
x4 8 0 0 -4 1 2
x2 3 0 1 0 0 1/4
检验数Ci - Zi 0 0 -2 0 1/4

检验数 Ci - Zi 有些大于0 。再计算。



b x1 x2 x3 x4 x5
x1 4 1 0 0 1/4 0
x5 4 0 0 -2 1/2 1
x2 2 0 1 1/2 -1/8 0
检验数Ci - Zi 0 0 -3/2 -1/8 0

检验数 Ci - Zi 都小于0,停止计算。得出最优解 x1 = 4, x2 = 2, x5 = 4,

max Z = 2x1 + 3 x2 = 2 × 4 + 3 × 2 = 8 + 6 = 14



对偶单纯形法

1. 使用要求/条件

要求 b 那一列至少有一个数小于 0, 检验数Ci - Zi 都小于0。


2. 选择主元标准

先看b那一列,挑个最小的,然后再看 Ci - Zi 那一行,选 Zi / ai (ai < 0)最小。
大家看下面这个例子哈。
单纯形法和对偶单纯形法这里选择-2/7的理由: 先看b那一列最小的是 -6 / 7, 即换出主元是 x6 确定了, 然后我们看检验数那一列, Z3 / a3 = (-5/7) / (-1/7) = 5, Z5 / a5 = (-3/7) / (-2/7) = 3 / 2, 这里选小的,故换入主元为 x 5



3. 使用流程

先用单纯形法运算到满足对偶单纯形法的使用条件后再用对偶单纯形法。


4. 一道例题

单纯形法和对偶单纯形法
解题过程:
(1)先加入松弛变量
{3x12x2+x3=35x1+4x2x4=102x1+x2+x5=5 \left\{ \begin{array}{l} 3x1 - 2x2 + x3 = 3 \\ 5x1 + 4x2 - x4 = 10 \\ 2x1 + x2 + x5 = 5 \end{array} \right.




(2)初始的单纯形表:选定x3, x4,x5 作为基变量,这里这样选择会使得这一步计算比较少

(表1)

b x1 x2 x3 x4 x5
x3 3 3 -2 1 0 0
x4 10 5 4 0 -1 0
x5 5 2 1 0 0 1
检验数 3 -1 0 0 0



(3)这里用单纯形法换入换出变量,这里选择换出变量为x4, 换入变量为x2, 因为b/ai最小(ai>0)

这一步选择22/3

(表2)

b x1 x2 x3 x4 x5
x1 1 1 -2/3 1/3 0 0
x4 5 0 22/3 -5/3 -1 0
x5 3 0 7/3 -2/3 0 1
检验数 0 1 -1 0 0



(4)上一步检验数不全小于0,继续单纯形。这一步选择7/22.

(表3)

b x1 x2 x3 x4 x5
x1 16/11 1 0 2/11 -1/11 0
x2 15/22 0 1 -5/22 -3/22 0
x5 31/22 0 0 -3/22 7/22 1
检验数 0 0 -17/22 3/22 0

换入换出后

(表4)

b x1 x2 x3 x4 x5
x1 13/7 1 0 1/7 0 2/7
x2 9/7 0 1 -2/7 0 3/7
x4 31/7 0 0 -3/7 1 22/7
检验数 0 0 -5/7 0 -3/7

可以看到此时解仍然部位整数,不过此时检验数已经都小于0.下面就可以使用对偶单纯形法了。

对于x1 = 13/7, 找割平面 1/7 x3 + 2/7 x5 ≥ 6/7,

即 -1 / 7 x3 - 2 / 7x5 + x6 = - 6 / 7.





添加割平面,得

(表5)

b x1 x2 x3 x4 x5 x6
x1 13/7 1 0 1/7 0 2/7 0
x2 9/7 0 1 -2/7 0 3/7 0
x4 31/7 0 0 -3/7 1 22/7 0
x6 -6/7 0 0 -1/7 0 -2/7 1
检验数 0 0 -5/7 0 -3/7 0

然后选定主元-2/7.


(5)
(表6)

b x1 x2 x3 x4 x5 x6
x1 1 1 0 0 0 0 1
x2 0 0 1 -1/2 0 0 3/2
x4 -5 0 0 -2 1 0 11
x5 3 0 0 1/2 0 1 -7/2
检验数 0 0 -1/2 0 0 -3/2




(6)得出

(表7)

b x1 x2 x3 x4 x5 x6
x1 1 1 0 0 0 0 1
x2 5/4 0 1 0 -1/4 0 -5/4
x3 5/2 0 0 1 -1/2 0 -11/2
x5 7/4 0 0 0 1/4 1 -3/4
检验数 0 0 0 -1/4 0 -17/4

最优解为(1, 5/4, 5/2, 0, 7/4, 0)

很不幸,这里仍然不为整数,则对x5 = 7/4, 有1/4 x4 + 1/4 x6 ≥ 3/4,

即将 -1/4 x4 - 1/4 x6 + x7 = -3/4加入割平面.




(表8)

b x1 x2 x3 x4 x5 x6 x7
x1 1 1 0 0 0 0 1 0
x2 5/4 0 1 0 -1/4 0 -5/4 0
x3 5/2 0 0 1 -1/2 0 -11/2 0
x5 7/4 0 0 0 1/4 1 -3/4 0
x7 -3/4 0 0 0 -1/4 0 -1/4 1
检验数 0 0 0 -1/4 0 -17/4 0




(7) 化简得

(表9)

b x1 x2 x3 x4 x5 x6 x7
x1 1 1 0 0 0 0 1 0
x2 2 0 1 0 0 0 -1 -2
x3 4 0 0 1 0 0 -5 -2
x5 1 0 0 0 0 1 -1 1
x7 3 0 0 0 1 0 1 -4
检验数 0 0 0 0 0 -4 -1

最优解为(1, 2, 4, 1, 3, 0, 0)

因此maxZ 的最优解为 3x1 - x2 = 3 * 1 - 2 = 1

相关文章: