1 线性规划标准形式
max z = c T x s.t. A x = b , x > 0 \text{max} \quad z=c^Tx\\\text{s.t.}\quad Ax=b, x>0 maxz=cTxs.t.Ax=b,x>0
标准形式的要求:
- 所有x>=0
- 目标函数为max
- b>=0
转换方法:
情况 | 方法 |
---|---|
x<=0 | 使用-x作为新变量 |
x无约束 | 使用x=x1-x2作为新变量, x1,x2>0 |
目标函数为min | 目标函数乘以-1 |
b<=0 | 该约束条件乘以-1 |
2 单纯性法
2.1 求解思路
求解思路基本为:
求一个解=> 验证是否是最优解 => 如果不是👉求下一个更优解|如果是👉结束。
2.2 构造初始解
由于系数矩阵A(m*n)不是满秩,因此满足限制的解可以写为:
(
x
1
,
x
2
,
.
.
.
x
m
,
x
m
+
1
,
.
.
.
x
n
)
(x_1,x_2,...x_m,x_{m+1},...x_{n})
(x1,x2,...xm,xm+1,...xn),为了构造一个解,将后面的n-m个变量全部取0, 然后带入Ax=b,解出一个解。
即是基可行解: ( x 1 , x 2 , . . . x m − 1 , 0 , 0 , . . , 0 ) (x_1,x_2,...x_{m-1},0,0,..,0) (x1,x2,...xm−1,0,0,..,0),前面m个称为基变量,后面n-m个称为非基变量。
由于目标函数只是由若干个坐标x线性组合的,如果这些坐标刚好是后面n-m个x组成,那么刚好就取到了最值。
如果不是,则说明基可行解不是最优的,需要通过基可行解求另一个可行解进行验证。
2.3 构造下一个解
下面说明如何从一个可行解寻找下一个可行解进行改进:
由于A是由n个列向量组成,而向量维度为m<n, 因此它们线性相关。
不妨用前m个列向量P来表示第j个列向量:
P j = k 1 P 1 + . . . k m P m P_j=k_1P_1+...k_mP_m Pj=k1P1+...kmPm
由于后n-m个x取0, 原方程表示为: x 1 P 1 + . . x m P m = b x_1P_1+..x_m P_m=b x1P1+..xmPm=b
将 θ ( P j − ( k 1 P 1 + . . . . k m P m ) ) \theta(P_j-(k_1P_1+....k_mP_m)) θ(Pj−(k1P1+....kmPm))加上上式,整理为:
( x 1 − θ k 1 ) P 1 + . . . ( x m − θ k m ) P m + θ P j = b (x_1-\theta k_1)P_1+...(x_m-\theta k_m)P_m+\theta P_j=b (x1−θk1)P1+...(xm−θkm)Pm+θPj=b
因此得到一个解: ( x 1 − θ k 1 , x 2 − θ k 2 , . . , 0 , 0 , θ , 0 , . . , 0 ) (x_1-\theta k_1,x_2-\theta k_2,..,0,0,\theta,0,..,0) (x1−θk1,x2−θk2,..,0,0,θ,0,..,0)
当某个 θ = x l / k l \theta=x_l/k_l θ=xl/kl时,xl相当于和xj交换了位置,因此从一个基可行解出发得到了另一个基可行解。
2.4 判断最优
对于目标函数: z = c 0 + c 1 x 1 + . . c n x n z=c_0+c_1x_1+..c_nx_n z=c0+c1x1+..cnxn, 由于x最小取0,如果c<0, 那么x取到了最优解。
因此只需要满足:
1.出现在目标函数中的x全部取0,未出现的没有限制
2.目标函数的系数全部小于0
即取到了最优解,总结为:目标函数中非基变量系数为正,基变量系数为0。
2.3 单纯形法和单纯形表
构造单纯形表:
x 1 x_1 x1 | x 2 x_2 x2 | … | x m − 1 x_{m-1} xm−1 | x m x_{m} xm | x m + 1 x_{m+1} xm+1 | … | x n x_n xn | ||
---|---|---|---|---|---|---|---|---|---|
0 \color{#FF7D00}{0} 0 | 0 \color{#FF7D00}{0} 0 | . . . \color{#FF7D00}{...} ... | 0 \color{#FF7D00}{0} 0 | . . . \color{#FF7D00}{...} ... | c m + 1 \color{#FF7D00}{c_{m+1}} cm+1 | . . . \color{#FF7D00}{...} ... | c n \color{#FF7D00}{c_n} cn | z \color{#FF7D00}{z} z | |
x 1 \color{#FF0000}x_1 x1 | 1 \color{#00FF00}{1} 1 | 0 \color{#00FF00}{0} 0 | . . . \color{#00FF00}{...} ... | 0 \color{#00FF00}{0} 0 | 0 \color{#00FF00}{0} 0 | k 11 \color{#00FF00}{k_{11}} k11 | . . . \color{#00FF00}{...} ... | k 1 n \color{#00FF00}{k_{1n}} k1n | b 1 \color{#FF00FF}{b_1} b1 |
x 2 \color{#FF0000}x_2 x2 | 0 \color{#00FF00}{0} 0 | 1 \color{#00FF00}{1} 1 | . . . \color{#00FF00}{...} ... | 0 \color{#00FF00}{0} 0 | 0 \color{#00FF00}{0} 0 | k 21 \color{#00FF00}{k_{21}} k21 | . . . \color{#00FF00}{...} ... | k 2 n \color{#00FF00}{k_{2n}} k2n | b 2 \color{#FF00FF}{b_2} b2 |
. . . \color{#FF0000}... ... | . . . \color{#00FF00}{...} ... | . . . \color{#00FF00}{...} ... | . . . \color{#00FF00}{...} ... | . . . \color{#00FF00}{...} ... | . . . \color{#00FF00}{...} ... | . . \color{#00FF00}{..} .. | . . . \color{#00FF00}{...} ... | . . . \color{#00FF00}{...} ... | . . . \color{#FF00FF}{...} ... |
x m \color{#FF0000}x_m xm | 0 \color{#00FF00}{0} 0 | 0 \color{#00FF00}{0} 0 | . . . \color{#00FF00}{...} ... | 0 \color{#00FF00}{0} 0 | 1 \color{#00FF00}{1} 1 | k m 1 \color{#00FF00}{k_{m1}} km1 | . . . \color{#00FF00}{...} ... | k m 1 \color{#00FF00}{k_{m1}} km1 | b m \color{#FF00FF}{b_m} bm |
红色:基变量
橙色:目标函数参数,只有非基变量前面是非0
绿色:系数矩阵,基变量为单位阵
紫色:方程的常数项
0.将问题转为标准形式
注意b必须全部大于0,不然需要乘以-1
1.初始时,如果系数矩阵是m*n,则找到m个变量作为基变量,使得它们系数矩阵为单位阵,然后把系数填入单纯形表中。
注意,目标函数中基变量前面系数必须化为0
一般来说,添加若干个变量使得不等号变为等号过程,会引入系数为1的变量,选这几个变量作为最开始的基变量最好。
2.如果目标函数系数没有负项,说明达到目的,结束。
如果不是,则挑选一个最大的作为入基变量。
3.对于每一行,计算 b k l \frac{b}{k_{l}} klb,即b除以该行入基变量对应的列的值。
选择值最小的作为入基变量`。注意必须选择kl是正的,如果是负值,则把kl化为1的同时,b变为了负值,问题不可行。
4.对于下一次迭代
入基变量行除以系数,使得入基变量系数为1.
其他行分别把入基向量所在列化为0,包括目标函数的那行。
5.重复2,3,4,5步
一个例子:
min z = − x 2 + 2 x 3 \min z=-x_2+2x_3 minz=−x2+2x3
s.t.
x
1
−
2
x
2
+
x
3
=
2
x_1-2x_2+x_3=2
x1−2x2+x3=2
x
2
−
3
x
3
+
x
4
=
1
x_2-3x_3+x_4=1
x2−3x3+x4=1
x
2
−
x
3
+
x
5
=
2
x_2-x_3+x_5=2
x2−x3+x5=2
x 1 , x 2 , x 3 , x 4 , x 5 ≥ 0 x_1,x_2,x_3,x_4,x_5\ge 0 x1,x2,x3,x4,x5≥0
1.发现目标函数不满足条件,化为标准形式
max z = x 2 − 2 x 3 \max z=x_2-2x_3 maxz=x2−2x3
2.构造初始可行解,由于1,4,5没有在目标函数中出现,所以选择它们(理论上可以任意选择,只需要把系数化为单位阵即可):
x1 | x2 | x3 | x4 | x5 | b | |
---|---|---|---|---|---|---|
0 | 1 | -2 | 0 | 0 | 0 | |
x1 | 1 | -2 | 1 | 0 | 0 | 2 |
x4 | 0 | 1 | -3 | 1 | 0 | 1 |
x5 | 0 | 1 | -1 | 0 | 1 | 2 |
发现1,4,5系数已经是单位阵了, 目标函数中1,4,5系数化为0(这步省略了)
3.选择入基变量:x2(因为目标函数中系数是正的)
选择出基变量(必须选择一个系数是正的),且b/a最小的, 因此选择x4
(1)最左边把x1换成x4,
(2)x2的系数变为1
(3)x1,x5在x2处的系数化为0
(3)x2目标函数系数化为0
x1 | x2 | x3 | x4 | x5 | b | |
---|---|---|---|---|---|---|
0 | 0 | 1 | -1 | 0 | 0 | |
x1 | 1 | 0 | -5 | 2 | 0 | 4 |
x2 | 0 | 1 | -3 | 1 | 0 | 1 |
x5 | 0 | 0 | [5] | -1 | 1 | 1 |
发现x3系数为正,因此x3入基,x5出基(只有x5系数是正的)
x1 | x2 | x3 | x4 | x5 | b | |
---|---|---|---|---|---|---|
0 | 0 | 0 | -4/5 | -1/5 | 0 | |
x1 | 1 | 0 | 0 | 1 | 1 | 5 |
x2 | 0 | 1 | 0 | -2/5 | 3/5 | 8/5 |
x3 | 0 | 0 | 1 | -1/5 | 1/5 | 1/5 |
发现可行,因此解为:
x1=5,x2=8/5,x3=1/5, z=-8/5+2/5=-6/5