我会每周运行两次解决方案,并删除第一天要完成的所有停靠点,因为下一个解决方案不再需要它们。如果卡车可以在第二天的任何地方启动,则需要在第二天更新启动位置。否则,如果两天都是从仓库出发,则两天的起点和终点位置相同。
首先,您要定义您的车辆类型和车辆:
// 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
. 还可以查看成本矩阵有助于您的解决方案。(查看:使用成本矩阵)
然后,运行您的解决方案。
干杯!