【问题标题】:Drools Hard Constraint ImplementationDrools 硬约束实现
【发布时间】:2020-03-26 22:37:55
【问题描述】:

尝试使用 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 的经验,这有效吗?

【问题讨论】:

    标签: java constraints drools optaplanner


    【解决方案1】:

    第一次 - 我不是规则专家(最近一直在学习这些东西)

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

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

    我认为您不需要 THEN 部分中的 if 子句 这应该是您在 when 部分中检查条件的一部分 所以 Then 部分应该包含 将新知识插入规则工作记忆 修改/删除当前在规则工作记忆中的事实 打印语句——如果你需要它们(真的不推荐——使用 changeListeners)

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

    规则“nightOrOffAfterNightShift” 什么时候 sAn:ShiftAssignment( $idn : 标识 $employee_n :员工, $employee_n != null, $班次:班次, $shift != null, $sTn : 移位类型 ) sAn_1 : ShiftAssignment( $idn_1 : 标识 $idn == $idn_1 + 1, $employee_n_1 :员工, $employee_n_1 != null, $employee_n_1 == $employee_n, $sTn_1 :移位类型, $sT != $sTn_1 ) 然后 ????现在你需要在这里做什么 结束

    你能分享你的 ShiftAssignment 类吗

    我认为以上发现 将 idn 和 idn_1 转移到哪里 同一员工 使用不同的 shiftType

    希望这与您所追求的接近

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多