线性规划问题
线性规划是一类形如这样的问题:
最大化/最小化一个
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.50x2≤120
0.50
x
1
+
0.50
x
2
≤
150
0.50x_1+0.50x_2 \leq 150
0.50x1+0.50x2≤150
0.25
x
1
≤
50
0.25x_1 \leq 50
0.25x1≤50
x
1
≥
0
,
x
2
≥
0
x_1 \geq 0, x_2 \geq 0
x1≥0,x2≥0
(在这里约束只有小于等于一种,是最简单的线性规划情形)
所谓单纯形,是一种常用的求解线性规划问题的算法。我曾经为它深情地赋过三行诗一首:
啊!单纯形!
你一点也不单纯!
你很行!
_(:зゝ∠)_
接下来我们就来讲讲这一点也不单纯的单纯形算法的步骤吧!
标准形
数学的基本思想,就是化繁为简,现在我们把这堆乱七八糟的条件进行一些统合,使得线性规划问题变得更加简单。
标准形的要求有三条:最小化
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=1naijxj≤bi的形式,引入松弛变量
y
i
≥
0
y_i \geq 0
yi≥0,然后将条件改为
∑
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=1naijxj−yi=bi即可。
第三步,将自由变量
x
j
x_j
xj替换为
x
j
′
−
x
j
′
′
x_j'-x_j''
xj′−xj′′,
x
j
′
,
x
j
′
′
≥
0
x_j',x_j'' \geq 0
xj′,xj′′≥0
那么对于例子来说,只需要添加松弛变量就可以了,化成标准形如下:
目标:
min
z
′
=
−
12
x
1
−
15
x
2
\min z' = -12x_1-15x_2
minz′=−12x1−15x2
约束:
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,x5≥0
标准形的基本解
令 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=⎣⎢⎡a11⋮am1⋯⋱⋯a1n⋮amn⎦⎥⎤, b = [ b 1 ⋮ b m ] b=\begin{bmatrix} b_1 \\ \vdots \\ b_m \end{bmatrix} b=⎣⎢⎡b1⋮bm⎦⎥⎤, c = [ c 1 ⋮ c n ] c=\begin{bmatrix}c_1 \\ \vdots \\ c_n \end{bmatrix} c=⎣⎢⎡c1⋮cn⎦⎥⎤, x = [ x 1 ⋮ x n ] x=\begin{bmatrix}x_1 \\ \vdots \\ x_n \end{bmatrix} x=⎣⎢⎡x1⋮xn⎦⎥⎤
则条件可以写作 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 m∗t的矩阵 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=B−1b,非基变量则全赋为0。
对于一组确定的基向量,基本解是唯一的,但是由于基向量的取法不唯一,所以基本解也有很多种。基本解符合了大部分条件,非常好,但唯一的问题是不一定满足 x j ≥ 0 x_j \geq 0 xj≥0。
定理1:若标准型有可行解,必有基本可行解。
证明:假设 A A A列满秩,那么解只有一组,符合了 x j ≥ 0 x_j \geq 0 xj≥0就是可行的。否则一定存在不全为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=1ncjxj≤∑j=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=B−1b−B−1NxN
代入目标函数 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=cBTB−1b+(cNT−cBTB−1N)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=cBTB−1b
对于任意解:
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+(cNT−cBTB−1N)xN+(cBT−cBTB−1B)xB=z0+(ct−cBTB−1A)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=cT−cBTB−1A,称它的分量 λ 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 aik≤0,则无最优解。
根据 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′=B−1P,A′=B−1A=(αij)m∗n,β=B−1b(这个 β \beta β就是基变量的解值啦)
看起来很复杂,尤其是有个超级复杂的东西——矩阵逆在里面。但我们现在只讨论最简单情况,对于例子,由于 B B B是一个单位阵,所以 B − 1 B^{-1} B−1可以不用考虑了。并且由于基变量都是我们人工加出来的, 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=[−12−15000]。
但是看起来它两个条件都不满足,看来我们还得继续。
基变换
假设基 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} B−1息息相关,所以我们不得不继续定义复杂的符号,比如 A ′ = ( α i j ) m ∗ n = B − 1 A A'=(\alpha_{ij})_{m*n}=B^{-1}A A′=(αij)m∗n=B−1A, β = B − 1 b \beta=B^{-1}b β=B−1b,以及 P i ′ = B − 1 P i P_i'=B^{-1}P_i Pi′=B−1Pi(当然,对于例子里的最简单情况,其实这些东西和 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)′)=B−1B=I
B
−
1
A
=
B
−
1
A
I
B^{-1}A=B^{-1}AI
B−1A=B−1AI,而
P
k
′
P_k'
Pk′是
B
−
1
A
B^{-1}A
B−1A的第
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=1∑mα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=1∑mα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 βi′≥0( β \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啊什么的,头都要晕了,而眼熟在于,它们还是好像高斯消元过程中的消元操作啊!事实上,通单纯形表,我们可以让这些复杂的公式,都变成简单的高斯消元!
不过,在介绍单纯形表前,我们还是再来回顾一遍单纯形的一般步骤吧:
单纯形的一般步骤
- 首先找一组初始可行解。
- 判断是否是最优解(所有 λ k ≥ 0 \lambda_k \geq 0 λk≥0)或者无最优解(所有 λ k < 0 \lambda_k <0 λk<0的 k k k,对任何 l l l都有 α l , k < 0 \alpha_{l,k} < 0 αl,k<0)。
- 取一个 λ 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进行交换得到一组新基。
- 重复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} c1⋯cn | ||||
---|---|---|---|---|
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} x1⋯xn | θ \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} −12−15000 | ||||
---|---|---|---|---|
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} −12−15000 |
这里换入变元是 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} −12−15000 | ||||
---|---|---|---|---|
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.251002−10010001 | 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} −12−15000 | ||||
---|---|---|---|---|
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} −15−120 | 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} 0101004−41−24−1001 | |
− 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
x1−2x2+x3≤11
−
4
x
1
+
x
2
+
2
x
3
≥
3
-4x_1+x_2+2x_3 \geq 3
−4x1+x2+2x3≥3
−
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,x3≥0
唔……总而言之,我们可以先把它变成一个标准形。
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
x1−2x2+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+2x3−x5=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,x5≥0
取不出单位阵基向量怎么办?那就硬取!我们加入人工变量
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+2x3−x5+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的人工变量,然后使用两阶段法来消掉人工变量。