运筹学 | 基础向 | 线性规划的运输问题


  • 这篇博客是 b 站王老师运筹学应试向网课 的随堂笔记,对应讲座 P7、P8。
    • 强烈安利王老师的网课 ✔️ 比课本好理解,节奏足够快,适合课余时间自学。
    • 本人以前无运筹学基础,直接听应试向网课,感觉还可以。各位自学选手 若感觉应试向太快,建议看 王老师的教学向视频
  • 本博客
    • 首先,介绍了运输问题的标准形式 产销平衡问题,以及其他问题如何转化为产销平衡问题。
    • 然后,介绍了 表上作业法 的步骤。作为一类特殊的线性规划问题,运输问题可以用特殊方法 表上作业法 求解,不仅很简单,而且直观易于理解,比单纯形法好用多了。
  • 本节内容相当简单,基本没有理解上的难度。各位,冲!


1 运输问题标准形式:产销平衡问题

1.1 运输问题的场景

从一个例子开始:

  • 老学长 A1 A2 要出马原课本,A1 有 3 本,A2 有 4 本。小学弟 B1 B2 B3 想要马原课本,B1 要 3 本,B2 B3 各要两本。
  • A1 A2 想尽可能少跑路 把书给 B1 B2 B3,A1 的宿舍离 B1 B2 更近,A2 的宿舍离 B3 更近,于是 A1 A2 一商量,打算 A1 把书全给 B1,A2 把书分给 B2 B3。

在这个例子下,老学长 A1 A2 可视作产品的 产地,小学弟 B1 B2 B3 可视作产品的 销地(叫做销地 是因为,通常是产地把产品运给商店,商店进行产品销售)。我们希望 最小化 的目标函数是 产品从产地运输到销地的代价,在这里,目标函数为老学长 A1 A2 的运动量。

我们可以用以下表格表示该问题:

image-20220921110225561
  • 格子右上角的数字,代表老学长每送一本书的运动量。
    • 通常情况下,代表产地 → 销地运输产品的 单位运费
  • 其余四分之三的格子,用来填 该学长打算给该学弟送几本书。
    • 通常情况下,用来填“该产地 → 该销地的 产品运输数量”,也就是我们的 决策变量

1.2 产销平衡问题:定义

在产销平衡问题中,Σ 产量 = Σ 销量。在上面的例子中,也就是产量列求和 = 销量行求和,老学长的每一本书 都能出给小学弟;老学长不会有书出不完,小学弟拿到书刚好够用。

  • 目标函数:运输成本最小化。
  • 决策变量:特定 产地 → 销地 的产品运输数量。
  • 约束条件:产销平衡。

2 其他运输问题 → 产销平衡问题

2.1 产销不平衡:产>销 or 销>产

继续举马原课本的例子。产量>销量,也就是老学长有很多书,但小学弟不需要这么多。

转化为产销平衡问题,可以假设一个虚拟的销地,把多余产品都送给虚拟销地,当然 这个运输代价 = 0。举上面的例子,就是把送不完的书 形式化地认为 送给一个虚拟的人,我们多出来多少,他就需要多少,(但其实是继续留在宿舍落灰了,所以送书代价 = 0)。

image-20220921111608242

销量>产量的情况,也就是老学长出的书 不够小学弟使用,小学弟还需要更多课本。转化为产销平衡问题,同样可以假设一个虚拟的产地,虚拟产地 → 其他销地的运输代价 = 0。

2.2 有转运的运输问题(产销平衡)

继续举马原课本的例子。假设 A2 灵机一动,我离 B1 B2 远,但 A1 离 B1 B2 近,我又离 A1 近,让 A1 转送一波,不就节省运动量了嘛?同样,A1 可以先把所有书给 B1,然后由 B1 分发给 B2 B3。

有转运 的运输问题中,所有产地 / 销地都可作为中转站。因此,可以得到扩展的运输问题,其中

  1. 发送产品地点的数量 = 接收产品地点的数量 = 产地数量 + 销地数量。
  2. 因为作为中转站,每一产地 / 销地都可能经手所有产品,所以,流经某一产地(销地)的产品 上限数量 = 原产量(原销量)+ 总产品数量。

这里以马原课本为例,直接给出扩展后的形式,这个扩展非常巧妙:

image-20220921120506896

可能有点费解,但仔细想一定能想明白。

(如果产销不平衡 并且有转运,① 先设虚拟产地 / 销地,② 列出扩展形式。)

2.3 产销不确定的运输问题

直接举个产量不确定的例子吧,销量不确定也是同理。继续举马原课本的例子。假设 A1 可以出 2~4 本书不定,A2 至少出 1 本书,最多可以出无限本书。

转换为产销平衡问题的方法:

  • 首先,考察 A1 A2 出书的上限 / 下限:
    • A1 A2 出书的下限没法 cover 所有需求,所以,为了 cover 所有需求,A1 A2 不能每个人都出最少的书;
    • A1 A2 出书的上限是无穷,所以,为了化成产销平衡问题,需要新增一个虚拟销地 B4。
  • 然后,将 A1 A2 出书的固定部分 / 可变部分拆开,其中,
    • 固定部分是必须出手的,通过把 固定部分 → 虚拟销地 的单位运价 设成特别大的数来保证;
    • 可变部分可以送给虚拟学弟(事实是放在宿舍落灰),给虚拟学弟的单位运价 = 0。
    • 对于上限为无穷的可变部分,需要考察一下:如果其他可变部分取最小值,这一部分要取多大,才能 cover 所有需求;这个值就是该部分可能出书的最大值。
image-20220921195401149

3 费劲的通法 vs 表上作业法

3.1 单纯形法解产销平衡问题

产销平衡问题,是线性规划的一类问题,可以用单纯形法求解。然而,对于 m 个产地、n 个销地,

  • 要决定第 j 个产地给第 i 个销地发多少货,因此有 m×n 个决策变量;
  • 第 j 个产地 产品必须全发出去,第 i 个销地 需求必须满足,因此有 m+n 个约束条件;

可以看出,问题规模非常大。

产销平衡问题 写成线性规划形式:(设 \(a_{j}\) 为第 j 个产地的产量,\(b_i\) 为第 i 个销地的销量,\(c_{ji}\) 为产地 j → 销地 i 的单位运价)

\[\min z=\sum_{j=1}^m\sum_{i=1}^n c_{ji} x_{ji} \\ \left\{ \begin{array} & \sum_{j=1}^m x_{ji}=a_j & (j=1,\cdots,m) \\ \sum_{i=1}^n x_{ji}=b_i & (i=1,\cdots,n) \\ x_{ji}\ge0 & (j=1,\cdots,m,~i=1,\cdots,n) \end{array} \right. \tag{1} \]

用通法求解特例问题,往往会麻烦。 对于产销平衡问题,我们可以用 表上作业法 求解。

3.2 表上作业法:形式、基本思路

表上作业法可以视为单纯形法的简化,基本思路:

  1. 寻找初始可行解。
  2. 迭代到新的解 + 最优性检验。

需要用到这张表:

image-20220921110225561

4 构造初始基可行解:贪心构造

构造初始基可行解,也就是构造一个运货方案,满足:

  • 所有产量都被运输,所有销量都被满足。
  • 仅有 m+n-1 条运输线路被使用。仅有 m+n-1 个决策变量 格子里的数非零,其他格子都 = 0。
    • 我们有 m×n 个决策变量、m+n 个约束条件等式。然而,因为运输过程中货物总量不变,也就是说,如果能保证 ① 产地的产品全发出去 ② 其他 n-1 个销地 销量需求都满足,那么第 n 个销地肯定也满足销量需求。
    • 可以得出,m+n 个方程中,有 1 个方程是多余的,所以系数矩阵的秩 = m+n-1,基可行解需要有 m+n-1 个决策变量非零。

构造基可行解的思路是贪心法,有三种主流方法:西北角法、最小元素法 / 最小运价法、沃格尔法。

  • 前两个非常简单,第三个有点麻烦,直接看网课即可理解:P7 6:16 ~ 21:42。
  • 解的质量:一般是 西北角法<最小运价法<沃格尔法。
  • 退化的最优解:
    • 如果构造可行解时,出现 格子里填了一个数,这一行一列都划掉了,则出现了退化的最优解。
    • 为了使表上作业法顺利进行,在这一行或列中 随便找个格子填 0 即可。
    • 本人专门写了 一篇博客,区分退化的最优解 & 无穷多最优解。

5 迭代、最优性检验

5.1 闭回路法:迭代 + 最优性检验

闭回路法的思想,网课说的非常好理解:P7 21:42 ~ 36:49。

  • 每个非基变量的闭回路是唯一的。
  • 在闭回路中,非基变量 & 它的对角 ++,剩下两个元素 --。
  • 检验数:
    • 检验数,就是把一单位货物 从 在出基变量路径运输 变成 在入基变量路径运输 的收益,也就是 ① 非基变量 & 它的对角 += 1 ② 剩下两个元素 -= 1 的收益。
    • 计算方法:σ = 非基变量单位运价 + 对角单位运价 - 剩下两个元素的单位运价之和。
    • 记录方法:记在格子里,打上括号(和基变量区分)。
    • 注意,运输问题的目标函数是 min,所以把 σ 最小的非基变量入基,如果 σ 全 ≥ 0,则最优解。
  • 迭代换基:
    • 增加非基变量 & 它的对角,减少剩下两个元素,直到剩下两个元素中 有人降为 0。

5.2 位势法:最优性检验

其实我也不太能直观理解位势法,不过硬要理解的话,网课说:位势作为 产地产量 / 销地销量 的对偶变量,可以理解为 把 i 到 j 的单位运价拆分成两部分,一部分是 i 的位势,一部分是 j 的位势。

注意,位势法只能做最优性检验,换基迭代还得靠闭回路。

位势法的步骤:

  • 首先,\(x_{ji}\) 对应的检验数 \(\sigma_{ji}=c_{ji}-u_j-v_i\),即 检验数 = 方格右上角运价 - 两地位势之和。
  • 然后,随便找一个位势设为 0。
    • 解释:我们对每个产地 / 销地都有一个位势,对应 产地 + 销地 的 m+n 个约束条件。但是还记得嘛,这 m+n 个约束条件 有一个是多余的,只有 m+n-1 个独立约束条件,因此也只有 m+n-1 个独立的位势,所以可以随便找个位势设为 0。
  • 接下来,利用基变量检验数 σ = 0,求出各地的位势。
    • \(σ=c-u-v\),c 和 u(或者 v)都知道(刚刚设了一个位势 = 0 呀),所以就能知道另一个。
    • 利用刚刚知道的那个位势,接着再推出其他位势,直到知道所有位势。
  • 最后,利用 \(\sigma_{ji}=c_{ji}-u_j-v_i\),直接得到所有检验数,over。


posted @ 2022-09-22 14:57  MoonOut  阅读(1354)  评论(0编辑  收藏  举报