系统分析:线性规划、非线性规划与排队模型 · 第 4 / 11 篇(展开目录)

从线性规划建模、单纯形法、对偶与灵敏度、运输与指派,到非线性规划、随机过程、马尔可夫链、排队模型和决策分析,每章都配手算例题和自测,最后一章用综合例题把方法串起来。

  1. 第1章 线性规划建模:从文字题到标准型
  2. 第2章 单纯形法:单纯形表、大 M 法与两阶段法
  3. 第3章 对偶与灵敏度分析:最终单纯形表还能回答什么
  4. 第4章 运输问题与指派问题:Vogel 法、位势法与匈牙利法
  5. 第5章 非线性规划(一):一维搜索与多元无约束优化
  6. 第6章 非线性规划(二):拉格朗日乘子与 KKT 条件
  7. 第7章 随机过程基础:几何分布、指数分布与泊松过程
  8. 第8章 马尔可夫链:离散时间与连续时间
  9. 第9章 排队模型:从 M/M/1 到 M/M/m
  10. 第10章 决策分析:不确定性准则、决策树与效用
  11. 第11章 综合例题讲解与解析

约 35 分钟 · 需要第2、3章的基与检验数概念

读完你能: 把供需问题写成平衡运输模型;用 Vogel 近似法得到初始基本可行解;用 ui+vj=ciju_i+v_j=c_{ij} 求位势并检验最优;沿闭回路调整运量;求某个运价变化时最优解不变的范围;用匈牙利法求最优指派,处理人数与任务数不等、某人不能做某项任务的情况。

1. 运输模型

有 mm 个产地(供应 sis_i)、nn 个销地(需求 djd_j),单位运价 cijc_{ij}。设 xijx_{ij} 为从产地 ii 运到销地 jj 的量:

min⁡ z=∑i∑jcijxij,∑jxij=si (供应),∑ixij=dj (需求),xij≥0.\min\ z=\sum_{i}\sum_{j}c_{ij}x_{ij},\qquad \sum_{j}x_{ij}=s_i\ (\text{供应}),\qquad \sum_{i}x_{ij}=d_j\ (\text{需求}),\qquad x_{ij}\ge0 .

它当然可以用单纯形法解,但 m=n=100m=n=100 时就有 10000 个变量、200 条约束。运输问题的系数矩阵结构特殊,有一套直接在表格上操作的算法,快得多。四条性质先记住:

性质 内容
可行性 所有线路可用、供需非负时,总供应 = 总需求(平衡)就有可行解;有禁止线路时还需另查可行性
不平衡怎么办 供大于求:加一个虚拟销地,需求为差额;求大于供:加一个虚拟产地,供应为差额。虚拟行列的运价取 0
整数性 所有 si,djs_i,d_j 为整数时,每个基本可行解都是整数,因此存在整数最优解(不同最优解的凸组合也可能是分数解)
基变量个数 m+nm+n 条约束中有一条是多余的,所以基变量恰好 m+n−1m+n-1 个

虚拟产地分到某个销地的量,含义是该销地缺货的数量;虚拟销地收到某个产地的量,含义是该产地没运出去的库存。

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+4−1=63+4-1=6。

3. Vogel 近似法求初始解

Vogel 法的想法是:先照顾“选错代价最大”的行或列。 每一行(列)的罚数 = 该行(列)中次小运价 − 最小运价,表示如果不用最便宜的格,至少要多付多少。

步骤:

  1. 计算每个未划去的行和列的罚数(只有一个格剩下时,罚数取该格运价)。
  2. 选罚数最大的行或列(并列任选),在其中运价最小的格里分配尽可能多的量,即 min⁡(剩余供应,剩余需求)\min(\text{剩余供应},\text{剩余需求})。
  3. 更新供需,划去已满足的行或列(同时满足时只划去一个,另一个留下供应或需求为 0 的“退化”分配)。
  4. 重复,直到全部分配完。

主线例子的六步:

步 行罚数(行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

z=8⋅20+7⋅10+8⋅25+2⋅15+3⋅35+10⋅15=715z=8\cdot20+7\cdot10+8\cdot25+2\cdot15+3\cdot35+10\cdot15=715。

4. 位势法检验最优性

给每行一个位势 uiu_i、每列一个位势 vjv_j,要求每个基格满足

ui+vj=cij.u_i+v_j=c_{ij}.

6 个方程、7 个未知数,任取一个设为 0(选基格最多的那一行,计算最省事)。然后对每个非基格计算检验数

cˉij=cij−ui−vj.\bar c_{ij}=c_{ij}-u_i-v_j .

全部 ≥0\ge0 则最优;有负数则不是最优,最负的那个格进基。这里的 cˉij\bar c_{ij} 和单纯形表里的检验数是同一个东西,ui,vju_i,v_j 正是对偶变量。

取 u1=0u_1=0:

  • 格(1,1):v1=8v_1=8;格(1,4):v4=7v_4=7;
  • 格(2,4):u2=2−7=−5u_2=2-7=-5;格(2,3):v3=8−(−5)=13v_3=8-(-5)=13;
  • 格(3,4):u3=10−7=3u_3=10-7=3;格(3,2):v2=3−3=0v_2=3-3=0。

非基格检验数:

格 (1,2) (1,3) (2,1) (2,2) (3,1) (3,3)
cij−ui−vjc_{ij}-u_i-v_j 4 1 1 14 1 −2

格(3,3) 为 −2:每往这里运 1 箱,总成本降 2。不是最优。

5. 闭回路调整

闭回路是从进基格出发、只在基格上转弯、最后回到出发格的折线:相邻两格同行或同列,每次转弯 90°。可以证明对每个非基格这样的回路唯一存在。

格(3,3) 的回路:(3,3)→(3,4)→(2,4)→(2,3)→(3,3)(3,3)\to(3,4)\to(2,4)\to(2,3)\to(3,3)。从进基格开始交替标 ++、−-:

格 (3,3) (3,4) (2,4) (2,3)
符号 + − + −
当前运量 0 15 15 25

调整量 θ\theta = 标“−”的格中的最小运量 =min⁡(15,25)=15=\min(15,25)=15。“+”格加 15、“−”格减 15,格(3,4) 降为 0 出基。这样每行每列的增减相抵,供需仍满足。

新解:

仓库 1 仓库 2 仓库 3 仓库 4
工厂 1 20 10
工厂 2 10 30
工厂 3 35 15

z=715+(−2)×15=685z=715+(-2)\times15=685。重新求位势(u1=0u_1=0):v1=8, v4=7, u2=−5, v3=13, u3=1, v2=2v_1=8,\ v_4=7,\ u_2=-5,\ v_3=13,\ u_3=1,\ v_2=2。非基格检验数为

格 (1,2) (1,3) (2,1) (2,2) (3,1) (3,4)
cij−ui−vjc_{ij}-u_i-v_j 2 1 1 12 3 2

全部为正,最优总运费 685,且最优解唯一(没有为 0 的检验数)。

退化

调整时如果有两个“−”格同时降到 0,只能让其中一个出基,另一个保留为取值 0 的基格;否则基格数少于 m+n−1m+n-1,位势就求不出来。Vogel 法中某一步行和列同时满足时,也要这样处理。

6. 运价的灵敏度

问: 工厂 3 到仓库 3 的运价从 14 变成 14+Δ14+\Delta,Δ\Delta 在什么范围内当前最优方案不变?

格(3,3) 是基格,运价变化会改变位势。保持 u1=0u_1=0 重新求:v1=8, v4=7, u2=−5, v3=13v_1=8,\ v_4=7,\ u_2=-5,\ v_3=13,由格(3,3) 得 u3=14+Δ−13=1+Δu_3=14+\Delta-13=1+\Delta,由格(3,2) 得 v2=3−u3=2−Δv_2=3-u_3=2-\Delta。非基格检验数:

格 检验数 要求
(1,2) 4−0−(2−Δ)=2+Δ4-0-(2-\Delta)=2+\Delta Δ≥−2\Delta\ge-2
(1,3) 14−0−13=114-0-13=1 —
(2,1) 4+5−8=14+5-8=1 —
(2,2) 9+5−(2−Δ)=12+Δ9+5-(2-\Delta)=12+\Delta Δ≥−12\Delta\ge-12
(3,1) 12−(1+Δ)−8=3−Δ12-(1+\Delta)-8=3-\Delta Δ≤3\Delta\le3
(3,4) 10−(1+Δ)−7=2−Δ10-(1+\Delta)-7=2-\Delta Δ≤2\Delta\le2

取交集:−2≤Δ≤2-2\le\Delta\le2,即运价在 [12, 16][12,\ 16] 内最优方案不变(总运费随之变为 685+15Δ685+15\Delta)。

如果改的是非基格的运价,位势不变,只需要求该格自己的检验数非负:例如格(3,1) 的检验数是 3,运价降幅不超过 3(Δ≥−3\Delta\ge-3)时方案不变。

7. 生产—库存问题写成运输模型

运输模型不只用于运货。“第 ii 期生产、第 jj 期交货”也可以看成从产地 ii 运到销地 jj:

运输模型 生产—库存问题
产地 ii 生产期 ii
销地 jj 需求期 jj
供应 sis_i 第 ii 期产能
需求 djd_j 第 jj 期需求
运价 cijc_{ij} 生产成本 + 提前生产的保管费 + 延期交货的罚金

例: 三个月产能 50、60、40,需求 40、50、60,单位生产成本 30;提前生产每件每月保管费 1;延期交货每件每月罚金 3。

运价矩阵:cij=30+1⋅(j−i)c_{ij}=30+1\cdot(j-i)(j≥ij\ge i),cij=30+3⋅(i−j)c_{ij}=30+3\cdot(i-j)(j<ij<i):

生产 \ 交货 第 1 月 第 2 月 第 3 月 产能
第 1 月 30 31 32 50
第 2 月 33 30 31 60
第 3 月 36 33 30 40
需求 40 50 60 150

用 Vogel 法得到 x11=40, x12=10, x22=40, x23=20, x33=40x_{11}=40,\ x_{12}=10,\ x_{22}=40,\ x_{23}=20,\ x_{33}=40,位势检验所有检验数 ≥0\ge0,最优总成本 4530。读法:1 月生产 50 件,其中 10 件存到 2 月;2 月生产 60 件,其中 20 件存到 3 月;3 月生产 40 件。格(1,3) 的检验数为 0,说明还有另一个同样便宜的方案(将 1 月原定存到 2 月的 10 件改为存到 3 月,2 月的 10 件相应提前交给 2 月需求)。

如果总产能大于总需求,就加一个“不生产”的虚拟需求期,运价取 0。

8. 指派问题

nn 个人做 nn 项任务,每人恰好一项、每项恰好一人,cijc_{ij} 是第 ii 人做第 jj 项的成本:

min⁡ z=∑i∑jcijxij,∑jxij=1,∑ixij=1,xij∈{0,1}.\min\ z=\sum_i\sum_j c_{ij}x_{ij},\qquad \sum_j x_{ij}=1,\qquad \sum_i x_{ij}=1,\qquad x_{ij}\in\{0,1\}.

它是所有供需都等于 1 的平衡运输问题。人数和任务数不等时,补虚拟人或虚拟任务(成本 0);某人不能做某项任务时,成本设为很大的 MM。

匈牙利法的依据是:某一行(列)同时减去一个常数,最优指派不变。于是不断化简成本矩阵,直到能在 0 上直接选出指派。

  1. 行化简: 每行减去该行最小值。列化简: 每列再减去该列最小值。此时每行每列都至少有一个 0。
  2. 试指派: 能否找到 nn 个位于不同行、不同列的 0?能,就是最优指派。
  3. 画线调整: 不能时,用最少的横线和竖线盖住所有 0(线数等于最多能选出的独立 0 的个数,小于 nn)。找出没被盖住的最小元素 kk:未盖住的元素都减 kk,两线交叉处的元素加 kk,只被盖一次的不变。
  4. 回到第 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。总成本 11+6+6+9=3211+6+6+9=32。

例2:四人五项任务(每人最多一项,有人不能做某些任务)。

任务 1 任务 2 任务 3 任务 4 任务 5
甲 10 — 7 8 11
乙 12 9 — 10 8
丙 8 11 9 — 10
丁 — 10 8 9 12

“—”记为 MM。人比任务少一个,补一个虚拟人(第 5 行,成本全为 0)凑成 5×55\times5。行化简后(虚拟行本来就全是 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。最小总成本 8+8+8+8=328+8+8+8=32,任务 2 无人承担(被分给了虚拟人)。

怎样确认“最少线数”

线数必须等于能选出的独立 0 的最大个数。手算时可以先尽量多地选独立的 0,再从“没选上 0 的行”出发标记:标记这些行里有 0 的列,再标记这些列中选中 0 所在的行……最后对未标记的行和已标记的列画线,线数就是最少的。

9. 小结

  • 运输问题:平衡后有 m+n−1m+n-1 个基变量,供需为整数则解为整数。
  • Vogel 法:罚数 = 次小 − 最小运价,先照顾罚数最大的行列,在其最便宜的格分配。
  • 位势法:基格 ui+vj=ciju_i+v_j=c_{ij},非基格检验数 cij−ui−vjc_{ij}-u_i-v_j,全部非负即最优。
  • 闭回路:从进基格交替 +/−+/-,调整量取“−”格最小运量。
  • 基格运价变化要重算位势;非基格只看自己的检验数。
  • 指派问题:行列化简 → 试指派 → 最少线覆盖 → 未盖住减 kk、交叉加 kk。

自测

1. 主线例子的最优方案中,工厂 2 到仓库 1 的运价要降到多少以下,才值得改用这条线路?

格(2,1) 是非基格,检验数为 1,即 4−u2−v1=14-u_2-v_1=1。运价降幅超过 1(低于 3)时检验数变负,改用这条线路能降低总运费;正好等于 3 时出现多重最优。

2. 某运输问题供应 15、13,需求 9、6、7、9,应该怎样平衡?虚拟格里的运量表示什么?

总供应 28 < 总需求 31,加一个虚拟产地,供应 3,运价全为 0。最优解中虚拟产地运往某销地的量,就是该销地在最优方案下的缺货量。

3. 匈牙利法中,为什么“未盖住的减 $k$、交叉处加 $k$”不会改变最优指派?

这一步等价于:所有未画线的行减 kk,所有画线的列加 kk。未盖住的元素只减一次;只被横线盖住的元素没被减也没被加;只被竖线盖住的元素减 kk 又加 kk,不变;交叉处只被加一次。整行整列加减常数不改变最优指派,而 kk 取未盖住的最小元素,保证所有元素仍然非负,并产生至少一个新的 0。