第4章 运输问题与指派问题:Vogel 法、位势法与匈牙利法
系统分析:线性规划、非线性规划与排队模型 · 第 4 / 11 篇(展开目录)
从线性规划建模、单纯形法、对偶与灵敏度、运输与指派,到非线性规划、随机过程、马尔可夫链、排队模型和决策分析,每章都配手算例题和自测,最后一章用综合例题把方法串起来。
读完你能: 把供需问题写成平衡运输模型;用 Vogel 近似法得到初始基本可行解;用 求位势并检验最优;沿闭回路调整运量;求某个运价变化时最优解不变的范围;用匈牙利法求最优指派,处理人数与任务数不等、某人不能做某项任务的情况。
1. 运输模型
有 个产地(供应 )、 个销地(需求 ),单位运价 。设 为从产地 运到销地 的量:
它当然可以用单纯形法解,但 时就有 10000 个变量、200 条约束。运输问题的系数矩阵结构特殊,有一套直接在表格上操作的算法,快得多。四条性质先记住:
| 性质 | 内容 |
|---|---|
| 可行性 | 所有线路可用、供需非负时,总供应 = 总需求(平衡)就有可行解;有禁止线路时还需另查可行性 |
| 不平衡怎么办 | 供大于求:加一个虚拟销地,需求为差额;求大于供:加一个虚拟产地,供应为差额。虚拟行列的运价取 0 |
| 整数性 | 所有 为整数时,每个基本可行解都是整数,因此存在整数最优解(不同最优解的凸组合也可能是分数解) |
| 基变量个数 | 条约束中有一条是多余的,所以基变量恰好 个 |
虚拟产地分到某个销地的量,含义是该销地缺货的数量;虚拟销地收到某个产地的量,含义是该产地没运出去的库存。
2. 主线例子
三个工厂供应 30、40、50 箱,四个仓库需求 20、35、25、40 箱,单位运价:
| 仓库 1 | 仓库 2 | 仓库 3 | 仓库 4 | 供应 | |
|---|---|---|---|---|---|
| 工厂 1 | 8 | 4 | 14 | 7 | 30 |
| 工厂 2 | 4 | 9 | 8 | 2 | 40 |
| 工厂 3 | 12 | 3 | 14 | 10 | 50 |
| 需求 | 20 | 35 | 25 | 40 | 120 |
总供应 120 = 总需求 120,已平衡。基变量个数 。
3. Vogel 近似法求初始解
Vogel 法的想法是:先照顾“选错代价最大”的行或列。 每一行(列)的罚数 = 该行(列)中次小运价 − 最小运价,表示如果不用最便宜的格,至少要多付多少。
步骤:
- 计算每个未划去的行和列的罚数(只有一个格剩下时,罚数取该格运价)。
- 选罚数最大的行或列(并列任选),在其中运价最小的格里分配尽可能多的量,即 。
- 更新供需,划去已满足的行或列(同时满足时只划去一个,另一个留下供应或需求为 0 的“退化”分配)。
- 重复,直到全部分配完。
主线例子的六步:
| 步 | 行罚数(行1、2、3) | 列罚数(列1–4) | 选中 | 分配 |
|---|---|---|---|---|
| 1 | 3, 2, 7 | 4, 1, 6, 5 | 行 3 | 格(3,2) 运价 3,分配 35,列 2 满足 |
| 2 | 1, 2, 2 | 4, —, 6, 5 | 列 3 | 格(2,3) 运价 8,分配 25,列 3 满足 |
| 3 | 1, 2, 2 | 4, —, —, 5 | 列 4 | 格(2,4) 运价 2,分配 15,行 2 满足 |
| 4 | 1, —, 2 | 4, —, —, 3 | 列 1 | 格(1,1) 运价 8,分配 20,列 1 满足 |
| 5 | 7, —, 10 | —, —, —, 3 | 行 3 | 格(3,4) 运价 10,分配 15,行 3 满足 |
| 6 | 7 | 7 | 行 1 | 格(1,4) 运价 7,分配 10 |
初始解(6 个基变量,个数正确):
| 仓库 1 | 仓库 2 | 仓库 3 | 仓库 4 | |
|---|---|---|---|---|
| 工厂 1 | 20 | 10 | ||
| 工厂 2 | 25 | 15 | ||
| 工厂 3 | 35 | 15 |
。
4. 位势法检验最优性
给每行一个位势 、每列一个位势 ,要求每个基格满足
6 个方程、7 个未知数,任取一个设为 0(选基格最多的那一行,计算最省事)。然后对每个非基格计算检验数
全部 则最优;有负数则不是最优,最负的那个格进基。这里的 和单纯形表里的检验数是同一个东西, 正是对偶变量。
取 :
- 格(1,1):;格(1,4):;
- 格(2,4):;格(2,3):;
- 格(3,4):;格(3,2):。
非基格检验数:
| 格 | (1,2) | (1,3) | (2,1) | (2,2) | (3,1) | (3,3) |
|---|---|---|---|---|---|---|
| 4 | 1 | 1 | 14 | 1 | −2 |
格(3,3) 为 −2:每往这里运 1 箱,总成本降 2。不是最优。
5. 闭回路调整
闭回路是从进基格出发、只在基格上转弯、最后回到出发格的折线:相邻两格同行或同列,每次转弯 90°。可以证明对每个非基格这样的回路唯一存在。
格(3,3) 的回路:。从进基格开始交替标 、:
| 格 | (3,3) | (3,4) | (2,4) | (2,3) |
|---|---|---|---|---|
| 符号 | + | − | + | − |
| 当前运量 | 0 | 15 | 15 | 25 |
调整量 = 标“−”的格中的最小运量 。“+”格加 15、“−”格减 15,格(3,4) 降为 0 出基。这样每行每列的增减相抵,供需仍满足。
新解:
| 仓库 1 | 仓库 2 | 仓库 3 | 仓库 4 | |
|---|---|---|---|---|
| 工厂 1 | 20 | 10 | ||
| 工厂 2 | 10 | 30 | ||
| 工厂 3 | 35 | 15 |
。重新求位势():。非基格检验数为
| 格 | (1,2) | (1,3) | (2,1) | (2,2) | (3,1) | (3,4) |
|---|---|---|---|---|---|---|
| 2 | 1 | 1 | 12 | 3 | 2 |
全部为正,最优总运费 685,且最优解唯一(没有为 0 的检验数)。
退化
调整时如果有两个“−”格同时降到 0,只能让其中一个出基,另一个保留为取值 0 的基格;否则基格数少于 ,位势就求不出来。Vogel 法中某一步行和列同时满足时,也要这样处理。
6. 运价的灵敏度
问: 工厂 3 到仓库 3 的运价从 14 变成 , 在什么范围内当前最优方案不变?
格(3,3) 是基格,运价变化会改变位势。保持 重新求:,由格(3,3) 得 ,由格(3,2) 得 。非基格检验数:
| 格 | 检验数 | 要求 |
|---|---|---|
| (1,2) | ||
| (1,3) | — | |
| (2,1) | — | |
| (2,2) | ||
| (3,1) | ||
| (3,4) |
取交集:,即运价在 内最优方案不变(总运费随之变为 )。
如果改的是非基格的运价,位势不变,只需要求该格自己的检验数非负:例如格(3,1) 的检验数是 3,运价降幅不超过 3()时方案不变。
7. 生产—库存问题写成运输模型
运输模型不只用于运货。“第 期生产、第 期交货”也可以看成从产地 运到销地 :
| 运输模型 | 生产—库存问题 |
|---|---|
| 产地 | 生产期 |
| 销地 | 需求期 |
| 供应 | 第 期产能 |
| 需求 | 第 期需求 |
| 运价 | 生产成本 + 提前生产的保管费 + 延期交货的罚金 |
例: 三个月产能 50、60、40,需求 40、50、60,单位生产成本 30;提前生产每件每月保管费 1;延期交货每件每月罚金 3。
运价矩阵:(),():
| 生产 \ 交货 | 第 1 月 | 第 2 月 | 第 3 月 | 产能 |
|---|---|---|---|---|
| 第 1 月 | 30 | 31 | 32 | 50 |
| 第 2 月 | 33 | 30 | 31 | 60 |
| 第 3 月 | 36 | 33 | 30 | 40 |
| 需求 | 40 | 50 | 60 | 150 |
用 Vogel 法得到 ,位势检验所有检验数 ,最优总成本 4530。读法:1 月生产 50 件,其中 10 件存到 2 月;2 月生产 60 件,其中 20 件存到 3 月;3 月生产 40 件。格(1,3) 的检验数为 0,说明还有另一个同样便宜的方案(将 1 月原定存到 2 月的 10 件改为存到 3 月,2 月的 10 件相应提前交给 2 月需求)。
如果总产能大于总需求,就加一个“不生产”的虚拟需求期,运价取 0。
8. 指派问题
个人做 项任务,每人恰好一项、每项恰好一人, 是第 人做第 项的成本:
它是所有供需都等于 1 的平衡运输问题。人数和任务数不等时,补虚拟人或虚拟任务(成本 0);某人不能做某项任务时,成本设为很大的 。
匈牙利法的依据是:某一行(列)同时减去一个常数,最优指派不变。于是不断化简成本矩阵,直到能在 0 上直接选出指派。
- 行化简: 每行减去该行最小值。列化简: 每列再减去该列最小值。此时每行每列都至少有一个 0。
- 试指派: 能否找到 个位于不同行、不同列的 0?能,就是最优指派。
- 画线调整: 不能时,用最少的横线和竖线盖住所有 0(线数等于最多能选出的独立 0 的个数,小于 )。找出没被盖住的最小元素 :未盖住的元素都减 ,两线交叉处的元素加 ,只被盖一次的不变。
- 回到第 2 步。
例1:四人四项任务,丁不能做任务 4。
| 任务 1 | 任务 2 | 任务 3 | 任务 4 | |
|---|---|---|---|---|
| 甲 | 9 | 11 | 14 | 11 |
| 乙 | 6 | 15 | 13 | 13 |
| 丙 | 12 | 13 | 6 | 8 |
| 丁 | 11 | 9 | 10 | M |
行化简(减 9、6、6、9)后再列化简(第 4 列减 2):
| 1 | 2 | 3 | 4 | |
|---|---|---|---|---|
| 甲 | 0 | 2 | 5 | 0 |
| 乙 | 0 | 9 | 7 | 5 |
| 丙 | 6 | 7 | 0 | 0 |
| 丁 | 2 | 0 | 1 | M |
已能选出 4 个独立的 0:乙→1、丁→2、丙→3、甲→4。总成本 。
例2:四人五项任务(每人最多一项,有人不能做某些任务)。
| 任务 1 | 任务 2 | 任务 3 | 任务 4 | 任务 5 | |
|---|---|---|---|---|---|
| 甲 | 10 | — | 7 | 8 | 11 |
| 乙 | 12 | 9 | — | 10 | 8 |
| 丙 | 8 | 11 | 9 | — | 10 |
| 丁 | — | 10 | 8 | 9 | 12 |
“—”记为 。人比任务少一个,补一个虚拟人(第 5 行,成本全为 0)凑成 。行化简后(虚拟行本来就全是 0,列最小值都是 0,列化简不变):
| 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|
| 甲 | 3 | M | 0 | 1 | 4 |
| 乙 | 4 | 1 | M | 2 | 0 |
| 丙 | 0 | 3 | 1 | M | 2 |
| 丁 | M | 2 | 0 | 1 | 4 |
| 虚拟 | 0 | 0 | 0 | 0 | 0 |
甲和丁都只在任务 3 有 0,最多选出 4 个独立的 0,不够 5 个。用 4 条线覆盖所有 0(乙、丙、虚拟三行加第 3 列),未覆盖的元素只剩甲、丁两行中第 3 列以外的格,其中最小的是 1(甲→4、丁→4)。未覆盖元素减 1、交叉处加 1:
| 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|
| 甲 | 2 | M | 0 | 0 | 3 |
| 乙 | 4 | 1 | M | 2 | 0 |
| 丙 | 0 | 3 | 2 | M | 2 |
| 丁 | M | 1 | 0 | 0 | 3 |
| 虚拟 | 0 | 0 | 1 | 0 | 0 |
现在可以选出 5 个独立的 0:甲→4、乙→5、丙→1、丁→3、虚拟→2。最小总成本 ,任务 2 无人承担(被分给了虚拟人)。
怎样确认“最少线数”
线数必须等于能选出的独立 0 的最大个数。手算时可以先尽量多地选独立的 0,再从“没选上 0 的行”出发标记:标记这些行里有 0 的列,再标记这些列中选中 0 所在的行……最后对未标记的行和已标记的列画线,线数就是最少的。
9. 小结
- 运输问题:平衡后有 个基变量,供需为整数则解为整数。
- Vogel 法:罚数 = 次小 − 最小运价,先照顾罚数最大的行列,在其最便宜的格分配。
- 位势法:基格 ,非基格检验数 ,全部非负即最优。
- 闭回路:从进基格交替 ,调整量取“−”格最小运量。
- 基格运价变化要重算位势;非基格只看自己的检验数。
- 指派问题:行列化简 → 试指派 → 最少线覆盖 → 未盖住减 、交叉加 。
自测
1. 主线例子的最优方案中,工厂 2 到仓库 1 的运价要降到多少以下,才值得改用这条线路?
格(2,1) 是非基格,检验数为 1,即 。运价降幅超过 1(低于 3)时检验数变负,改用这条线路能降低总运费;正好等于 3 时出现多重最优。
2. 某运输问题供应 15、13,需求 9、6、7、9,应该怎样平衡?虚拟格里的运量表示什么?
总供应 28 < 总需求 31,加一个虚拟产地,供应 3,运价全为 0。最优解中虚拟产地运往某销地的量,就是该销地在最优方案下的缺货量。
3. 匈牙利法中,为什么“未盖住的减 $k$、交叉处加 $k$”不会改变最优指派?
这一步等价于:所有未画线的行减 ,所有画线的列加 。未盖住的元素只减一次;只被横线盖住的元素没被减也没被加;只被竖线盖住的元素减 又加 ,不变;交叉处只被加一次。整行整列加减常数不改变最优指派,而 取未盖住的最小元素,保证所有元素仍然非负,并产生至少一个新的 0。
- 感谢你赐予我前进的力量

