OptaPlanner:如何连续两天或以上分配班次?护士名册示例

时间:2018-09-10 05:52:39

标签: drools optaplanner

我是OptaPlanner的新手,我正在尝试创建一个规则,该规则可以连续两天或两天以上分配班次,而不仅仅是默认的仅分配一天的班次。例如,

rule "Assign same shift two days in a row"

    when        
        ShiftAssignment($shiftType : shiftType, $employee : employee, $firstDayIndex : shiftDateDayIndex)
        ShiftAssignment(shiftType == $shiftType, employee == $employee, shiftDateDayIndex == ($firstDayIndex + 1))
        not ShiftAssignment(shiftType == $shiftType, employee == $employee, shiftDateDayIndex == ($firstDayIndex + 2))
    then
        scoreHolder.addSoftConstraintMatch(kcontext, 1);
end

虽然这样做有些奏效,但不允许将下一个班次设为两天一班。例如,如果在星期一为护士分配了Shfit“ A”,则此规则还将在星期二为该护士分配Shift“ A”,因此模式为A-A-其他。但是,由于声明为“ not”,因此它防止第三天(星期三)的班次也成为连续两天分配的班次。因此,无法使用A-A-B-B模式或什至A-A-A-A模式的移位。

是否有更好的方法?

此外,此示例仅用于连续两天分配班次。但是,如果我想让它更灵活,并根据假设的表示“班次长度”的班次类型变量连续分配两天或更多天的班次,怎么办?

此外,我注意到我需要对scoreHolder.addSoftConstraintMatch使用“ +1”而不是“ -1”,以使OptaPlanner遵循此规则。为什么会这样呢?如果有人可以帮助,那就太好了!

0 个答案:

没有答案