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

Routing 具有多个站点、作业类型和目的地的路线优化,routing,resource-scheduling,jsprit,Routing,Resource Scheduling,Jsprit,我是路线优化新手,非常感谢您使用jsprit帮助解决以下业务需求。我从Stefan Schröder那里得到了一些反馈,他帮助我学习了一些关于jsprit的基本知识。我将首先解释业务需求,然后问几个问题 目标是制定一份需要在一个月内完成的维护工作清单。需要为整个月准备一份每日时间表。这里的目标是每天执行最大数量的作业 一个区域内有4个仓库 每个地区大约有70个仓库,总共有300个仓库 已知该区域内每个仓库和仓库之间的距离 每个区域有3-4辆不同类型的车辆,总共12辆 区域内的车辆只能服务于该区

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

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

  • 一个区域内有4个仓库
  • 每个地区大约有70个仓库,总共有300个仓库
  • 已知该区域内每个仓库和仓库之间的距离
  • 每个区域有3-4辆不同类型的车辆,总共12辆
  • 区域内的车辆只能服务于该区域内的仓库
  • 区域内的车辆具有相同的起点,而起点恰好是终点
  • 车辆没有任何容量、收货或交付要求
  • 车辆仅用于运输将执行维护工作的工人
  • 已知每辆车的平均速度
  • 大约有80种维护作业类型
  • 每种作业类型占用的时间以分钟为单位
  • 维护作业不必在特定时间开始
  • 每月大约需要执行200项维护工作
  • 这些工作可以在任何仓库进行
  • 同一仓库在同一天或不同的一天可能会发生多个作业
  • 一天内有三班八小时的班次。上午六时至下午二时、下午二时至十时及晚上十时至六时
  • 车辆将在轮班开始时离开车辆段仓库,并在8小时轮班内访问尽可能多的仓库
  • 在作业进行期间,车辆必须在仓库等待,然后才能移动到下一个仓库或返回仓库
我的基本理解是,可以将维护作业定义为jsprit中的服务,并且可以为每辆车设置启动/返回时间。此外,还可以使用成本矩阵为车辆和仓库之间的关系添加时间和距离。我的问题是:

  • 每个维护作业都需要定义为服务,因此将有200个服务对象传递给VRP解算器,对吗
  • VehicleTypeImpl具有addCapacityDimension()、setCostPerDistance()和setCostPerTime()方法。这些具体是什么?它们如何应用于上述情况
  • Builder具有addSizeDimension()方法。它有什么作用
  • costMatrixBuilder具有添加传输距离和传输时间的方法。这些方法使用哪些单位,我如何使用它们
  • 对于每个车辆段,需要为每个车辆MPL定义一个坐标并将其传递给setStartLocationCoordinate()方法。是这样吗
  • 车辆制造商已设置LateStarrival(双倍最大持续时间);这里用哪一个单位
  • 我非常感谢您对解决上述案件的帮助

    谢谢, 亚当

    编辑1:

    几个问题

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

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

    C.VehicleTypImpl.Builder.setMaxVelocity(双英寸每秒)方法需要最大速度,有没有办法指定车辆的平均速度

    D.所有车辆必须三班制工作;这是否意味着我必须对同一辆车定义三次,每班一次,以及不同的最早出发时间和最晚到达时间

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

    ad1)正确

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

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

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

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


    ad6)同样,由您决定单位。

    非常感谢Stefan。我非常感谢你的帮助。请你详细说明如何定义这些单位好吗?jsprit如何知道距离以公里为单位,时间以分钟为单位,平均速度以公里/小时为单位?我已经看过了源代码,有几个问题(与原始问题一起发布在上面),我假设您使用它来定义运输时间和距离。然后你必须知道你在矩阵中输入了多少distance unit。如果使用km,则“每距离成本”参数也应使用km,例如10€/km。setCostPerDista