在单纯形法中,检验数(有时也叫做“机会成本”或“检验系数”,在英文中通常称为 Reduced Cost)是用来判断 非基变量 是否有可能让目标函数得到进一步改善(也就是判断是否值得“进基”)的一个指标。它在单纯形表中一般对应于“目标函数行”(又称“第 0 行”)里非基变量所在列的系数。
1. 检验数的定义
以最大化问题为例,单纯形表第 0 行(或目标行)里某个非基变量
x
j
x_j
xj 的系数,记为
c
ˉ
j
\bar{c}_j
cˉj,就是这个变量的检验数。它反映了如果将该变量从 0 稍微增大,对目标函数的影响趋势:
若
c
ˉ
j
>
0
\bar{c}_j > 0
cˉj>0(在最大化问题中),表示引入(增大)该变量能提高目标值,故可能“进基”。若
c
ˉ
j
≤
0
\bar{c}_j \le 0
cˉj≤0,表示引入该变量不会提高目标值(甚至会让目标变差),故不值得让它进基。
对于最小化问题,判断标准相反:若检验数(
c
ˉ
j
\bar{c}_j
cˉj) < 0,就能让目标函数继续下降,值得进基。
简而言之:
最大化问题:检验数 > 0 的非基变量可以带来改进。最小化问题:检验数 < 0 的非基变量可以带来改进。
2. 检验数在单纯形法迭代中的作用
决定进基的非基变量 在每一次迭代中,单纯形法会查看所有非基变量的检验数:
若在最大化问题里存在
c
ˉ
j
>
0
\bar{c}_j > 0
cˉj>0 的非基变量,则表示还能改进目标函数;通常选其中最“有利”的一个进入基。若所有非基变量的检验数都
≤
0
\le 0
≤0,则说明无法继续改进,当前解即为最优解。 配合出基变量选择 进基变量确定后,需要根据最小比率检验(ratio test)来选出一个基变量“出基”,从而保证新的基可行解仍然满足所有约束。
3. 检验数的几何含义
几何上,单纯形法是在多面体顶点之间移动:
检验数可以理解为:如果我们从当前顶点向着某个非基变量的方向移动,对目标函数的变化率是正(最大化)还是负。当检验数显示继续“前进”能提升(或降低)目标函数时,就意味着多面体在这个方向上还有更优的顶点可达。
4. 检验数的计算
在单纯形法中,检验数(Reduced Cost)本质上是用来衡量“将某个非基变量从 0 调整为正值”对目标函数的边际影响。它既可以通过单纯形表中的“目标行”系数直接读取,也可以用向量-矩阵的形式进行计算。下面分别从这两种视角来说明其计算原理。
1. 在单纯形表(Simplex Tableau)中的计算
在构造单纯形表时,我们会把问题写成如下形式(以最大化问题为例):
初始形式
Maximize
z
=
∑
j
=
1
n
c
j
x
j
subject to
{
A
x
=
b
,
x
≥
0
,
\begin{aligned} \text{Maximize}\quad & z = \sum_{j=1}^n c_j x_j \\ \text{subject to}\quad & \begin{cases} A x = b, \\ x \ge 0, \end{cases} \end{aligned}
Maximizesubject toz=j=1∑ncjxj{Ax=b,x≥0, 并在表格最底行(或顶部行)记录目标函数行。
引入基与非基
选定一组基变量
x
B
x_B
xB
(
m
(m
(m 个),非基变量
x
N
x_N
xN(
n
−
m
n-m
n−m 个)。在单纯形表中,基变量所在列常被“单位列”化,而非基变量的列则随迭代而更新。 检验数在目标行
在“目标行”中,每个非基变量
x
j
x_j
xj 对应一列,其在目标行的系数就是该变量的检验数
c
ˉ
j
\bar{c}_j
cˉj。通过单纯形表的高斯消去或透过上一轮迭代的更新,就可以读出
c
ˉ
j
\bar{c}_j
cˉj 的数值。
在最大化问题里,如果有某个非基变量
x
j
x_j
xj 的检验数
c
ˉ
j
>
0
\bar{c}_j > 0
cˉj>0,意味着把
x
j
x_j
xj从 0 增大可以提高目标函数;相反,若
c
ˉ
j
≤
0
\bar{c}_j \le 0
cˉj≤0,就表示它对目标函数无进一步改进或会使目标下降。
2. 从线性代数(向量-矩阵)角度的公式
假设线性规划的标准形式为:
Maximize
z
=
c
T
x
subject to
A
x
=
b
,
x
≥
0
,
\begin{aligned} \text{Maximize}\quad & z = c^T x \\ \text{subject to}\quad & A x = b, \\ & x \ge 0, \end{aligned}
Maximizesubject toz=cTxAx=b,x≥0, 其中:
A
A
A 为
m
×
n
m \times n
m×n矩阵,
c
c
c 为
n
n
n-维目标系数向量,
x
x
x 为
n
n
n-维决策变量向量,
b
b
b 为
m
m
m-维常数向量。
令
B
B
B 表示基变量对应的列所组成的可逆矩阵(大小为
m
×
m
m \times m
m×m),
N
N
N 表示非基变量对应的列(大小为
m
×
(
n
−
m
m \times (n-m
m×(n−m))。相应地,将目标系数向量
c
c
c 拆分成
c
B
c_B
cB(基变量的目标系数)和
c
N
c_N
cN(非基变量的目标系数)。
基变量的值:
x
B
=
B
−
1
b
x_B = B^{-1} b
xB=B−1b检验数(Reduced Cost) 对应于某个非基变量
x
j
x_j
xj 的计算公式:
c
ˉ
j
=
c
j
−
c
B
T
B
−
1
A
j
\bar{c}_j \;=\; c_j \;-\; c_B^T\,B^{-1}\,A_j
cˉj=cj−cBTB−1Aj 其中:
c
j
c_j
cj 是非基变量
x
j
x_j
xj 在目标函数中的系数,
c
B
c_B
cB 是基变量的目标系数向量,
B
−
1
B^{-1}
B−1 是基矩阵的逆,
A
j
A_j
Aj 是矩阵
A
A
A 中对应非基变量
x
j
x_j
xj 的那一列。
含义
λ
T
=
c
B
T
B
−
1
\lambda^T = c_B^T B^{-1}
λT=cBTB−1 可以视为对偶变量(或对偶价格)。
c
ˉ
j
=
c
j
−
λ
T
A
j
\bar{c}_j = c_j - \lambda^T A_j
cˉj=cj−λTAj 则表示:将变量
x
j
x_j
xj 从 0 增加一点点,对目标的净影响是多少。在最大化问题中,如果
c
ˉ
j
>
0
\bar{c}_j > 0
cˉj>0,就能提高目标;若
c
ˉ
j
=
0
\bar{c}_j = 0
cˉj=0,表示目标对它不敏感;若
c
ˉ
j
<
0
\bar{c}_j < 0
cˉj<0,增大该变量会让目标变差。
5. 总结
检验数(Reduced Cost):在单纯形表的目标函数行中,用于评估“将某个非基变量由 0 调整为正值”对目标函数的影响。用途:
判断是否能继续改进目标函数;决定哪一个非基变量进基。 判定标准:
判断是否还有改进空间:最大化问题:若存在
c
ˉ
j
>
0
\bar{c}_j > 0
cˉj>0 的非基变量,表示可进基。最小化问题:若存在
c
ˉ
j
<
0
\bar{c}_j < 0
cˉj<0 的非基变量,表示可进基。 计算
检验数在单纯形表中的体现:
直接体现在“目标函数行”对应非基变量列的系数上。通过单纯形法的表格运算更新得到。 向量-矩阵公式:
c
ˉ
j
=
c
j
−
c
B
T
B
−
1
A
j
\bar{c}_j \;=\; c_j \;-\; c_B^T B^{-1} A_j
cˉj=cj−cBTB−1Aj 它反映了 目标系数 与 对偶价格
(
c
B
T
B
−
1
(c_B^T B^{-1}
(cBTB−1)的差值。
因此,检验数或Reduced Cost在单纯形法中扮演了“方向判别器”的角色,告诉我们是否还能通过让某个非基变量进入基来继续改进目标函数。