Optaplanner: проверьте, имеет ли связанная переменная планирования привязку

Я модифицирую пример Optaplanner с маршрутизацией транспортных средств. Транспортные средства заменяются людьми, которым приходится передвигаться по городу, но они могут делать это с использованием различных видов транспорта. Итак, у меня есть атрибут привязки (Автомобиль в примере, Сотрудник в моем модифицированном коде) под названием modeOfTransportation.

При вычислении времени прибытия с использованием прослушивателя пользовательской теневой переменной из примера, я, конечно, хочу принять во внимание способ транспортировки. Но когда Optaplanner начинает инициализировать мои объекты планирования (потребителей), кажется, что они сначала не связаны с привязкой. Так что я не могу найти свой вид транспорта, и все ломается.

Есть идеи, как действовать?

Вот чего я хочу добиться. shadowVisit - это моя планирующая организация, shadowVisit.getEmployee() должна дать мне привязку. Выполнение shadowVisit.getEmployee()==null проверки, похоже, подвешивает весь процесс решения.

arrivalTime = 
previousStopDepartureTime.plus(
shadowVisit.getLocation().getDistanceFrom(
shadowVisit.getPreviousStop().getLocation(), shadowVisit.getEmployee().getModeOfTransportation())

person Magnus Våge    schedule 18.03.2021    source источник


Ответы (2)


Итак, я понял, в чем проблема. Моя проблема слишком ограничена, и я реализовал фиктивного сотрудника в качестве решения (см. optaplanner: изменение маршрута транспорта, чтобы клиенты не обслуживались)

Я не установил modeOfTransportation для своего манекена, что привело к нулевым указателям. Иногда просто записать проблему заставляет задуматься, чтобы ее решить!

Большое спасибо за ваш вклад Джеффри

person Magnus Våge    schedule 19.03.2021

Это странно, потому что принципы цепочки гарантируют, что у каждой цепочки есть якорь (см. Ниже).

Возможно, ваш атрибут @CustomShadowVariable sources не включает переменную тени привязки, и ваш прослушиватель настраиваемой переменной вызывается до вызова прослушивателя переменной тени привязки. OptaPlanner гарантирует, что вызовет один тип прослушивателя переменных для всех классов домена перед вызовом следующего типа. Порядок этих типов слушателей переменных определяется этим атрибутом sources (см. Второе изображение).

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

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

person Geoffrey De Smet    schedule 19.03.2021
comment
согласился, что это странно. Конечно, в начале процесса решения все объекты планирования осиротели, но я как бы предполагаю, что цепочки построены от якорей вверх, что объекты планирования не объединяются в цепочку до того, как будут закреплены. Вот мои переменные в том, что является классом Customer в примере TWVRP @PlanningVariable (valueRangeProviderRefs = {employeeRange, visitRange}, graphType = PlanningVariableGraphType.CHAINED) private Stop previousStop; Сотрудник - якорь. - person Magnus Våge; 19.03.2021
comment
@CustomShadowVariable (variableListenerClass = ArrivalTimeListener.class, sources = {@PlanningVariableReference (variableName = previousStop)}) private LocalDateTime arrivalTime; - person Magnus Våge; 19.03.2021
comment
@AnchorShadowVariable (sourceVariableName = previousStop) частный сотрудник Employee; - person Magnus Våge; 19.03.2021
comment
Хорошо, немного отладив, я вижу, что когда вызывается мой слушатель переменных, иногда previousStop устанавливается на Employee, а employee имеет значение null, а иногда и наоборот. - person Magnus Våge; 19.03.2021