注意
- 本文使用的是 M a x Max Max型模型说明单纯法相关求解思路
- 本文选用的检验数
σ
=
z
j
−
c
j
=
C
B
B
−
1
b
−
C
j
\sigma={z_{j}-c_{j}}=C_{B}B^{-1}b-C_{j}
σ=zj−cj=CBB−1b−Cj
线性规划是在线性约束下最优化线性目标函数的优化问题。下面介绍线性规划问题相关解法。
图解法
图解法的优点是直观,缺点是一般只能用于解决二维线性规划问题。
- 图解法步骤
- 先画决策变量范围约束,再画资源约束得到可行域
- 对于目标函数,任意给 z z z取两个值,画出两条虚线进而确定出最优解的方向
- 将目标直线向最优解方向移动到可行域边界,这时与可行域边界的交点就是最优解
从图解法可以观察到线性规划问题可行域有如下特征:
- 线性规划的可行域一定是一个凸多面体(凸集的一种)
- 线性规划的最优解存在,则一定可以在凸多面体的极点取得
注意可以
二字,除了在极点可以取到最优解外,取得最优解的极点的连线上也可能取得最优解。所谓最优解指得是有唯一解或有多重最优解。
特点的意义在于我们在寻找最优解时可以着眼于可行域极点,由于凸多面体的极点个数有限,于是将寻找最优解从可行域的无穷点转到极点集的有穷点,借此思路提出了利用代数方法来寻找可行域极点的办法——单纯形法,该算法通常情况下优于穷举法法.
单纯形法
原理与算法
单纯形法的原理就是沿着使得目标函数值增加的方向搜索最优解。
好了,了解了单纯形法的原理,为了应用单纯形算法,我们需要先将线性规划问题标准化来适应算法的设计。
- 线性规划的一般形式
m a x ( m i n ) z = C X ; A X ≥ ( = , ≤ ) b , X ≥ 0 max(min)\quad z=CX;AX\ge(=,\le)b,X\ge0 max(min)z=CX;AX≥(=,≤)b,X≥0 - 线性规划的标准形式
m a x z = C X ; A X = b , X ≥ 0 max\quad z=CX;AX=b,X\ge0 maxz=CX;AX=b,X≥0
其中 b ≥ 0 , A . s h a p e = ( m , n ) m ≤ n R ( A ) = 0 b\ge0,A.shape=(m,n)\quad m\le n \quad R(A)=0 b≥0,A.shape=(m,n)m≤nR(A)=0 - 给出转换方法
- 最小化转最大化目标函数
- 设 z ′ = − z z^{'}=-z z′=−z,有 − m i n z = m a x ( − z ) = m a x z ′ -min z=max(-z)=maxz^{'} −minz=max(−z)=maxz′
- 不等式约束化为等式约束
- 向约束中加减
松弛变量
( > 0 ) (>0) (>0),相当于引入新变量所以在变量范围中也添加上松弛变量的范围。注意,添加松弛变量并不会对目标函数造成任何影响
- 向约束中加减
- 自由变量的处理
- 对于无非负要求的变量 x i x_{i} xi,引入两个非负变量 x i ′ , x i ′ ′ x^{'}_{i},x^{''}_{i} xi′,xi′′.由于任意实数都可表示为两个非负实数之差,于是 x i = x i ′ , x i ′ ′ . 其中 x i ′ , x i ′ ′ ≥ 0 x_{i}=x^{'}_{i},x^{''}_{i}.其中x^{'}_{i},x^{''}_{i}\ge0 xi=xi′,xi′′.其中xi′,xi′′≥0.再将约束条件中的所有 x i x_{i} xi替换为 x i ′ , x i ′ ′ x^{'}_{i},x^{''}_{i} xi′,xi′′问题就解决了.
- 右端常量化为大于0的形式
- 约束左右两边同时乘上一个-1
- 最小化转最大化目标函数
支撑单纯形算法的定理
- 基本可行解对应于凸集的极点。
- 意义:强调代数方法寻找凸多面体极点的可行性
单纯形算法
-
关于确定初始基可行解的问题
- 为什么我们要确定初始基本可行解,不能随便找一个可行解
- 可以从理论上证明,如果初始解是可行解,则单纯形算法必然能够收敛到最优解。实际上,如果我们随意选择一个可行解作为初始解,那么算法可能会遇到以下问题:(1)无法确定入基变量和出基变量(2)更长的计算时间(3)非最优解:虽然随意选择一个可行解可能会得到一个非常接近最优解的解,但这并不总是正确的。特别是在可行域比较大或者复杂的情况下,该方法可能会得到一个很差的解,甚至根本没有解
- 如何寻找初始基本可行解
- 系数矩阵中的
m
m
m阶单位阵对应的可行解称为标准可行解。此时基变量=
B
−
1
b
B^{-1}b
B−1b=b,非基变量=
O
O
O.由于标准型中
b
≥
0
b\ge0
b≥0于是标准可行解一定是基本可行解。于是如果系数矩阵中含有单位矩阵,那么直接选择单位矩阵作为初始基本可行解就好了。如果在引松弛变量
X
S
X_{S}
XS后系数矩阵中仍然没有单位矩阵,我们可以再引入人工变量
X
人
X_{人}
X人来强行构造出单位矩阵(
大M法
的逻辑),或对增广矩阵 [ A , b ] [A,b] [A,b]做初等行变换来暴露出单位矩阵(两阶段法
的逻辑)
- 系数矩阵中的
m
m
m阶单位阵对应的可行解称为标准可行解。此时基变量=
B
−
1
b
B^{-1}b
B−1b=b,非基变量=
O
O
O.由于标准型中
b
≥
0
b\ge0
b≥0于是标准可行解一定是基本可行解。于是如果系数矩阵中含有单位矩阵,那么直接选择单位矩阵作为初始基本可行解就好了。如果在引松弛变量
X
S
X_{S}
XS后系数矩阵中仍然没有单位矩阵,我们可以再引入人工变量
X
人
X_{人}
X人来强行构造出单位矩阵(
- 为什么我们要确定初始基本可行解,不能随便找一个可行解
-
关于检查解是否最优的问题
- 不妨将 A X = b AX=b AX=b这个非齐次线性方程组写成 [ B , N ] ( X B , X N ) T = b [B,N](X_{B},X_{N})^{T}=b [B,N](XB,XN)T=b,可以解得 X B = B − 1 b − B − 1 N X N X_{B}=B^{-1}b-B^{-1}NX_{N} XB=B−1b−B−1NXN将其代入目标函数 z = [ C B , C N ] ( X B , X N ) z=[C_{B},C_{N}](X_{B},X_{N}) z=[CB,CN](XB,XN)可以得到 z = C B B − 1 b − ( C B B − 1 N − C N ) X N z=C_{B}B^{-1}b-(C_{B}B^{-1}N-C_{N})X_{N} z=CBB−1b−(CBB−1N−CN)XN。在这里我们将目标函数完全用非基变量表示,在基本可行解中由于 X B X_{B} XB取0,则当 C B B − 1 N − C N ≥ 0 C_{B}B^{-1}N-C_{N}\ge 0 CBB−1N−CN≥0时目标函数( M a x Max Max型)值就是最优的。我们把 C B B − 1 N − C N C_{B}B^{-1}N-C_{N} CBB−1N−CN记作 σ j ∈ N \sigma_{j_{\in N}} σj∈N,这就是我们说得检验数。其中隐含了基变量的检验数为0。总结一下解是否最优的判别方法就是计算非基变量的检验数 ,对于 M a x Max Max型的问题如果非基变量检验数大于等于0了就是最优解了。而对于 M i n Min Min型则是当非基变量的检验数小于等于0就是最优解了。
-
关于如何确定进基变量和出基变量使得算法朝着目标函数值增加的方向搜索最优值
- 使用检验数
z
j
−
c
j
z_{j}-c_{j}
zj−cj确定进基变量,如果存在检验数小于0,则说明目标函数没有到达最大值
。我们选择检验数最小的非基变量作为进基变量。这是因为检验数的负值实际是非基变量在目标函数中的价值系数,表示的是自变量增加1个单位目标函数的变化量,所以取最小的检验数对应的非基变量作为进基变量可以减少迭代次数(可以看出这种选取规则并不是必须的,有些时候我们不会按照这种方式选择进基变量,比如使用bland则防止退化循环的时候)。 - 使用检验比确定出基变量,选择检验比中大于0的最小检验比对应的基变量作为出基变量。这种方式一定可以保证得到的下一个解是可行的。如果检验比都小于等于0,则说明线性规划没有最优解,有无界解。BUT WHY? 检验比小于0说明一件事——由于检验比的计算方式是 θ = { B − 1 b a i k } \theta=\{\frac{B^{-1}b}{a_{ik}}\} θ={aikB−1b},即如果检验比都小于0一定是进基变量对应系数列向量 P k < 0 P_{k}<0 Pk<0,而 X B = B − 1 b − B − 1 N X N = B − 1 b − P k X N X_{B}=B^{-1}b-B^{-1}NX_{N}=B^{-1}b-P_{k}X_{N} XB=B−1b−B−1NXN=B−1b−PkXN于是基变量会随着非基变量的增大而增大且不会违背可行性 B − 1 b ≥ 0 B^{-1}b\ge0 B−1b≥0,要进基的非基变量就可以无限增大,从而得到无界解。
- 使用检验数
z
j
−
c
j
z_{j}-c_{j}
zj−cj确定进基变量,如果存在检验数小于0,则说明目标函数没有到达最大值
直接引入单位矩阵OR暴露单位矩阵
前面在 如何寻找初始基本可行解 中已经提到人工变量法,这不再赘述,直接给出操作步骤。
- 大M法
- 直接在原来的等式约束(因为已经加入过 X S X_{S} XS了)加入人工变量 X 人 X_{人} X人,同时为了保证问题的等价性,修改远目标函数——在原目标函数中加入人工变量,人工变量系数设置为- M M M.求解修改后的线性规划问题.
- 两阶段法
- 构造辅助问题 m i n w = ∑ X 人 minw=\sum{X_{人}} minw=∑X人,该目标函数受约束于原来的等式约束(因为已经加入过 X S X_{S} XS了)加入人工变量 X 人 X_{人} X人后形成的新约束。求解该辅助问题,如若 m i n w = 0 minw=0 minw=0且 X 人 X_{人} X人全部出基,则说明原问题的增广矩阵 [ A , b ] [A,b] [A,b]经过初等行变换成功暴露出了单位矩阵。那么接下来使用该暴露出的单位矩阵在变换后的 [ A , b ] [A,b] [A,b]对应的约束下求解原问题。
注意:对于涉及到引入人工变量的线性规划问题可能存在无解的情况。具体表现为人工变量最终没能出基
退化问题
退化问题就是说出现了多个基本可行解对应于一个极点的情况。
表现为迭代过程中出现基变量为 0。
- Bland法则
- Bland’s Rule 是解决退化问题的另一种方法。它规定,在有多个变量可以作为进入基变量的情况下,总是选择编号最小的变量。同样,在有多个变量可以作为离开基变量的情况下,总是选择编号最小的变量。这种方法可以确保算法不会陷入死循环,并且会最终找到最优解。
线性规划解的情况及其表现形式(Max型)
- 最优解:所有检验数大于等于0
- 唯一最优解:检验数全部大于0
- 多重最优解:检验数全部大于等于0,且有非基变量的检验数为0
- 无最优解
- 无界解:进基变量对应的系数矩阵列向量全部小于0
- 无解: X 人 X_{人} X人最终没有离基
单纯形表
单纯形表是单纯形法的载体,用于执行单纯形法,其结构如下
对此,我个人的看法是(仅仅是个人看法):
它将空间变换到以基
B
B
B中列向量作为基底的坐标系中,并且使用该坐标系中的语言来描述解。数值上看这个过程实际上就完成了从一个基本可行解到另一个基本可行的转换;几何上看就是解向量的终点通过基变换(线性变换到)下一个可行域的极点上。
补充
这里补充一下对基变换的说明,我们知道矩阵本质是一种线性变换。而所谓基变换就是从一个坐标系变换为另一个坐标系。假设
A
A
A的列向量是初始坐标系
M
M
M下对于变换后的坐标系
N
N
N的基底的描述。那么对于同一个向量在坐标系
M
M
M下和坐标系
N
N
N下表示的转换方式如下:
还有一个问题是,对
[
A
,
b
]
[A,b]
[A,b]做基变换的矩阵
B
k
−
1
B_{k}^{-1}
Bk−1(
B
B
B是指第
k
k
k次迭代的基矩阵)应该怎么计算得到呢?假设
B
k
−
1
−
1
B_{k-1}^{-1}
Bk−1−1是第
k
−
1
k-1
k−1迭代的基矩阵的逆,而我们知道矩阵的乘法本质上是线性变换的复合。所以可以自然想到
B
k
−
1
=
E
k
B
k
−
1
−
1
B_{k}^{-1}=E_{k}B_{k-1}^{-1}
Bk−1=EkBk−1−1,其中
E
k
E_{k}
Ek是在前一次变换的基础上再进行的线性变换,现在的问题就转化为了取寻找这样一个变换
E
E
E是什么?回忆手算单纯形法中我们对增广矩阵
[
A
,
b
]
[A,b]
[A,b]的初等行变换的操作,而这个
E
k
E_{k}
Ek做的就恰好是这个变换(这一点是为什么呢,请参考钱颂迪老师的《运筹学》第四版60页到61页相关论述)。下面直接给出这个变换矩阵:
E
k
=
∣
1
0
⋯
−
a
1
k
/
a
l
k
0
⋯
0
0
1
⋯
−
a
2
k
/
a
l
k
0
⋯
0
⋮
⋮
⋮
⋮
⋮
⋯
⋮
0
0
⋯
1
/
a
l
k
0
⋯
0
⋮
⋮
⋮
⋮
⋮
⋯
⋮
0
0
⋯
−
a
i
k
/
a
l
k
1
⋯
0
⋮
⋮
⋮
⋮
⋮
⋯
⋮
0
0
0
−
a
m
k
/
a
l
k
0
⋯
1
∣
m
×
m
E_{k}=\begin{vmatrix} 1& 0&\cdots &-a_{1k}/a_{lk} &0 &\cdots &0 \\ 0& 1& \cdots & -a_{2k}/a_{lk}& 0&\cdots &0 \\\vdots &\vdots &\vdots &\vdots &\vdots&\cdots &\vdots\\ 0& 0& \cdots & 1/a_{lk}& 0&\cdots &0 \\\vdots &\vdots &\vdots &\vdots &\vdots&\cdots &\vdots\\ 0 & 0& \cdots & -a_{ik}/a_{lk}&1&\cdots &0 \\\vdots &\vdots &\vdots &\vdots &\vdots&\cdots &\vdots\\ 0 & 0& 0&-a_{mk}/alk&0&\cdots&1\end{vmatrix}_{m\times {m}}
Ek=
10⋮0⋮0⋮001⋮0⋮0⋮0⋯⋯⋮⋯⋮⋯⋮0−a1k/alk−a2k/alk⋮1/alk⋮−aik/alk⋮−amk/alk00⋮0⋮1⋮0⋯⋯⋯⋯⋯⋯⋯⋯00⋮0⋮0⋮1
m×m
其中
a
l
k
a_{lk}
alk是通过检验数和检验比确定出来的主元,即该线性变换矩阵就是将一个
m
m
m阶单位矩阵中出基变量对应列替换为:
∣
−
a
1
k
/
a
l
k
−
a
2
k
/
a
l
k
⋮
1
/
a
l
k
⋮
−
a
i
k
/
a
l
k
⋮
−
a
m
k
/
a
l
k
∣
m
×
1
\begin{vmatrix} -a_{1k}/a_{lk} \\ -a_{2k}/a_{lk} \\\vdots \\ 1/a_{lk} \\\vdots \\-a_{ik}/a_{lk}\\\vdots\\-a_{mk}/a_{lk}\end{vmatrix}_{m\times {1}}
−a1k/alk−a2k/alk⋮1/alk⋮−aik/alk⋮−amk/alk
m×1
比如当前的非基变量
X
N
=
(
x
3
,
x
4
,
x
5
)
T
X_{N}=(x_{3},x_{4},x_{5})^{T}
XN=(x3,x4,x5)T,选择
x
5
x_{5}
x5出基,则将单位矩阵的第三列替换为上述列向量。理解单纯形法进基出基实际是在做基变换,可以更好的理解灵敏度分析中的一些操作。同时意识到修正单纯形法(单纯形的矩阵运算)的合理性。
对偶理论
笔记整理中~