[rules-users] Planner - NurseRostering: MaxWorkingWeekendsInFourWeeks

John Poole jdpoole at gmail.com
Mon Jan 21 17:16:50 EST 2013


The parameters for MaxWorkingWeekendsInFourWeeks is in some of the
input files for the NurseRostering example, but it doesn't seem to be
the rules(drl) file.
Is it implemented elsewhere? I've tried doing is like this, but it
doesn't work as a HARD constraint. I'm running it as SOFT now, but  it
would nice to compare it to a better version.

//Rules for workingweekends
rule "insertWorkingWeekends"
    when
        MinMaxContractLine(contractLineType ==
ContractLineType.TOTAL_WORKING_WEEKENDS_IN_FOUR_WEEKS, enabled ==
true,
            $contract : contract)
        $employee : Employee(contract == $contract)
		ShiftAssignment(employee == $employee, $shiftDateDayIndex :
shiftDate.dayIndex, weekend == true)
    then
        insertLogical(new WorkingWeekend($employee, $shiftDateDayIndex/7));
end

// Maximum working weekends in four weeks
rule "insertWorkingWeekendsInFourWeeks"
       // salience 1 // Do these rules first (optional, for performance)
    when
        MinMaxContractLine(contractLineType ==
ContractLineType.TOTAL_WORKING_WEEKENDS_IN_FOUR_WEEKS, enabled ==
true,
            $contract : contract)
        $employee : Employee(contract == $contract)
		WorkingWeekend(employee == $employee, $week: week)
        $workingWeekendTotal : Number() from accumulate(
            $workingWeekend : WorkingWeekend(employee == $employee,
week >= $week, week-$week < 3 ),
            count($workingWeekend)
        )
    then
        insertLogical(new WorkingWeekendTotalFourWeeks($employee,
$workingWeekendTotal.intValue(), $week));
end


// Maximum working weekends in four weeks
rule "maxWorkingWeekendsInFourWeeks"
    when
        $contractLine : MinMaxContractLine(
            contractLineType ==
ContractLineType.TOTAL_WORKING_WEEKENDS_IN_FOUR_WEEKS, maximumEnabled
== true,
            $contract : contract, $maximumValue : maximumValue
        )
        $employee : Employee(contract == $contract)
        WorkingWeekendTotalFourWeeks(employeeContract == $contract,
total > $maximumValue,
             employee==$employee, $total : total, $week : week)
    then
        insertLogical(new
IntConstraintOccurrence("maxWorkingWeekendsInFourWeeks",
ConstraintType.NEGATIVE_SOFT,
                ($total - $maximumValue) * $contractLine.getMaximumWeight(),
                $employee, $week));
end


More information about the rules-users mailing list