具有多个站点、作业类型和目的地的路线优化

Posted

技术标签:

【中文标题】具有多个站点、作业类型和目的地的路线优化【英文标题】:Route Optimization with Multiple Depots, Job Types and Destinations 【发布时间】:2014-11-25 12:50:19 【问题描述】:

我是路由优化的新手,非常感谢您在使用 jsprit 解决以下业务需求方面的帮助。我从 Stefan Schröder 那里得到了一些反馈,他帮助我学习了一些关于 jsprit 的基础知识。我先解释一下业务需求,然后问几个问题。

目标是安排需要在一个月内完成的维护工作列表。需要为整个月准备每日时间表。这里的目标是每天执行最大数量的工作。

一个地区有 4 个站点,每个站点都有一个 每个区域大约有 70 个仓库,总共 300 个仓库 该区域内每个仓库与仓库之间的距离已知 每个区域有3-4辆不同类型的车辆,总共12辆 区域内的车辆只能服务于该区域内的仓库 区域内的车辆具有相同的起点,恰好是终点 车辆没有任何容量、取货或交付要求 车辆仅用于运送执行维护工作的工人 每辆车的平均速度已知 大约有 80 种维护作业类型 每种作业类型都需要以分钟为单位的已知时间 维护作业不必在特定时间开始 每月约有 200 项维护工作需要执行 这些工作可以在任何仓库进行 同一仓库可以在同一天或不同天进行多个作业 一天内有 3 个八小时班次。上午 6 点至下午 2 点、下午 2 点至晚上 10 点和晚上 10 点至上午 6 点 车辆将在轮班开始时离开仓库仓库,并在 8 小时轮班内访问尽可能多的仓库 在执行作业时,车辆必须在仓库等待,然后才能移动到下一个仓库或返回到堆场仓库

我的基本理解是,维护工作可以定义为jsprit中的服务,并且可以为每辆车设置启动/返回时间。此外,成本矩阵可用于增加车辆和仓库之间关系的时间和距离。我的问题是:

    每个维护作业都需要定义为服务,因此将有 200 个服务对象传递给 VRP 求解器,对吗? VehicleTypeImpl 具有 addCapacityDimension()、setCostPerDistance() 和 setCostPerTime() 方法。这些到底是什么?它们如何应用上述案例? Service.Builder 具有 addSizeDimension() 方法。它有什么作用? costMatrixBuilder 具有添加 TransportDistance 和 TransportTime 的方法。这些方法使用了哪些单位,我该如何使用它们? 对于每个站点,需要定义一个坐标并将其传递给每个 VehicleImpl 的 setStartLocationCoordinate() 方法。对吗? vehicleBuilder 有 setLatestArrival(double maxDuration);这里使用的是哪个单位?

感谢您在解决上述案例方面的任何帮助。

谢谢, 亚当

编辑1:

几个问题

A. setEarliestStart() 和 setLatestArrival() 方法接受 double 值,如何将最早出发和最晚到达指定为这些方法的实际日期?例如,开始时间是 2014 年 11 月 28 日下午 2 点,结束时间是当天晚上 10 点。

B.有没有办法以分钟为单位指定服务时间?

C. VehicleTypeImpl.Builder.setMaxVelocity(double inMeterPerSeconds) 方法需要最大速度,有没有办法指定车辆的平均速度?

D.所有车辆实行三班倒;这是否意味着我必须定义同一辆车三次,每个班次都有不同的最早出发和最晚到达时间?

E.由于作业可以在一个月内的任何时间执行,每个作业的时间窗口是否会作为月初和月底传递给 Service.Builder.setTimeWindow() 方法?

【问题讨论】:

【参考方案1】:

ad1) 正确

ad2) 如果容量不起作用,则不需要 addCapacityDimension(..)。如果是这样,您可以使用此方法定义任意数量的容量维度,例如重量、体积、托盘数量(然后是三个维度)。使用 .setCostPerDistance(..) 您可以设置 - 顾名思义 - 每个距离单位的成本(例如 1 欧元/公里)。因此,使用 .setCostPerTime(..) 您可以设置每个时间单位的成本,例如20 欧元/小时。因此,如果您的车辆/司机在 1 小时内行驶 100 公里,则将花费 100 公里 * 1 欧元/公里 + 20 欧元/小时 * 1 小时。

ad3) 服务可能会消耗您车辆的容量。服务可能是指在客户/服务站点提取货物。它可能具有一定的体积、重量,并且可以装载到某个编号上。托盘。这就是您使用 .addCapacityDimension(..) 定义的内容

ad4) 您定义单位。它应该是相同的单位,您在设置成本参数时假设。

ad5) 正确。但是您不一定需要坐标。您需要 locationId 或坐标,但您可以同时设置两者。 locationId 应该与您在将时间和距离关系添加到 costMatrix 时使用的相同。

ad6) 同样,您确定单位。

【讨论】:

非常感谢斯特凡。我很感激你的帮助。您能否详细说明如何定义单位? jsprit 如何知道距离以公里为单位,时间以分钟为单位,平均速度以公里/小时为单位?我查看了源代码并有几个问题(上面与原始问题一起发布) 我假设您使用这个github.com/jsprit/jsprit/blob/master/jsprit-core/src/main/java/… 来定义您的运输时间和距离。然后你必须知道你放入矩阵的距离单位。如果您使用公里,您的每距离成本参数也应该使用公里,例如10 欧元/公里,因此 .setCostPerDistance(10)。如果您使用 m,您的成本参数应定义每 m 的成本,例如0.01 €/m 因此 .setCostPerDistance(0.01)。 是的,你是对的。我使用 VehicleRoutingTransportCostsMatrix 来定义运输时间和距离。有没有办法使用实际日期值指定车辆的最早出发和最晚到达以及工作的时间窗口?我打算使用只接受双精度值的 setEarliestStart()、setLatestArrival() 和 setTimeWindow() 方法。再次感谢 Stefan,非常感谢您的帮助 :) 花了几个小时阅读代码后,我发现 Time 类可以处理这种格式:hh:mm:ss AM|PM。有没有办法指定日/月/年以及 hh:mm:ss AM|PM?一些工作的时间窗口通常是几天,在某些情况下是 3-4 周。

以上是关于具有多个站点、作业类型和目的地的路线优化的主要内容,如果未能解决你的问题,请参考以下文章

在具有多个目的地的移动设备上启动地图应用程序

解决车辆路线以优化成本

个人项目——地铁出行路线规划

地铁出行路线规划

地铁出行路线规划

地铁出行路线规划分析与设计