Optaplanner约束流得分计算问题

时间:2020-10-10 03:54:48

标签: optaplanner

----------------------------------- document ----------- --------------------

约束流是纯Java中增量分数计算的函数式编程形式,易于读取,编写和调试。如果您使用过Java 8 Streams或SQL,则应该对API感到熟悉。

ConstraintStreams / ConstraintProvider API是一个正在进行的项目。它可以工作,但是有很多API差距。因此,它还不够丰富,无法处理复杂的约束。约束条件可能无法正常运行。

6.1。介绍 使用Java 8的Streams API,我们可以使用功能方法实现一个简单的分数计算器:

private int doNotAssignAnn() {
    int softScore = 0;
    schedule.getShiftList().stream()
            .filter(Shift::isEmployeeAnn)
            .forEach(shift -> {
                softScore -= 1;
            });
    return softScore;
}

但是,由于无法进行增量计算,因此扩展性很差:当单个Shift的计划变量更改时,要重新计算分数,常规Streams API必须从头开始执行整个流。 ConstraintStreams API使您可以用纯Java编写类似的代码,同时获得增量分数计算的性能优势。这是使用Constraint Streams API的相同代码的示例:

private Constraint doNotAssignAnn(ConstraintFactory factory) {
    return factory.from(Shift.class)
            .filter(Shift::isEmployeeAnn)
            .penalize("Don't assign Ann", HardSoftScore.ONE_SOFT);
}

此约束流迭代问题事实中的Shift类的所有实例以及计划问题中的计划实体。它会找到分配给员工Ann的每个班次,并为每个此类实例(也称为比赛),在总分上加软罚分1。

----------------------------------- document ----------- --------------------

我的问题是:

作为计划实体,如果首次将Shift分配给Ann,将对总分加1。 如果最佳解决方案的第二次迭代的总得分为0,并且分配给Ann2,则不会应用软罚分,但是上次的总得分加1的软罚分如何变为0?

0 个答案:

没有答案
相关问题