我有一堂课,我正在为其分配教师和 BatchTimeSlot(其中包含 => 日期(本地日期)、开始时间(本地时间)和结束时间(本地时间)。
我想添加一个约束,即任何给定日期的教师进出时间不超过 10 小时。一位老师一天可以上多节课。
逻辑上我正在考虑以下内容:
Group By Teacher + Date + min(startTime) + max(endTime),然后检查 min 和 max 之间的差异
private Constraint maximumTeacherTimeConstraint(ConstraintFactory constraintFactory) {
return constraintFactory.forEach(Lesson.class)
.groupBy(lesson -> lesson.getTeacher(),
lesson -> lesson.getBatchTimeSlot().getDate(),
min(lesson -> lesson.getBatchTimeSlot().getStartTime().toEpochSecond(LocalDate.now(), ZoneOffset.UTC)),
max(lesson -> lesson.getBatchTimeSlot().getEndTime().toEpochSecond(LocalDate.now(), ZoneOffset.UTC))
)
.filter((teacher, date, minStartTime, maxEndTime) -> maxEndTime - minStartTime > 36000)
.penalize(HardSoftScore.ONE_SOFT)
.asConstraint("Time exceeds");
}
上面的代码给了我一个语法错误。它甚至没有被编译。如果我删除 min() 和 max() 那么代码就会被编译。接下来我可以尝试什么?
你的做法是正确的。
尝试改变
min(lesson -> ...
max(lesson -> ...
到
min((Lesson lesson) -> ...
max((Lesson lesson) -> ...
帮助编译器获取它。我们可能在那里放置了太多重载,因此编译器很容易感到困惑。
这似乎是在 timefold-quickstarts 的学校时间表上为我编译的(这种方式没有用,只是为了测试类型系统):
return constraintFactory.forEach(Lesson.class)
.groupBy(lesson -> lesson.getTeacher(),
lesson -> lesson.getTimeslot().getStartTime(),
min((Lesson lesson) -> lesson.getTimeslot().getStartTime()),
max((Lesson lesson) -> lesson.getTimeslot().getEndTime())
)
如果没有明确的 Lesson 演员表,它就不会。