我是路由优化的新手,感谢您使用 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() 方法。这是对的吗?
- 车辆建造者设置了最新到达(双倍最大持续时间);这里使用哪个单位?
我非常感谢在解决上述案件方面的任何帮助。
谢谢亚当
编辑1:
几个问题
一个。setEarliestStart() 和 setLatestArrival() 方法接受双精度值,如何将最早出发和最晚到达指定为这些方法的实际日期?例如,开始时间为 2014 年 11 月 28 日下午 2 点,结束时间为同一天晚上 10 点。
二.有没有办法以分钟为单位指定服务时间?
C. VehicleTypeImpl.Builder.setMaxVelocity(双倍inMeterPerSeconds)方法期望最大速度,有没有办法指定车辆的平均速度?
D.所有车辆都必须在三班倒中工作;这是否意味着我必须定义同一辆车三次,每个班次一个,具有不同的最早出发时间和最晚到达时间?
E.由于作业可以在当月的任何时间执行,因此每个作业的时间窗口是否会作为月初和月底传递给 Service.Builder.setTimeWindow() 方法?
ad1) 更正
公元2)如果容量不起作用,则不需要addCapacityDimension(..)。如果是这样,则可以使用此方法定义任意数量的容量维度,例如重量、体积、托盘数量(当时是三个维度)。使用.setCostPerDistance(..),您可以设置每个距离单位的成本(例如1€/km)。因此,使用 .setCostPerTime(..) 您可以设置每个时间单位的成本,例如 20 欧元/小时。因此,如果您的车辆/驾驶员在 1 小时内行驶 100 公里,则花费 100 公里 * 1 欧元/公里 + 20 欧元/小时 * 1 小时。
公元3)服务可能会消耗车辆的容量。服务可能是指在客户/服务站点取货。它可能有一定的体积,重量,并且可以装载到一定的编号上。的托盘。这就是你用 .addCapacityDimension(..) 定义的内容
公元4)定义单位。它应该是相同的单位,您在设置成本参数时假设。
公元5)正确。但是您不一定需要坐标。您需要位置 ID 或坐标,但您可以同时设置两者。位置 ID 应与您在将时间和距离关系添加到成本矩阵时使用的 ID 相同。
公元6)同样,您确定单位。