2. 多仓多产线配送网络建模
多仓多产线配送优化之所以难,首先难在“把现实世界翻译成可计算的模型”。如果直接把仓库、月台、叉车、料架、工位、AGV、电梯、门禁都画进一张图,模型会迅速膨胀到无法求解;如果抽象得太粗,又会丢失时间窗、容量、换装等关键约束,算出来的方案在现场根本执行不了。本节要解决的就是这个“翻译”问题:如何用一套统一的抽象方法,把配送网络表达成图模型,并在此基础上引入网络流的基本概念。
一、五类基本对象:从物理实体到图元素
多仓多产线配送网络中,最值得抽象的对象可以归为五类,它们分别对应图模型中的不同角色:
- 仓库(Warehouse):物料的供应起点,具有库存、拣货能力、发运时间窗和出库容量。在图中通常抽象为“源点”或“供应节点”,附带供应量上限与可发运时段。
- 配送节点(Distribution Node):包括中转仓、越库平台、厂内配送中心、电梯口、楼层交接点等。它不改变物料形态,只做暂存、分拣、换装或交接,是网络中的“中间节点”,核心属性是吞吐能力与停留时间。
- 线边库(Line-side Store):产线旁的缓冲存储区,是配送与消耗的衔接点。它既有容量上限(工位面积、料架位数),又有补货触发逻辑(看板、双箱、定时补货),在图中是“需求节点”的前置缓冲。
- 产线/工位(Line / Station):物料的最终消耗点,具有节拍、需求速率、消耗时间窗和齐套要求。它是网络中的“汇点”或“需求节点”,需求量由生产计划与BOM展开得到。
- 路径(Route / Arc):连接上述节点的可行通道,可以是厂区道路、连廊、电梯、AGV通道或人工推车路径。每条路径带有距离或行驶时间、通行能力、可用时段,以及是否允许双向通行。
把对象映射为图元素后,一个多仓多产线配送问题就变成了:在带容量与时间窗的有向图上,把物料从多个源点经中间节点送到多个汇点,并满足路径能力、节点吞吐和时间约束。
二、时间窗的抽象:节点时间窗与弧时间窗
时间窗是配送网络建模中最容易被简化、也最容易出问题的地方。建议区分两类时间窗:
- 节点时间窗:某节点允许被服务或允许停留的时间区间。例如仓库发运时间窗 [08:00, 11:30],线边库收货时间窗 [09:00, 16:00],产线某工位只允许在换型间隙收货 [13:20, 13:50]。
- 弧时间窗:某条路径允许通行的时间区间。例如厂内主干道在 07:30–08:30 只允许人员通行,AGV 通道在夜班时段才开放,电梯在整点前后 10 分钟为高峰禁货时段。
建模时通常把时间离散化为时间片(如 5 分钟一格),或采用连续时间变量。离散化便于表达“某时段容量上限”,连续化便于精确计算到达时间。实际工程中,若配送频次高、时间窗密集,建议用离散时间片;若配送批量大、时间窗宽松,可用连续时间加惩罚函数。
三、图模型:从物理网络到有向图
完成对象与时间窗抽象后,就可以构建图模型。设图 G = (V, E),其中 V 为节点集合,E 为弧集合。节点可进一步分为供应节点 S、中间节点 T、需求节点 D;弧可带有容量 c、行驶时间 t、时间窗 [a, b] 和单位成本 w。一个典型的抽象结果如下:
节点集合 V:
S1 一号仓库 供应量 120 托/班 发运窗 [08:00, 11:30]
S2 二号仓库 供应量 80 托/班 发运窗 [09:00, 14:00]
T1 厂内配送中心 吞吐 200 托/班 停留 ≤ 30 min
T2 电梯交接点 吞吐 60 托/班 高峰禁货 11:30–12:30
D1 总装线边库 容量 40 托 收货窗 [09:00, 16:00]
D2 焊装线边库 容量 25 托 收货窗 [08:30, 15:30]
弧集合 E(示例):
S1 → T1 容量 80 托/班 行驶 25 min 全天可用
S2 → T1 容量 60 托/班 行驶 40 min 全天可用
T1 → T2 容量 50 托/班 行驶 10 min 高峰禁货
T2 → D1 容量 30 托/班 行驶 8 min 收货窗内可用
T2 → D2 容量 20 托/班 行驶 12 min 收货窗内可用
这张图已经可以直接用于网络流计算。需要注意的是,弧容量与节点吞吐要分开建模:弧容量限制“同时在路上”的流量,节点吞吐限制“单位时间通过该节点”的流量。很多现场问题不是路不够宽,而是配送中心或电梯口的吞吐不够。
四、网络流基础:从可行流到最小费用流
图模型建立后,配送问题可以形式化为网络流问题。最基本的约束是流量守恒:对任意中间节点,流入量等于流出量;对供应节点,流出量不超过供应上限;对需求节点,流入量应满足需求量。在此基础上,弧容量约束要求每条弧上的流量不超过其容量,时间窗约束则要求流量在允许的时间区间内通过。
如果只关心“能不能送得到”,这是一个可行流问题;如果关心“怎么送最省”,则是最小费用流问题,目标函数通常是最小化总运输成本、总行驶时间或总延误惩罚。多仓多产线场景下,还常引入多商品流(不同物料不能混装)或带时间窗的车辆路径问题(VRPTW)。
实际建模时,建议按以下顺序推进:
- 确定节点粒度:仓库是否细分到月台?线边库是否细分到料架?粒度过细会导致节点数爆炸,粒度过粗会丢失关键约束。一般建议以“有独立容量或独立时间窗”为最小节点划分依据。
- 确定弧的粒度:同一段道路若不同时段容量不同,应拆成多条带时间窗的弧;若双向通行能力不同,应拆成两条有向弧。
- 标定参数:供应量、需求量、容量、行驶时间、时间窗、单位成本。参数来源可以是WMS、MES、历史配送记录或现场实测,但必须标注数据口径与时间范围。
- 选择求解方式:小规模可用线性规划或最小费用流算法;大规模带时间窗问题通常需要启发式或元启发式算法,并配合仿真验证。
- 验证与回写:将求解结果映射回现场,检查是否存在“数学上可行、现场不可执行”的情况,如叉车不足、电梯排队、料架已满等,再反向修正模型。
五、一个可复用的抽象检查清单
在进入具体算法之前,可以用下面这份清单快速检查抽象是否完整。它不追求覆盖所有细节,而是确保关键约束没有被遗漏:
| 检查项 | 需要确认的内容 | 对应图元素 |
|---|---|---|
| 供应侧 | 每个仓库的供应量上限、发运时间窗、拣货能力 | 供应节点属性 |
| 中间侧 | 配送中心/交接点的吞吐上限、停留时间、换装要求 | 中间节点属性 |
| 需求侧 | 线边库容量、产线消耗速率、收货时间窗、齐套要求 | 需求节点属性 |
| 路径侧 | 距离/时间、容量、可用时段、单向/双向、通行限制 | 弧属性 |
| 时间侧 | 时间片粒度、参照系、排队与交接耗时是否计入 | 时间窗参数 |
| 目标侧 | 最小成本、最小时间、最小延误或综合目标 | 目标函数 |
完成上述抽象后,多仓多产线配送网络就从一个模糊的现场问题,变成了一个有节点、有弧、有容量、有时间窗、有目标函数的图模型。后续的路径优化、流量分配、时间窗松弛与仿真验证,都建立在这一步的准确性之上。抽象的质量,直接决定了优化结果能否真正落地。