Optaplanner: расширение примера vrp для решения проблем с несколькими поездками

В моей компании мы в настоящее время используем optaplanner для решения проблемы маршрутизации транспортных средств с отличными результатами, мы создали веб-приложение для управления транспортными средствами, клиентами, местоположениями, депо и для отображения графического представления решения (включая отображение местоположений на карте) . Мы обернули решатель в java-приложение Spring с интерфейсом rest для получения запроса и решения проблемы. Мы используем карты Google для получения данных о расстоянии и времени. Теперь нам нужно реализовать многопоточность ....

Чтобы справиться с многопользовательской частью, я следую этому подходу:

1.- Я добавил члены readyTime, endOfTrip и dueTime в класс Vehicle

2.- Я создал правило, предотвращающее прибытие к клиентам после транспортного средства-> должного времени

3.- Я изменил ArrivalTimeUpdateListener, чтобы учесть транспортное средство-> readyTime при вычислении времени отправления из транспортного средства (используя Math.max (depot-> readyTime, vehicle-> readyTime)

4.- На этом этапе я начал использовать класс транспортного средства, как если бы это была поездка на транспортном средстве, а не на транспортном средстве (я все еще не меняю название, но это идея)

5.- Я создал участника nextVehicle в транспортном средстве, чтобы представить следующую поездку.

6.- В целях тестирования я вручную связываю два транспортных средства (или поездки транспортных средств) перед отправкой в ​​решатель-> решить

7.- В классе ArrivalTimeUpdatingVariableListener я расширил метод, который обновляет время прибытия, чтобы рассмотреть возможность обновления nextVehicle-> readyTime и, как следствие, времени прибытия клиентов, которые принадлежат к следующей поездке (и так далее, когда есть более двух поездок )

Я уверен, что это не самое элегантное решение, но я пробовал другие подходы (например, используя настраиваемую теневую переменную на Vehicle), но это не могло заставить его работать. Проблема, с которой я столкнулся прямо сейчас, заключается в том, что я не могу понять состояние модели при вызове ArrivalTimeUpdatingVariableListener, возможно, кто-то столкнулся с аналогичной проблемой и может мне помочь. Я обнаружил (после попытки и ошибки):

  • the customer.getVehice() method not always returns a value (distinct from null value), it seems to get updated some time after the previousStandstill change triggers the listener "updateArrivalTime" method.
    • In construction fase when a customer get assign to a vehicle the customer.getVehice() method returns null (it came from "not assigned")
    • В случае конструкции, когда клиент "освобожден", метод customer.getVehice () возвращает "предыдущее транспортное средство".
    • В случае локального поиска, когда покупатель назначается транспортному средству, метод customer.getVehice () возвращает «предыдущий автомобиль» (исходный автомобиль).
    • В случае локального поиска, когда покупатель возвращается к исходному автомобилю, метод customer.getVehice () возвращает «предыдущее назначенное транспортное средство».

Есть мысли по этому поводу? Я делаю правильные предположения? (потому что изначально я считал customer.getVehicle () "реальным" транспортным средством, и решения были совершенно неправильными ...)

  • Порядок срабатывания предыдущей остановки еще не изменен (для меня) трудно понять. Я имею в виду при перемещении клиентов или обмене их между транспортными средствами ... какие-либо мысли или намеки на то, чтобы найти информацию?

  • Могу ли я получить доступ к некоторым переменным из «предыдущего состояния модели», когда решатель делает движение? Потому что я думаю, что мне это понадобится, если я продолжу использовать этот подход (для обновления транспортного средства-> endOfTrip, которое является следующим транспортным средством-> readyTime, например, когда клиент является последним в цепочке)

и наконец ... я делаю что-то принципиально неправильно?

Будем очень признательны за любые комментарии (извините, моя грамматика, я являюсь носителем испанского языка)


person GustavoArzola    schedule 03.02.2016    source источник
comment
Какую версию OptaPlanner вы используете? Обратите внимание, что в версии 6.3 поведение триггера теневой переменной стало разумным (см. Примечания к выпуску 6.3).   -  person Geoffrey De Smet    schedule 10.02.2016


Ответы (1)


Хаотический запуск теневых переменных, который вы описываете, больше не должен происходить в optaplanner 6.3.0.Final или более поздних версиях, потому что теперь он дает гарантию, показанную ниже.

введите здесь описание изображения

Но более старые версии (optaplanner 6.2 и более ранние) страдают от этого хаотичного поведения триггера (как исправлено PLANNER-252 - да, я знаю этот номер проблемы наизусть - и да, я не единственный) довести разработчика (который работает над сложной моделью с несколькими теневыми переменными) до безумия и предоставить билет в один конец в убежище.

К счастью, это было исправлено несколько месяцев назад, так что обновитесь до 6.3.0.Final или более поздней версии и сохраните рассудок.

person Geoffrey De Smet    schedule 10.02.2016