jsprit入门:概念建议

问题描述 投票:4回答:1

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

我的例子:

我一开始只有一辆带有起始和结束位置的车辆。有几个优先的取货位置,只有一个要交付的仓库位置。车辆应该行驶1天,然后休息2天(比第二天休息2天),并指定每天的开始/结束时间。每天定义开始/结束位置(1和4)。载具可以在第一天返回到其最终位置,但是在第四天,最后一个位置应该是要卸货的仓库(然后返回空车位)。

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

  • 有什么想法吗?
  • 分别定义取件和交货而不是使用装运之间是否有好处/区别?
  • 我本来想定义2辆车,而不是定义休息时间,但是我不想在第一天就卸货。我读到这可以使用2个驱动程序完成,查看API和驱动程序设置(我不知道如何)。https://discuss.graphhopper.com/t/3-questions-endlocation-and-multiple-vehicles/414/8Driver类具有home属性,但这是一个字符串,只能在车辆上定义休息时间。
  • 我应该运行求解器两次,并在第4天运行它之前在我的第一条路线中卸下拾音器吗? +之后合并结果?
  • 如何实现仅在负载达到85%时才加载的约束?
  • 如何实施第4天的最后一个位置应为仓库的约束,然后再返回到最终位置(如果完成所有提货,甚至<85%)?
jsprit
1个回答
0
投票

我每周要运行该解决方案两次,并删除第一天要完成的所有停止,因为下一个解决方案不再需要它们。如果卡车可以在第二天的任何地方出发,那么第二天的出发地点将需要更新。否则,如果这两天都是从仓库开始的,那么这两天的开始和结束位置都相同。

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

// 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。此外,调查成本矩阵可以为您的解决方案提供帮助。 (签出:Using a cost matrix

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

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.