Теневая переменная Optaplanner

#java #optaplanner

#java #optaplanner

Вопрос:

Я использую «шаблон chained through time» для нашего проекта оптимизации, где следую примеру назначения задачи, но для теневой переменной вместо использования целочисленного времени начала, используя timeGrain (из примера собрания).

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

Здесь я использую timeGrain в качестве теневой переменной (поскольку доступность ресурсов определяется для каждого timeGrain)

 @CustomShadowVariable(variableListenerClass = AssignmentVariableListener.class,
                           sources = { @PlanningVariableReference(variableName = "previousAssignment"), 
                                       @PlanningVariableReference(variableName = "scheduleAssignment")
                                      }
                          )
public TimeGrain getTimeGrain() {
    return timeGrain;
}
 

Я устанавливаю теневую переменную в прослушивателе переменных, но должен ли я всегда сначала инициализировать теневую переменную перед началом решения?

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

Спасибо, Картик

Комментарии:

1. Если «теневая переменная A = подлинная переменная B 10», то, если вы предоставите экземпляр решения optaplanner, для которого B равно 4, а A не 14 (например, null), вы предоставляете ему поврежденный экземпляр, и он будет вести себя плохо. Включите environmentMode FULL_ASSERT, и он потратит циклы процессора на проверку этого.

2. OptaPlanner гарантирует, что при изменении подлинной переменной B он вызовет прослушиватель, чтобы разрешить ему обновить A. Таким образом, это не приведет к повреждению модели.

3. Спасибо, Джеффри, за ваш быстрый ответ, ваше второе обновление отвечает на мой вопрос, и я изменю режим env на FULL_ASSET.

4. Спасибо, Джеффри, за ваш быстрый ответ, ваше второе обновление отвечает на мой вопрос, и я изменю режим env на FULL_ASSET. Один побочный вопрос по этому поводу, у слушателя, есть ли у меня способ получить поведение типа накопления?. Я пытаюсь выяснить, сколько ресурсов назначено на данный момент, исходя из того, что мне нужно предоставить в следующий раз зерно. Спасибо, Картик

5. В настоящее время у меня есть расчет общего назначения в правиле (см. Ниже), когда $timeGrain : timeGrain($available : доступно); накапливается ( $assigned : ServiceAssignment(timeGrain != null, timeGrain == $ timeGrain); $totalAssigned : count($assigned); $totalAssigned > $available )тогда int tc = $totalAssigned.intValue(); ScoreHolder.addHardConstraintMatch(kcontext, ($available — tc) * 5 ); конец