必须承认,上学的时候线性规划这门课完全没听懂。参加工作后,需要根据线性规划原理写一个算法,没办法,只好自己从头学,几经周折终于弄明白。感觉单纯形方法一节课足以讲明白,不知道教材为什么写得这么深奥难懂,而且竟然需要用一学年时间授课。
本文,我按自己的理解讲一下单纯形方法。我保证,稍加耐心看明白这篇文章,你能把单纯形算法DIY出来。
典范型
从一个实际例子开始讨论。
例1 求解下述LP问题最优解:
m
a
x
z
=
2
x
1
+
3
x
2
+
4
(1)
\tag{1} max \ \ z = 2x_1 + 3x_2 + 4
max z=2x1+3x2+4(1)
s.t.
{ 5 x 1 + 2 x 2 ≤ 40 3 x 1 + 5 x 2 ≤ 30 − x 1 + 3 x 2 ≤ 9 x 1 , x 2 ≥ 0 (2) \tag{2} \begin{cases} & 5x_1 + 2x_2 &\le& 40 \\ & 3x_1 + 5x_2 &\le& 30\\ & -x_1 + 3x_2 &\le& 9 \\ & x_1 , x_2 &\ge& 0 \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧5x1+2x23x1+5x2−x1+3x2x1,x2≤≤≤≥403090(2)
LP问题有很多种表达形式,我比较喜欢上面这种,解的可行域差不多是上图这个样子,在这样一个可行域里,寻找目标函数的最大值。最优解通常位于可行域顶点位置。感觉上面这种表达形式比较符合直观想象。
本文中我们把上述形式的LP模型称为典范型。
标准型
约束条件(2)是不等式,引入松弛变量
x
3
,
x
4
,
x
5
x_3,x_4,x_5
x3,x4,x5将其变为等式。
m
a
x
z
=
2
x
1
+
3
x
2
+
4
(3)
max \ \ z = 2x_1 + 3x_2 + 4 \tag{3}
max z=2x1+3x2+4(3)
s.t.
{
5
x
1
+
2
x
2
+
x
3
=
40
3
x
1
+
5
x
2
+
x
4
=
30
−
x
1
+
3
x
2
+
x
5
=
9
x
1
,
x
2
,
x
3
,
x
4
,
x
5
≥
0
(4)
\begin{cases}\tag4 & 5x_1 + 2x_2 + x_3 &=& 40 \\ &3x_1 + 5x_2 + x_4&=& 30\\ &-x_1 + 3x_2 + x_5&=& 9 \\ & x_1, x_2, x_3, x_4, x_5 & \ge & 0 \\ \end{cases}
⎩⎪⎪⎪⎨⎪⎪⎪⎧5x1+2x2+x33x1+5x2+x4−x1+3x2+x5x1,x2,x3,x4,x5===≥403090(4)
上述表达形式称为LP问题的标准型,任何LP问题均可转化为标准型。如何把典范性转化为标准型,不是本文关注的问题,对此不展开讨论。需要关注的是, 约束条件中的五个变量,令它们分别等于零,则对应的图像是可行域的五条边界。 牢牢记住这一点,这是单纯形解法的关键,参见下图。
单纯形方法思路
单纯性的思路很简单,如果最优解唯一的话,它一定是可行域的一个顶点。
上面的例子中,可行域的顶点就是两条边界的交点。换句话讲,最优解的五个变量
x
1
,
.
.
.
,
x
5
x_1,...,x_5
x1,...,x5中,一定有两个变量为零,其余的大于等于零。我们先从最简单的情况开始研究。
最简单的情形
例1修改一下,把目标函数的变量系数改成负数,其它条件不变。
例2 求解LP问题:
m
a
x
z
=
−
2
x
1
−
3
x
2
+
4
(5)
max \ z = -2x_1 -3x_2 + 4 \tag{5}
max z=−2x1−3x2+4(5)
解:
由于目标函数的变量系数都是负数,很显然,
x
1
,
x
2
=
0
x_1,x_2=0
x1,x2=0 时,目标函数取得最大值。
于是,毫无悬念,问题的解为:
x
1
=
0
,
x
2
=
0
,
z
=
4.
x_1=0,x_2=0,z=4.
x1=0,x2=0,z=4.
和几何解释结合起来,问题的最优解是直线 x 1 = 0 , x 2 = 0 x_1=0,x_2=0 x1=0,x2=0的交点。 ■ \blacksquare ■
问题再复杂一点点
如果目标函数中变量系数有大于零的怎么办?答案是通过更换变量,使系数小于零。下面例子中, x 1 x_1 x1系数为正,显然 x 1 = 0 x_1=0 x1=0不再适合做此规划问题的最优解。于是我们要想办法选择一个合适的变量来置换 x 1 x_1 x1,具体方法参照下面的例子。
例3 求解LP问题:
m
a
x
z
=
2
x
1
−
3
x
2
+
4
(6)
\tag6 max \ z = 2x_1 - 3x_2 + 4
max z=2x1−3x2+4(6)
s.t.
{
5
x
1
+
2
x
2
+
x
3
=
40
3
x
1
+
5
x
2
+
x
4
=
30
−
x
1
+
3
x
2
+
x
5
=
9
x
1
,
x
2
,
x
3
,
x
4
,
x
5
≥
0
(7)
\begin{cases} 5x_1 + 2x_2 + x_3 &=& 40\tag{7} \\ 3x_1 + 5x_2 + x_4 &=& 30\\ -x_1 + 3x_2 + x_5 &=& 9 \\ x_1, x_2, x_3, x_4, x_5 &\ge& 0 \end{cases}
⎩⎪⎪⎪⎨⎪⎪⎪⎧5x1+2x2+x33x1+5x2+x4−x1+3x2+x5x1,x2,x3,x4,x5===≥403090(7)
解:
把约束方程(7)变换一下形式,用
x
1
,
x
2
x_1,x_2
x1,x2表示其它变量:
{
x
3
=
−
5
x
1
−
2
x
2
+
40
x
4
=
−
3
x
1
−
5
x
2
+
30
x
5
=
x
1
−
3
x
2
+
9
(8)
\begin{cases} x_3 &=& -5x_1-2x_2+40 \tag{8}\\ x_4 &=& -3x_1-5x_2+30 \\ x_5 &=& x_1-3x_2+9 \end{cases}
⎩⎪⎨⎪⎧x3x4x5===−5x1−2x2+40−3x1−5x2+30x1−3x2+9(8)
上述方程式左边的变量称为基变量,右边的变量称为非基变量。
寻求可行解
方程组右边的常数项都是非负的,这说明
x
1
=
0
,
x
2
=
0
x_1=0,x_2=0
x1=0,x2=0时其他变量均非负,也就是说
x
1
=
0
,
x
2
=
0
x_1=0,x_2=0
x1=0,x2=0是一组可行解。
注:本例有意忽略了可行解求法,后面会专门介绍可行解一般求法。
选择入基变量
目标函数中,非基变量
x
1
x_1
x1系数是正数,它的值越大,目标函数就越大。在单纯形方法中,非基变量最终总是要取零值的,因此,它作为非基变量不利于目标函数最大化。我们希望选择一个新的变量来置换它。这一步中,
x
1
x_1
x1称为入基变量。
选择出基变量
从基变量
x
3
,
x
4
,
x
5
x_3,x_4,x_5
x3,x4,x5选择出基变量,用于置换
x
1
x_1
x1。很显然,
x
5
x_5
x5不合适,因为在约束条件(8)中,它与
x
1
x_1
x1系数符号相同,把它放到目标函数中,它的系数仍然为正数。这不符合我们最初的想法。令其他两个个变量为零,看看
x
1
x_1
x1等于多少。
{
x
2
=
0
,
x
3
=
0
⇒
x
1
=
−
40
/
(
−
5
)
=
8
x
2
=
0
,
x
4
=
0
⇒
x
1
=
−
30
/
(
−
3
)
=
10
\begin{cases}{} x_2=0,x_3=0 &\Rightarrow& \ x_1 = -40 / (-5) = 8 \\ x_2=0,x_4=0 &\Rightarrow& \ x_1 = -30/(-3) = 10 \end{cases}
{x2=0,x3=0x2=0,x4=0⇒⇒ x1=−40/(−5)=8 x1=−30/(−3)=10
这两个解,我们肯定要选择绝对值较小的那个。为什么呢?因为如果选择较大的那个
x
1
=
10
x_1=10
x1=10(注:OA与CB的交点),也落到了可行域之外,只有最小的一个(A点)才恰好落在可行域的一个顶点上。
求最优解
x
1
,
x
3
x_1,x_3
x1,x3角色交换后,可以用
x
2
,
x
3
x_2,x_3
x2,x3表示其他变量,于是得到:
x
1
=
−
2
5
x
2
−
1
5
x
3
+
8
x_1 = -\frac25x_2 -\frac15x_3 + 8
x1=−52x2−51x3+8
代入目标函数,得到:
m
a
x
z
=
−
19
5
x
2
−
2
5
x
3
+
20
max \ z = -\frac{19}5x_2 -\frac25x_3+20 \\
max z=−519x2−52x3+20
显然,当 x 2 = 0 , x 3 = 0 x_2=0,x_3=0 x2=0,x3=0时得到最优解 z = 20 z = 20 z=20。 ■ \blacksquare ■
如何求初始可行解
前面看到如何根据第一个可行解逐步求初最优解,那么第一个可行解是如何求出来的呢?
例4 求下面LP最优解:
m
a
x
z
=
2
x
1
+
3
x
2
+
4
max \ z = 2x_1 + 3x_2 + 4\\
max z=2x1+3x2+4
s.t.
{
5
x
1
+
2
x
2
≤
40
3
x
1
+
5
x
2
≤
30
−
2
x
1
+
x
2
≤
−
1
x
1
,
x
2
≥
0
\begin{cases} 5x_1 + 2x_2 &\le& 40 \\ 3x_1 + 5x_2 &\le& 30\\ -2x_1 + x_2 &\le& -1 \\ x_1, x_2 &\ge& 0 \end{cases}
⎩⎪⎪⎪⎨⎪⎪⎪⎧5x1+2x23x1+5x2−2x1+x2x1,x2≤≤≤≥4030−10
解:
x
1
=
0
,
x
2
=
0
x_1=0,x_2=0
x1=0,x2=0不是可行解,我们需要研究如何寻找初始基础可行解。
问题转化成标准型,
{
5
x
1
+
2
x
2
+
x
3
=
40
3
x
1
+
5
x
2
+
x
4
=
30
−
2
x
1
+
x
2
+
x
5
=
−
1
x
1
,
x
2
,
x
3
,
x
4
,
x
5
≥
0
\begin{cases} 5x_1 + 2x_2 + x_3 &=& 40 \\ 3x_1 + 5x_2 + x_4 &=& 30\\ -2x_1 + x_2 + x_5 &=& -1 \\ x_1, x_2, x_3, x_4, x_5 &\ge& 0 \end{cases}
⎩⎪⎪⎪⎨⎪⎪⎪⎧5x1+2x2+x33x1+5x2+x4−2x1+x2+x5x1,x2,x3,x4,x5===≥4030−10
我们先尝试把
x
1
,
x
2
x_1,x_2
x1,x2当作非基变量,写出可行解约束方程,
{
x
3
=
−
5
x
1
−
2
x
2
+
40
x
4
=
−
3
x
1
−
5
x
2
+
30
x
5
=
2
x
1
−
x
2
−
1
\begin{cases} x_3 &=& -5x_1 - 2x_2 + 40 \\ x_4 &=& -3x_1 - 5x_2 + 30\\ x_5 &=& 2x_1 - x_2 -1 \end{cases}
⎩⎪⎨⎪⎧x3x4x5===−5x1−2x2+40−3x1−5x2+302x1−x2−1
令
x
1
=
0
,
x
2
=
0
x_1=0,x_2=0
x1=0,x2=0,我们看到
x
5
=
−
1
x_5=-1
x5=−1,所以我们确定
x
5
x_5
x5出基。入基变量如何选择?
显然应该选择系数与常数项相反的,也就是
x
1
x_1
x1。这样,
x
2
=
0
,
x
5
=
0
x_2=0,x_5=0
x2=0,x5=0时,
x
1
=
1
2
≥
0
x_1=\frac12 \ge 0
x1=21≥0。
于是问题变成,
m
a
x
z
=
4
x
2
+
x
5
+
5
max \ z = 4x_2 + x_5 + 5\\
max z=4x2+x5+5
s.t
{
x
1
=
1
2
x
2
+
1
2
x
5
+
1
2
x
3
=
−
9
2
x
2
−
5
2
x
5
+
75
2
x
4
=
−
13
2
x
2
−
3
2
x
5
+
57
2
\begin{cases} x_1 &=& \frac12x_2+\frac12x_5+\frac12\\ x_3 &=& -\frac92x_2 - \frac52x_5 + \frac{75}2 \\ x_4 &=& -\frac{13}2x_2 - \frac32x_5 + \frac{57}2 \end{cases}
⎩⎪⎨⎪⎧x1x3x4===21x2+21x5+21−29x2−25x5+275−213x2−23x5+257
现在基可行解约束方程右边的常数项全部非负。令非基变量为零,可以得到初始基可行解。
■
\blacksquare
■
小结
单纯形方法利用了可行域顶点就是非基变量为零的那些点,通过从第一个随机解,逐步进行入基/出基置换,得到第一个可行解,然后再继续入基/出基置换,得到最优解。
从几何解释上看,就是从任意一个顶点,先找到可行域的一个顶点,再不断沿着相邻顶点,最终走到最优点。
另外需要注意两个特殊情况:
- 如果目标函数中某个变量的系数大于零,但是无法找到与其置换的入基变量,该规划问题最优解是正无穷大。
- 如果目标函数中某个变量系数为零,则规划问题可能具有无数个解。
- 如果无可行解,则规划问题无解。
到这里单纯形方法的最核心内容就讲完了。通过本文获取的第一手经验,读懂专业教程应该没多大困难了。