单纯形法
基本思想
对于线性规划问题,满足以下形式
mincTxs.t.Ax≤bx≥0
转化为标准形式,引入松弛变量,转化为
mincTxs.t.A′[x,x′]T=b [x,x′]≥0
A是一个m行n列的矩阵,其中n是包含松弛变量在内的变量数。假设所有约束都有效,并且m≤n,那么A是一个行满秩的矩阵。因此存在m个基向量。经过一番重新排列,可以转化成[B,N]其中B是基向量。
相应x里的变量顺序也跟着变,优化目标也变成了cbTx+cNTx
这样一个初始可行解就得到了,x0=[B−1b,0],优化目标值为cBTB−1b
如何从这个解出发改进呢,对任何的可行解[xB,xN],带入约束条件,可以得到xB=B−1b−B−1NxN,因此对于优化目标f=cTx=cBB−1b−(cBB−1N−cN)xN=f0−(cBB−1N−cN)xN。也就是说,只要后面减的这个大于0,就能改进了。
仔细分析一下后面这一项,是一个行向量乘列向量,并且都是非基变量对应的列乘出来的,因此可以重新写成f0−∑j∈R(cBB−1pj−cj)xj,其中R是非基向量的列号集合,pj是A矩阵相应的列向量。
现在的目标就变成了,如何选取合适的xj,使得∑j∈R(cBB−1pj−cj)xj>0,因为cBB−1pj是个定值,设为zj,因此目标为∑j∈R(zj−cj)xj>0。
动xj的方式很简单,就是只动其中一个,别的保持为0,那么自然要动zj−cj最大值对应的j(假设为正数),设为k。xk一旦从0变化成正数,会导致xB=B−1b−B−1NxN发生变化(这个前面带入约束条件算过),也就是说这个变化同时造成了xB和xN的改变,然后他们都要满足x≥0的约束,所以xk的变化上限满足B−1b−B−1NxN≤0。
仔细分析xN中只有xk=0,所以B−1b−B−1pkxk≤0,所以xk≤mini{(B−1pk)i(B−1b)i},注意这里只需要从(B−1pk)i>0的位置里面选,其他的系数说明改变xk不会影响xB中相应变量的取值(这句话很重要)。
更进一步发现,因为xk取了这个上限使得某一个xB中的变量缩小到0了,因此新的可行解中,xk从0变成非0,其他非0变量相应改变,只有1个变成了0,设为pr。如果把非0变量对应的列向量看成新的基,那似乎又回到了开始找到可行解的状态了。算法可以继续迭代。问题是新的这一串列向量能否看成基?
答案是能,因为pk=BB−1pk=B(B−1pk),可以看作是B中原有基向量的线性组合,并且变成0的那个向量pr的系数B−1pr肯定不等于0(这里看上上段非常重要的那句话),所以pk和没有pr的向量线性无关了,因此可以组成新的无关组。
整个过程一直迭代,直至找不到zj−cj>0了,这说明怎么调整都没法进一步减小了。如果xj在确定上限那里找不到分母>0的位置,那说明这个变量可以无限制的增长下去,此时问题最优解为−∞
表格法
重新改进表示方法
minfs.t.f−cBxB−cNxN=0xB+B−1NxN=B−1b
把第二个约束左乘cB再加到第一个约束,得到新的问题
minfs.t.f−0xB+(cBB−1N−cN)xN=cBB−1bxB+B−1NxN=B−1b
左侧xB的顺序要保证读下来是个单位阵。
在实际操作中,如果恰好基变量的系数都是1,然后基变量都是人工变量所以cB=0,那形式会非常简洁。
实际运算中:
- 1)按照maxzi−ci确定主列(就是f行xN列的最大数对应的列)
- 2)用xk的上限确定主行(主列中的每一个行,右端项除以本行的元素,只有大于0才考虑),交叉位置为主元,所在列对应的xN进基,所在行出基,替换左侧xB
- 3)利用该位置消去它所在列其他行的非0值(把自己变成1,然后加减把其他变成0)。完成一次迭代。
- 4)直至迭代结束,右下角的值就是最优解。左侧的xB是基,对应的右端列是取值。其他非基变量取值为0。
如何找初始可行解
初始可行解必须是一个基本可行解,而不简单是一个可行解,因此找起来有难度。
两阶段法
一个简单情况是,如果A中包含单位阵了,那就很容易求出B和初始可行解,因此两阶段法的思想是加入人工变量。注意人工变量和松弛变量不一样,松弛变量是合法的,而人工变量强行在每个等式后面加入了一个非负变量,从而凑出A′包含单位阵。如果真的要合法的话,这些人工变量只能取0,因此第一阶段求解如下问题:
min[1,1,1...,1]Txas.t.Ax+xa=bxa≥0,x≥0
这个问题A′包含单位阵所以很容易找到初始可行解。然后最小化上述问题。
- 如果原问题可行最优值为0,最优解中人工变量全取0。
- 如果对应的位置都是非基变量,直接找到原问题最优解
- 如果对应位置存在基变量,执行主元消去过程,这里选取主元的方法为,行取人工变量对应的行(因为要消去它),然后列可以选择任何非人工变量的列,并且这一列可以用你选的那一行消成0。
大M法
优化目标中加入人工变量,但前面的系数使用非常巨大的常数M,迫使人工变量离基。