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);
    } конец
Другие вопросы по тегам