You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于教室容量,用OptaPlanner将学生分配至Lesson的studentGroup

基于OptaPlanner实现按教室容量分配学生至课程分组

1. 完善领域模型

调整/新增实体类

  • StudentGroup类:新增该类(若尚未定义),用于封装一组学生,包含属性:id(分组唯一标识)、studentList(该组的学生集合)、studentCount(学生数量,可通过studentList.size()实时计算或缓存为字段)。
  • Lesson类:保留已有的studentGroup字段,确保其关联StudentGroup实例,同时保留room字段(关联分配的教室)。
  • Room类:确认已添加capacity整数字段,代表教室最大容纳人数。

2. 定义规划约束

在时间表规划器的约束提供者类中,添加以下核心约束:

硬约束:禁止教室容量超限

这是必须满足的规则,确保课程对应的学生分组人数不超过分配教室的容量:

private Constraint roomCapacityExceeded(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Lesson.class)
            .filter(lesson -> lesson.getStudentGroup().getStudentCount() > lesson.getRoom().getCapacity())
            .penalize("Room capacity exceeded", HardSoftScore.ONE_HARD);
}

软约束:最大化教室利用率(可选)

若希望尽量填满教室空间、减少浪费,可添加该约束,鼓励学生分组人数向教室容量靠拢:

private Constraint maximizeRoomUtilization(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Lesson.class)
            .reward("Room utilization", HardSoftScore.ONE_SOFT,
                    lesson -> lesson.getStudentGroup().getStudentCount() * 100 / lesson.getRoom().getCapacity());
    // 以利用率百分比作为奖励权重,可根据需求调整计算逻辑
}

3. 配置规划变量与问题事实

  • 若studentGroup是需要OptaPlanner动态分配的对象,需给Lesson类的studentGroup字段添加@PlanningVariable注解,指定取值范围为所有可用的StudentGroup实例。
  • 若StudentGroup是预先划分好的,只需确保Lesson的room规划变量在分配时,满足容量硬约束即可。

4. 初始化问题数据

  • 整理所有Student实例,可根据教室容量预先划分StudentGroup;若需OptaPlanner动态分组,则需将Student的分组归属设为规划变量,调整模型让Student关联对应的Lesson/StudentGroup。
  • 确保每个Lesson实例的studentGroup或room初始状态为未分配(设为null或特定标记值)。

5. 运行规划器验证结果

启动规划器后,OptaPlanner会在满足硬约束的前提下,优化软约束(若已添加),最终生成符合教室容量要求的学生分组-课程-教室分配方案。


内容的提问来源于stack exchange,提问作者Panaceata dev04

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:07:16