运输问题作为运筹学中的经典模型,在物流配送、供应链管理等领域有着广泛应用。表上作业法作为求解运输问题的有效方法,其关键步骤之一就是判断当前解是否最优。很多初学者在这个环节容易陷入"会算但不懂原理"的困境,今天我们就来深入剖析两种主流判定方法——闭回路法和位势法。
为什么需要最优解判定?想象你是一家物流公司的调度员,已经用最小元素法给出了初始配送方案。但这个方案真的最省钱吗?这时候就需要通过检验数来判断:如果所有空格的检验数都非负,说明已达到最优;如果存在负检验数,就意味着还有优化空间。
检验数的本质是什么?它实际上反映了将单位货物调入该空格后,总运输成本的变化量。负检验数表示成本能降低,正检验数则会导致成本增加。这个理解对后续的方案调整至关重要。
闭回路法的核心在于为每个空格找到唯一的闭回路。很多教材对这个"唯一性"语焉不详,其实这与运输问题的特殊结构有关——每个空格对应的闭回路,实际上反映了调整该变量时受影响的其他基变量。
具体操作时有个实用技巧:从空格出发,先水平移动寻找第一个数字格,然后垂直转向。我常告诉学生把这个过程想象成"贪吃蛇"游戏——碰到数字格就必须转弯。比如在下表中:
code复制 | B1 | B2 | B3
A1| 10 | | 20
A2| | 30 |
A3| 15 | | 5
要找到(A2,B1)空格的闭回路,可以这样走:(A2,B1)→(A2,B2)→(A1,B2)→(A1,B3)→(A3,B3)→(A3,B1)→(A2,B1)。这个路径构成了一个闭合多边形。
计算检验数时容易混淆奇偶顶点。我的记忆方法是:把起点空格看作"第1个"顶点,之后交替为偶、奇。比如上面那个闭回路:
检验数=奇顶点运价和-偶顶点运价和。如果结果为负,说明调整这个空格能降低成本。
实际应用中常见两个误区:
位势法(对偶变量法)的数学基础是对偶理论。简单理解,ui可以看作产地i的"影子价格",vj则是销地j的"影子价格"。检验数公式σij=cij-(ui+vj)实际上在比较实际运费与影子价格之和的差异。
为什么基变量检验数为0?这反映了互补松弛条件——在最优解中,基变量对应的约束是紧的(等式成立),所以其"机会成本"正好等于实际成本。
第一步:建立位势方程组。对每个基变量xij,写出方程ui + vj = cij。例如有三个基变量时:
u1 + v1 = 8
u2 + v1 = 9
u2 + v2 = 10
第二步:设定u1=0(这是关键!),然后依次求解其他位势。上例中:
v1=8, u2=1, v2=9
第三步:计算所有非基变量检验数。比如对x12:
σ12 = c12 - (u1 + v2) = 6 - (0 + 9) = -3
这个方法看似抽象,但计算量比闭回路法小很多。特别是在处理大型运输问题时,优势更加明显。
闭回路法需要为每个空格构建闭回路,时间复杂度约为O(mn×min(m,n));而位势法只需解(m+n-1)个方程,再计算(m-1)(n-1)个检验数,复杂度为O(mn)。当m,n较大时,位势法优势明显。
但在教学场景中,我通常建议初学者先用闭回路法,因为它更直观,有助于理解检验数的几何意义。
闭回路法更适合:
位势法更适合:
一个实际案例:某电商区域配送中心有15个仓库、30个配送站,用位势法将最优解判定时间从原来的2小时缩短到15分钟。
回路不闭合:忘记回到起点
调试方法:检查最后一个顶点是否与起点同行/同列
顶点计数错误:把非转角点也算作顶点
调试方法:确认每次转向必须发生在数字格
检验数符号混淆:记错奇偶顶点顺序
调试方法:统一约定起点为奇数次顶点
位势方程组无解:通常因为基变量选择不当
解决方法:检查基变量是否构成支撑树
检验数与闭回路法结果不一致
可能原因:位势计算错误或检验数公式用错
交叉验证:选一个空格同时用两种方法计算
退化情形处理:当基变量含0时容易出错
应对策略:把0视为普通数字格处理
掌握最优解判定方法后,可以进一步:
在实际物流调度中,我经常将位势法的计算结果用于:
记住,检验数的绝对值大小也很有信息量——它反映了相应空格对总成本的影响程度。在多个负检验数时,通常会选择绝对值最大的进行调整,这样可以更快接近最优解。