线性规划简单理解(LP问题)

  在数学中,线性规划(Linear Programming)特指目标函数和约束条件皆为线性的最优化问题。

基本概念

  • 线性约束条件:由多个不等式形成的约束条件(在线性规划中,其约束条件一定为非严格不等式,即 ≤ \le ≥ \ge ,不允许出现 < < < > > >
  • 线性目标函数:由多个变量x形成的函数
  • 线性规划问题:在线性约束条件下,线性目标函数求极值的问题
  • 可行解:满足线性约束条件下的解
  • 可行域:由所有可行解组成的集合
  • 最优解:使目标函数取得极值的可行解

标准型

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.Axbx0
  标准型中的线性规划是满足线性不等式约束的线性函数的最大化问题。其有以下几个特点:

  • 目标函数是求解某个线性问题的最大值
  • 所有变量都具有非负约束
  • 不存在等式约束
  • 所有不等式约束都是 ≤ \le 而非 ≥ \ge

下面我们举例介绍如何将一个基本的线性规划问题转化为标准型,如果我们有线性规划问题:

  最小化       − 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  x12x24
                x 1           ≥ 0 \ x_1\ \ \ \ \ \ \ \ \ \ge0  x1         0

①我们将目标函数系数取负,得到:

  最大化       2 x 1 − 3 x 2 2x_1-3x_2 2x13x2

  满足约束       x 1 + x 2 = 7 x_1+x_2=7 x1+x2=7
                x 1 − 2 x 2 ≤ 4 \ x_1-2x_2\le4  x12x24
                x 1           ≥ 0 \ x_1\ \ \ \ \ \ \ \ \ \ge0  x1         0
②约束条件里并没有给出 x 2 x_2 x2的非负约束,我们可以采用换元的方式来解决这一问题,即使用 x 2 ′ − x 2 ′ ′ x_2^{'}-x_2^{''} x2x2来替换 x 2 x_2 x2,并且满足 x 2 ′ ≥ 0 , x 2 ′ ′ ≥ 0 x_2^{'}\ge0,x_2^{''}\ge0 x20,x20

  最大化       2 x 1 − 3 x 2 ′ + 3 x 2 ′ ′ 2x_1-3x_2^{'}+3x_2^{''} 2x13x2+3x2

  满足约束       x 1 + x 2 ′ − x 2 ′ ′ = 7 x_1+x_2^{'}-x_2^{''}=7 x1+x2x2=7
                x 1 − 2 x 2 ′ + 2 x 2 ′ ′ ≤ 4 \ x_1-2x_2^{'}+2x_2^{''}\le4  x12x2+2x24
               x 1 , x 2 ′ , x 2 ′ ′ ≥ 0 x_1,x_2^{'},x_2{''}\ge0 x1,x2,x20
③我们将等式约束替换为不等式约束,对于一个线性问题 x ≥ y x\ge y xy并且 x ≤ y x\le y xy我们就可以推出 x = y x=y x=y,反之亦然:

  最大化       2 x 1 − 3 x 2 ′ + 3 x 2 ′ ′ 2x_1-3x_2^{'}+3x_2^{''} 2x13x2+3x2

  满足约束       x 1 + x 2 ′ − x 2 ′ ′ ≤ 7 x_1+x_2^{'}-x_2^{''}\le7 x1+x2x27
            x 1 + x 2 ′ − x 2 ′ ′ ≥ 7 x_1+x_2^{'}-x_2^{''}\ge7 x1+x2x27
                x 1 − 2 x 2 ′ + 2 x 2 ′ ′ ≤ 4 \ x_1-2x_2^{'}+2x_2^{''}\le4  x12x2+2x24
               x 1 , x 2 ′ , x 2 ′ ′ ≥ 0 x_1,x_2^{'},x_2{''}\ge0 x1,x2,x20
④将所有 ≥ \ge 转化为 ≤ \le

  最大化       2 x 1 − 3 x 2 ′ + 3 x 2 ′ ′ 2x_1-3x_2^{'}+3x_2^{''} 2x13x2+3x2

  满足约束       x 1 + x 2 ′ − x 2 ′ ′ ≤ 7 x_1+x_2^{'}-x_2^{''}\le7 x1+x2x27
            − x 1 − x 2 ′ + x 2 ′ ′ ≤ − 7 -x_1-x_2^{'}+x_2^{''}\le-7 x1x2+x27
                x 1 − 2 x 2 ′ + 2 x 2 ′ ′ ≤ 4 \ x_1-2x_2^{'}+2x_2^{''}\le4  x12x2+2x24
               x 1 , x 2 ′ , x 2 ′ ′ ≥ 0 x_1,x_2^{'},x_2{''}\ge0 x1,x2,x20

⑤为了保持变量名的一致性,我们将 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 2x13x2+3x3

  满足约束       x 1 + x 2 − x 3 ≤ 7 x_1+x_2-x_3\le7 x1+x2x37
            − x 1 − x 2 + x 3 ≤ − 7 -x_1-x_2+x_3\le-7 x1x2+x37
                x 1 − 2 x 2 + 2 x 3 ≤ 4 \ x_1-2x_2+2x_3\le4  x12x2+2x34
               x 1 , x 2 , x 3 ≥ 0 x_1,x_2,x_3\ge0 x1,x2,x30

松弛型

  用等式约束来等价描述不等式约束,松弛变量度量了等式约束与原不等式约束之间的松弛或差别

我们引入松弛变量 s s s来代替原式中的不等式约束: s = b − A x s ≥ 0 \begin{aligned}&s=b-Ax\\&s\ge0\end{aligned} s=bAxs0
我们将上述的标准型转化为松弛型:

  最大化       2 x 1 − 3 x 2 + 3 x 3 2x_1-3x_2+3x_3 2x13x2+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=7x1x2+x3x5=7+x1+x2x3x6=4x1+2x22x3x1,x2,x3,x4,x5,x60
  在这个线性规划中,除了非负约束外,所有约束都是等式,并且所有变量都满足非负约束,我们称等式左边的变量为基本变量,右边的变量为非基本变量
  对于满足这些条件的线性规划,我们往往省略词语“最大化”和“满足约束”,以及明显的非负约束。使用变量 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=2x13x2+3x3x4=7x1x2+x3x5=7+x1+x2x3x6=4x1+2x22x3

线性规划问题求解

线性规划简单理解(LP问题)_第1张图片
  从直观上看,线性规划问题的最优解一定在可行域的顶点上。其有着严格的数学证明而非偶然,感兴趣的可以去搜一下,这里就不做赘述了,而上升到 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+3x3302x1+2x2+5x3244x1+x2+2x336x1,x2,x30

为了利用单纯形算法,我们必须将其转化为松弛型如下:
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=30x1x23x3x5=242x12x25x3x6=364x1x22x3

  • 我们先令所有非基本变量为0获得其基本解
    ( x ‾ 1 , x ‾ 2 , . . . , x ‾ 6 ) = ( 0 , 0 , 0 , 30 , 24 , 36 ) (\overline{x}_1,\overline{x}_2,...,\overline{x}_6)=(0,0,0,30,24,36) (x1,x2,...,x6)=(0,0,0,30,24,36)
    目标值 z = ( 3 ⋅ 0 ) + ( 1 ⋅ 0 ) + ( 2 ⋅ 0 ) = 0 z=(3\cdot0)+(1\cdot0)+(2\cdot0)=0 z=(30)+(10)+(20)=0

  如果一个基本解是可行的,我们称其为基本可行解,对于单纯形算法而言,基本解几乎总是可行的。

  • 我们的目标是重新整理线性规划,使得基本解有一个更大的目标值。因此我们选择一个在目标函数中系数为正的非基本变量为,让其取值尽可能大而不违反任何约束条件。这里我们选择 x 1 x_1 x1作为替入变量(即使其尽量增大的非基本变量)。

  现在我们增大 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=94x22x34x6

  • 重写上述松弛型中右侧包含 x 1 x_1 x1的等式,将 x 1 x_1 x1用上述等式替换掉,并将 x 6 x_6 x6的约束条件转化为上述的等式:
    z = 27 + x 2 4 + x 3 2 − 3 x 6 4 x 1 = 9 − x 2 4 − x 3 2 − x 6 4 x 4 = 21 − 3 x 2 4 − 5 x 3 2 + x 6 4 x 5 = 6 − 3 x 2 2 − 4 x 3 + x 6 2 \begin{aligned}&z=27+\frac{x_2}{4}+\frac{x_3}{2}-\frac{3x_6}{4}\\&x_1=9-\frac{x_2}{4}-\frac{x_3}{2}-\frac{x_6}{4}\\&x_4=21-\frac{3x_2}{4}-\frac{5x_3}{2}+\frac{x_6}{4}\\&x_5=6-\frac{3x_2}{2}-4x_3+\frac{x_6}{2}\end{aligned} z=27+4x2+2x343x6x1=94x22x34x6x4=2143x225x3+4x6x5=623x24x3+2x6
    我们称此操作为一个转动,每一次转动都会选取一个非基本变量 x e x_e xe(称为替入变量)和一个基本变量 x i x_i xi(称为替出变量),然后交换二者的角色。

  此时我们的基本解为 ( 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=2383x24x5+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+16x28x51611x6x1=43316x2+8x5165x6x3=2383x24x5+8x6x4=469+163x2+85x516x6
    此时的基本解为$(33/4,0,3/2,69/4,0,0),目标值为 111 / 4 111/4 111/4

  • 现在增加目标值的唯一方法是增加 x 2 x_2 x2,这三个约束分别给出了上界 132 、 4 132、4 1324 ∞ \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=438x332x5+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=286x36x532x6x1=8+6x3+6x53x6x2=438x332x5+3x6x4=182x3+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的条件下取得。

你可能感兴趣的:(算法杂章,线性代数,机器学习,算法)