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