Как мне получить «текущий» скоринговый директор в optaplanner - и какое это имеет значение?

Как и в этом потоке, я хотел бы удалить объекты, прежде чем снова решать проблему Optaplanner (повторяется планирование).

Но я не уверен, как получить директор по оценке, который использовался при создании первого решения, и о важности вызова Before / AfterEntityRemoved и Before / AfterVariableChanged в scoredirector при удалении объектов?

Предположим, я удалил Vehicle И всех клиентов, которые были ему назначены - и я еще не создал ScoreDirector сам - могу ли я тогда просто игнорировать вызывающие методы в scoredirector и по-прежнему иметь возможность решать его снова с правильно рассчитанным счетом?


person Michael Krog    schedule 02.12.2015    source источник


Ответы (1)


1) Вы уверены, что вместо удаления сущностей вы можете просто оставить их неназначенными? Если да, то вместо этого выполните чрезмерно ограниченное планирование (см. Документацию).

2) Если вы удалите сущности до передачи экземпляра решения solve(Solution s), вы можете удалить их без уведомления ScoreDirector.

3) Удаление объектов обычно меняет проблему планирования, так что это планирование в реальном времени (= изменение проблемы во время решения). Поэтому, если вы хотите удалить объекты во время решения, это нужно сделать в addProblemFactChange(). См. Документацию о том, как получить ScoreDirector там и каковы ваши обязательства по уведомлению.

person Geoffrey De Smet    schedule 03.12.2015
comment
1) Да, я хочу их удалить. Я разрабатываю план на несколько недель вперед. Я занимаюсь ночным планированием, и мне нужно удалить задачи, которые были запланированы на вчерашний день, и добавить несколько новых задач, которые нужно запланировать на несколько недель вперед. - person Michael Krog; 06.12.2015
comment
2) Супер! 3) Хорошо. Я не занимаюсь планированием в реальном времени. Я занимаюсь только ночным планированием (+ небольшое краткосрочное планирование, когда пользователь вносит изменения, которые, по-видимому, мало влияют на проблему). Я полагал, что тогда мне следует подумать о планировании в реальном времени, но система будет планировать для тысяч различных организаций и Я хочу тратить циклы процессора только тогда, когда это необходимо. - person Michael Krog; 06.12.2015
comment
В случае еженедельного планирования 2) определенно лучший вариант. ProblemFactChanges - это сложность, с которой следует иметь дело только в том случае, если требуется время на решение менее чем за секунды или секунды. - person Geoffrey De Smet; 07.12.2015
comment
PS: возможно, вы не захотите удалять все исторические задачи. Только действительно старые. Недавние исторические задачи могут понадобиться как неподвижные объекты, если есть правила оценки, например, не 10-кратное выполнение задач одного и того же типа подряд. - person Geoffrey De Smet; 07.12.2015
comment
Спасибо. Однако я не могу использовать недвижимые объекты. Это всегда дает мне следующее исключение, и я еще не понял почему: java.lang.IllegalStateException: повторное воспроизведение должно происходить после записи. Next () recordEntitySelector (Recording (Filtering (FromSolutionEntitySelector (Visit)))) еще не был вызван. - person Michael Krog; 07.12.2015
comment
Это исключение связано с имитацией воспроизведения / записи. Если действительно использование неподвижных объектов вызывает это исключение, вероятно, это ошибка. Создайте jira (см. Optaplanner.org - ›код -› сообщить о проблеме) и прикрепите репродуктор, и я исправлю это. - person Geoffrey De Smet; 08.12.2015