单纯形法:
将目标函数和约束变换成标准形式。
先找一个基本可行解。
判别它是否为最优解,如果不是,再找一个更好的基本可行解。
例子
min z = x1 + x2
s.t.
2x1 - x2 <= 10 (1)
2 <= x1 <= 20 (2)
0 <= x2 <= 15 (3)
step1: 变换成标准形
==>
(2) ==> 0 <= x1 - 2 <= 20 - 2
取x3 = x1 - 2 ,
则 x1 = x3 + 2 (4)
则 (2) ==> 0 <= x3 <= 18 (5)
(5) ==>
x3 >= 0
x3 <= 18 (6)
(6) ==> x3 + x4 = 18 (7) , x4 >= 0 (8)
(3) ==>
x2 >= 0
x2 <= 15 (9)
(9) ==> x2 + x5 = 15 (10) , x5 >= 0 (11)
将(4)代入(1),得到 2(x3 + 2) - x2 <= 10 (12)
(12) ==> 2x3 + 4 - x2 + x6 = 10 (13) , x6 >= 0
综上,将(4)代入目标函数,消去x1
min z = x3 + 2 + x2 等价于 min z = x3 + x2
约束条件综合起来
(13) ==> -x2 + 2x3 + x6 = 6
(7) x3 + x4 = 18
(10) x2 + x5 = 15
x2 >= 0 , x3 >= 0 , x4 >= 0 , x5 >= 0 , x6 >= 0
以上就是LP的规范形式,即
min c.T x
s..T. Ax = b
x >= 0
c x b为列向量,c x的长度为变量数n(此为5) , b的长度为约束方程数m(此为3) ,A为矩阵(m*n)(3*5)
c.T = (1 , 1 , 0 , 0 , 0)
x.T = (x2 , x3 , x4 , x5 , x6)
A = -1 , 2 , 0 , 0 , 1
0 , 1 , 1 , 0 , 0
1 , 0 , 0 , 1 , 0
b.T = (6 , 18 , 15 )
=====================================================================
step2: 基本概念
将A拆成
N B
A = -1 , 2 | 0 , 0 , 1
0 , 1 | 1 , 0 , 0
1 , 0 | 0 , 1 , 0
B称为基阵 , B中的M个列向量称为基向量
将 x拆成
xn.T xb.T
x.T = x2 , x3 | x4 ,x5 ,x6
变量X中与之对应的(xb)为基变量 , 其余为非基变量(xn)
Ax = b ==>
B*xb + N*xn = b (20)
即:
B xb N xn b
| 0 , 0 , 1 | | x4 | | -1 , 2 | | x2 | | 6 |
| 1 , 0 , 0 | * | x5 | + | 0 , 1 | * | | = | 18 |
| 0 , 1 , 0 | | x6 | | 1 , 0 | | x3 | | 15 |
(20)两边左乘B.I(B的逆)
xb + B.I * N * xn = B.I * b (21)
此式称为对应于基B的典则方程组,将数值代入为:
xb B.I N xn B.I b
| x4 | | 0 , 1 , 0 | | -1 , 2 | | x2 | | 0 , 1 , 0 | | 6 |
| x5 | + | 0 , 0 , 1 | * | 0 , 1 | * | | = | 0 , 0 , 1 | * | 18 |
| x6 | | 1 , 0 , 0 | | 1 , 0 | | x3 | | 1 , 0 , 0 | | 15 |
由(21)==> xb = B.I * b - B.I * N * xn (22)
即
xb B.I b B.I N xn
| x4 | | 0 , 1 , 0 | | 6 | | 0 , 1 , 0 | | -1 , 2 | | x2 |
| x5 | = | 0 , 0 , 1 | * | 18 | - | 0 , 0 , 1 | * | 0 , 1 | * | |
| x6 | | 1 , 0 , 0 | | 15 | | 1 , 0 , 0 | | 1 , 0 | | x3 |
这里xb的取值由xn的取值确定。
将非基变量(xn)全为0 ,代入(22) , xb = B.I*b
xb B.I b
| x4 | | 0 , 1 , 0 | | 6 | | 18 |
| x5 | = | 0 , 0 , 1 | * | 18 | = | 15 |
| x6 | | 1 , 0 , 0 | | 15 | | 6 |
此时,x.T = ( 0 , 0 , 18 , 15 , 6 ) , 称为相应于B的基本解。
如果B.I*b >= 0 , 称为基本可行解,此时B称为可行基。如果 B.I*b > 0 ,则称为非退化的基本可行解。
这里 B.I*b = (18 , 15 , 6).T >= 0 , 所以 x.T = ( 0 , 0 , 18 , 15 , 6 )为基本可行解。
定理:x是基本可行解的充要条件是x是可行域D的顶点。
=================================================================================
step3:基本可行解是否为最优解的判别
对 z = c.T * x 也做相应的变换:
非基变量对应的系数 基变量对应的系数
设 c.T = (cn.T , cb.T )
cn.T cb.T
c.T = ( 1 , 1 | 0 , 0 , 0 )
则 z = c.T * x = cb.T * xb + cn.T * xn
将(22)式代入上式中消去xb
==> z = cb.T * (B.I * b - B.I * N * xn) + cn.T * xn
==> z = cb.T * B.I * b - (cb.T * B.I * N - cn.T) * xn (23)
设z在x.T = ( 0 , 0 , 18 , 15 , 6 ) 这个基本可行解时的取值为z0
将x.T = ( 0 , 0 , 18 , 15 , 6 ) 代入 (23)
==>
z0 = cb.T * B.I * b
将数值代入为:
cb.T B.I b
| 0 , 1 , 0 | | 6 |
z0 = | 0 , 0 , 0 | * | 0 , 0 , 1 | * | 18 | = 0
| 1 , 0 , 0 | | 15 |
将(23)中的 cb.T * B.I * b 用z0替换
==>
z = z0 - (cb.T * B.I * N - cn.T) * xn (24)
设xi.T = cb.T * B.I * A - c.T
cb.T B.I A c.T
| 0 , 1 , 0 | | -1 , 2 , 0 , 0 , 1 |
xi.T = | 0 , 0 , 0 | * | 0 , 0 , 1 | * | 0 , 1 , 1 , 0 , 0 | - | 1 , 1 , 0 , 0 , 0 | = | -1 , -1 , 0 , 0 , 0 |
| 1 , 0 , 0 | | 1 , 0 , 0 , 1 , 0 |
xi = (-1 , -1 , 0 , 0 , 0).T
cb.T B.I N cn.T
| 0 , 1 , 0 | | -1 , 2 |
cb.T * B.I * N - cn.T = | 0 , 0 , 0 | * | 0 , 0 , 1 | * | 0 , 1 | - | 1 , 1 | = | -1 , -1|
| 1 , 0 , 0 | | 1 , 0 |
可证 xi.T = cb.T * B.I * A - c.T = ( cb.T * B.I * N - cn.T , 0 , 0, …)
所以(24) 等价于
z = z0 - xi.T * x (25)
所以,原问题围绕基B转换成了等价的新问题:
目标函数为 z = z0 - xi.T * x
s.t.
xb + B.I * N * xn = B.I * b
x >= 0
因为 x >= 0 , 所以如果xi.T <= 0 , 那么z一定大于z0 , 则此基B对应的基本可行解就可以判定为最优解,z0就是目标函数的最小值。
在此例中xi = (-1 , -1 , 0 , 0 , 0).T , xi <= 0 , 所以( 0 , 0 , 18 , 15 , 6 ) 为最优解,目标函数的最小值为z0 = 0
原函数的最小值为2.
这里面的xi(克西)称为检验数向量。
如果 xi <= 0 , 则此基本可行解为最优解。
如果 xi的某个(设为第K个)分量大于0 , 且 B.I * Ak (Ak为A的第K个列向量) <= 0 , 则问题无界。
如果 xi的某个(设为第K个)分量大于0 , 且 B.I * Ak 中含有正分量 , 那么可求出一个新的基本可行解使目标函数下降。