java - PlanningEntities 分布在多个集合中

标签 java optaplanner domain-model

我正在为我的办公室编写员工调度程序。每天至少有两类(每周 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>在每个类次
  • 添加字段 dayShift ,甚至可能使用枚举来指示当天是否是周末。

然后,您可以使用 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/

相关文章:

java - 使用 Jackson,如何将 JSON 解码到 Java Map,但将特定的嵌套成员作为域实例?

oop - 领域模型中的特化层次结构

java - 尝试使用 Rhino,getEngineByName ("JavaScript")在 OpenJDK 7 中返回 null

java - 每行有多个数字的外部文件 Java

java - java中使用可重入锁进行锁定同步

java - 如何从 OptaPlanner 中的解决方案访问聚合结果

java - OptaPlanner - 在同一规划实体中使用 @PlanningListVariable 和 @PlanningVariable 时出现问题

java - 将一个类的对象传递给另一个类的方法

java - 计算解决方案级别的转换

uml - 实体关系和领域模型有什么区别