我是路由优化的新手,非常感谢您在使用 jsprit 解决以下业务需求方面的帮助。我从 Stefan Schröder 那里得到了一些反馈,他帮助我学习了一些关于 jsprit 的基础知识。我将首先解释业务需求,然后问几个问题。
目标是安排需要在一个月内完成的维护工作列表。需要为整个月准备每日时间表。这里的目标是每天执行最大数量的工作。
- 一个地区有 4 个仓库,每个仓库
- 每个区域有大约 70 个仓库,总共 300 个仓库
- 该区域内每个仓库与仓库之间的距离是已知的
- 每个区域有3-4辆不同类型的车辆,共12辆
- 区域内的车辆只能服务于该区域内的仓库
- 区域内的车辆具有相同的起点,恰好是终点
- 车辆没有任何容量、取货或交付要求
- 车辆仅用于运输将执行维护工作的工人
- 每辆车的平均速度已知
- 大约有 80 种维护工作类型
- 每种作业类型都需要以分钟为单位的已知时间
- 维护作业不必在特定时间开始
- 每月大约有 200 项维护工作需要执行
- 这些工作可以在任何仓库
- 同一个仓库可以在同一天或不同天进行不止一项工作
- 一天内有 3 个八小时班次。上午 6 点至下午 2 点、下午 2 点至晚上 10 点和晚上 10 点至上午 6 点
- 车辆将在轮班开始时离开仓库仓库,并在八小时轮班内访问尽可能多的仓库
- 车辆在执行作业时必须在仓库等待,然后才能移动到下一个仓库或返回到堆场仓库
我的基本理解是,维护工作可以定义为jsprit中的服务,并且可以为每辆车设置启动/返回时间。此外,成本矩阵可用于增加车辆和仓库之间关系的时间和距离。我的问题是:
- 每个维护作业都需要定义为一项服务,因此将有 200 个服务对象传递给 VRP 求解器,对吗?
- VehicleTypeImpl 具有 addCapacityDimension()、setCostPerDistance() 和 setCostPerTime() 方法。这些到底是什么以及它们如何应用上述案例?
- Service.Builder 有 addSizeDimension() 方法。它有什么作用?
- costMatrixBuilder 具有添加 TransportDistance 和 TransportTime 的方法。这些方法使用了哪些单位,我该如何使用它们?
- 对于每个站点,需要定义一个坐标并将其传递给每个 VehicleImpl 的 setStartLocationCoordinate() 方法。这是正确的吗?
- vehicleBuilder 有 setLatestArrival(double maxDuration); 这里使用哪个单位?
我非常感谢解决上述案例的任何帮助。
谢谢,亚当
编辑1:
几个问题
A. setEarliestStart() 和 setLatestArrival() 方法接受双精度值,如何将最早出发和最晚到达的日期指定为这些方法的实际日期?例如,开始时间是 2014 年 11 月 28 日下午 2 点,结束时间是当天晚上 10 点。
B. 有没有办法以分钟为单位指定服务时间?
C. VehicleTypeImpl.Builder.setMaxVelocity(double inMeterPerSeconds) 方法期望最大速度,有没有办法指定车辆的平均速度?
D、所有车辆实行三班倒;这是否意味着我必须定义同一辆车三次,每个班次都有不同的最早出发和最晚到达时间?
E. 由于作业可以在一个月内的任何时间执行,每个作业的时间窗口是否会作为月份的开始和结束传递给 Service.Builder.setTimeWindow() 方法?