单纯形算法
1947年,丹齐格提出了一种求解线性规划问题的方法,即今天所称的单纯形法,这是一种简洁且高效的算法,被誉为20世纪对科学发展和工程实践影响最大的十大算法之一。
上文提到线性规划问题的最优解一定是基本可行解,单纯形法的思路即在不同的基向量下求不同的基本可行解,然后找到最优的解。从几何的角度来看,也就是从一个极点转换到另一个极点,直至找到最优极点的过程。
那么这样的话可以把算法分成三个子问题,1.如何从一个基本可行解转换到另一个基本可行解。2.如何确定应该转移到哪个极点。3.什么时候停止转移操作,即如何判断当前基本可行解是否为最优解。
极点的转移
线性规划的标准型为
minimizecTxsubject toAx=bx≥0 m i n i m i z e c T x s u b j e c t t o A x = b x ≥ 0
考虑到方程
Ax=b A x = b ,展开成如下规范型的方程组
x1+y1 m+1xm+1+...+y1nxn=y10x2+y2 m+1xm+1+...+y2nxn=y20⋮xm+ym m+1xm+1+...+ymnxn=ym0 x 1 + y 1 m + 1 x m + 1 + . . . + y 1 n x n = y 10 x 2 + y 2 m + 1 x m + 1 + . . . + y 2 n x n = y 20 ⋮ x m + y m m + 1 x m + 1 + . . . + y m n x n = y m 0
可以将该方程组转换为
[Im,Ym,n−m]x=y0 [ I m , Y m , n − m ] x = y 0 ,这种形式的方程组
Ax=b A x = b 称为
典式,方程组的典式与原方程组的解是相同的,在典式表达式中,与基列向量对应的变量为基变量,其他的变量为非基变量,即在方程
[Im,Ym,n−m]x=y0 [ I m , Y m , n − m ] x = y 0 中,
x1,x2...,xm x 1 , x 2 . . . , x m 为基变量,其他的变量是非基变量。考虑增广矩阵规范型
[Im,Ym,n−m,y0] [ I m , Y m , n − m , y 0 ] ,其最后一列的各元素是向量
b b 关于基{
a1,...,am a 1 , . . . , a m }的坐标。
现在考虑增广矩阵的更新,即用某个非基变量替换某个基变量,求新的基变量对应的典式表达式,比如用非基变量 aq,m<q≤n a q , m < q ≤ n 替换基变量 ap,1≤p≤m a p , 1 ≤ p ≤ m 。在原矩阵上, aq a q 可以表示为
aq=∑i=1myiqai=∑i=1i≠pmyiqai+ypqap a q = ∑ i = 1 m y i q a i = ∑ i = 1 i ≠ p m y i q a i + y p q a p
注意仅当
ypq≠0 y p q ≠ 0 时,向量组{
a1,...,ap−1,aq,ap+1,...,am a 1 , . . . , a p − 1 , a q , a p + 1 , . . . , a m }才是线性无关的,才能形成一组基。
可以由上述方程求解出
ap=1ypqaq−∑i=1i≠pmyiqypqai a p = 1 y p q a q − ∑ i = 1 i ≠ p m y i q y p q a i
利用原来的增广矩阵,可以将任意向量
aj(m<j≤n) a j ( m < j ≤ n ) 表示为
aj=y1ja1+y2ja2+...+ymjam a j = y 1 j a 1 + y 2 j a 2 + . . . + y m j a m
将
ap a p 的表达式代入可以得到
aj=∑i=1i≠pm(yij−ypjypqyiq)ai+ypjypqaq a j = ∑ i = 1 i ≠ p m ( y i j − y p j y p q y i q ) a i + y p j y p q a q
利用
y′ij y i j ′ 表示新的增广矩阵中的元素,由上式可得
y′ij=yij−ypjypqyiq,i≠py′pj=ypjypq y i j ′ = y i j − y p j y p q y i q , i ≠ p y p j ′ = y p j y p q
利用以上公式对矩阵的变换称为关于元素
(p,q) ( p , q ) 的
枢轴变换,以上即为从一个极点转换到另一个极点的公式。
确定转移的极点
确定转移的极点即将向量组转换到另一组坐标系上,详细来说就是将向量组中m个向量之一取出,从另外n-m个向量中选择一个向量加入到基向量组形成新的基。我们记为将 ap a p 向量取出(出基),将 aq a q 向量加入(入基),又可以将这个问题分为两部分,即分别确定 p p 和 q q 。
对于 q q 的确定,先看枢轴变换的公式如下
y′ij=yij−ypjypqyiq,i≠py′pj=ypjypq y i j ′ = y i j − y p j y p q y i q , i ≠ p y p j ′ = y p j y p q
再看另一种方法将一个非基变量
aq a q 变成基向量
利用当前的基向量来表示向量
aq a q
aq=y1qa1+y2qa2+...+ymqam a q = y 1 q a 1 + y 2 q a 2 + . . . + y m q a m
上式两边同时乘上
ϵ>0 ϵ > 0 可以得到
ϵaq=ϵy1qa1+ϵy2qa2+...+ϵymqam ϵ a q = ϵ y 1 q a 1 + ϵ y 2 q a 2 + . . . + ϵ y m q a m
将基本解
x=[y10,...,ym0,0,...,0]T x = [ y 10 , . . . , y m 0 , 0 , . . . , 0 ] T 代入方程
Ax=b A x = b 可以得到
y10a1+...+ym0am=b y 10 a 1 + . . . + y m 0 a m = b
联立上面两个等式,可以得到
(y10−ϵy1q)a1+(y20−ϵy2q)a2+...+(ym0−ϵymq)am+ϵaq=b ( y 10 − ϵ y 1 q ) a 1 + ( y 20 − ϵ y 2 q ) a 2 + . . . + ( y m 0 − ϵ y m q ) a m + ϵ a q = b
即向量
[y10−ϵy1q,...,ym0−ϵymq,0,...,ϵ,...,0] [ y 10 − ϵ y 1 q , . . . , y m 0 − ϵ y m q , 0 , . . . , ϵ , . . . , 0 ] 是方程
Ax=b A x = b 的一个解,当
ϵ ϵ 不断增大,向量的前m个元素中首次出现0,此时可以得到一个基本可行解,变换过后的基本可行解对应的目标函数值为
z=c1(y10−y1qϵ)+...+cm(ym0−ymqϵ)+cqϵ=z0+[cq−(c1y1q+...+cmymq)]ϵ z = c 1 ( y 10 − y 1 q ϵ ) + . . . + c m ( y m 0 − y m q ϵ ) + c q ϵ = z 0 + [ c q − ( c 1 y 1 q + . . . + c m y m q ) ] ϵ
其中,
z0=c1y10+...+cmym0 z 0 = c 1 y 10 + . . . + c m y m 0 ,令
zq=c1y1q+...+cmymq z q = c 1 y 1 q + . . . + c m y m q ,可以得到
z=z0+(cq−zq)ϵ z = z 0 + ( c q − z q ) ϵ ,当
z−z0=(cq−zq)ϵ<0 z − z 0 = ( c q − z q ) ϵ < 0 时,说明基本可行解对应的目标函数值变小了,即认为这个向量加入基向量组后是有益的。
那么可以对每一个 q,m<q≤n q , m < q ≤ n 计算 cq−zq c q − z q ,令 ri=0(i=1,...,m),ri=ci−zi(i=m+1,...,n) r i = 0 ( i = 1 , . . . , m ) , r i = c i − z i ( i = m + 1 , . . . , n ) ,称 ri r i 为第 i i 个简化价值系数,也称为检验数。可以通过证明得到,当且仅当相应的检验数都是非负的时候,该基本可行解是最优解。
即可以通过计算检验数的方法来判断当前解是否为最优解,当检验数中有负数的时候,则说明当前解不是最优解,可以通过将第 q q 个向量加入基向量组的方法减小目标函数值,如果有多个负数,则选择检验数最小的第 q q 个向量加入基向量组。
上面确定了 q q 的选择方法,下面来介绍一下如何确定出基向量 ap a p ,由上文可知,对于向量 [y10−ϵy1q,...,ym0−ϵymq,0,...,ϵ,...,0] [ y 10 − ϵ y 1 q , . . . , y m 0 − ϵ y m q , 0 , . . . , ϵ , . . . , 0 ] ,当 ϵ ϵ 不断增大,在前 m m 个元素中会有第 i i 个元素 yi0−ϵyiq y i 0 − ϵ y i q 最先等于0,那么我们则选择 ai a i 作为出基向量 ap a p ,即 p=arg mini{yi0/yiq:yiq>0} p = a r g m i n i { y i 0 / y i q : y i q > 0 } ,需要注意的是,如果不存在 yiq>0 y i q > 0 ,则问题有无界解,停止运算,另外如果同时出现多个0元素,那么得到退化的基本可行解,此时选择最小的 p p 值。
确定停止条件
上文介绍了如何选择转移的极点数,在确定 q q 的时候,计算检验数,若所有的检验数都是非负,那么此时的基本可行解是最优解,停止计算。另外在确定 p p 的时候,若随着 ϵ ϵ 不断增大,向量的前m个元素也随之增大,即对于 0<i≤m,yiq<0 0 < i ≤ m , y i q < 0 ,那么该问题有无界解,也停止计算。
单纯形算法
上文介绍了单纯形算法几个子问题的处理方法,下面来总结一下单纯形算法
1.根据初始基本可行解构造增广矩阵规范型;
2.计算非基变量的检验数;
3.如果对于所有 j j 都有 rj≤0 r j ≤ 0 ,则停止计算,当前基本可行解是最优解,否则进入下一步
4.在小于0的检验数中选择检验数最小的 q q
5.如果不存在 yiq>0 y i q > 0 ,则停止计算,问题有无界解;否则计算 p=arg mini{yi0/yiq:yiq>0} p = a r g m i n i { y i 0 / y i q : y i q > 0 } ,如果得到多个满足条件的下标 i i ,令 p p 为最小的下标值。
6.以元素 (p,q) ( p , q ) 作为枢轴元素,进行枢轴变换,更新增广矩阵规范型。
7.转到步骤2
另外对于单纯形算法,还有其矩阵表达式,对于寻找初始基本可行解所遇到的困难,又提出了两阶段单纯形法,为了减小计算量,又提出了修正单纯形法等等。
To be continue…