在数学中,线性规划(Linear Programming)特指目标函数和约束条件皆为线性的最优化问题。
max c T x s . t . A x ≤ b x ≥ 0 \begin{aligned}&\max c^Tx\\&s.t.Ax\le b\\&\quad \quad x\ge0\end{aligned} maxcTxs.t.Ax≤bx≥0
标准型中的线性规划是满足线性不等式约束的线性函数的最大化问题。其有以下几个特点:
下面我们举例介绍如何将一个基本的线性规划问题转化为标准型,如果我们有线性规划问题:
最小化 − 2 x 1 + 3 x 2 -2x_1+3x_2 −2x1+3x2
满足约束 x 1 + x 2 = 7 x_1+x_2=7 x1+x2=7
x 1 − 2 x 2 ≤ 4 \ x_1-2x_2\le4 x1−2x2≤4
x 1 ≥ 0 \ x_1\ \ \ \ \ \ \ \ \ \ge0 x1 ≥0
①我们将目标函数系数取负,得到:
最大化 2 x 1 − 3 x 2 2x_1-3x_2 2x1−3x2
满足约束 x 1 + x 2 = 7 x_1+x_2=7 x1+x2=7
x 1 − 2 x 2 ≤ 4 \ x_1-2x_2\le4 x1−2x2≤4
x 1 ≥ 0 \ x_1\ \ \ \ \ \ \ \ \ \ge0 x1 ≥0
②约束条件里并没有给出 x 2 x_2 x2的非负约束,我们可以采用换元的方式来解决这一问题,即使用 x 2 ′ − x 2 ′ ′ x_2^{'}-x_2^{''} x2′−x2′′来替换 x 2 x_2 x2,并且满足 x 2 ′ ≥ 0 , x 2 ′ ′ ≥ 0 x_2^{'}\ge0,x_2^{''}\ge0 x2′≥0,x2′′≥0:
最大化 2 x 1 − 3 x 2 ′ + 3 x 2 ′ ′ 2x_1-3x_2^{'}+3x_2^{''} 2x1−3x2′+3x2′′
满足约束 x 1 + x 2 ′ − x 2 ′ ′ = 7 x_1+x_2^{'}-x_2^{''}=7 x1+x2′−x2′′=7
x 1 − 2 x 2 ′ + 2 x 2 ′ ′ ≤ 4 \ x_1-2x_2^{'}+2x_2^{''}\le4 x1−2x2′+2x2′′≤4
x 1 , x 2 ′ , x 2 ′ ′ ≥ 0 x_1,x_2^{'},x_2{''}\ge0 x1,x2′,x2′′≥0
③我们将等式约束替换为不等式约束,对于一个线性问题 x ≥ y x\ge y x≥y并且 x ≤ y x\le y x≤y我们就可以推出 x = y x=y x=y,反之亦然:
最大化 2 x 1 − 3 x 2 ′ + 3 x 2 ′ ′ 2x_1-3x_2^{'}+3x_2^{''} 2x1−3x2′+3x2′′
满足约束 x 1 + x 2 ′ − x 2 ′ ′ ≤ 7 x_1+x_2^{'}-x_2^{''}\le7 x1+x2′−x2′′≤7
x 1 + x 2 ′ − x 2 ′ ′ ≥ 7 x_1+x_2^{'}-x_2^{''}\ge7 x1+x2′−x2′′≥7
x 1 − 2 x 2 ′ + 2 x 2 ′ ′ ≤ 4 \ x_1-2x_2^{'}+2x_2^{''}\le4 x1−2x2′+2x2′′≤4
x 1 , x 2 ′ , x 2 ′ ′ ≥ 0 x_1,x_2^{'},x_2{''}\ge0 x1,x2′,x2′′≥0
④将所有 ≥ \ge ≥转化为 ≤ \le ≤:
最大化 2 x 1 − 3 x 2 ′ + 3 x 2 ′ ′ 2x_1-3x_2^{'}+3x_2^{''} 2x1−3x2′+3x2′′
满足约束 x 1 + x 2 ′ − x 2 ′ ′ ≤ 7 x_1+x_2^{'}-x_2^{''}\le7 x1+x2′−x2′′≤7
− x 1 − x 2 ′ + x 2 ′ ′ ≤ − 7 -x_1-x_2^{'}+x_2^{''}\le-7 −x1−x2′+x2′′≤−7
x 1 − 2 x 2 ′ + 2 x 2 ′ ′ ≤ 4 \ x_1-2x_2^{'}+2x_2^{''}\le4 x1−2x2′+2x2′′≤4
x 1 , x 2 ′ , x 2 ′ ′ ≥ 0 x_1,x_2^{'},x_2{''}\ge0 x1,x2′,x2′′≥0
⑤为了保持变量名的一致性,我们将 x 2 ′ x_2^{'} x2′命名为 x 2 x_2 x2,将 x 2 ′ ′ x_2^{''} x2′′更名为 x 3 x_3 x3:
最大化 2 x 1 − 3 x 2 + 3 x 3 2x_1-3x_2+3x_3 2x1−3x2+3x3
满足约束 x 1 + x 2 − x 3 ≤ 7 x_1+x_2-x_3\le7 x1+x2−x3≤7
− x 1 − x 2 + x 3 ≤ − 7 -x_1-x_2+x_3\le-7 −x1−x2+x3≤−7
x 1 − 2 x 2 + 2 x 3 ≤ 4 \ x_1-2x_2+2x_3\le4 x1−2x2+2x3≤4
x 1 , x 2 , x 3 ≥ 0 x_1,x_2,x_3\ge0 x1,x2,x3≥0
用等式约束来等价描述不等式约束,松弛变量度量了等式约束与原不等式约束之间的松弛或差别
我们引入松弛变量 s s s来代替原式中的不等式约束: s = b − A x s ≥ 0 \begin{aligned}&s=b-Ax\\&s\ge0\end{aligned} s=b−Axs≥0
我们将上述的标准型转化为松弛型:
最大化 2 x 1 − 3 x 2 + 3 x 3 2x_1-3x_2+3x_3 2x1−3x2+3x3
满足约束 x 4 = 7 − x 1 − x 2 + x 3 x 5 = − 7 + x 1 + x 2 − x 3 x 6 = 4 − x 1 + 2 x 2 − 2 x 3 x 1 , x 2 , x 3 , x 4 , x 5 , x 6 ≥ 0 \begin{aligned}&x_4=7-x_1-x_2+x_3\\&x_5=-7+x_1+x_2-x_3\\&x_6=4-x_1+2x_2-2x_3\\&x_1,x_2,x_3,x_4,x_5,x_6\ge0\end{aligned} x4=7−x1−x2+x3x5=−7+x1+x2−x3x6=4−x1+2x2−2x3x1,x2,x3,x4,x5,x6≥0
在这个线性规划中,除了非负约束外,所有约束都是等式,并且所有变量都满足非负约束,我们称等式左边的变量为基本变量,右边的变量为非基本变量。
对于满足这些条件的线性规划,我们往往省略词语“最大化”和“满足约束”,以及明显的非负约束。使用变量 z z z来表示目标函数值:
z = 2 x 1 − 3 x 2 + 3 x 3 x 4 = 7 − x 1 − x 2 + x 3 x 5 = − 7 + x 1 + x 2 − x 3 x 6 = 4 − x 1 + 2 x 2 − 2 x 3 \begin{aligned}&z=2x_1-3x_2+3x_3\\&x_4=7-x_1-x_2+x_3\\&x_5=-7+x_1+x_2-x_3\\&x_6=4-x_1+2x_2-2x_3\end{aligned} z=2x1−3x2+3x3x4=7−x1−x2+x3x5=−7+x1+x2−x3x6=4−x1+2x2−2x3
从直观上看,线性规划问题的最优解一定在可行域的顶点上。其有着严格的数学证明而非偶然,感兴趣的可以去搜一下,这里就不做赘述了,而上升到 n n n维的话,其约束条件构成的可行域我们称为单纯形。
求解线性规划问题有很多种方法,而最经典、最常用的方法就是单纯形算法。
单纯形算法是从单纯形的某个顶点开始,执行顺序迭代。在每次迭代中,它沿着单纯形的一条边从当前顶点移动到一个目标值不小于当前顶点的相邻顶点。当达到一个局部的最大值,即存在一个顶点所有相邻顶点的目标值都小于目标值,单纯形算法终止。
每轮迭代都关联一个基本解(我们很容易可以从松弛型中获得基本解,即令所有非基本变量为0,并从等式约束中计算基本变量的值)。每轮迭代都讲一个松弛型转化成为一个等价的松弛型。
为了增大目标值,我们选择一个非基本变量(通常为目标函数中系数为正的非基本变量),使得如果从0开始增加变量值,目标值也会增加。变量值得增加范围受限于非负约束,我们增加它,直到某基本变量为0。
然后重写松弛型,交换此基本变量和选定的非基本变量。重新计算基本解和目标函数。重复以上步骤,直到没有合适的非基本变量为止。
下面我们将举例说明单纯形算法的基本步骤:
现在有一个满足标准型的线性规划:
最大化 3 x 1 + x 2 + 2 x 3 3x_1+x_2+2x_3 3x1+x2+2x3
满足约束 x 1 + x 2 + 3 x 3 ≤ 30 2 x 1 + 2 x 2 + 5 x 3 ≤ 24 4 x 1 + x 2 + 2 x 3 ≤ 36 x 1 , x 2 , x 3 ≥ 0 \begin{aligned}&x_1+x_2+3x_3\le30\\&2x_1+2x_2+5x_3\le24\\&4x_1+x_2+2x_3\le36\\&x_1,x_2,x_3\ge0\end{aligned} x1+x2+3x3≤302x1+2x2+5x3≤244x1+x2+2x3≤36x1,x2,x3≥0
为了利用单纯形算法,我们必须将其转化为松弛型如下:
z = 3 x 1 + x 2 + 2 x 3 x 4 = 30 − x 1 − x 2 − 3 x 3 x 5 = 24 − 2 x 1 − 2 x 2 − 5 x 3 x 6 = 36 − 4 x 1 − x 2 − 2 x 3 \begin{aligned}&z=3x_1+x_2+2x_3\\&x_4=30-x_1-x_2-3x_3\\&x_5=24-2x_1-2x_2-5x_3\\&x_6=36-4x_1-x_2-2x_3\end{aligned} z=3x1+x2+2x3x4=30−x1−x2−3x3x5=24−2x1−2x2−5x3x6=36−4x1−x2−2x3
如果一个基本解是可行的,我们称其为基本可行解,对于单纯形算法而言,基本解几乎总是可行的。
现在我们增大 x 1 x_1 x1的值,对于 x 4 x_4 x4而言,当 x 1 > 30 x_1>30 x1>30的时候, x 4 x_4 x4的取值一定为负;对于 x 5 x_5 x5而言,当 x 1 > 12 x_1>12 x1>12的时候, x 5 x_5 x5的取值一定为负,对于 x 6 x_6 x6而言,当 x 1 > 9 x_1>9 x1>9的时候, x 6 x_6 x6的取值一定为负。其中第三个约束为最紧的约束,因此我们交换 x 1 x_1 x1和 x 6 x_6 x6。对第三个约束解方程得: x 1 = 9 − x 2 4 − x 3 2 − x 6 4 x_1=9-\frac{x_2}{4}-\frac{x_3}{2}-\frac{x_6}{4} x1=9−4x2−2x3−4x6
此时我们的基本解为 ( 9 , 0 , 0 , 21 , 6 , 0 ) (9,0,0,21,6,0) (9,0,0,21,6,0),目标值为 z = 27 z=27 z=27
此时我们的替入变量可以选择 x 2 x_2 x2或者 x 3 x_3 x3,因为 x 6 x_6 x6前面的系数是负的,当我们增大 x 6 x_6 x6会使得目标值减小,所以不考虑 x 6 x_6 x6,这里我们选择 x 3 x_3 x3作为替入变量。对于 x 1 x_1 x1而言, x 3 x_3 x3的最大取值为18,对于 x 4 x_4 x4而言, x 3 x_3 x3的最大取值为42/5,对于 x 1 x_1 x1而言, x 5 x_5 x5的最大取值为3/2。因此我们选择 x 5 x_5 x5为替出变量,置换 x 3 . x 5 x_3.x_5 x3.x5: x 3 = 3 2 − 3 x 2 8 − x 5 4 + x 6 8 x_3=\frac{3}{2}-\frac{3x_2}{8}-\frac{x_5}{4}+\frac{x_6}{8} x3=23−83x2−4x5+8x6
替换原松弛型中左侧的 x 3 x_3 x3可得等价松弛型:
z = 111 4 + x 2 16 − x 5 8 − 11 x 6 16 x 1 = 33 4 − x 2 16 + x 5 8 − 5 x 6 16 x 3 = 3 2 − 3 x 2 8 − x 5 4 + x 6 8 x 4 = 69 4 + 3 x 2 16 + 5 x 5 8 − x 6 16 \begin{aligned}&z=\frac{111}{4}+\frac{x_2}{16}-\frac{x_5}{8}-\frac{11x_6}{16}\\&x_1=\frac{33}{4}-\frac{x_2}{16}+\frac{x_5}{8}-\frac{5x_6}{16}\\&x_3=\frac{3}{2}-\frac{3x_2}{8}-\frac{x_5}{4}+\frac{x_6}{8}\\&x_4=\frac{69}{4}+\frac{3x_2}{16}+\frac{5x_5}{8}-\frac{x_6}{16}\end{aligned} z=4111+16x2−8x5−1611x6x1=433−16x2+8x5−165x6x3=23−83x2−4x5+8x6x4=469+163x2+85x5−16x6
此时的基本解为$(33/4,0,3/2,69/4,0,0),目标值为 111 / 4 111/4 111/4。
现在增加目标值的唯一方法是增加 x 2 x_2 x2,这三个约束分别给出了上界 132 、 4 132、4 132、4和 ∞ \infty ∞(因为对于 x 4 x_4 x4而言,只要 x 2 x_2 x2增加, x 4 x_4 x4也会增加,因此是 ∞ \infty ∞),因此我们选择 x 3 x_3 x3为替出变量,得到 x 2 x_2 x2和 x 3 x_3 x3的关系为: x 2 = 4 − 8 x 3 3 − 2 x 5 3 + x 6 3 x_2=4-\frac{8x_3}{3}-\frac{2x_5}{3}+\frac{x_6}{3} x2=4−38x3−32x5+3x6
继而得到新的松弛型:
z = 28 − x 3 6 − x 5 6 − 2 x 6 3 x 1 = 8 + x 3 6 + x 5 6 − x 6 3 x 2 = 4 − 8 x 3 3 − 2 x 5 3 + x 6 3 x 4 = 18 − x 3 2 + x 5 2 \begin{aligned}&z=28-\frac{x_3}{6}-\frac{x_5}{6}-\frac{2x_6}{3}\\&x_1=8+\frac{x_3}{6}+\frac{x_5}{6}-\frac{x_6}{3}\\&x_2=4-\frac{8x_3}{3}-\frac{2x_5}{3}+\frac{x_6}{3}\\&x_4=18-\frac{x_3}{2}+\frac{x_5}{2}\end{aligned} z=28−6x3−6x5−32x6x1=8+6x3+6x5−3x6x2=4−38x3−32x5+3x6x4=18−2x3+2x5
此时的基本解为 ( 8 , 4 , 0 , 18 , 0 , 0 ) (8,4,0,18,0,0) (8,4,0,18,0,0),目标值为 28 28 28
由于此时目标函数中的未知数系数都为负,目标值已经不能继续增大,因此循环结束,最优值为28,在 x 1 = 8 , x 2 = 4 , x 3 = 0 x_1=8,x_2=4,x_3=0 x1=8,x2=4,x3=0的条件下取得。