单纯形法与单纯形表

1,071 阅读4分钟

一、单纯形法的基本思想

从一个基本可行解出发,求一个使目标函数值有所改善(指让目标函数减小)的基本可行解;通过不断改进基本可行解,力图达到最优基本可行解

二、基本可行解

一般线性规划问题总可以写成下列标准形式:

\min \quad \boldsymbol {cx}\\
s.t. \quad \boldsymbol {Ax} = \boldsymbol b,\\
\qquad \boldsymbol x \geq \boldsymbol 0;\\\tag{2.1}

其中\boldsymbol Am \times n矩阵,\boldsymbol cn维行向量,\boldsymbol bm维列向量。对矩阵进行分块:A = \left[B,N \right],其中Bm阶可逆矩阵,一般情况下,m < n,不然则方程无解;如果A的秩小于m,则多项式有多余行;如果不是可逆矩阵,那么可以通过列变换化为可逆矩阵。 同时记:

\boldsymbol x=\left[
\begin{matrix}
\boldsymbol x_B\\
\boldsymbol x_N
\end{matrix}
\right]

其中Bx_B对应,Nx_N对应。这样可以把A \boldsymbol x =\boldsymbol b写成:

\left[
\begin{matrix}
B \quad N
\end{matrix}
\right] 
\left[
\begin{matrix}
\boldsymbol x_B\\
\boldsymbol x_N
\end{matrix}
\right]=\boldsymbol b \quad \Rightarrow \quad B\boldsymbol x_B+N\boldsymbol x_N=\boldsymbol b \tag{2.2}

由于B可逆,(2.2)可以写为:

\boldsymbol x_B=B^{-1}\boldsymbol b - BN \boldsymbol x_N,\tag {2.3}

\boldsymbol x_N 取不同的值,那么方程有不同的解。如果我们令 \boldsymbol x_N = \boldsymbol 0 ,得到

\boldsymbol x=
\left[
\begin{matrix}
\boldsymbol x_B\\
\boldsymbol x_N
\end{matrix}
\right]
=
\left[
\begin{matrix}
B^{-1}\boldsymbol b\\
\boldsymbol 0
\end{matrix}
\right] \tag{2.4}

并把这个解称为方程组A \boldsymbol x =\boldsymbol b的基本解。如果B^{-1}\boldsymbol b > 0则称(2.4)为约束条件A \boldsymbol x =\boldsymbol b \quad \boldsymbol x  \geq 0基本可行解。特别的,如果B=I_m或者B=E_m,即B为单位矩阵,那么B=B^{-1}=I_m,所以(2.4)可以化为:

\boldsymbol x=
\left[
\begin{matrix}
\boldsymbol x_B\\
\boldsymbol x_N
\end{matrix}
\right]
=
\left[
\begin{matrix}
\boldsymbol b\\
\boldsymbol 0
\end{matrix}
\right]\\ \tag{2.5}

这个讨论单纯形法单纯形表的时候会用上。

三、单纯形法的原理

我们接下来讨论如何从一个基本可行解(已知),求另外一个基本可行解。

f=\boldsymbol {cx} \tag{3.1}

我们已知一个基本可行解:

\boldsymbol x^{(0)} =
\left[
\begin{matrix}
B^{-1}\boldsymbol b\\
\boldsymbol 0
\end{matrix}
\right]

处的目标函数值

f_0=\boldsymbol {cx^{(0)}}=[\boldsymbol c_B, \boldsymbol c_N]
\left[
\begin{matrix}
B^{-1}\boldsymbol b\\
\boldsymbol 0
\end{matrix}
\right]
=\boldsymbol c_B B^{-1}\boldsymbol b \tag {3.2}

\boldsymbol x=
\left[
\begin{matrix}
\boldsymbol x_B\\
\boldsymbol x_N
\end{matrix}
\right]

是任意一个可行解(满足约束条件的解)。此处的目标函数值为:

f=\boldsymbol cx=[\boldsymbol c_B, \boldsymbol c_N]
\left[
\begin{matrix}
\boldsymbol x_B\\
\boldsymbol x_N
\end{matrix}
\right]
=\boldsymbol {c_B x_B}+\boldsymbol { c_N x_N }\\

把公式(2.3)带入:

\begin{split}
f&=\boldsymbol c_B(B^{-1}\boldsymbol b - BN \boldsymbol x_N)+\boldsymbol c_N x_N\\
 &=\boldsymbol c_B B^{-1} \boldsymbol b-(\boldsymbol c_B B^{-1}N - \boldsymbol c_N)\boldsymbol x_N\\
 &=f_0-\sum_{j\in R}{(\boldsymbol c_B B^{-1}\boldsymbol p_j-c_j)x_j}\\
 &=f_0-\sum_{j\in R}{(z_j-c_j)x_j}
\end{split}\tag{3.3}

其中把N写成列向量的形式,并且RN的下标集合,有n-m个。

z_j=\boldsymbol c_B B^{-1} \boldsymbol p_j \tag{3.4}

由于x_j未知,所以可能存在使(其中z_jc_j是标量)

\sum_{j\in R}{(z_j-c_j)x_j} > 0,

的情况。我们再假设x_j中有一项x_k\ne0,其他项x_j=0(j\ne k , j\in R)(都为0),为使目标函数尽可能快速减小,z_j-c_j越大越好,这样减少的快,当然如果是负数,那么由于x_j > 0,目标函数就不会减少了,此处就为最优解。我们把k取在z_j-c_j最大处:

z_k - c_k=\max_{j \in R}{(z_j-c_j)},\tag{3.5}

那我们取值取多少呢?由公式(2.3)可以得到:

\boldsymbol x_B=B^{-1}\boldsymbol b - B^{-1} \boldsymbol p_k \boldsymbol x_k=\boldsymbol {\bar b }-\boldsymbol y_kx_k,

其中\boldsymbol {\bar b } =B^{-1}\boldsymbol by_k=B^{-1} \boldsymbol p_km维列向量(而且都是常量),写成分量形式:

\boldsymbol x_B = 
\left[
\begin{matrix}
x_{B_1}\\
x_{B_2}\\
\cdot\\
\cdot\\
\cdot\\
x_{B_m}\\
\end{matrix}
\right]
=
\left[
\begin{matrix}
\bar b_1\\
\bar b_2\\
\cdot\\
\cdot\\
\cdot\\
\bar b_m\\
\end{matrix}
\right]
-
\left[
\begin{matrix}
y_{1k}\\
y_{2k}\\
\cdot\\
\cdot\\
\cdot\\
y_{mk}\\
\end{matrix}
\right]x_k,\tag{3.6}

由于\boldsymbol x的每个分量都非负,而且y_{ik} \leq 0时,x_k将不受限制,我们取y_{ik} > 0时所以:

\bar b_i-y_{ik}x_k \geq 0 \Rightarrow x_k \leq \frac{\bar b_i}{y_{ik}}

所以可以看出x_k比所有的

\frac{\bar b_i}{y_{ik}}

都要小,x_k最大可以取到它们之中最小的,由于x_k越大,目标函数下降的越快,所以:

x_k=\min{ \left\{ \frac{\bar b_i}{y_{ik}} \Bigg | y_{ik} > 0\right\} }=\frac{\bar b_r}{y_{rk}} \tag{3.7}

此时,把x_k的值带入公式(3.6)可以得到:

x_{B_r}=\bar b_r-y_{rk} \cdot \frac{\bar b_r}{y_{rk}}=0

表明\boldsymbol x的前m项中有一项为0:

\boldsymbol x=[x_{B_1},x_{B_2},\cdot \cdot  \cdot,x_{B_{r-1}},0,x_{B_{r+1}},\cdot \cdot  \cdot,x_{B_m},0,\cdot \cdot  \cdot,x_k,0,\cdot \cdot  \cdot,0]^\top

恰好这个可行解\boldsymbol x的形式与基本可行解的形式一样,经证明(略),这也是基本可行解。此时,从一个基本可行解,到了另外一个基本可行解,而且,目标函数值减少了(z_k-c_k)x_k
重复上述过程即可抵达最优基本可行解。

四、单纯形法到单纯形表

单纯形法可以计算出最优解基本可行解,但是不方便检查,下面介绍单纯形表。 线性规划标准形式(公式(2.1))可以改写成下面的形式:

\begin{split}
\min \quad f \quad\quad\quad\quad\quad\quad\quad\quad \\
s.t.\quad  f-\boldsymbol {c_B x_B} - \boldsymbol {c_N x_N} &=0\\
B\boldsymbol x_B+N\boldsymbol x_N &=\boldsymbol b\\
\boldsymbol {x_B \geq 0,x_N \geq 0}
\end{split} \tag{4.1}

对公式(4.1)进行整理,可以得到:

\begin {split}
\min \quad f \qquad \qquad\qquad\qquad\qquad\qquad\quad\\
s.t. \qquad\qquad\boldsymbol x_B \qquad\qquad +B^{-1}N \boldsymbol x_N &= B^{-1}\boldsymbol b\\
f+0 \cdot \boldsymbol x_B +(\boldsymbol c_B B^{-1}N - \boldsymbol c_N)\boldsymbol x_N &=\boldsymbol c_B B^{-1}\boldsymbol b\\
\boldsymbol {x_B \geq 0,x_N \geq 0}
\end {split} \tag{4.2}

我们把公式(4.2)写成矩阵的形式:

\left[
\begin{matrix}
0&I_m&B^{-1}N\\
1&0&\boldsymbol c_B B^{-1}N - \boldsymbol c_N
\end{matrix}
\right]

\left[
\begin{matrix}
f\\
\boldsymbol x_B\\
\boldsymbol x_N
\end{matrix}
\right]=

\left[
\begin{matrix}
 B^{-1}\boldsymbol b\\
\boldsymbol c_B B^{-1}\boldsymbol b
\end{matrix}
\right] \tag{4.3}

如果我们令\boldsymbol {x_N=0},公式(4.2)可以简化为:

\begin {split}
\min \qquad f \quad\\
s.t. \qquad  x_B &= B^{-1}\boldsymbol b \qquad\\
f &=\boldsymbol c_B B^{-1}\boldsymbol b\\
\boldsymbol {x_B \geq 0,x_N \geq 0}
\end {split} \tag{4.4}

公式(4.3)可以简化为:

\left[
\begin{matrix}
0&I_m\\
1&0
\end{matrix}
\right]

\left[
\begin{matrix}
f\\
\boldsymbol x_B\\
\end{matrix}
\right]=

\left[
\begin{matrix}
 B^{-1}\boldsymbol b\\
\boldsymbol c_B B^{-1}\boldsymbol b
\end{matrix}
\right] \tag{4.5}

我们把公式(4.3)矩阵部分整理成表1:

对应x f \boldsymbol x_B \boldsymbol x_N 右端
\boldsymbol x_B 0 I_m B^{-1}N B^{-1}\boldsymbol b
f 1 0 \boldsymbol c_B B^{-1}N - \boldsymbol c_N \boldsymbol{c_B}B^{-1}\boldsymbol b

根据公式(3.3)可以知道

\boldsymbol c_B B^{-1}N - \boldsymbol c_N=(z_{N_1}-c_{N_1},\cdot \cdot \cdot ,z_{N_{n-m}}-c_{N_{n-m}})

这个就是公式(3.5)所需的,用来确定x_k的位置的, 从这个表中我们也可以得到\boldsymbol {\bar b } =B^{-1}\boldsymbol by_k=B^{-1} \boldsymbol p_k,用来确定x_k的大小的。

其实我们从公式(4.3)、加上第二部分结尾所说,可以得到,如果B是单位矩阵I_m,或者整个系数矩阵A中出现了可以组成单位矩阵的m列,那么我们可以方便的找到一个基本可行解,并且得到他的目标函数值。我们从表格中得到了大小和位置,然后进行矩阵行变换,把k所在列化为基向量的形式(如[0,0,\cdot\cdot\cdot ,0,1,0,\cdot\cdot\cdot,0]),就可以得到另外一个基本可行解。 这样就是如何从单纯形法到单纯形表。

五、补充说明矩阵变换不会改变多项式的结构

比如这样一个多项式:

\begin{split}
x_1 + x_2 &=1  \quad (1)\\
x_1 +2x_2 &=2  \quad (2)
\end{split}

对多项式进行行变换(比如第一行加第二行)不会改变多项式的解。