尝试使用Optaplanner为员工(护士)名册创建Java Web应用程序。我想这样一个硬约束:

//护士只能在夜夜后上夜班,即两个连续的轮班可以是N-X或N-N
rule "nightOrOffAfterNightShift" when ShiftAssignment( $employee : employee, employee != null, $shiftDate : shiftDate, $lastShift : shift, $shiftType : shiftType ) ShiftAssignment( employee == $employee, shiftDate.isAfter($shiftDate) == true ) then if(shiftType != $shiftType && shift != null) scoreHolder.addHardConstraintMatch(kcontext, -1);end
我没有Drools的经验,这有效吗?

最佳答案

第一关-我不是规则专家(最近一直在学习一些此类知识)

不要以为您需要$ lastShift:shift,
您将使用“规则”将2个ShiftAssignment链接在一起

我认为您应该使用顺序ID来检查连续的班次
目前,我认为您的规则将在$ shiftDate之后触发所有班次
我不认为你打算

我认为您在THEN部分中不需要if子句
这应该是您在when部分中进行条件检查的一部分
因此,然后部分应包含
将新知识插入规则工作记忆
修改/删除“规则”工作存储器中当前存在的事实
打印语句-如果需要它们(实际上不建议使用-使用changeListeners)

if(shiftType!= $ shiftType && shift!= null)
您认为shiftType来自2个ShiftAssignment对象中的哪一个尚不清楚

规则“ nightOrOffAfterNightShift”
什么时候
sAn:ShiftAssignment(
$ idn:Id
$ employee_n:员工,
$ employee_n!= null,
$ shift:移动
$ shift!=空,
$ sTn:ShiftType

sAn_1:ShiftAssignment(
$ idn_1:ID
$ idn == $ idn_1 + 1,
$ employee_n_1:员工,
$ employee_n_1!=空,
$ employee_n_1 == $ employee_n,
$ sTn_1:ShiftType,
$ sT!= $ sTn_1

然后
现在您需要在这里做什么
结束

你能分享你的ShiftAssignment类吗

我认为以上发现
将idn和idn_1转移到
同一员工
具有不同的shiftType

希望这与您追求的目标接近

10-07 17:06