如何在 optaplanner 中添加与最小值/最大值之间的差异相关的约束

问题描述 投票:0回答:1

我有一堂课,我正在为其分配教师和 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() 那么代码就会被编译。接下来我可以尝试什么?

optaplanner
1个回答
0
投票

你的做法是正确的。

尝试改变

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 演员表,它就不会。

© www.soinside.com 2019 - 2024. All rights reserved.