如何修改School-Timetabling用例的Lesson类以新增classRoom参数?
修改Lesson类并入门Timefold时间表规划
一、修改Lesson类适配指定教室需求
- 更新Lesson类属性与构造函数
添加classRoom属性,并扩展构造函数以接收该参数,同时生成所有属性的getter/setter(Timefold依赖getter访问规划实体属性):
public class Lesson { private Long id; private String subject; private String teacher; private String studentGroup; private String classRoom; // 新增教室属性 // 包含所有参数的构造函数 public Lesson(Long id, String subject, String teacher, String studentGroup, String classRoom) { this.id = id; this.subject = subject; this.teacher = teacher; this.studentGroup = studentGroup; this.classRoom = classRoom; } // 生成所有属性的getter和setter public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public String getTeacher() { return teacher; } public void setTeacher(String teacher) { this.teacher = teacher; } public String getStudentGroup() { return studentGroup; } public void setStudentGroup(String studentGroup) { this.studentGroup = studentGroup; } public String getClassRoom() { return classRoom; } public void setClassRoom(String classRoom) { this.classRoom = classRoom; } }- 更新Lesson类属性与构造函数
- 调整约束逻辑(可选)
如果需要强制所有课程必须指定教室,添加硬约束确保classRoom不为空:
若允许部分课程自动分配教室,保留原有自动分配约束即可——Timefold会优先使用传入的private Constraint ensureClassRoomAssigned(ConstraintFactory constraintFactory) { return constraintFactory.from(Lesson.class) .filter(lesson -> lesson.getClassRoom() == null || lesson.getClassRoom().isBlank()) .penalize("Unassigned classroom", HardSoftScore.ONE_HARD); }classRoom值,仅在存在冲突时调整。- 调整约束逻辑(可选)
- 初始化数据
现在可以用你提供的代码添加课程:
List<Lesson> lessonList = new ArrayList<>(); long nextLessonId = 1; lessonList.add(new Lesson(nextLessonId++, "Math", "A. Turing", "9th grade","Room A"));- 初始化数据
二、Timefold时间表规划新手入门要点
- 先吃透核心概念
- 规划实体:需要分配资源的对象(如Lesson),以及可分配的资源(如Room、TimeSlot)。
- 规划变量:实体中需要被Solver优化的属性(如classRoom、timeSlot),可设置初始值让Solver迭代调整。
- Score:衡量方案优劣的标准,硬约束(必须满足,如资源冲突)违反扣减硬分数,软约束(偏好需求)违反扣减软分数。
- Solver:Timefold核心组件,通过启发式算法自动寻找最优解。
- 从官方示例拆解学习
先跑通School-Timetabling示例,逐一理解:实体类定义、规划变量注解、约束配置、Solver启动流程。 - 分步落地自己的需求
- 明确所有规划实体与资源:比如你的场景需要Lesson、Room、TimeSlot三类对象。
- 标记规划变量:用
@PlanningVariable注解标记classRoom等需要Solver分配的属性,可设置nullable=false强制分配。 - 梳理约束清单:先列硬约束(资源冲突类),再列软约束(业务偏好类),按优先级设置分数权重。
- 调试优化
开启Solver日志,观察迭代过程中的分数变化;调整约束权重,让符合业务需求的方案得到更高分数。
内容的提问来源于stack exchange,提问作者Tan Teck Hock
相关产品推荐
相关产品推荐

