Оптапланер с ограничениями по времени windows - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь решить VRP с OptaPlanner. У меня есть несколько клиентов, которые имеют разное время windows. Вот мои поставщики ограничений

protected Constraint arrivalAfterDueTime(ConstraintFactory factory) {
        return factory.from(TimeWindowedCustomer.class)
                .filter(customer -> customer.getArrivalTime() >= customer.getDueTime())
                .penalizeLong("arrivalAfterDueTime",
                        HardSoftLongScore.ONE_HARD,
                        customer -> customer.getArrivalTime() - customer.getDueTime());
    }

protected Constraint arrivalBeforeReadyTime(ConstraintFactory factory) {
        return factory.from(TimeWindowedCustomer.class)
                .filter(customer -> customer.getArrivalTime() > customer.getReadyTime()
                && customer.getArrivalTime() < customer.getDueTime() )
                .penalizeLong("arrivalBeforeReadyTime",
                        HardSoftLongScore.ONE_HARD,
                        customer -> customer.getReadyTime() - customer.getArrivalTime());
    }

Но в решении я получаю время прибытия <время готовности. Как я могу это исправить? Заранее спасибо. </p>

1 Ответ

1 голос
/ 04 мая 2020

Обычно есть три подхода, когда вы приходите слишком рано:

  • A) Дождитесь открытия времени windows, потеряв его, но без дополнительного штрафа. Поэтому, когда он прибывает в 9:30, время обслуживания 0:10 и время готовности 10:00, автомобиль отправляется в 10:10 (не в 9:40!). Этого автоматически избежать, если у вас есть общее ограничение по сокращению общего времени активности транспортных средств (или комбинации максимального времени активности на транспортное средство со слишком большим количеством задач в день).
  • B) То же, что и A), с дополнительным мягким штрафом. Это может быть полезно, если у вас нет глобального ограничения для сокращения общего времени активности транспортных средств.
  • C) То же, что и А) с дополнительным жестким штрафом. Это опасно, потому что, учитывая 2 задачи, одну с временным окном с 9:00 до 10:00 и одну с 11:00 до 12:00, с 10-минутным перерывом между ними, и никаких других задач вы не разрешаете одно транспортное средство, чтобы выполнить обе эти задачи.

В любом случае, используйте ConstraintVerifier для модульного тестирования ваших ограничений!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...