食品配送中堆叠订单的算法(取货和配送)

Posted

技术标签:

【中文标题】食品配送中堆叠订单的算法(取货和配送)【英文标题】:Algorithm for stacked orders in food delivery (Pick up and deliveries) 【发布时间】:2021-11-20 03:02:05 【问题描述】:

我正在尝试实现堆叠订单

虽然最佳解决方案是考虑从具有相似食物准备时间和附近送货地点的附近餐厅取货。

我想从稍微简单一点的开始 - 即仅将来自相同餐厅的订单堆叠起来,这些餐厅的食物准备时间与多个送货点相似。 (交付示例:https://riders.deliveroo.com.sg/en/tech-round-up-stacking-orders)

规模约为每小时 20 万份订单和 5000 名骑手、5000 家餐厅。运行时间在这里很重要~理想情况下少于 1 分钟(按需服务)

我的想法是这样的:

(1) 每隔几分钟收集一次订单,并按准备时间 O(nlogn) 对所有订单进行排序

(2) 按餐厅 O(n) 分组订单

(3) 从剩余准备时间最短的订单开始,在时间窗口(比如 3-5 分钟)内查找同一餐厅的任何订单,如果存在则将它们分组为一个堆栈。 O(1)。

此处未考虑配送点的位置以减少计算量 - 大多数配送点位于给定区域的 3 公里范围内。 对计算时间的全局最优不太感兴趣。选择剩余准备时间最短的订单是为了避免考虑所有组合进行骑手 - 订单排列匹配。

(4) 为车辆路径的半最优 TSP 运行模拟退火。 (例如,从同一家餐厅取订单 A、B、C -> 将 C 送到 A 到 B)

我了解,对于多个 PICKUP 和 Dropoff,问题将转化为 VRPTW - 一个难以实时解决的问题。

一个更简单的问题 - 单次上车和多次下车有没有比我现在想到的更好的方法?

非常感谢。

【问题讨论】:

您应该能够以最佳方式将这些 TSP 实例作为 MIP 解决,而不会消耗太多的计算量。 “规模约为每小时 20 万份订单和 5000 名骑手。”有多少家不同的餐厅? 让我们说每个区域大约有 5k 家餐厅。 @DavidEisenstat 不是 MIP NP 难的吗?如果您说堆叠数量有实际限制(最多可携带 @zcahfg2 在看起来像道路网络的图中,计算成对距离的速度很快(对于每个具有正确预处理的节点,图大小的亚线性),并且 TSP MIP 的指数基数是在实践中相当温和。 【参考方案1】:

我已经实现了你的算法

(1) 每隔几分钟收集一次订单,并按顺序对所有订单进行排序 他们的准备时间

(2) 按餐厅分组订餐

(3) 从剩余准备时间最短的订单开始, 在时间窗口内查找同一家餐厅的任何订单 (假设 3-5 分钟),如果存在,将它们分组为一个堆栈。

使用如下配置运行我的实现

theConfig.OrdersPerHour = 20000;        // incoming order per hour
theConfig.GroupTimeMins = 5;            // order collection time
theConfig.ResterauntCount = 1000;       // number of resteraunts
theConfig.PickupWindowMins = 5;         // pickup window time
theConfig.MaxPrepTimeMins = 15;         // maximum order preparation time

大约 1/3 秒生成 815 个订单堆栈

C:\Users\James\code\pickup\bin>pickup.exe
Pickup
815 order stacks created
raven::set::cRunWatch code timing profile
Calls           Mean (secs)     Total           Scope
       1        0.329374        0.329374        stack

您可以在https://github.com/JamesBremner/pickup查看代码

请注意,此时间不包括生成驾驶员路线的时间。这应该不会花费太长时间,因为每个司机将访问不到六个站点。这在很大程度上取决于正在搜索的图形的大小。如果您可以围绕每家餐厅划分图表,那么它会很快进行。如果每个搜索可以在三分之一秒内完成,并且搜索是连续完成的,那么您将需要 5 分钟来执行 800 条路线。

作为最初的实验,我假设:

    以餐厅为中心的 5 公里乘 5 公里的分区搜索图 曼哈顿距离 送货到最远的角落,或靠近最远的角落

使用Pathfinder travelling salesman implementation.的以下输入

format sales
manhatten 0 0 0
c 0.0 0.0 rest
c 2.5 2.5 topright
c -2.5 2.5 topleft
c 2.5 -2.5 bottomright
c 2 2 neartopright

给予

这需要 0.4 毫秒。

pickup timer test
manhatten 0 0 0
c 0.0 0.0 rest
c 2.5 2.5 topright
c -2.5 2.5 topleft
c 2.5 -2.5 bottomright
c 2 2 neartopright

route rest -> topright -> neartopright -> topleft -> bottomright -> rest ->
raven::set::cRunWatch code timing profile
Calls           Mean (secs)     Total           Scope
       1        0.0003218       0.0003218       TravellingSalesManCalculation
       1        2.23e-05        2.23e-05        CalculateManhattenDistances

对于 800 个订单堆栈,串行处理时为 1/3 秒。加上上面显示的订单堆叠时间,总计算时间不到一秒。您将不得不添加从服务器接收订单数据所需的时间,然后将路线发送到取决于您的服务器和网络的驱动程序,但我猜您只需要几秒钟。 (你还没有发布你的运行时要求!!!)

注意:我假设司机只需要一份按最佳顺序排列的送货地点列表,以便他们可以使用自己的 GPS 设备找到下一次送货的详细路线。如果不是这种情况,并且司机需要详细的路线(左,右,第二左......),那么这将需要更长的时间。请让我知道您希望它如何工作。

我已将餐厅数量增加到 5000 家

C:\Users\James\code\pickup\bin>pickup.exe
Pickup
Orders per hour                20000
Order collection time mins     5
Restaurants                    5000
Pickup window mins             5
Maximum order preparation mins 15
1416 order stacks created
raven::set::cRunWatch code timing profile
Calls           Mean (secs)     Total           Scope
       1        2.80843         2.80843         stack

由于订单率没有增加,每家餐厅的订单数量减少了,堆叠订单的机会也减少了 - 结果是计算时间显着增加。

【讨论】:

谢谢,我下班后会仔细看看代码。对于图 - 理想情况下,它将是道路网络的双向图(可以修剪高速公路,因为交付车辆类型主要是摩托车、自行车和步行以减少计算量)要构建道路图,我们可以使用原始 shapefile,例如(download.geofabrik.de/europe/great-britain/england.html)。由于伦敦地图非常大 - 对于这个特定示例,我们可以将网络修剪 5kmx5km(单区域大小)。 如果真实道路网络上的TSP计算太慢而无法用于实时按需服务。我不得不改用曼哈顿距离(完全放弃道路网络)并创建由餐厅、交付点仅作为节点组成的简单网络。但是随着 SA 在“裁剪”的道路网络上运行启发式算法,它应该真的是可能的。至少 Uber pooling 能够成功。 请指定您的时间限制。在所有订单注册后多久需要计算所有路线?还需要在theConfig.*中指定可以运行的线程数和其他参数 " 理想情况下,一组订单的计算时间限制为 1 分钟。"我的实验表明,这很容易实现。这是您最重要的限制 - 为什么不在您的问题中?您应该编辑您的问题以包含它,而不是将其隐藏在评论中。 "我们正在使用 python" 如果计算时间对您很重要,这是个坏主意。 Python 很慢,很慢,很慢,...

以上是关于食品配送中堆叠订单的算法(取货和配送)的主要内容,如果未能解决你的问题,请参考以下文章

matlab遗传算法求解选址结合路径优化问题

matlab遗传算法求解选址结合路径优化问题

matlab遗传算法求解选址结合路径优化问题

matlab遗传算法求解选址结合路径优化问题

matlab遗传算法求解选址结合路径优化问题

bzoj1806[Ioi2007]Miners 矿工配餐 dp