Первоначальный маршрут транспортного средства JSprit не позволяет вставить новую отгрузку, когда мощности используются

У меня есть простой начальный маршрут автомобиля с пикапом и доставкой. Я хочу добавить задание доставки 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());

person Sam Barnum    schedule 14.10.2020    source источник


Ответы (1)


Я исправил это, создав Shipment и добавив его к исходному маршруту.

Shipment job = Shipment.Builder.newInstance(...)
VehicleRoute.Builder route = VehicleRoute.Builder.newInstance(...)
route.addPickup(job);
route.addDelivery(job);
person Sam Barnum    schedule 30.10.2020