Optaplanner新手:周末护士softconstraint

时间:2015-01-04 08:01:37

标签: drools optaplanner

我正在研究Optaplanner,并正在与护理名册进行一些实验。

对于这个实验,我的目标很简单:让护士“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

1 个答案:

答案 0 :(得分:4)

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

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

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

或,(对我而言)最好

ShiftAssignment( weekend )
ShiftAssignment( ! weekend )

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

中的$wk
not $wk : ShiftAssignment( ! isWeekend )

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

CE

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)会使第一护士更难以在工作日工作:周末需要十个班次才能在一周内平衡一个。