我是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遵循此规则。为什么会这样呢?如果有人可以帮助,那就太好了!