上下文是在OptaPlanner中使用Drools规则进行员工轮班安排。假设我有一些班次,并且需要检查是否有任何班次在要分配的预定义班次列表中。后面要分配的班次列表为[S1,S2,S3]
;我需要满足以下条件(我使用冒号作为“ such that”):
exists s in [S1,S2,S3] : forall shift (shift != s)
如何在Drools中实施这样的规则?
答案 0 :(得分:0)
如果没有Shift
的成员[S1, S2, S3]
,则以下模式将匹配。
not Shift( this memberOf [S1, S2, S3] )
不确定列表文字[S1, S2, S3]
是否与Drools兼容,但我认为它将是动态的,并将被插入到工作内存中。
答案 1 :(得分:0)
我认为您需要将要分配给[S1, S2, S3]
的班次列表表示为另一种事实(ShiftToAssign
):
Shift { // planning entity
String id;
LocalDateTime: time;
Emploee employee;
}
ShiftToAssign { // planning fact
String id;
}
然后,您无需将元素添加/删除到要指定的班次预定义列表中,只需将它们添加到@ProblemFactCollectionProperty
中即可。它们将被自动插入Drools的工作记忆中,因此您可以像这样匹配您的条件:
$s : ShiftToAssign // equivalent to: for each Si in [S1, S2, S3]
not Shift(id == $s.id) // equivalent to: there is no Shift whose id is member of the list