单纯形法

维基百科,自由的百科全书
跳转至: 导航搜索

数学最优化中,由George Dantzig发明的单纯形法(simplex algorithm)是线性规划问题的数值求解的流行技术。有一个算法与此无关,但名称类似,它是Nelder-Mead法或称下山单纯形法,由Nelder和Mead发现(1965年),这是用于优化多维无约束问题的一种数值方法,属于更一般的搜索算法的类别。

这二者都使用了单纯形的概念,它是N维中的N + 1个顶点的凸包,是一个多胞体:直线上的一个线段,平面上的一个三角形,三维空间中的一个四面体,等等。

标准形式[编辑]

以下为线性规划的标准形式,假设有n个变量和m个約束


\begin{align}
  & \max \sum\limits_{1\le k\le n}{{{c}_{k}}{{x}_{k}}} \\ 
 & s.t. &  &  &  &  \\ 
 & \sum\limits_{1\le k\le n}{{{A}_{1,k}}{{x}_{k}}}\le {{b}_{1}}, \\ 
 & \sum\limits_{1\le k\le n}{{{A}_{2,k}}{{x}_{k}}\le {{b}_{2}},} \\ 
 & ... \\ 
 & \sum\limits_{1\le k\le n}{{{A}_{m,k}}{{x}_{k}}}\le {{b}_{m}} \\ 
 & {{x}_{1}},{{x}_{2,}}...,{{x}_{n}}\ge 0  
\end{align}

所有其他形式的线性规划方程组都可以按照下列方式转化成标准形式:

  • 目标函数并非最大化:将所有{{c}_{k}}取负。
  • 约束条件中存在大于或等于约束:将约束两边取负。
  • 约束条件中存在等式:将其转化为两个不等式(一个大于等于,一个小于等于)
  • 有的变量没有非负约束:加入新变量x',并用x-x'替换原来的变量x

松弛形式[编辑]

可以将标准形式的线性规划转化为松弛形式,以方便运算。 在原来n个变量,m个约束的线性规划中,加入m个新的变量,将原来的不等式化为等式:

{{x}_{n+j}}={{b}_{j}}-\sum\limits_{1\le k\le n}{{{A}_{j,k}}{{x}_{k}}}

当然,此时{{x}_{n+j}}\ge 0依然成立。

我们将{{x}_{1}},{{x}_{2}},...,{{x}_{n}}这些变量称为非基变量,它们构成的集合记为N。将 {{x}_{n+1}},{{x}_{n+2}},...,{{x}_{n+m}}这些变量称为基变量,它们构成的集合记为B。简单地理解,非基变量能够由基变量唯一确定。

在这样的定义下,线性规划的松弛形式可以写为如下形式:

\begin{align}
  & \max v+\sum\limits_{k\in N}{{{c}_{k}}{{x}_{k}}} \\ 
 & s.t. \\ 
 & \forall 1\le i\le n+m,{{x}_{i}}\ge 0 \\ 
 & \forall j\in B,{{x}_{j}}={{b}_{j}}-\sum\limits_{k\in N}{{{A}_{j,k}}{{x}_{k}}} \\ 
\end{align}

因此,线性规划的松弛形式可以由v, c, A, b, N, B唯一确定,其中v是实数,c是长度为n+m的向量,b是长度为m的向量,A是m*(n+m)的矩阵。N, B是整数集合,分别表示非基变量集合以及基变量集合。

转轴操作[编辑]

转轴操作是单纯形法中的核心操作,其作用是将一个基变量与一个非基变量进行互换。可以将转轴操作理解为从单纯形上的一个顶点走向另一个顶点。

设变量{{x}_{n+d}}属于B(基变量),变量{{x}_{e}}属于N(非基变量),执行转轴操作pivot(d,e)之后,{{x}_{n+d}}将变为非基变量,相应地{{x}_{e}}将变为基变量。

具体地说,一开始我们有

{{x}_{n+d}}={{b}_{d}}-\sum\limits_{k\in N}{{{A}_{d,k}}{{x}_{k}}}

移项,得

A_{d,e}x_e = b_d-\sum\limits_{k\in N,k\ne e}A_{d,k}x_k-{x}_{n+d}

如果{{A}_{d,e}}\ne 0,我们有

{{x}_{e}}=\frac{{{b}_{d}}}{{{A}_{d,e}}}-(\sum\limits_{k\in N,k\ne e}{\frac{{{A}_{d,k}}}{{{A}_{d,e}}}{{x}_{k}})}-\frac{1}{{{A}_{d,e}}}{{x}_{n+d}}

将此式代入其他的约束等式以及目标函数,我们就实现了{{x}_{n+d}}{{x}_{e}}在基变量和非基变量上的互换。

最优化过程[编辑]

如果b向量所有元素非负,则显然我们只需要令所有的变量等于0,就可以得到一个可行解。在这种情况下,通过下述最优化过程,我们可以得到该线性规划的最优解,或者指出该线性规划的最优解为无穷大(不存在)。

  1. 任取一个非基变量{{x}_{e}},使得{{c}_{e}}>0
  2. 选取一个基变量{{x}_{d}},使得{{A}_{d,e}}>0,且最小化{{{b}_{d}}}/{{{A}_{d,e}}}\;
  3. 执行转轴操作pivot(d, e),并转到第一步继续算法。

根据{{{b}_{d}}}/{{{A}_{d,e}}}\;的最小性不难证明pivot(d, e)不会破坏b的非负性。因此将所有变量取0值仍然是可行解。同时,根据\Delta v={{c}_{e}}\frac{{{b}_{d}}}{{{A}_{d,e}}}\ge 0,我们发现v一定是不降的。这就达到了更新解的目的。

不难发现,算法终止有两种情况:

  1. 对于所有的非基变量,c均非正。
  2. 对于某一个e,所有的{{A}_{d,e}}均非正。

可以证明,对于第一种情况,我们已经得到了该线性规划的最优解。当前的v即为答案。严格证明比较复杂,但是直观上是很容易理解的。因为所有的非基变量都是非负的,而所有的c都是非正的,因此只要某个非基变量不为0,就会使得目标函数更小。

对于第二种情况来说,很容易证明此时线性规划的最优解是无穷大。只要让其他所有变量均为0,变量{{x}_{e}}为正无穷。由于所有的{{A}_{d,e}}都非正,因此非基变量的非负性得到保证。同时由于{{c}_{e}}>0,目标函数值为正无穷。

实例[编辑]

例:解最优化问题:

\min \quad - x_1 - x_2

s.t. \quad 2x_1 + x_2 + x_3 = 12,

\quad x_1 + 2x_2+ x_4 = 9,

x_i \geq 0, i = 1, 2, 3, 4.

列单纯形表(即矩阵):

x_1 x_2 x_3 x_4 b
x_3 2 1 1 0 12
x_4 1 2 0 1 9
c 1 1 0 0 0

然后从c所在行的正数中最大的一个所对应的变量作为基变量,因为这里两者一样,不妨选为x_1

由于拿x_1所在列的正系数去除b所在列的数的结果为\frac {12}2 = 6 < \frac 91 = 9,故取x_3离开基变量。

然后对该矩阵进行行变换,使x_1所在列变成单位向量:

x_1 x_2 x_3 x_4 b
x_1 1 1/2 1/2 0 6
x_4 0 3/2 -1/2 1 3
c 0 1/2 -1/2 0 -6

接下来令c所在行的其余的正数中最大的一个所在列的变量x_2进入基变量,并且根据\frac 6{1/2} = 12 > \frac 3{3/2} = 2,令x_4离开基变量。

继续进行行变换,得到

x_1 x_2 x_3 x_4 b
x_1 1 0 2/3 -1/3 5
x_2 0 1 -1/3 2/3 2
c 0 0 -1/3 -1/3 -7

由于c所在行的所有数都非正,问题结束。最优解为x_1 = 5, x_2 = 2,最优值为\min - x_1 - x_2 = -7

初始化过程[编辑]

如果b向量并不全为非负,则我们需要通过初始化过程来找到一个可行解,然后才可以使用最优化过程进行优化。当然,此时原线性规划不一定存在可行解。

具体的方法是,加入一个新的非基变量{{x}_{0}},并在原线性规划的基础上构造一个新的辅助的线性规划。

\begin{align}
  & \max -{{x}_{0}} \\ 
 & s.t. \\ 
 & \forall 0\le i\le n+m,{{x}_{i}}\ge 0 \\ 
 & \forall j\in B,{{x}_{j}}={{b}_{j}}-(\sum\limits_{k\in N}{{{A}_{j,k}}{{x}_{k}}})+{{x}_{0}} \\ 
\end{align}

注意这里N集合并不包含{{x}_{0}}

然后,选择一个基变量{{x}_{d}}使得{{b}_{d}}最小,执行转轴操作pivot(d, 0)。不难证明该操作过后所有的b值全部非负。然后,使用前文中所述的最优化过程求解该辅助线性规划。

由于{{x}_{0}}非负,因此该线性规划的答案非正。如果答案为负数,则说明原线性规划不可能让所有的基变量都非负,因此原线性规划无可行解。否则,只要令所有变量为0,并去掉{{x}_{0}}变量,就可以得到可行解。

在从辅助线性规划转化到原来的线性规划的过程中,如果{{x}_{0}}已经是非基变量,则可以将其从约束条件和目标函数中直接去掉。否则,需要任取一个非基变量{{x}_{e}}执行pivot(0, e),将{{x}_{0}}变为非基变量。由于此时{{x}_{0}}是基变量且{{x}_{0}}=0,故{{b}_{0}}=0一定成立,因此这个转轴操作不会破坏b向量的非负性。

效率分析[编辑]

在采用Bland's法则选择用于转轴操作的d和e(相同值的情况下取字典序最小)之后,可以证明单纯形法一定能够在有限步之后终止,但是最坏情况算法的时间复杂度指数级别的,而且可以构造出让单纯形法的时间复杂度达到指数级别的具体实例。不过实践证明在绝大多数情况下单纯形法的效率非常令人满意。

单纯形法的最坏时间复杂度为指数级别,并不意味着线性规划不存在多项式级别的算法。椭球算法内点算法均为解决线性规划的多项式时间算法。

参考[编辑]

  • Greenberg, Harvey J., Klee-Minty Polytope Shows Exponential Time Complexity of Simplex Method University of Colorado at Denver (1997) PDF download
  • Frederick S. Hillier and Gerald J. Lieberman: Introduction to Operations Research, 8th edition. McGraw-Hill. ISBN 0-07-123828-X
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Section 29.3: The simplex algorithm, pp.790–804.
  • IOI2007国家集训队论文,《浅谈信息学竞赛中的线性规划——简洁高效的单纯形法实现与应用》,作者:李宇骞

参看[编辑]

外部连接[编辑]