我们此前探讨过了一般的单纯形法(传送门),这次则来研究所谓“对偶单纯形法”。
线性规划的对偶问题
原始的线性规划问题:
max
c
T
x
\max c^T x
maxcTx
A
x
≤
b
Ax \leq b
Ax≤b
x
≥
0
x \geq 0
x≥0
它的对偶问题:
min
b
T
y
\min b^Ty
minbTy
A
T
y
≥
c
A^Ty \geq c
ATy≥c
y
≥
0
y \geq 0
y≥0
容易看出,对偶的对偶就是它自身。
定理1: c T x ≤ ( A T y ) T x = y T ( A x ) ≤ y T c = c T y c^T x \leq (A^Ty)^T x=y^T(Ax)\leq y^Tc=c^Ty cTx≤(ATy)Tx=yT(Ax)≤yTc=cTy
定理2:若原始问题有一组可行解 x x x,对偶问题有一组可行解 y y y,且 c T x = b T y c^Tx=b^Ty cTx=bTy,则两个解分别是它们的最优解。(由定理1确定的上下界知,显然)
定理3:若原问题有最优解,则对偶问题有最优解。
证明:
先按照单纯形的流程做一下,在原问题引入松弛变量
u
u
u后转化为
A
x
+
E
u
=
b
Ax+Eu=b
Ax+Eu=b。我们找到了一组基本最优解,基向量为
x
B
=
B
−
1
b
x_B=B^{-1}b
xB=B−1b。
还记得最优解的条件码?对,检验数。由于这个原问题是最大化问题,所以检验数此时应该全部小于等于0。
还记得检验数的公式吗?
λ
T
=
c
T
−
c
B
T
B
−
1
A
\lambda^T=c^T-c_B^TB^{-1}A
λT=cT−cBTB−1A,不过由于我们加了变量没有扩展
A
A
A,所以松弛变量
u
u
u这一块要额外考虑考虑。考虑的结果就是:
λ
T
=
(
c
T
−
c
B
T
B
−
1
A
,
−
c
B
T
B
−
1
E
)
\lambda^T = (c^T-c_B^TB^{-1}A, -c_B^TB^{-1}E)
λT=(cT−cBTB−1A,−cBTB−1E)
因此
c
T
−
c
B
T
B
−
1
A
≤
0
c^T-c_B^TB^{-1}A \leq 0
cT−cBTB−1A≤0即
c
T
≤
c
B
T
B
−
1
A
c^T \leq c_B^TB^{-1}A
cT≤cBTB−1A。两边同时取反一下得:
c
≤
A
T
(
(
B
−
1
)
T
c
B
)
c \leq A^T((B^{-1})^Tc_B)
c≤AT((B−1)TcB)
对比一下对偶问题的条件
A
T
y
≥
c
A^Ty \geq c
ATy≥c,发现
y
=
(
B
−
1
)
T
c
B
y=(B^{-1})^Tc_B
y=(B−1)TcB是一组可行解。
而
y
T
b
=
c
B
T
B
−
1
b
=
c
B
T
x
B
y^Tb=c_B^TB^{-1}b=c_B^Tx_B
yTb=cBTB−1b=cBTxB,即
b
T
y
=
c
T
x
b^Ty=c^Tx
bTy=cTx,根据定理2,
y
y
y是最优解。
对偶单纯形法
由以上证明过程可以看出,如果认为 y T = c B B − 1 y^T=c_BB^{-1} yT=cBB−1,对偶问题的一组可行解,能够保证原问题 λ ≥ 0 \lambda \geq 0 λ≥0,虽然此时它不一定是原问题的可行解。我们定义这样的解叫做正则解。
普通的单纯形法,是可行解保证了可行性后,我们再将其逐步变为正则解保证最优性。
交换后,要让 λ j ′ = λ j − λ k α l j / α l k ≥ 0 \lambda_j' = \lambda_j-\lambda_k \alpha_{lj}/\alpha_{lk} \geq 0 λj′=λj−λkαlj/αlk≥0,即正则性依然成立。
当 α l j ≥ 0 \alpha_{lj} \geq 0 αlj≥0等式自然成立,则只需要对于 α l j < 0 \alpha_{lj} < 0 αlj<0的,有 λ j α l j ≤ λ k α l k \frac{\lambda_j}{\alpha_{lj}} \leq \frac{\lambda_k}{\alpha_{lk}} αljλj≤αlkλk即可。
故对偶单纯形法的流程如下:
- 先找到正则解和正则基
- 判断 β = B − 1 b ≥ 0 \beta=B^{-1}b \geq 0 β=B−1b≥0是否成立,也就是是否可行。若可行则结束。
- 否则取 β l < 0 \beta_l < 0 βl<0,若 α i j ≥ 0 \alpha_{ij} \geq 0 αij≥0则无可行解。
- 否则找 λ k α l k = max { λ j α l j ∣ α l j < 0 } \frac{\lambda_k}{\alpha_{lk}}=\max\{\frac{\lambda_j}{\alpha_{lj}} |\alpha_{lj} < 0\} αlkλk=max{αljλj∣αlj<0}的 x k x_k xk和 x π ( l ) x_{\pi(l)} xπ(l)交换做基变换。
- 重复2
整数线性规划问题
你可能要问,既然我们已经有了普通的单纯形算法,为什么需要对偶单纯形算法?这就要提整数线性规划问题了。
整数线性规划问题,指的是添加了条件“变量必须是整数”的线性规划问题,视具体的约束条件不同,又分了很多种,就不细说了。
算分书中的例题:
min
z
=
−
3
x
−
5
y
\min z = -3x-5y
minz=−3x−5y
−
x
+
y
≤
1.5
-x+y \leq 1.5
−x+y≤1.5
2
x
+
3
y
≤
11
2x+3y \leq 11
2x+3y≤11
x
,
y
≥
0
x,y \geq 0
x,y≥0且它们都是整数。
同样,本文不作数学证明,只说解法:
先去掉整数条件,做线性规划求最优解。比方说例题,两个条件添加松弛变量 u 1 u_1 u1和 u 2 u_2 u2,去掉整数条件做完单纯形算法,最终单纯形表如下:
− 3 − 5 0 0 \begin{matrix}-3 & -5 & 0& 0 \end{matrix} −3−500 | |||
---|---|---|---|
c B c_B cB | x B x_B xB | b b b | x y u 1 u 2 \begin{matrix}x & y & u_1& u_2 \end{matrix} xyu1u2 |
− 5 − 3 \begin{matrix}-5 \\ -3 \end{matrix} −5−3 | y x \begin{matrix}y \\ x \end{matrix} yx | 2.8 1.3 \begin{matrix}2.8 \\ 1.3 \end{matrix} 2.81.3 | 0 1 0.4 0.2 1 0 − 0.6 0.2 \begin{matrix}0 & 1 & 0.4 & 0.2\\ 1& 0 & -0.6& 0.2\end{matrix} 01100.4−0.60.20.2 |
− z -z −z | 17.9 17.9 17.9 | 0 0 0.2 1.6 \begin{matrix}0 & 0& 0.2 & 1.6 \end{matrix} 000.21.6 |
如果解都是整数,很好。但是我们得到的 x = 1.3 , y = 2.8 x=1.3, y=2.8 x=1.3,y=2.8,解都不是整数!所以我们得继续。
有若干变量不是整数,任选一个,比如 x i = s x_i=s xi=s,将这个问题分裂成两个子问题,分别添加条件 x i ≤ ⌊ s ⌋ x_i \leq \lfloor s \rfloor xi≤⌊s⌋和 x i ≥ ⌈ s ⌉ x_i \geq \lceil s \rceil xi≥⌈s⌉两个条件,分别求解。然后选择得到的最优解值更优的,再继续重复分裂,直到所有解都变成整数为止。
一个
x
i
≤
a
x_i \leq a
xi≤a的条件相当于
x
i
+
u
=
a
x_i + u =a
xi+u=a。
一个
x
i
≥
a
x_i \geq a
xi≥a的条件相当于
−
x
i
+
u
=
a
-x_i +u=a
−xi+u=a。
比方说例题,我们先来解决添加了 x ≤ 1 x \leq 1 x≤1条件的子问题吧。
我们需要给 A A A添加一行(一个新条件)和一列(一个新变量u),并且基变量也要增加一个 u u u。
− 3 − 5 0 0 0 \begin{matrix}-3 & -5 & 0& 0 & 0 \end{matrix} −3−5000 | |||
---|---|---|---|
c B c_B cB | x B x_B xB | b b b | x y u 1 u 2 u \begin{matrix}x & y & u_1& u_2 & u \end{matrix} xyu1u2u |
− 5 − 3 0 \begin{matrix}-5 \\ -3 \\ 0 \end{matrix} −5−30 | y x u \begin{matrix}y \\ x \\ u \end{matrix} yxu | 2.8 1.3 1 \begin{matrix}2.8 \\ 1.3 \\ 1 \end{matrix} 2.81.31 | 0 1 0.4 0.2 0 1 0 − 0.6 0.2 0 1 0 0 0 1 \begin{matrix}0 & 1 & 0.4 & 0.2 & 0\\ 1& 0 & -0.6& 0.2 & 0 \\ 1 & 0 & 0 & 0 & 1\end{matrix} 0111000.4−0.600.20.20001 |
− z -z −z | 17.9 17.9 17.9 | 0 0 0.2 1.6 0 \begin{matrix}0 & 0& 0.2 & 1.6 & 0 \end{matrix} 000.21.60 |
而由于 x x x已经是一个基变量的,所以应该把 u u u这一行的那个1给消掉(严格证明略,即我不会),也就是说要这样:
− 3 − 5 0 0 0 \begin{matrix}-3 & -5 & 0& 0 & 0 \end{matrix} −3−5000 | |||
---|---|---|---|
c B c_B cB | x B x_B xB | b b b | x y u 1 u 2 u \begin{matrix}x & y & u_1& u_2 & u \end{matrix} xyu1u2u |
− 5 − 3 0 \begin{matrix}-5 \\ -3 \\ 0 \end{matrix} −5−30 | y x u \begin{matrix}y \\ x \\ u \end{matrix} yxu | 2.8 1.3 − 0.3 \begin{matrix}2.8 \\ 1.3 \\ -0.3 \end{matrix} 2.81.3−0.3 | 0 1 0.4 0.2 0 1 0 − 0.6 0.2 0 0 0 0.6 − 0.2 1 \begin{matrix}0 & 1 & 0.4 & 0.2 & 0\\ 1& 0 & -0.6& 0.2 & 0 \\ 0 & 0 & 0.6 & -0.2 & 1\end{matrix} 0101000.4−0.60.60.20.2−0.2001 |
− z -z −z | 17.9 17.9 17.9 | 0 0 0.2 1.6 0 \begin{matrix}0 & 0& 0.2 & 1.6 & 0 \end{matrix} 000.21.60 |
可以看到,现在 b ≥ 0 b \geq 0 b≥0的条件并没有满足,但 λ ≥ 0 \lambda \geq 0 λ≥0的条件还是满足的,也就是说这是一组基本正则解。
所以此时应用对偶单纯形算法,就可以继续求解了。
此时我们把 θ \theta θ写最上面,值为 λ j α l j \frac{\lambda_j}{\alpha_{lj}} αljλj,其中这个 l = 3 l=3 l=3:
θ \theta θ | − − − − 8 − \begin{matrix}- & - & -& -8 & -\end{matrix} −−−−8− | ||
---|---|---|---|
c B c_B cB | x B x_B xB | b b b | x y u 1 u 2 u \begin{matrix}x & y & u_1& u_2 & u\end{matrix} xyu1u2u |
− 5 − 3 0 \begin{matrix}-5 \\ -3 \\ 0 \end{matrix} −5−30 | y x u \begin{matrix}y \\ x \\ u \end{matrix} yxu | 2.8 1.3 − 0.3 \begin{matrix}2.8 \\ 1.3 \\ -0.3 \end{matrix} 2.81.3−0.3 | 0 1 0.4 0.2 0 1 0 − 0.6 0.2 0 0 0 0.6 − 0.2 1 \begin{matrix}0 & 1 & 0.4 & 0.2 & 0\\ 1& 0 & -0.6& 0.2 & 0 \\ 0 & 0 & 0.6 & -0.2 & 1\end{matrix} 0101000.4−0.60.60.20.2−0.2001 |
− z -z −z | 17.9 17.9 17.9 | 0 0 0.2 1.6 0 \begin{matrix}0 & 0& 0.2 & 1.6 & 0 \end{matrix} 000.21.60 |
若 α l j ≥ 0 \alpha_{lj}\geq0 αlj≥0,那这一列就直接忽略,所以只有 u 2 u_2 u2是我们心仪的换入变量。将其换入,消元如出一辙,将第3行第4列消成1,其他行第4列都消成0:
c B c_B cB | x B x_B xB | b b b | x y u 1 u 2 u \begin{matrix}x & y & u_1& u_2 & u\end{matrix} xyu1u2u |
---|---|---|---|
− 5 − 3 0 \begin{matrix}-5 \\ -3 \\ 0 \end{matrix} −5−30 | y x u 2 \begin{matrix}y \\ x \\ u_2 \end{matrix} yxu2 | 2.5 1 1.5 \begin{matrix}2.5 \\ 1 \\ 1.5 \end{matrix} 2.511.5 | 0 1 1 0 1 1 0 0 0 1 0 0 − 3 1 − 5 \begin{matrix}0 & 1 & 1 & 0 & 1\\ 1& 0 & 0& 0 & 1 \\ 0 & 0 & -3 & 1 & -5\end{matrix} 01010010−300111−5 |
− z -z −z | 15.5 15.5 15.5 | 0 0 5 0 0 \begin{matrix}0 & 0& 5& 0& 0 \end{matrix} 00500 |
可喜可贺可喜可贺。加 x ≥ 1 x \geq 1 x≥1的子问题也类似,我也没有算,按算分书的说法,那个子问题的解更优,应该从它开始继续分裂。要分好几次才能找到最优解 x = 4 , y = 1 , z = − 17 x=4,y=1,z=-17 x=4,y=1,z=−17。
这个算法被称为分支限界算法。
总结
讨论了线性规划的对偶单纯形法,以及它在整数线性规划问题中的应用。