对不起,这不是一个具体问题。由于我是Jsprit的新手,因此我需要一些有关如何开始解决问题的概念性帮助。
我的例子:
我一开始只有一辆带有起始和结束位置的车辆。有几个优先的取货位置,只有一个要交付的仓库位置。车辆应该行驶1天,然后休息2天(比第二天休息2天),并指定每天的开始/结束时间。每天定义开始/结束位置(1和4)。载具可以在第一天返回到其最终位置,但是在第四天,最后一个位置应该是要卸货的仓库(然后返回空车位)。
我想根据优先级和车辆2d负载限制尽可能多地拾取物品,如果拾取太多,它们将被忽略。车辆每天可以返回仓库几次卸货。我还考虑过在第4天开始之前更改取车优先级。
我每周要运行该解决方案两次,并删除第一天要完成的所有停止,因为下一个解决方案不再需要它们。如果卡车可以在第二天的任何地方出发,那么第二天的出发地点将需要更新。否则,如果这两天都是从仓库开始的,那么这两天的开始和结束位置都相同。
首先要定义您的车辆类型和车辆:
// 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();
接下来,创建您的工作。服务作业从仓库开始,取件作业可以从商店位置开始,然后放到目标位置。这样,我将定义pickups
和service
作业,然后将它们添加到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)
[然后,运行您的解决方案。
干杯!