我正在为我的办公室写一份员工安排员。每天至少有两个班次(每周7天),我希望优化人员确保没有一个工作人员比周末班次工作更多。
我有一个简单的工作程序,为每个 Shift 分配一个员工。 程序结构如下:
此工作解决方案可以平等地安排所有员工,但不考虑周末和工作日。为了描述周末的工作日,我更换了列表&lt; Shift &gt;在 SchedulingSolution 中使用列表&lt; 日&gt;。每天都包含自己的列表&lt; Shift &gt;表示当天发生的变化。现在,当我想计算一名工作人员工作的周末数时,我可以找到代表周末的所有日对象,并且只计算当天所包含的班次。< / p>
不幸的是,这会将列表&lt; Shift &gt;这是不是 @PlanningSolution 的类中的 @PlanningEntityCollectionProperty 。现在忽略 @PlanningEntityCollectionProperty 注释,程序失败。
我是否错过了重新构建程序的明显方法,或者我唯一的选择是保留原始程序结构并修改 shift 对象以记录它们发生在哪一天?
提前致谢。如果可以的话,我会尝试向前传递帮助。
答案 0 :(得分:2)
我会重组您的规划解决方案。
你为什么不这样做:
List<Shift>
保留在Planning Solution
List<Day>
day
中添加字段Shift
,甚至可能指示当天是否是使用枚举的周末。然后,您可以轻松计算每位员工使用Drools工作的周末天数:
(绝对未经测试!!!)
rule "balancedStaffWeekend"
when
$staff: Staff()
accumulate(
Shift(
staff == $staff
day == Day.WEEKEND);
$count: count()
);
)
then
scoreHolder.addSoftConstraintMatch(kcontext, -Math.pow(count, 2));
end
通过提高到两次幂的计数来惩罚解决方案,平衡周末的数量。