在本文中,我们着重具体地来介绍一下二段法(The 2-Phase Method)和单纯形法(the Simplex Algorithm)两种方法。
在最优化:单纯形法(一) 中,我们提出了二段法(The 2-Phase Method)和单纯形法(the Simplex Algorithm)。我们在上一篇文章中,是可以知道,任意的LP,符合Bland’s Rule便可以利用二段法求解,得到最优解或者是Unbounded的结果。
在本文中,我们着重具体地来介绍一下这两种方法。
Simplex
单纯形法说难不难,不如利用一个例子来描述。例如,对于一个以下的LP:
max
(
0
1
3
0
)
⏟
c
x
s.t.
(
1
1
2
0
0
1
1
1
)
⏟
A
x
=
(
2
5
)
⏟
b
x
1
,
x
2
,
x
3
,
x
4
≥
0
\begin{array}{ll}\max & \underbrace{\left(\begin{array}{llll}0 & 1 & 3 & 0\end{array}\right)}_{c} x \\\text { s.t. } & \underbrace{\left(\begin{array}{llll}1 & 1 & 2 & 0 \\0 & 1 & 1 & 1\end{array}\right)}_{A} x=\underbrace{\left(\begin{array}{l}2 \\5\end{array}\right)}_{b} \\& x_{1}, x_{2}, x_{3}, x_{4} \geq 0\end{array}
max s.t. c
(0130)xA
(10112101)x=b
(25)x1,x2,x3,x4≥0
通过在最优化:单纯形法(一) 的叙述,我们很容易便可以确定,这个LP的基是
B
=
{
1
,
4
}
B=\{1,4\}
B={1,4}。对于这个基,有一个基解:
x
=
{
2
,
0
,
0
,
5
}
x=\{2,0,0,5\}
x={2,0,0,5}
但是,怎么去得到更好的可行解呢?
假定这个更好的可行解为:
x
=
{
x
1
,
x
2
,
x
3
,
x
4
}
x=\{x_1,x_2,x_3,x_4\}
x={x1,x2,x3,x4}。首先,我们可以固定
x
3
=
0
x_3=0
x3=0,使得
x
2
=
t
x_2=t
x2=t。
这个可行解一定会满足
A
x
=
b
Ax=b
Ax=b的限制条件,因此:
(
2
5
)
=
(
1
1
2
0
0
1
1
1
)
x
=
x
1
(
1
0
)
+
x
2
(
1
1
)
+
x
3
(
2
1
)
+
x
4
(
0
1
)
=
(
x
1
0
)
+
t
(
1
1
)
+
0
(
2
1
)
+
(
0
x
4
)
=
t
(
1
1
)
+
(
x
1
x
4
)
(
∗
)
\begin{aligned} \left(\begin{array}{l} 2 \\ 5 \end{array}\right) &=\left(\begin{array}{llll} 1 & 1 & 2 & 0 \\ 0 & 1 & 1 & 1 \end{array}\right) x \\ &=x_{1}\left(\begin{array}{l} 1 \\ 0 \end{array}\right)+x_{2}\left(\begin{array}{l} 1 \\ 1 \end{array}\right)+x_{3}\left(\begin{array}{l} 2 \\ 1 \end{array}\right)+x_{4}\left(\begin{array}{l} 0 \\ 1 \end{array}\right) \\ &=\left(\begin{array}{c} x_{1} \\ 0 \end{array}\right)+t\left(\begin{array}{l} 1 \\ 1 \end{array}\right)+0\left(\begin{array}{l} 2 \\ 1 \end{array}\right)+\left(\begin{array}{c} 0 \\ x_{4} \end{array}\right) \\ &=t\left(\begin{array}{l} 1 \\ 1 \end{array}\right)+\left(\begin{array}{l} x_{1} \\ x_{4} \end{array}\right) (*) \end{aligned}
(25)=(10112101)x=x1(10)+x2(11)+x3(21)+x4(01)=(x10)+t(11)+0(21)+(0x4)=t(11)+(x1x4)(∗)
In short,这个式子总结为:
x
B
=
b
−
t
A
k
x_B = b-tA_k
xB=b−tAk。其中,
x
B
x_B
xB为
x
x
x的基分量,
x
B
=
{
x
B
1
,
.
.
.
,
x
B
n
}
x_B =\{x_{B1},...,x_{Bn}\}
xB={xB1,...,xBn}。
A
k
A_k
Ak为矩阵
A
A
A的第
k
k
k列。这个
k
k
k叫entering basis。也就是上面的
x
2
x_2
x2的下标
2
2
2。
我们改写上面的结果,可以得到下面的式
(
∗
)
(*)
(∗)。
(
x
1
x
4
)
⏟
x
B
=
(
2
5
)
⏟
b
−
t
(
1
1
)
⏟
A
2
(
∗
)
\underbrace{\left(\begin{array}{l}x_{1} \\x_{4}\end{array}\right)}_{x_{B}}=\underbrace{\left(\begin{array}{l}2 \\5\end{array}\right)}_{b}-t \underbrace{\left(\begin{array}{l}1 \\1\end{array}\right)}_{A_{2}}(*)
xB
(x1x4)=b
(25)−tA2
(11)(∗)
我们可以解这个式
(
∗
)
(*)
(∗)。而且,要使得
x
1
x_1
x1和
x
4
x_4
x4同时满足非负的条件:
x
1
=
2
−
t
≥
0
⟶
t
≤
2
x
4
=
5
−
t
≥
0
⟶
t
≤
5
\begin{array}{l} x_{1}=2-t \geq 0 \quad \longrightarrow \quad t \leq {2}\\ x_{4}=5-t \geq 0 \quad \longrightarrow \quad t \leq 5 \end{array}
x1=2−t≥0⟶t≤2x4=5−t≥0⟶t≤5
于是,优化这个LP,我们要使
t
t
t取所能取的最大的值。因此,
t
=
2
t=2
t=2。
因此,我们便可以得到一个新解:
x
=
{
0
,
2
,
0
,
3
}
x=\{0,2,0,3\}
x={0,2,0,3}。这个新解比之前的解会使得目标函数再大一些。之后再将LP改写成Canonical form;单纯形法就是迭代多次,直至找到最优的解。
同时,我们发现,这个LP的解从 x = { 2 , 0 , 0 , 5 } x=\{2,0,0,5\} x={2,0,0,5}到 x ′ = { 0 , 2 , 0 , 3 } x'=\{0,2,0,3\} x′={0,2,0,3},下标为1的分量退出( x 1 ′ = 0 x_1'=0 x1′=0),而下标为2的分量进入了解,使得 x 2 ′ ≠ 0 x_2'\neq0 x2′=0。我们称下标1为leaving bias,称下标2为entering bias。基从 B = { 1 , 4 } B=\{1,4\} B={1,4}变成了 B = { 2 , 4 } B=\{2,4\} B={2,4}。因此,我们也可以认为,单纯形法其实就是找到一个最佳的基。(个人理解,不一定对)
值得注意的问题
问题也是存在的:
-
算法需要一个初始解向量,那我们如何得到一个的初始的可行解向量呢?
-
我们如何保证算法是可以迭代到最终退出的结果呢?即:需要一些新规则来保证算法最终会退出。
初始化
前面说到了,我们需要一个初始的可行解(或者说是可行基,其实是同样的意思)。其实这个可行解也可以利用单纯形法求得。首先,可行解需要同时满足LP的两个限制条件:
A
x
=
b
x
≥
0
Ax=b \\ x \geq 0
Ax=bx≥0
还是继续给出一个例子:
max ( 1 2 − 1 3 ) ⏟ c x s.t. ( 1 5 2 1 − 2 − 9 0 3 ) ⏟ A x = ( 7 − 13 ) ⏟ b x 1 , x 2 , x 3 , x 4 ≥ 0 \begin{array}{ll}\max & \underbrace{\left(\begin{array}{llll}1 & 2 & -1 & 3\end{array}\right)}_{c} x \\\text { s.t. } & \underbrace{\left(\begin{array}{llll}1 & 5 & 2 & 1 \\-2 & -9 & 0 & 3\end{array}\right)}_{A} x=\underbrace{\left(\begin{array}{c}7 \\-13\end{array}\right)}_{b} \\& x_{1}, x_{2}, x_{3}, x_{4} \geq 0\end{array} max s.t. c (12−13)xA (1−25−92013)x=b (7−13)x1,x2,x3,x4≥0
可行解不会和Objective function 有联系:毕竟,我们只要一个可行解嘛。因此,我们只关注上面的限制条件: A x = b Ax=b Ax=b。
因此,问题便转化为了:对于这两个限制条件,我们需要找到一个可行解、或者判断无解。这个问题的解只需要follow下面的几个步骤:
将 A x = b Ax=b Ax=b的右边的常量分量转化为非负
很简单,对于某一个
b
i
,
(
b
i
<
0
)
b_i,(b_i<0)
bi,(bi<0)所对应的一个方程,我们只需要乘于一个
−
1
-1
−1,便可以将其转化。
(
1
5
2
1
2
9
0
−
3
)
x
=
(
7
13
)
\left(\begin{array}{cccc}1 & 5 & 2 & 1 \\2 & 9 & 0 & -3\end{array}\right) x=\left(\begin{array}{c}7 \\13\end{array}\right)
(1259201−3)x=(713)
构造副问题(Auxiliary Problem)
例如,对于上面的例子,我们构造如下的Auxiliary Problem。
min x 5 + x 6 s.t. ( 1 5 2 1 1 0 2 9 0 − 3 0 1 ) ⏟ A ∣ I x = ( 7 13 ) x ≥ 0 \min x_5 + x_6 \\\text{s.t.}~~\underbrace{\left(\begin{array}{cccccc}1 & 5 & 2 & 1 & 1 &0 \\2 & 9 & 0 & -3 & 0 & 1\end{array}\right)}_{A~~~~~~~~~~|~~~~~~~~~~~I} x=\left(\begin{array}{c}7 \\13\end{array}\right) \\x \geq 0 minx5+x6s.t. A ∣ I (1259201−31001)x=(713)x≥0
利用单纯形法,解这个问题
得到结果 ( 2 , 1 , 0 , 0 , 0 , 0 ) ⊤ (2,1,0,0,0,0)^{\top} (2,1,0,0,0,0)⊤。判断出 x 5 = x 6 = 0 x_5=x_6=0 x5=x6=0,从而它是这个问题的可行解。
于是,我们就可以得到满足初始的解。从而进入单纯形算法中。