В моей компании мы в настоящее время используем 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, например, когда клиент является последним в цепочке)
и наконец ... я делаю что-то принципиально неправильно?
Будем очень признательны за любые комментарии (извините, моя грамматика, я являюсь носителем испанского языка)