护理应用中Drools规则的解释

护理应用中Drools规则的解释,drools,rules,optaplanner,Drools,Rules,Optaplanner,我在理解Drools规则时遇到了一些问题,这些规则是在OptaPlanner演示示例之一(Nurservestering应用程序)中实现的。有人能解释一下下面的规则是如何工作的吗 // a nurse can only work one shift per day, i.e. no two shift can be assigned to the same nurse on a day. rule "oneShiftPerDay" when $leftAssignment : Shift

我在理解Drools规则时遇到了一些问题,这些规则是在OptaPlanner演示示例之一(Nurservestering应用程序)中实现的。有人能解释一下下面的规则是如何工作的吗

// a nurse can only work one shift per day, i.e. no two shift can be assigned to the same nurse on a day.
rule "oneShiftPerDay"
when
    $leftAssignment : ShiftAssignment($leftId : id, $employee : employee, $shiftDate : shiftDate)
    $rightAssignment : ShiftAssignment(employee == $employee, shiftDate == $shiftDate, id > $leftId)
then
    insertLogical(new IntConstraintOccurrence("oneShiftPerDay", ConstraintType.NEGATIVE_HARD,
            1,
            $leftAssignment, $rightAssignment));
end
是否有详细说明规则解释及其实施方式的资源?当我在网上和一些书中查看一些示例时,我发现它很容易理解,但是当我查看Drools中提供的示例时,我无法理解

when
    // When a specific shift with id $leftId is assigned to employee $employee and that shift is on date $shiftDate
    $leftAssignment : ShiftAssignment($leftId : id, $employee : employee, $shiftDate : shiftDate)
    // AND there is another shift assigned to the same for the same date and with a higher id
    $rightAssignment : ShiftAssignment(employee == $employee, shiftDate == $shiftDate, id > $leftId)
then
    // Then this solution is penalized: it gets -1 hard score point
    scoreHolder.addHardConstraintMatch(kcontext, -1);
注意:在then端,我使用了6语法(而不是不推荐使用的Planner 5.x语法),因为它很简单


关于
id<$leftId
部分:这是为了确保Drools只匹配shiftasignment A和shiftasignment B(给出A-B),而不是A-A、B-B、B-A,以避免惩罚过多

为了学习DRL的语法,我建议在这里阅读Drools文档:

就我的理解而言,与OptaPlanner/Drools Planner文档相比,它对规则设置的帮助更大