在流口水中存在状况

时间:2020-03-13 09:51:11

标签: drools optaplanner

上下文是在OptaPlanner中使用Drools规则进行员工轮班安排。假设我有一些班次,并且需要检查是否有任何班次在要分配的预定义班次列表中。后面要分配的班次列表为[S1,S2,S3];我需要满足以下条件(我使用冒号作为“ such that”):

exists s in [S1,S2,S3] : forall shift (shift != s)

如何在Drools中实施这样的规则?

2 个答案:

答案 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