Hard Constraint Optaplanner
Я хотел бы заставить каждую медсестру работать в 9 смен в течение 2 недель. Жесткое ограничение. Я также хотел бы обеспечить трехдневный перерыв после ночной смены. Оба это жесткие ограничения для медсестер. Будет ли следующая работа
salience 1 // Do these rules first (optional, for performance)
when
$contractLine : MinMaxContractLine(contractLineType == ContractLineType.TOTAL_ASSIGNMENTS, enabled == true,
$contract : contract)
$employee : Employee(contract == $contract)
accumulate(
$assignment : ShiftAssignment(employee == $employee);
$total : count($assignment)
)
then
int totalInt = $total.intValue();
if ($contractLine.isMinimumEnabled() && totalInt < $contractLine.getMinimumValue()) {
scoreHolder.addHardConstraintMatch(kcontext,
(totalInt - $contractLine.getMinimumValue()) * $contractLine.getMinimumWeight());
} else if ($contractLine.isMaximumEnabled() && totalInt > $contractLine.getMaximumValue()) {
scoreHolder.addHardConstraintMatch(kcontext,
($contractLine.getMaximumValue() - totalInt) * $contractLine.getMaximumWeight());
} else {
// Workaround for https://issues.jboss.org/browse/PLANNER-761
scoreHolder.addHardConstraintMatch(kcontext, 0);
}
1 ответ
Я нашел обходной путь, но мне это не нравится. Если я установлю свой MaximumValue == 9 и MinimumValue == 9 и выполню расписание в 14-дневных блоках с приведенной ниже конфигурацией DRL, это будет работать. Теперь я хочу обеспечить 3 выходных дня после ночной смены. Я новичок в Java и XML и немного борюсь с обновлением импорта XML для реализации WorkBeforeFreeSequencePattern
когда $contractLine: MinMaxContractLine(contractLineType == ContractLineType.TOTAL_ASSIGNMENTS, enabled == true,
$contract: contract)
$ сотрудник: сотрудник (контракт == $ контракт) накапливается ($ назначение: ShiftAssignment(employee == $employee);
$ всего: count($assignment)) затем int totalInt = $ total.intValue (); if ($contractLine.isMaximumEnabled() && $contractLine.isMinimumEnabled()) {
scoreHolder.addHardConstraintMatch(kcontext,
((totalInt - $contractLine.getMinimumValue()) * $contractLine.getMinimumWeight()) * (($contractLine.getMaximumValue() - totalInt) * $contractLine.getMaximumWeight()));
} else if ($ contractLine.isMaximumEnabled () && totalInt> $ contractLine.getMaximumValue ()) {scoreHolder.addSoftConstraintMatch (kcontext, ($ contractLine.getMaximumValue () - totalInt) * $ contractLine.getMaximumWeight ()); } else {// Временное решение для https://issues.jboss.org/browse/PLANNER-761
scoreHolder.addHardConstraintMatch(kcontext, 0);
} конец