从荷兰工厂到你家门口,450英里(约700公里)的距离,为什么货物能在第二天就送达?答案在于精细的物流优化——尤其是"中间里程"这一环节。这段路程覆盖了整个运输过程中最长的距离,占据了总成本的很大比例,更重要的是,它决定了货物送到时是新鲜完好,还是已经受损变质。
物流研究历来更关注"首公里"(将货物从生产者运往初始集散点)和"最后一公里"(配送至消费者手中)。这两个阶段通常被建模为车辆路径问题(VRP)的变体。然而,负责在区域或洲际范围内的配送中心之间进行大宗货物运输的"中间里程",尽管在物流总支出中占据相当大的比重,却在运筹学研究中受到的关注要少得多。造成这种学术进展滞后的一个重要原因是缺乏公开的高质量数据——大多数物流公司都将自身的网络拓扑结构和需求量视为高度敏感的商业机密。
中间里程物流在供应链中有着广泛的应用场景。从电商领域将货物从工厂运往消费者、零售商运往市中心门店,到汽车制造商需要将合适的零部件从各个工厂和中央仓库运送到生产线和门店,都涉及这一环节。此外,还包括一些时效性要求极高的运输任务,比如在存储设施和医院之间运送需要温控的药品。
中间里程物流衔接了首公里与最后一公里之间的空白。
为了解决这一领域缺乏标准化数据的问题,我们在论文《一种模拟中间里程物流网络的新型实例生成器》中,介绍了MilleMiglia——一款用C++编写的实例生成器,旨在为中间里程配送问题创建真实的基准测试数据。这项工作为未来的研究成果奠定了基础。本文将探讨中间里程独有的约束条件,以及MilleMiglia如何成功捕捉这些特征,从而生成既真实又能保护隐私的数据。源代码和相关文档已在GitHub上开放获取。
物流谱系:首公里、中间里程与最后一公里
首公里、中间里程与最后一公里物流之间的区别,体现在单件货物运输的整个旅程中。在这段旅程中,核心运营目标都是高效调度车队,实现多地点的访问。以某制造商在典型在线市场上销售商品并触达终端消费者为例来说明。
在首公里和最后一公里物流中,特定货物从始至终都由单一车辆运输——首公里从起点(工厂)运往目的地(配送中心),最后一公里则从配送中心运往终端客户。这类VRP问题涉及在有限时间跨度(通常是一天)内优化多辆车的调度,其优化难点本质上是分配与排序问题:确定哪辆车负责处理哪些货物,以及按什么顺序处理。
在我们的例子中,首公里对应的是收集制造商售出的商品(比如荷兰传统小煎饼poffert),最后一公里则涵盖最终配送给消费者的环节(有些消费者可能已经饿坏了!)。这两种情况下,都是单辆卡车在区域配送中心和起点/终点之间运输货物。然而,如果制造商和消费者身处不同区域,中间里程物流就承担起衔接远距离配送中心的重任。举例来说,从荷兰格罗宁根某制造商发出的货物,会先运往乌得勒支的区域配送中心,再转运至法国巴黎的另一配送中心,最终送达凡尔赛的消费者手中。
与首公里和最后一公里不同,中间里程的运作方式更像一场接力赛。一件货物在抵达最终目的地之前,可能需要经过洲际网络中多辆不同车辆的接力运输,整个过程甚至可能耗时一周之久。在中转配送中心,货物可能需要经历卸货、按目的地分拣、与其他货物合并集装,然后再装上下一辆车。这就产生了一个复杂的同步问题:货物必须在特定时间窗口内到达配送中心,才能赶上预定的出发班次。一旦错过预定的转运班次,货物就只能在配送中心滞留,等待下一个运输周期,从而造成严重延误。
在我们的例子中,制造商的货物一旦抵达乌得勒支区域中心,就会被装上当天发往比利时安特卫普的首班卡车。假设发往巴黎的最近一班卡车已满载,且客户选择的是标准配送服务,那么货物将在第二天从安特卫普搭乘第二班卡车前往巴黎。包裹在第二天晚上抵达巴黎,随后进入最后一公里配送网络,于次日完成对客户的最终配送。
货物的旅程:从荷兰格罗宁根的制造商到法国凡尔赛的客户,一份小煎饼的大部分旅程都是在货运代理商的中间里程网络中完成的。
数学建模与现有求解器的局限性
中间里程配送的数学结构在几个关键方面与标准VRP存在差异。
在传统VRP问题中,比如OR-Tools等开源工具或谷歌地图平台路径优化(GMPRO)等专用API所解决的问题,目标通常是为车队优化行车路线。其核心在于车辆路径规划和站点访问顺序安排,以满足客户严格的时限要求。与最后一公里配送不同,中间里程物流具备在不同卡车之间转运的额外灵活性。我们将这一额外维度建模为时空图上的多商品流问题。在这类模型中:
尽管许多学术界研究的VRP问题约束条件较少,但中间里程的运营约束却很难在不扭曲实际运营问题结构的前提下加以简化:
正是由于这些相互依赖的关系,现有的VRP求解器无法直接应用于中间里程问题。该问题需要确定一系列中转配送中心,并在多辆车之间进行分配,而且往往需要考虑跨越多天的时间跨度。
MilleMiglia:生成真实的基准测试数据
MilleMiglia运用多种统计分布方法,确保生成的合成网络在外观上与真实配送网络高度相似,同时不泄露任何隐私信息:
这些分布数据介于公开的行业信息与私下披露的数据之间进行插值处理。
MilleMiglia采用C++语言编写,并使用Protocol Buffers进行数据序列化,从而使得多样化的数据能够存储在单一文件中,针对每个实例生成一个文件。这样,生成的实例文件体积紧凑,且能够被用不同编程语言编写的求解器轻松读取和使用。
与VRP实例不同——VRP存在诸多变体,比如带容量约束的CVRP、带时间窗的VRPTW,或带时间窗的取送货问题PDPTW等,用以捕捉多样化的运营需求——我们的中间里程数据格式将所有关键约束条件整合在同一文件格式中:固定的车辆班次、配送中心的吞吐量限制,以及复杂的同步前提条件,这些都是该问题结构中不可或缺的基本要素。
我们的目标是为研究社区提供一系列实例:
该生成器同样支持学习场景的应用,因为它能够创建海量数据集,用于训练机器学习算法。
协作研究与未来的求解器
MilleMiglia是迈向中间里程物流标准化基准测试套件的第一步,其定位类似于CVRPLIB(容量约束车辆路径问题库)之于VRP研究社区的作用。
该项目源于谷歌与布雷西亚大学(UniBrescia)以及巴黎路桥高等工程师学校(ENPC Paris)等学术合作伙伴之间正在进行的合作研究。除了实例生成器之外,我们目前还在开发一款专门针对中间里程运营问题设计的求解器与API。该求解器旨在充分利用中间里程流量的独特结构特征。
通过开源我们的实例生成器,我们希望能够激励更广泛的研究社区聚焦中间里程的运营挑战,最终推动构建更加稳健、高效的全球供应链。我们希望能够发起一项针对中间里程问题的挑战赛,以提升学术界和产业界求解器开发者对这一长期被忽视却亟需优化的领域的关注度。任何对该领域感兴趣的人士,都可以从GitHub代码库中提供的样本实例入手进行了解。
致谢
这项研究主要由Aymane Lotfi在谷歌担任学生研究员期间完成,以及Matteo Petris(现就职于ENPC Paris)共同完成,属于双方持续合作的一部分。感谢Thibaut Cuvelier和Bruno De Backer为这项工作作出的贡献。特别感谢Claudia Archetti(现就职于UniBrescia)的领导与支持。
Q&A
Q1:MilleMiglia是什么?它主要用来解决什么问题?
A:MilleMiglia是谷歌联合学术机构开发的一款C++实例生成器,用于为中间里程物流配送问题创建真实的基准测试数据,旨在解决该领域长期缺乏公开高质量数据的问题,帮助研究者优化中间里程运营网络。
Q2:中间里程物流和最后一公里物流有什么区别?
A:最后一公里物流中,单件货物从始至终由同一辆车运输;而中间里程物流更像接力赛,一件货物可能需要经过多辆车的接力运输,并在配送中心经历卸货、分拣、合并等环节,才能到达最终目的地,运输周期可能长达一周。
Q3:普通人或研究者可以从哪里获取MilleMiglia的相关资源?
A:MilleMiglia的源代码和使用文档已经在GitHub上开放获取,感兴趣的研究者可以直接查看代码库中提供的样本实例,进一步了解该生成器的具体功能和使用方式。
