У меня есть простой начальный маршрут автомобиля с пикапом и доставкой. Я хочу добавить задание доставки LastMinute на маршрут. Действия и транспорт имеют вместимость 1.
JSprit отказывается планировать новое задание. Покопавшись в исходном коде, я считаю, что это связано с тем, что емкость доставки отрицательна, но это не отражается в диспетчере состояний. Хотя и не положительно.
Если я не использую никаких мощностей, задание можно запланировать. Если в начальном маршруте вместо «Забрать и доставить» используется «Служба», задание можно запланировать, но это также препятствует точному обеспечению пропускной способности. Я убрал временные окна, чтобы максимально упростить пример, но результаты те же, что и с временными окнами.
Мысли?
final Location depot = Location.newInstance(50.0, 50.0);
final Location loc1 = Location.newInstance(100.0, 100.0);
final Location loc2 = Location.newInstance(200.0, 200.0);
final Capacity cap = Capacity.Builder.newInstance()
.addDimension(0, 1)
.build();
Vehicle v1 = VehicleImpl.Builder
.newInstance("V1")
.setStartLocation(depot)
.setEndLocation(depot)
.setType(VehicleTypeImpl.Builder
.newInstance("VT1")
.setCapacityDimensions(cap)
.build())
.build();
final VehicleRoutingProblem vrp = new VehicleRoutingProblem.Builder()
.addInitialVehicleRoute(VehicleRoute.Builder.newInstance(v1)
.addPickup(Pickup.Builder
.newInstance("Pickup1")
.setLocation(loc1)
.addAllSizeDimensions(cap)
.build())
.addDelivery(Delivery.Builder
.newInstance("Dropoff1")
.setLocation(loc2)
.addAllSizeDimensions(cap)
.build())
.build())
.addJob(Shipment.Builder.newInstance("LastMinute")
.setPickupLocation(loc1)
.setDeliveryLocation(loc2)
.addAllSizeDimensions(cap)
.build())
.setFleetSize(VehicleRoutingProblem.FleetSize.FINITE)
.build();
final Collection<VehicleRoutingProblemSolution> solutions = Jsprit.Builder
.newInstance(vrp)
.buildAlgorithm()
.searchSolutions();
final VehicleRoutingProblemSolution best = Solutions.bestOf(solutions);
SolutionPrinter.print(vrp, best, SolutionPrinter.Print.VERBOSE);
assertTrue(best.getUnassignedJobs().isEmpty());