PlanningEntities 拆分为多个集合
PlanningEntities split across multiple collections
我正在为我的办公室编写人员调度程序。每天(每周 7 天)至少有两班轮班,我希望优化器确保没有一名员工比另一名员工在周末轮班时工作得更多。
我有一个简单的工作程序,可以为每个 Shift 分配一个 Staff。
程序结构如下:
- SchedulingSolution 是 @PlanningSolution
- SchedulingSolution 包含一个列表<Shift>,它是 @PlanningEntityCollectionProperty
- Shift 是@PlanningEntity
- Shift 包含 Staff 即 @PlanningVariable
- SchedulingSolution 包含一个 @ValueRangeProvider,其中 returns 我们的员工名册作为 List<Staff>.
这个工作解决方案平等地安排所有员工,但不考虑周末和工作日。为了从周末划定工作日,我将 SchedulingSolution 中的 List<Shift> 替换为 List<Day>。每个 Day 都包含其自己的列表<Shift>,表示当天发生的班次。现在,当我想计算一名员工工作的周末数时,我可以找到所有代表周末的 Day 对象,并且只计算 Shifts包含在那些日子里。
不幸的是,这将 @PlanningEntityCollectionProperty 列表<Shift> 放在了 class 中,而不是@PlanningSolution。 @PlanningEntityCollectionProperty 注释现在被忽略,程序失败。
我是否错过了重组程序的明显方法,或者这是我保留原始程序结构并修改我的 shift 对象以记录它们发生在哪一天的唯一选择?
提前致谢。如果可以的话,我会尽量转发帮助。
我会重组您的规划解决方案。
你为什么不这样做:
- 将
List<Shift>
保留在 Planning Solution
- 每班丢弃
List<Day>
- 在
Shift
中添加一个字段 day
,甚至可能使用枚举指示当天是否是周末。
然后您可以使用 Drools 轻松计算每个员工周末工作的天数:
(绝对未经测试!!!)
rule "balancedStaffWeekend"
when
$staff: Staff()
accumulate(
Shift(
staff == $staff
day == Day.WEEKEND);
$count: count()
);
)
then
scoreHolder.addSoftConstraintMatch(kcontext, -Math.pow(count, 2));
end
通过计数的二次方平衡周末的数量来惩罚解决方案。
我正在为我的办公室编写人员调度程序。每天(每周 7 天)至少有两班轮班,我希望优化器确保没有一名员工比另一名员工在周末轮班时工作得更多。
我有一个简单的工作程序,可以为每个 Shift 分配一个 Staff。 程序结构如下:
- SchedulingSolution 是 @PlanningSolution
- SchedulingSolution 包含一个列表<Shift>,它是 @PlanningEntityCollectionProperty
- Shift 是@PlanningEntity
- Shift 包含 Staff 即 @PlanningVariable
- SchedulingSolution 包含一个 @ValueRangeProvider,其中 returns 我们的员工名册作为 List<Staff>.
这个工作解决方案平等地安排所有员工,但不考虑周末和工作日。为了从周末划定工作日,我将 SchedulingSolution 中的 List<Shift> 替换为 List<Day>。每个 Day 都包含其自己的列表<Shift>,表示当天发生的班次。现在,当我想计算一名员工工作的周末数时,我可以找到所有代表周末的 Day 对象,并且只计算 Shifts包含在那些日子里。
不幸的是,这将 @PlanningEntityCollectionProperty 列表<Shift> 放在了 class 中,而不是@PlanningSolution。 @PlanningEntityCollectionProperty 注释现在被忽略,程序失败。
我是否错过了重组程序的明显方法,或者这是我保留原始程序结构并修改我的 shift 对象以记录它们发生在哪一天的唯一选择?
提前致谢。如果可以的话,我会尽量转发帮助。
我会重组您的规划解决方案。
你为什么不这样做:
- 将
List<Shift>
保留在Planning Solution
- 每班丢弃
List<Day>
- 在
Shift
中添加一个字段day
,甚至可能使用枚举指示当天是否是周末。
然后您可以使用 Drools 轻松计算每个员工周末工作的天数:
(绝对未经测试!!!)
rule "balancedStaffWeekend"
when
$staff: Staff()
accumulate(
Shift(
staff == $staff
day == Day.WEEKEND);
$count: count()
);
)
then
scoreHolder.addSoftConstraintMatch(kcontext, -Math.pow(count, 2));
end
通过计数的二次方平衡周末的数量来惩罚解决方案。