【问题标题】:Optaplanner newbie: nurse softconstraint for weekendsOptaplanner 新手:周末护理软约束
【发布时间】:2015-01-05 17:38:16
【问题描述】:

我正在研究 Optaplanner,并且正在使用 Nursing Roster 做一些实验。

对于这个实验,我的目标很简单:让护士“1”更受欢迎,也更有可能在周末工作。

我编写了以下规则来帮助实现这一点:

 rule "nurseNamed1WorksWeekends"
    when
        $oneNurse: Employee( name = "1")
        $wk : ShiftAssignment( isWeekend = true)
    then
        scoreHolder.addSoftConstraintMatch(kcontext, 1);
end

rule "nurseNamed1MustNotWorkWeekdays"
    when
        $oneNurse: Employee( name = "1")
        not $wk : ShiftAssignment( isWeekend = false)
    then
        scoreHolder.addSoftConstraintMatch(kcontext, 1);

end

但是,在运行示例一段时间后,护士“1”仍然没有周末工作。

我做错了什么?

谢谢

根据 laune 的建议修改规则,但 optaplanner 仍然不愿意让护士周末轮班:

rule "nurseNamed1WorksWeekends"
when
  $oneNurse: Employee( name == "1", )
  $wk : ShiftAssignment( isWeekend == true, employee == $oneNurse)
then
  scoreHolder.addSoftConstraintMatch(kcontext, 1);
end
rule "nurseNamed1MustNotWorkWeekdays"
when
  $oneNurse: Employee( name == "1")
  not ShiftAssignment( isWeekend = false, employee == $oneNurse)
then
  scoreHolder.addSoftConstraintMatch(kcontext, 1);
end

【问题讨论】:

    标签: drools optaplanner


    【解决方案1】:

    不要在约束中使用 = - 测试相等性使用 == 表示。

    如果布尔值的 getter 称为 isWeekend,则约束应写为

    ShiftAssignment( weekend == true )
    ShiftAssignment( weekend == false )
    

    或者,(对我来说)最好

    ShiftAssignment( weekend )
    ShiftAssignment( ! weekend )
    

    条件元素中的绑定变量,例如$wk in

    not $wk : ShiftAssignment( ! isWeekend )
    

    没有意义。如果没有这样的 ShiftAssignment,规则会触发 - 那么$wk 会绑定到什么?

    行政长官

    not ShiftAssignment( ! weekend )
    

    很奇怪:规则触发当且仅当任何工作日都没有 ShiftAssignment - 不太可能。

    在“WorksWeekends”规则中添加大于 1 的值应该有利于护士 1 在周末。

    稍后

    rule dislikeNurseOneOnWeekdays
    when
      $oneNurse: Employee( name == "1")
      ShiftAssignment( isWeekend = false, employee == $oneNurse)
    then
      scoreHolder.addSoftConstraintMatch(kcontext, -1);
    end
    

    使用较小的值(例如 -10)会使第一护士在工作日的工作更加困难:周末需要十班来平衡一周中的一个班次。

    【讨论】:

    • 感谢 Laune,我现在可以在我的 drl 中看到错误 - 并将其更正为以下 rule "nurseNamed1WorksWeekends" when $oneNurse: Employee( name == "1", ) $wk : ShiftAssignment( isWeekend == true, employee == $oneNurse) then scoreHolder.addSoftConstraintMatch(kcontext, 1); end rule "nurseNamed1MustNotWorkWeekdays" when $oneNurse: Employee( name == "1") not ShiftAssignment( isWeekend = false, employee == $oneNurse) then scoreHolder.addSoftConstraintMatch(kcontext, 1); end。然而 optaplanner 仍然不愿意让这名护士在周末轮班。有什么想法吗?
    • 请不要将代码放入 cmets - 它不可读。只需添加到您的 Q 中,就像我对您所做的那样。请用评论提醒我。
    • 我仍然认为减少分数的积极规则会更好。将此添加到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    相关资源
    最近更新 更多