我正在尝试使用optaplanner为大学生成时间表。我想把老师每天的课程数量限制在2门以内。
通过使用约束,我知道如何将限制强制为1,例如:
return constraintFactory
.forEachUniquePair(Lesson.class,
Joiners.equal(Lesson::getTeacher)
Joiners.equal((lesson) -> lesson.getStart().toLocalDate()))
.penalize("Limit to one course per date", HardSoftScore.ONE_SOFT);
这很容易,因为我只需要处理对,而且有一个forEachUniquePair。optaplanner有forEachUniqueTriplet
这样的东西吗?
不,没有。然而,forEachUniquePair
是的句法糖
forEach(Lesson.class)
.join(Lesson.class, Joiners.lessThan(Lesson::getId))
通过在第三个Lesson
上应用相同的模式,您将获得所需的结果。也就是说,joiner的逻辑可能需要有点不同,才能真正给出唯一的三元组。事实上,只做可能更容易(但不是最高效的(
forEach(Lesson.class)
.join(Lesson.class, Joiners.lessThan(Lesson::getId))
.join(Lesson.class)
.filter((lesson1, lesson2, lesson3) -> lesson3 != lesson2 && lesson3 != lesson1)