如何用运筹优化解决物流排车问题:CVRPTW 算法从理论到落地
背景
物流排车是一个经典的运筹优化问题——给定一批订单和一组车辆,如何规划每辆车的配送路线,使得在满足各种约束的前提下,总成本最低。
这个问题在学术上叫 CVRPTW(Capacitated Vehicle Routing Problem with Time Windows),听起来高深,但拆开来看,核心就是两个字:装得下和送的完。
这篇文章把我们在实际项目中解决这个问题的思路整理出来,包括业务约束的抽象、算法选型、关键创新点,以及踩过的一些坑。
问题拆解:装得下 + 送的完
装得下
最直观的约束:每辆车的装载量不能超过其承载能力。但真实业务比这复杂得多。
问题1:超单车承运能力
有些订单的商品体积或重量超过了单辆车的承载能力。这时候不能简单地把整个订单分配给一辆车,需要拆分。
我们设计了一个整数规划"打包"模型,从最小的商品粒度出发,自动决定如何拆分和组合订单,使得需要的车辆数最少。覆盖三种场景:
- 单点位、单订单、单商品就超载
- 单点位、单订单超载(多个商品加起来超)
- 单点位整体超载(多个订单加起来超)
问题2:单维度装车的盲区
如果只按体积或只按件数来约束装车,会遇到实际装不下的情况:
- 油、大米等密度大的商品,按体积算装得下,但严重超重,车开不动
- 鸡蛋等易碎品,堆叠到一定高度就不能再放了
我们的解决方案是引入双重维度约束(体积+重量,或件数+重量),同时考虑密度和堆叠限制,系统性地解决"装得下"的问题。
送的完
装上车只是第一步,还得保证能在规定时间内送到。
问题1:时间窗口约束
每个配送点位都有履约时间窗口——最早可送达时间(通常是市场开门时间)和最晚要求送达时间。司机必须在这个窗口内完成配送。
我们引入 CVRPTW 的时间窗口约束,确保每个点位的作业完成时间严格落在要求的时间窗口内。
问题2:点位作业时间差异大
不同点位的作业难度差异很大——有的点位卸货方便,5分钟搞定;有的点位要爬楼梯、等电梯,可能要30分钟。如果用统一的时间估算,要么排得太松(车辆利用率低),要么排得太紧(送不完)。
我们的做法是:统计历史较长一段时间内,不同司机、各种情况下每个点位的作业时间,按点位取中位数,然后拆分到每件、每客户维度。这样就能比较合理地反映每个点位的真实作业难度。
问题3:留有余地
再精确的估算也挡不住突发情况——堵车、找不到停车位、客户不在。我们在每条线路的作业时间基础上,额外安排缓冲时间,保证司机即使遇到突发情况也能完成履约。
问题4:真实距离与时间
两点之间的直线距离不等于实际行车距离。我们接入高德地图 API,获取两两点位间的实际行车距离和行车时间,作为算法的输入。
算法选型:为什么用 OR-Tools
CVRPTW 是 NP-hard 问题,精确求解在大规模场景下不现实。我们选择 Google 的 OR-Tools 运筹优化求解框架,原因:
- 成熟稳定:Google 维护,社区活跃,文档完善
- 求解效率高:内置高效的启发式算法(如 Guided Local Search),能在合理时间内给出高质量解
- 灵活可定制:支持自定义约束、目标函数、搜索策略
- Python 接口友好:与业务代码集成成本低
OR-Tools 的核心思路是:先构造初始解(贪心策略),再通过局部搜索不断优化(交换、 relocate、cross-exchange 等算子),最终收敛到一个近似最优解。
关键创新点
1. 打包模型与路径优化的联合求解
传统做法是先决定怎么装车、再决定怎么排路线,两步分离。但装车方式会影响路线长度,路线长度又会影响装车策略。我们把打包模型和路径优化联合求解,在搜索过程中同时优化装车方案和路线规划。
2. 个性化点位作业时间
不是用一个统一的"每点位30分钟",而是基于历史数据为每个点位计算个性化的作业时间估算。这使得排车结果更贴近实际,司机按照 AI 排线结果履约时,真的能送完。
3. 双维度装车约束
同时考虑体积和重量(或件数和重量),避免了单维度约束下的"装得下但超重"或"不超重但装不下"的问题。
实际效果
在宁波仓的试点中,AI 排车算法替代人工排车后:
- 车均装载件数提升10%以上——同样的订单,需要的车辆更少
- 履约达标率保持稳定——"送的完"约束有效
- 年节省物流费用千万以上——直接体现为成本节约
总结
物流排车问题的核心是约束建模——把业务语言翻译成数学约束。"装得下"对应容量约束和装车模型,"送的完"对应时间窗口约束和作业时间估算。在这个基础上,用 OR-Tools 的启发式算法高效求解,再通过一些创新(打包模型、双维度、个性化作业时间)提升解的质量。
对于类似场景(城配物流、冷链配送、生鲜到家),这套方案可以作为参考蓝本快速复用。关键不在于算法本身有多新,而在于对业务约束的理解和建模——这是从理论到落地最核心的一步。