4

对不起,这不是一个具体的问题。由于我是 Jsprit 的新手,我需要一些关于如何开始解决问题的概念性帮助。

我的例子:

我一开始只有一辆车的起点和终点位置。有几个具有优先级的取货位置,只有一个用于交付的仓库位置。车辆应行驶 1 天,然后休息 2 天,然后再休息 2 天,每天给定开始/结束时间。开始/结束位置是每天定义的(1 和 4)。车辆可以在第 1 天返回其终点位置,包括装载,但在第 4 天,最后一个位置应该是卸货(并返回空车)的仓库。

我想根据优先级和车辆 2d 负载约束尽可能多地拾取物品,如果拾取过多,它们将被忽略。车辆每天可多次返回仓库卸货。我还想在第 4 天开始之前更改接送优先级。

  • 有任何想法吗?
  • 分别定义取件和交付而不是使用发货之间是否有好处/区别?
  • 我想定义 2 辆车而不是定义休息时间,但我不想在第一天卸货。我读到这可以使用 2 个驱动程序来完成,查看 API 和我不知道的驱动程序设置。 https://discuss.graphhopper.com/t/3-questions-endlocation-and-multiple-vehicles/414/8 Driver 类有一个 home 属性,但这是一个字符串,只能在车辆上定义中断。
  • 在第 4 天运行求解器之前,我是否应该运行两次求解器并删除第一条路线中已经存在的皮卡?+ 之后合并结果?
  • 如果负载达到 85%,如何实现仅 onload 的约束?
  • 如何实施约束,即第 4 天的最后一个位置应该是返回终点位置之前的仓库(如果所有提货都完成,甚至 <85%)?
4

1 回答 1

1

我会每周运行两次解决方案,并删除第一天要完成的所有停靠点,因为下一个解决方案不再需要它们。如果卡车可以在第二天的任何地方启动,则需要在第二天更新启动位置。否则,如果两天都是从仓库出发,则两天的起点和终点位置相同。

首先,您要定义您的车辆类型和车辆:

// Vehicle Type
VehicleTypeImpl vehicleType = VehicleTypeImpl.Builder.newInstance("Your vehicle type")
    .addCapacityDimension(0, capacity)
    .setMaxVelocity(maxSpeed) // in meters per second
    .setCostPerDistance(value)
    .build();

VehicleImpl vehicle = VehicleImpl.Builder.newInstance(fleet[i])
    .setType(vehicleType)
    .setEarliestStart(start).setLatestArrival(end)
    .setStartLocation(location) // Warehouse location
    .setEndLocation(location) // warehouse location
    .build();

接下来,创建您的工作。服务工作从仓库开始,提货工作可以从商店位置开始,然后送到目标位置。有了这个,我会定义pickupsservice工作,然后将它们添加到VRP

// Service Jobs
Service.Builder.newInstance(instanceName)
    .setName("Unique Name").setLocation(
         new Location.Builder()
         .newInstance().setId("Unique ID")
         .setCoordinate(new Coordinate(x, y))
    )
    .addSizeDimension(0, 1) // accounts for vehicle capacity
    .build();

// Shipment Jobs
Shipment.Builder.newInstance(instanceName)
    .setName("Unique Name")
    .setPickupLocation(
         new Location.Builder()
         .newInstance().setId("Unique ID")
         .setCoordinate(new Coordinate(x, y))
    )
    .setDeliveryLocation(
         new Location.Builder()
         .newInstance().setId("Unique ID")
         .setCoordinate(new Coordinate(x, y))
    )
    .addSizeDimension(0, 1)
    .build();

// You can add priorities to jobs how you like with .setPriority()

您可以遍历您的作业并根据类型创建任一作业并将其添加到VRP. 还可以查看成本矩阵有助于您的解决方案。(查看:使用成本矩阵

然后,运行您的解决方案。

干杯!

于 2020-05-27T17:36:24.480 回答