----------------------------------- 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?