Optaplanner是否支持forEachUniqueTriplet?需限制教师每日授课数至2
关于OptaPlanner限制教师每日授课节数的实现
OptaPlanner没有提供forEachUniqueTriplet这类直接处理三元组的API。其实对于“每日授课不超过2节”这类数量限制,用分组统计的写法比成对/三元组比较更灵活高效,也更易维护。
你之前实现“每日最多1节”用了forEachUniquePair,但如果要限制2节,不需要找三元组,而是可以通过forEachGroupBy统计每个教师每天的授课数量,当数量超过2时触发惩罚:
return constraintFactory .forEach(Lesson.class) .groupBy(Lesson::getTeacher, lesson -> lesson.getStart().toLocalDate(), Collectors.counting()) .filter((teacher, date, count) -> count > 2) .penalize("教师每日授课不超过2节", HardSoftScore.ONE_SOFT, (teacher, date, count) -> count - 2); // 每超出1节罚1个软分数
代码说明:
groupBy将课程按教师+日期分组,统计每组的课程数量filter筛选出数量超过2的分组penalize的第三个参数可以指定惩罚的分数权重,这里按超出的节数计算(比如一天上3节就罚1分,上4节罚2分),也可以固定罚1分,根据你的需求调整。
这种写法的好处是扩展性强,以后如果要把限制改成3节,只需要把count > 2改成count > 3就行,不用修改遍历逻辑。
内容的提问来源于stack exchange,提问作者user19917937
相关产品推荐
相关产品推荐

