PlanningEntities分为多个集合

时间:2018-06-05 06:41:52

标签: java optaplanner domain-model

我正在为我的办公室写一份员工安排员。每天至少有两个班次(每周7天),我希望优化人员确保没有一个工作人员比周末班次工作更多。

我有一个简单的工作程序,为每个 Shift 分配一个员工。 程序结构如下:

  • SchedulingSolution @PlanningSolution
  • SchedulingSolution 包含列表< Shift >这是 @PlanningEntityCollectionProperty
  • Shift 是@PlanningEntity
  • Shift 包含员工,即 @PlanningVariable
  • SchedulingSolution 包含 @ValueRangeProvider ,它将我们的员工名单作为列表< 员工>返回。

此工作解决方案可以平等地安排所有员工,但不考虑周末和工作日。为了描述周末的工作日,我更换了列表&lt; Shift &gt;在 SchedulingSolution 中使用列表&lt; &gt;。每都包含自己的列表&lt; Shift &gt;表示当天发生的变化。现在,当我想计算一名工作人员工作的周末数时,我可以找到代表周末的所有对象,并且只计算当天所包含的班次。< / p>

不幸的是,这会将列表&lt; Shift &gt;这是不是 @PlanningSolution 的类中的 @PlanningEntityCollectionProperty 。现在忽略 @PlanningEntityCollectionProperty 注释,程序失败。

我是否错过了重新构建程序的明显方法,或者我唯一的选择是保留原始程序结构并修改 shift 对象以记录它们发生在哪一天?

提前致谢。如果可以的话,我会尝试向前传递帮助。

1 个答案:

答案 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

通过提高到两次幂的计数来惩罚解决方案,平衡周末的数量。