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