【数学】线性规划问题与不单纯的单纯形

线性规划问题

线性规划是一类形如这样的问题:
最大化/最小化一个 z = ∑ j = 1 n c j x j z=\sum_{j=1}^n c_j x_j z=j=1ncjxj
x j x_j xj是变量,其中有些是自由变量(随意取值),有些具有非负条件。
此外还有若干形如 ∑ j = 1 n a i j x j ≤ / = / ≥ b i \sum_{j=1}^n a_{ij}x_j \leq/=/\geq b_i j=1naijxj/=/bi的约束条件。

比方说,《算法设计与分析》中的一个例子:
求: max ⁡ z = 12 x 1 + 15 x 2 \max z = 12x_1+15x_2 maxz=12x1+15x2
约束:
0.25 x 1 + 0.50 x 2 ≤ 120 0.25x_1+0.50x_2 \leq 120 0.25x1+0.50x2120
0.50 x 1 + 0.50 x 2 ≤ 150 0.50x_1+0.50x_2 \leq 150 0.50x1+0.50x2150
0.25 x 1 ≤ 50 0.25x_1 \leq 50 0.25x150
x 1 ≥ 0 , x 2 ≥ 0 x_1 \geq 0, x_2 \geq 0 x10,x20

(在这里约束只有小于等于一种,是最简单的线性规划情形)

所谓单纯形,是一种常用的求解线性规划问题的算法。我曾经为它深情地赋过三行诗一首:

啊!单纯形!
你一点也不单纯!
你很行!

_(:зゝ∠)_接下来我们就来讲讲这一点也不单纯的单纯形算法的步骤吧!

标准形

数学的基本思想,就是化繁为简,现在我们把这堆乱七八糟的条件进行一些统合,使得线性规划问题变得更加简单。
标准形的要求有三条:最小化 z z z,所有约束条件都是 ∑ j = 1 n a i j x j = b i \sum_{j=1}^n a_{ij}x_j = b_i j=1naijxj=bi的形式,所有变量x_j有非负条件。
第一步好说,如果原问题是最大化 z z z,只需要取反 z ′ = − z z'=-z z=z,然后最小化这个 z ′ z' z即可。
第二步呢,则对于 s u m j = 1 n a i j x j ≤ b i sum_{j=1}^n a_{ij}x_j \leq b_i sumj=1naijxjbi的形式,引入松弛变量 y i ≥ 0 y_i \geq 0 yi0,然后将条件改为 ∑ j = 1 n a i j x j + y i = b i \sum_{j=1}^n a_{ij}x_j+y_i = b_i j=1naijxj+yi=bi。至于大于等于的条件,引入类似的剩余变量 y i y_i yi ∑ j = 1 n a i j x j − y i = b i \sum_{j=1}^n a_{ij}x_j -y_i = b_i j=1naijxjyi=bi即可。
第三步,将自由变量 x j x_j xj替换为 x j ′ − x j ′ ′ x_j'-x_j'' xjxj x j ′ , x j ′ ′ ≥ 0 x_j',x_j'' \geq 0 xj,xj0

那么对于例子来说,只需要添加松弛变量就可以了,化成标准形如下:
目标: min ⁡ z ′ = − 12 x 1 − 15 x 2 \min z' = -12x_1-15x_2 minz=12x115x2
约束:
0.25 x 1 + 0.50 x 2 + x 3 = 120 0.25x_1+0.50x_2+x_3=120 0.25x1+0.50x2+x3=120
0.50 x 1 + 0.50 x 2 + x 4 = 150 0.50x_1+0.50x_2+x_4=150 0.50x1+0.50x2+x4=150
0.25 x 1 + x 5 = 50 0.25x_1+x_5=50 0.25x1+x5=50
x 1 , x 2 , x 3 , x 4 , x 5 ≥ 0 x_1,x_2,x_3,x_4,x_5 \geq 0 x1,x2,x3,x4,x50

标准形的基本解

A = [ a 11 ⋯ a 1 n ⋮ ⋱ ⋮ a m 1 ⋯ a m n ] A=\begin{bmatrix} a_{11} & \cdots & a_{1n} \\ \vdots & \ddots & \vdots \\ a_{m1} & \cdots & a_{mn} \end{bmatrix} A=a11am1a1namn b = [ b 1 ⋮ b m ] b=\begin{bmatrix} b_1 \\ \vdots \\ b_m \end{bmatrix} b=b1bm c = [ c 1 ⋮ c n ] c=\begin{bmatrix}c_1 \\ \vdots \\ c_n \end{bmatrix} c=c1cn x = [ x 1 ⋮ x n ] x=\begin{bmatrix}x_1 \\ \vdots \\ x_n \end{bmatrix} x=x1xn

则条件可以写作 A x = b , min ⁡ z = c T x Ax=b,\min z=c^Tx Ax=b,minz=cTx

P j P_j Pj A A A的列向量,也可以说有条件 ∑ j = 1 n P j x j = b \sum_{j=1}^n P_jx_j = b j=1nPjxj=b

假设 A A A的秩为 t t t,将列向量中的 t t t个基向量弄出来组成一个 m ∗ t m * t mt的矩阵 B B B,非基向量对应的 x j x_j xj(称为非基变量,而基向量对应的变量就叫基变量)直接赋值为0,根据我们小学学过的线性代数知识,基变量能够找到唯一解,这组解被称为基本解

更数学一点的说法,令 x B x_B xB为基变量构成的基向量,解 B x B = b Bx_B=b BxB=b x B = B − 1 b x_B=B^{-1}b xB=B1b,非基变量则全赋为0。

对于一组确定的基向量,基本解是唯一的,但是由于基向量的取法不唯一,所以基本解也有很多种。基本解符合了大部分条件,非常好,但唯一的问题是不一定满足 x j ≥ 0 x_j \geq 0 xj0

定理1:若标准型有可行解,必有基本可行解。

证明:假设 A A A列满秩,那么解只有一组,符合了 x j ≥ 0 x_j \geq 0 xj0就是可行的。否则一定存在不全为0的 λ \lambda λ使得 ∑ j = 1 n P j λ j = 0 \sum_{j=1}^n P_j \lambda_j = 0 j=1nPjλj=0。令 δ \delta δ是一个常数,则 ∑ j = 1 n ( x j + λ j δ ) P j = b \sum_{j=1}^n (x_j + \lambda_j \delta)P_j=b j=1n(xj+λjδ)Pj=b { x j ′ = x j + λ j δ } \{x_j'=x_j+\lambda_j \delta\} {xj=xj+λjδ}也还是一组解。

x j + λ j δ ≥ 0    ⟺    δ ≥ − x j λ j x_j+\lambda_j \delta \geq 0 \iff \delta \geq - \frac{x_j}{\lambda_j} xj+λjδ0δλjxj,我们得到了一组 δ \delta δ的约束条件。将 δ \delta δ尽可能地减小,总会导致 − x j λ j -\frac{x_j}{\lambda_j} λjxj最大的那个 x j x_j xj x j ′ = 0 x_j'=0 xj=0,于是变量数就减少了并且新的解还是可行解。不再考虑 x j x_j xj,继续看剩下的 P i ( i ≠ j ) P_i(i \not= j) Pi(i=j)是否线性相关,一直做到将所有的非基变量全部变成0即可获得一组基本可行解。

定理2:若标准型有最优解,必定有基本最优解。

证明:由于 { x j } \{x_j\} {xj}是最优解,所以无论 δ \delta δ如何取值(可正可负), ∑ j = 1 n c j x j ≤ ∑ j = 1 n c j ( x j + δ λ j ) = ∑ j = 1 n c j x j + δ ∑ j = 1 n c j λ j \sum_{j=1}^n c_jx_j \leq \sum_{j=1}^n c_j(x_j+\delta\lambda_j)=\sum_{j=1}^n c_j x_j + \delta \sum_{j=1}^n c_j\lambda_j j=1ncjxjj=1ncj(xj+δλj)=j=1ncjxj+δj=1ncjλj恒成立。

所以 ∑ j = 1 n c j λ j = 0 \sum_{j=1}^n c_j\lambda_j=0 j=1ncjλj=0

所以我们做如定理1证明那样的解变换,不会改变最优性。

不过如果你看我们的例子,基变量可以取我们添加的松弛变量,会发现 B B B的形式非常简单,就是一个3×3的单位矩阵。所以很快可以得到一组基本解: ( 0 , 0 , 120 , 150 , 50 ) (0,0,120,150,50) (0,0,120,150,50)

最优性检验

这是一组可行解,可是,是不是最优解呢?如果能确定是最优解,或者没有最优解,我们的算法就可以停下来了。

我们之前定义了基变量对应的 A A A中的几行构成矩阵 B B B,它们对应的 c c c x x x中的几行拿出来就叫 c B c_B cB x B x_B xB什么的。那么非基变量也类似定义 N N N,对于例子, N = [ 0.25 0.50 0.50 0.50 0.25 0 ] N=\begin{bmatrix} 0.25 & 0.50 \\ 0.50 & 0.50 \\ 0.25 & 0 \end{bmatrix} N=0.250.500.250.500.500

B x B + N x N = b Bx_B+Nx_N=b BxB+NxN=b,即 x B = B − 1 b − B − 1 N x N x_B=B^{-1}b-B^{-1}Nx_N xB=B1bB1NxN

代入目标函数 z = c T x = c B T B − 1 b + ( c N T − c B T B − 1 N ) x N z=c^Tx=c_B^TB^{-1}b+(c_N^T-c_B^TB^{-1}N)x_N z=cTx=cBTB1b+(cNTcBTB1N)xN

那对于一组基本可行解, x N ( 0 ) = 0 x_N^{(0)}=0 xN(0)=0,故 z 0 = c B T B − 1 b z_0=c_B^TB^{-1}b z0=cBTB1b

对于任意解:

z = z 0 + ( c N T − c B T B − 1 N ) x N + ( c B T − c B T B − 1 B ) x B = z 0 + ( c t − c B T B − 1 A ) x z=z_0+(c_N^T-c_B^TB^{-1}N)x_N+(c_B^T-c_B^TB^{-1}B)x_B=z_0+(c^t-c_B^TB^{-1}A)x z=z0+(cNTcBTB1N)xN+(cBTcBTB1B)xB=z0+(ctcBTB1A)x

(上式中 x B x_B xB乘的东西等于0)

λ T = c T − c B T B − 1 A \lambda^T=c^T-c_B^TB^{-1}A λT=cTcBTB1A,称它的分量 λ 1 , . . . , λ n \lambda_1,...,\lambda_n λ1,...,λn检验数。则 z = z 0 + λ T x z=z_0+\lambda^T x z=z0+λTx

定理3:给定一个基本可行解 x ( 0 ) x^{(0)} x(0),则

(1)若所有检验数大于等于0,则 x ( 0 ) x^{(0)} x(0)是最优解。

(2)若存在检验数 λ k < 0 \lambda_k < 0 λk<0且所有 a i k ≤ 0 a_{ik}\leq 0 aik0,则无最优解。

根据 x x x的非负性还是比较显然的。

并且我们记一下 P i ′ = B − 1 P , A ′ = B − 1 A = ( α i j ) m ∗ n , β = B − 1 b P_i'=B^{-1}P,A'=B^{-1}A=(\alpha_{ij})_{m * n},\beta=B^{-1}b Pi=B1P,A=B1A=(αij)mn,β=B1b(这个 β \beta β就是基变量的解值啦)

看起来很复杂,尤其是有个超级复杂的东西——矩阵逆在里面。但我们现在只讨论最简单情况,对于例子,由于 B B B是一个单位阵,所以 B − 1 B^{-1} B1可以不用考虑了。并且由于基变量都是我们人工加出来的, c B c_B cB全零,所以又有一大段不用考虑了。

所以, λ T = c T = [ − 12 − 15 0 0 0 ] \lambda^T=c^T=\begin{bmatrix} -12 & -15 & 0 & 0 &0 \end{bmatrix} λT=cT=[1215000]

但是看起来它两个条件都不满足,看来我们还得继续。

基变换

假设基 B = ( P π ( 1 ) , . . . P π ( m ) ) B=(P_{\pi(1)},...P_{\pi(m)}) B=(Pπ(1),...Pπ(m)),不加这个 π \pi π P P P呢,就是非基。现在我们的目的是将 P π ( l ) P_{\pi(l)} Pπ(l)(换出变元/向量)和 P k P_k Pk(换入变元/向量)换一下,得到一个新的基,并得到它对应的基本可行解,继续检验它是不是最优解。

检验数的计算和 B − 1 B^{-1} B1息息相关,所以我们不得不继续定义复杂的符号,比如 A ′ = ( α i j ) m ∗ n = B − 1 A A'=(\alpha_{ij})_{m*n}=B^{-1}A A=(αij)mn=B1A β = B − 1 b \beta=B^{-1}b β=B1b,以及 P i ′ = B − 1 P i P_i'=B^{-1}P_i Pi=B1Pi(当然,对于例子里的最简单情况,其实这些东西和 A , b , P i A,b,P_i A,b,Pi完全一致)

首先, B ′ = ( P π ( 1 ) ′ , . . . , P π ( m ) ′ ) = B − 1 B = I B'=(P_{\pi(1)}',...,P_{\pi(m)}')=B^{-1}B=I B=(Pπ(1),...,Pπ(m))=B1B=I
B − 1 A = B − 1 A I B^{-1}A=B^{-1}AI B1A=B1AI,而 P k ′ P_k' Pk B − 1 A B^{-1}A B1A的第 k k k列,故:

P k ′ = ∑ i = 1 m α i k P π ( i ) P_k'=\sum_{i=1}^m \alpha_{ik}P_{\pi(i)} Pk=i=1mαikPπ(i)
左边同时乘以 B B B
P k = ∑ i = 1 m α i k P π ( i ) P_k=\sum_{i=1}^m \alpha_{ik}P_{\pi(i)} Pk=i=1mαikPπ(i)

α l k ≠ 0 \alpha_{lk} \not=0 αlk=0,则将 P k P_k Pk替换 P π ( l ) P_{\pi(l)} Pπ(l)后,得到的还是一个基。

如果再去利用小学学的知识计算这次替换对 A ′ A' A β \beta β的影响的话,可以得到一下变化公式:

α l j ′ = α l j α l k \alpha_{lj}'=\frac{\alpha_{lj}}{\alpha_{lk}} αlj=αlkαlj
α i j ′ = α i j − α i k α l j α l k \alpha_{ij}'=\alpha_{ij}-\frac{\alpha_{ik}\alpha_{lj}}{\alpha_{lk}} αij=αijαlkαikαlj
唔……这就是个将除了第 l l l行以外的第 k k k列元全部消掉,第 l l l行的第 k k k列元变成1的变换过程呢,在高斯消元中,我们可经常做这事。

β l ′ = β l α l k \beta_l'=\frac{\beta_l}{\alpha_{lk}} βl=αlkβl
β i ′ = β i − α i k β l α l k \beta_i'=\beta_i-\frac{\alpha_{ik}\beta_l}{\alpha_{lk}} βi=βiαlkαikβl

要保证新的基依然能够得到可行解,就需要 β i ′ ≥ 0 \beta_i' \geq 0 βi0 β \beta β是解值)

也就是需要取 l l l使得 β l α l k = min ⁡ { β i α i k ∣ α i k > 0 } \frac{\beta_l}{\alpha_{lk}}=\min\{\frac{\beta_i}{\alpha_{ik}} | \alpha_{ik}>0\} αlkβl=min{αikβiαik>0}

另外还有:

λ i ′ = λ i − λ k α l i α l k \lambda_i'=\lambda_i-\lambda_k\frac{\alpha_{li}}{\alpha_{lk}} λi=λiλkαlkαli

z 0 ′ = z 0 + λ k β l α i k z_0'=z_0+\frac{\lambda_k \beta_l}{\alpha_{ik}} z0=z0+αikλkβl

这些式子看着又复杂又眼熟,复杂在于有一堆 l l l k k k啊什么的,头都要晕了,而眼熟在于,它们还是好像高斯消元过程中的消元操作啊!事实上,通单纯形表,我们可以让这些复杂的公式,都变成简单的高斯消元!

不过,在介绍单纯形表前,我们还是再来回顾一遍单纯形的一般步骤吧:

单纯形的一般步骤

  1. 首先找一组初始可行解。
  2. 判断是否是最优解(所有 λ k ≥ 0 \lambda_k \geq 0 λk0)或者无最优解(所有 λ k < 0 \lambda_k <0 λk<0 k k k,对任何 l l l都有 α l , k < 0 \alpha_{l,k} < 0 αl,k<0)。
  3. 取一个 λ k < 0 \lambda_k<0 λk<0,且 α l , k > 0 \alpha_{l,k}>0 αl,k>0 β l α l , k \frac{\beta_l}{\alpha_{l,k}} αl,kβl最小的 l l l,将基 l l l与非基 k k k进行交换得到一组新基。
  4. 重复2。

另外,在第三步中,为了避免单纯形陷入死循环,人们一般在多个 λ k < 0 \lambda_k<0 λk<0中选最小(绝对值最大)的那个。数学证明?我不会!(理直气壮.jpg)

单纯形表

将上文提到的所有参数合理地画出一张表格,那么基变换中连带着导致 α , β , z \alpha, \beta, z α,β,z λ \lambda λ的变换,就能被统一起来。

单纯形表是一个这样子的东西:

c 1 ⋯ c n \begin{matrix}c_1 & \cdots & c_n \end{matrix} c1cn
c B c_B cB x B x_B xB b b b x 1 ⋯ x n \begin{matrix}x_1 & \cdots & x_n \end{matrix} x1xn θ \theta θ
c π ( 1 ) ⋮ c π ( m ) \begin{matrix}c_{\pi(1)} \\ \vdots \\ c_{\pi(m)} \end{matrix} cπ(1)cπ(m) x π ( 1 ) ⋮ x π ( m ) \begin{matrix}x_{\pi(1)} \\ \vdots \\ x_{\pi(m)} \end{matrix} xπ(1)xπ(m) β 1 ⋮ β m \begin{matrix}\beta_1 \\ \vdots \\ \beta_m \end{matrix} β1βm α 11 ⋯ α 1 n ⋮ ⋱ ⋮ α π ( m 1 ) ⋯ α m n \begin{matrix}\alpha_{11} & \cdots & \alpha_{1n}\\ \vdots & \ddots & \vdots \\ \alpha_{\pi(m1)} & \cdots & \alpha_{mn}\end{matrix} α11απ(m1)α1nαmn
− z -z z − z 0 -z_0 z0 λ 1 ⋯ λ n \begin{matrix}\lambda_1 & \cdots & \lambda_n \end{matrix} λ1λn

我们一般令要换入的 k k k λ k \lambda_k λk最小的那个, θ \theta θ就是对应的 β l α l k \frac{\beta_l}{\alpha_{lk}} αlkβl

初始的 β i = b i \beta_i=b_i βi=bi,初始的 x B x_B xB就是添加的几个松弛变量,初始的 λ \lambda λ也就是 c c c

我们拿例题中的数据举例:

− 12 − 15 0 0 0 \begin{matrix}-12& -15 & 0 & 0 & 0 \end{matrix} 1215000
c B c_B cB x B x_B xB b b b x 1 x 2 x 3 x 4 x 5 \begin{matrix}x_1 & x_2 & x_3 & x_4& x_5 \end{matrix} x1x2x3x4x5 θ \theta θ
0 0 0 \begin{matrix}0 \\ 0 \\ 0 \end{matrix} 000 x 3 x 4 x 5 \begin{matrix}x_3 \\ x_4\\ x_5 \end{matrix} x3x4x5 120 150 50 \begin{matrix}120 \\ 150 \\ 50 \end{matrix} 12015050 0.25 0.50 1 0 0 0.50 0.50 0 1 0 0.25 0 0 0 1 \begin{matrix}0.25& 0.50 & 1 & 0 & 0\\ 0.50& 0.50& 0 & 1 & 0\\ 0.25 & 0& 0 & 0 & 1\end{matrix} 0.250.500.250.500.500100010001 240 300 0 \begin{matrix}240 \\ 300 \\ 0 \end{matrix} 2403000
− z -z z 0 0 0 − 12 − 15 0 0 0 \begin{matrix}-12 & -15& 0 & 0 & 0\end{matrix} 1215000

这里换入变元是 x 2 x_2 x2,换出变元是 x 3 x_3 x3

现在你可以暂时忘记上面的公式了,我们要做的事是,将表中央写了数据( α , β , λ , − z \alpha,\beta,\lambda,-z α,β,λ,z)的四个格子,看成一个统一的矩阵。然后完成第1行第2列对其他行的消元。

第一行,同时除以 0.50 0.50 0.50
第二行, 150 − = 120 150-=120 150=120 0.50 − = 0.25 0.50-=0.25 0.50=0.25 0.50 − = 0.50 0.50-=0.50 0.50=0.50(消成0), 0 − = 1 0-=1 0=1 1 − = 0 1-=0 1=0 0 − = 0 0-=0 0=0
第三行,由于第2列为0,无需操作。
第四行( − z -z z λ \lambda λ), 0 − = 120 ∗ ( − 15 / 0.50 ) 0-=120*(-15/0.50) 0=120(15/0.50) − 12 − = 0.25 ∗ ( − 15 / 0.50 ) -12-=0.25*(-15/0.50) 12=0.25(15/0.50) 0 − = 1 ∗ ( − 15 / 0.50 ) 0-=1*(-15/0.50) 0=1(15/0.50) 0 − = 0 0-=0 0=0 0 − = 0 0-=0 0=0

得到下表( θ \theta θ是选定换入变元是 x 1 x_1 x1算的):

− 12 − 15 0 0 0 \begin{matrix}-12& -15 & 0 & 0 & 0 \end{matrix} 1215000
c B c_B cB x B x_B xB b b b x 1 x 2 x 3 x 4 x 5 \begin{matrix}x_1 & x_2 & x_3 & x_4& x_5 \end{matrix} x1x2x3x4x5 θ \theta θ
− 15 0 0 \begin{matrix}-15 \\ 0 \\ 0 \end{matrix} 1500 x 2 x 4 x 5 \begin{matrix}x_2 \\ x_4\\ x_5 \end{matrix} x2x4x5 240 30 50 \begin{matrix}240\\ 30\\ 50 \end{matrix} 2403050 0.50 1 2 0 0 0.25 0 − 1 1 0 0.25 0 0 0 1 \begin{matrix}0.50& 1& 2 & 0 & 0\\ 0.25& 0& -1 & 1 & 0\\ 0.25 & 0& 0 & 0 & 1\end{matrix} 0.500.250.25100210010001 480 120 200 \begin{matrix}480\\ 120\\ 200 \end{matrix} 480120200
− z -z z 3600 3600 3600 − 4.5 0 30 0 0 \begin{matrix}-4.5 & 0& 30 & 0 & 0\end{matrix} 4.503000

再接下来,使用 x 1 x_1 x1 x 4 x_4 x4,然后完成第2行第1列对其他所有行的消元,得:

− 12 − 15 0 0 0 \begin{matrix}-12& -15 & 0 & 0 & 0 \end{matrix} 1215000
c B c_B cB x B x_B xB b b b x 1 x 2 x 3 x 4 x 5 \begin{matrix}x_1 & x_2 & x_3 & x_4& x_5 \end{matrix} x1x2x3x4x5 θ \theta θ
− 15 − 12 0 \begin{matrix}-15 \\ -12 \\ 0 \end{matrix} 15120 x 2 x 1 x 5 \begin{matrix}x_2 \\ x_1\\ x_5 \end{matrix} x2x1x5 180 120 20 \begin{matrix}180\\ 120\\ 20 \end{matrix} 18012020 0 1 4 − 2 0 1 0 − 4 4 0 0 0 1 − 1 1 \begin{matrix}0& 1& 4 & -2 & 0\\ 1& 0& -4 & 4 & 0\\ 0 & 0& 1 & -1 & 1\end{matrix} 010100441241001
− z -z z 4140 4140 4140 0 0 12 18 0 \begin{matrix}0 & 0& 12 & 18 & 0\end{matrix} 0012180

可以看见此时 λ \lambda λ已经全正了,是最优解。

人工变量与两阶段法

对于所有约束条件都是 ≤ \leq 的情况,我们已经看过了,由于 B B B可以取成单位阵,所以运算比较简便。那引入了 = = = ≥ \geq 怎么办呢?

继续看算分书的例子:

min ⁡ z = − 3 x 1 + x 2 + x 3 \min z = -3x_1+x_2+x_3 minz=3x1+x2+x3
x 1 − 2 x 2 + x 3 ≤ 11 x_1 - 2x_2+x_3 \leq 11 x12x2+x311
− 4 x 1 + x 2 + 2 x 3 ≥ 3 -4x_1+x_2+2x_3 \geq 3 4x1+x2+2x33
− 2 x 1 + x 3 = 1 -2x_1+x_3=1 2x1+x3=1
x 1 , x 2 , x 3 ≥ 0 x_1,x_2,x_3 \geq 0 x1,x2,x30

唔……总而言之,我们可以先把它变成一个标准形。

min ⁡ z = − 3 x 1 + x 2 + x 3 \min z = -3x_1+x_2+x_3 minz=3x1+x2+x3
x 1 − 2 x 2 + x 3 + x 4 = 11 x_1 - 2x_2+x_3+x_4 =11 x12x2+x3+x4=11
− 4 x 1 + x 2 + 2 x 3 − x 5 = 3 -4x_1+x_2+2x_3-x_5 =3 4x1+x2+2x3x5=3
− 2 x 1 + x 3 = 1 -2x_1+x_3=1 2x1+x3=1
x 1 , x 2 , x 3 , x 4 , x 5 ≥ 0 x_1,x_2,x_3,x_4,x_5 \geq 0 x1,x2,x3,x4,x50

取不出单位阵基向量怎么办?那就硬取!我们加入人工变量 x 6 x_6 x6 x 7 x_7 x7,将约束条件暂时变为:
− 4 x 1 + x 2 + 2 x 3 − x 5 + x 6 = 3 -4x_1+x_2+2x_3-x_5+x_6 =3 4x1+x2+2x3x5+x6=3
− 2 x 1 + x 3 + x 7 = 1 -2x_1+x_3+x_7=1 2x1+x3+x7=1

这样取 x 4 , x 6 , x 7 x_4,x_6,x_7 x4,x6,x7作为基变量就可以使 B = I B=I B=I了!
但问题是,这个 x 6 x_6 x6 x 7 x_7 x7必须等于0啊。
于是我们先求解这么一个线性规划问题:

min ⁡ ω = x 6 + x 7 \min \omega = x_6+x_7 minω=x6+x7,约束条件不变。

由于 ω ≥ 0 \omega \geq 0 ω0,所以这个问题必有最优解。这个问题求出来的可行解,由于约束条件和求 z z z的那个问题完全一致,所以也是原问题的可行解。
若最优解 ω > 0 \omega > 0 ω>0,说明原问题无解,不能将所有的人工变量都变成0。
若最优解 ω = 0 \omega=0 ω=0,也就是 x 6 , x 7 = 0 x_6,x_7=0 x6,x7=0,此时我们一定能够通过基变换操作使得 x 6 x_6 x6 x 7 x_7 x7不是基变量,具体的数学证明我这里就不谈啦。然后我们就可以在单纯形表中直接删掉 x 6 , x 7 x_6,x_7 x6,x7两列,将 c c c λ \lambda λ计算并修改后,就能接着做原问题了。

所以所谓的两阶段法,指的就是靠 ω \omega ω的问题得到人工变量不在基中的可行解,然后再计算 z z z的问题的一个过程。

总结

单纯形法的思路建立在“有可行解则有基本可行解”,“有最优解则有基本最优解”的思路上,将在繁多的解上讨论的问题转化为在基本解上讨论的问题。通过检验数 λ \lambda λ来确定是否得到了最优解,通过基变换来枚举不同的基本解的这么一个过程。

为了计算简便,我们初始需要的基向量阵应该是人力引入的变量构成的单位阵。这在 ≤ \leq 约束条件下很好实现,而对于 = = = ≥ \geq 的情况,我们需要引入最终希望它们都是0的人工变量,然后使用两阶段法来消掉人工变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值