在单纯形法中,检验数(有时也叫做“机会成本”或“检验系数”,在英文中通常称为 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在单纯形法中扮演了“方向判别器”的角色,告诉我们是否还能通过让某个非基变量进入基来继续改进目标函数。