Linear Programming Note

之前在上家公司处理一个产品上的算法策略时,无意上发现问题在一定近似转化下,可用线性规划来做。于是某次周例行分享中给组里简单讲了下线性规划的东西。单纯形之类的算法运筹课上讲过,即使忘了,按部就班复习一遍倒也不算难事,更何况有各种现成软件包可供调用,并不必手动去写。反倒是推理的过程之前运筹和数学建模课上并没有太理清,自己整理的时候发现还挺有意思;而且也不难,都是最基本的分析和代数技巧。这里顺便记录一下。

1. 例子

我们讲一个小例子来引入线性规划可以做什么。假设你现在有 10 万块钱想要做理财,可选的方案包括存定期、买货币基金、p2p 借贷以及投资黄金,每种方案有着不同的收益期望和风险。同时假设你给自己定了一些投资原则,比如希望定期和货基占到某个数额(随便说,例如 5 万)同时货基比存款多;又或者更看好黄金,希望其份额比 p2p 多至少 50%,等等。

我们用 x1,,x4 依次表示上述四种投资的数量,于是可以把问题形式化为如下形式:

maxz=c1x1+c2x2+c3x3+c4x4s.t.{x1+x2+x3+x4=100000x1x20x1+x250000x31.5x40xi0,i=1,,4

其中 c1,,c4 是几种方法对应的单位时间收益率。 (当然这只是演示例子,真的投资显然不是每种都有稳定线性收益的。)

2. 问题的一般形式

现实中有大量的问题最终会转化为求解一个线性函数的最值,而其中的决策变量(比如上例中的 xi)需要满足线性约束条件。

我们希望问题的形式能更整齐一点,不要一会大于一会小于,于是一般会进行如下一些正规化步骤。

变量非负

有时变量可能取负值,或没有明确约束条件,一般的处理技巧是:

  • xa,a0:引入 u=xa
  • xa:令 u=x
  • x[a,b]:令 u1a,u2b,同时在方程组中添加 u1u2=0 并把所有 x 替换为 u1
  • xR:引入 u10,u20,同时令 x=u1u2

这些引入的新变量 u 一般也称为松弛变量slack variable)。

对于严格不等号的情形(比如 x>0)很多书中并未明确说,但严格来讲是需要讨论的。这时也可以通过引入松弛变量来完成非负转化,比如 u=xx+0,x+0,但此时的问题是等号不能同时成立。因此或者我们需要在最后求解完成后进行验证;或者我们需要放宽最值条件到上/下确界,因为此时有可能最值是不存在的,即实际求得的是 supz(或 infz)。

总之通过上述转化,我们可以将所有变量转化为非负变量。

约束不等号

类似的,对于约束条件,也可通过上述技巧转化为等式。记 f=a1x1+a2x2++anxnbR

  • fbf>b:等式两边取负号
  • fbf<b:添加松弛变量 f+u=b,u0
  • minz:取 z=z,转化为 maxz

一般形式

于是,经过转化,我们可以得到线性规划(linear programming)问题的一般形式:

maxz=cTxs.t.Ax=b,x0

其中,ARm×nx,cRn,bRm。在上下文没有歧义的情况下,当 x 是向量时,x0 表示 x 各分量非负。

3. 理论证明

问题定义好了,接下来就是要把它解决掉。当然,暴力的办法是行不通的,我们不可能穷举所有满足约束条件的 x 然后计算 z 值再来看哪个最大。为方便叙述需要引入一些基本概念,然后来看问题是如何一步步转化为可解决的。

可行域的凸性

Ω={xAx=b,x0},称为可行域Fesible region)。x(1),x(2)Ωλ(0,1),很容易证明 λx(1)+(1λ)x(2)Ω,因此 Ω 是凸集。

引入极点extreme point)的概念:设 xX 为凸集中一点,若不存在 x(1),x(2)Xx(1)x(2)λ(0,1),使得 x=λx(1)+(1λ)x(2)(或从几何角度说,x 不在 x(1),x(2) 的连接线段上),则称 xX 的一个极点。有时也说顶点,因为从几何直观上看,极点可以粗略看作 X 在空间中所表示的几何体的「顶点」。

因为我们就在性质良好的 Rn 中,所以由 Krein-Milman 定理可以很容易的得到1

推论 1:设 V 是有界凸集 Ω 中所有极点的集合2,记

Hull(V)={iλiy(i)iλi=1,λi0,y(i)V}

V 中所有点的凸组合组成的集合,则 Hull(V)V 的凸包,且 Ω=Hull(V)

由此推论我们可知 Ω 中任意一点可表示成其极点的凸组合。正是利用这个性质,我们可以把在 Ω 内寻找最大值的问题限制到只在极点集合 V 上寻找最大值。因为若记

M=maxyVcTy

z=cTx=iλicTy(i)iλiM=M

基础可行解

那么怎么寻找这些极点呢?我们需要暂时先回到问题的代数形式上,引入一些必要的概念。

首先我们不妨假定上述标准形式已经过必要的行变换,且 rank(A)=m<n(否则的话可行域是零维空间,可直接通过线性方程组解得,不在讨论范围内)。设 A=(p1,p2,,pn),其中 piRm×1A 的列向量;x=(x1,x2,,xn)T,于是 Ax=j=1nxjpj=b

x 的非零分量下标为 S={j1,j2,,jm},若这些下标对应的列向量 pj1,pj1,,pjm 线性无关,则称该 x基础可行解Basic Feasible Solution)。为方便,有时也将非负向量 x 用其非零分量表示,即 xS;相应的列向量组为 AS。此时可简记 Ax=ASxS=b

主要定理结论

Theorem 1: xΩ is a basic feasible solution x is an extreme point of Ω.

定理 1xΩ 是上述线性规划问题一般形式的基础可行解当且仅当 xΩ 的极点。

证明:

”:若 x 不是极点,则存在 x(1),x(2)Ωx(1)x(2),及 λ(0,1),使得 x=λx(1)+(1λ)x(2)。令 S={1,,n}Sx 的零分量下标集合,则

0=xS=λxS(1)+(1λ)xS(2)

因为 x(1),x(2) 在可行域内,本身非负,所以由上式可知 $ x_{S{}}{(1)} = 0 x_{S{}}{(2)} = 0 $。又由于 x(1)x(2),所以 xS(1)xS(2)

x(1),所以 Ax(1)=ASxS(1)=b,同理 ASxS(2)=b。由 x 是基础可行解知 AS=(pj1,pj1,,pjm) 列向量线性无关,即 ASRm×m 满秩,估逆矩阵存在,所以 xS(1)=AS1b=xS(2),同 xS(1)xS(2) 矛盾。

”:若 x 不是基础可行解,则 AS=(pj1,pj1,,pjm) 线性相关,所以方程 ASxS=0 有非零解,不妨记为 yS,即 yS0,ASyS=0

构造 yRn 使其在 S 上的分量跟 yS 一致,而在其他分量上为零,即 yS=0。由于 xS>0,可取足够小的 ϵ>0,使得 x+y。又因为

A(x+ϵy)=(p1,,pn)(x+ϵy)=j=1nxjpj+ϵjSyjpj+ϵjSyjpj=b+ϵASyS+ϵASyS=b+ϵ0+ϵ0=b

所以,x+ϵyΩ,同理,可取到足够小的 >0 使得 xy,为简便仍然用 ϵ 表示 (,)

则由 y0x+ϵyxϵy,但

x=12(x+ϵy)+12(xϵy)

这与 x 是极点矛盾。

有了这个定理,我们可以发现问题归结为只需要在 A 的列向量组 (p1,,pn) 中找出所有极大线性无关组就好了。而这是一个通过最基本线性代数就可以完成的任务。

当然你并不需要去穷举所有可能的线性无关组( 种可能还是很多的),这就是单纯形法simplex algorithm)发挥作用的地方了,不过这里限于篇幅(太懒了)就不再详细描述这个著名算法的具体操作了。

4. 小结

我们可以看到对于这样一个看似「古老」的问题,其实在细节上依然有很多需要小心证明的地方。而我个人觉得比较有意思的一个点,就是主要定理之所以对问题的解决有着很重要的一步非平凡推进,原因在于,其把一个完全是几何味道的极点(顶点)概念,同完全是代数味道的基础可行解(线性无关)结合了起来。而其证明过程没有用到高阶的理论,全部是很工整的基础代数和分析技巧。所以这里特意详细梳理了一下理论的流程,算是一篇简单的笔记。3


  1. 声明,我并没有严格验证 Krein-Milman 定理的细节,但在 Rn 中结论应该是没问题的。↩︎

  2. 严格证明中这里需要先说明 V 非空且有限。↩︎

  3. 其实主要是重新开了博客,总不能空着,于是随手先写一点占个位置。↩︎

F. Shen
F. Shen
Algorithm Engineer

Be an informed citizen, life hacker, and sincere creator.

Next
Previous

Related