我正在为我的办公室编写员工调度程序。每天至少有两类(每周 7 天),我希望优化器确保没有一名员工的周末轮类时间比另一名员工多得多。
我有一个简单的工作程序,为每个轮类分配一名员工。 程序结构如下:
- SchedulingSolution 是 @PlanningSolution
- SchedulingSolution 包含一个列表<Shift>,即 @PlanningEntityCollectionProperty
- Shift 是 @PlanningEntity
- Shift 包含一个 Staff,即 @PlanningVariable
- SchedulingSolution 包含一个@ValueRangeProvider,它以列表<Staff> 的形式返回我们的员工名册。
此工作解决方案对所有员工进行平等安排,但不考虑周末和工作日。为了区分工作日和周末,我用列表<Day>替换了SchedulingSolution中的列表<Shift>。每个日都包含自己的列表<类次>,表示当天发生的类次。现在,当我想要计算员工工作的周末数时,我可以找到代表周末的所有 Day 对象,并仅计算这些天中包含的 Shifts。
不幸的是,这将 @PlanningEntityCollectionProperty 列表 <Shift> 放置在一个不是 @PlanningSolution 的类中。 @PlanningEntityCollectionProperty 注释现在被忽略,程序失败。
我是否错过了重组程序的明显方法,或者是保留原始程序结构并修改我的 shift 对象以记录它们发生在哪一天的唯一选择?
提前致谢。如果可以的话,我会尽力传递帮助。
最佳答案
我会重组您的规划解决方案。
你为什么不这样做:
- 保留
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
通过计数的二次方来惩罚解决方案,平衡周末的数量。
关于java - PlanningEntities 分布在多个集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50693647/