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

如何修改School-Timetabling用例的Lesson类以新增classRoom参数?

修改Lesson类并入门Timefold时间表规划

一、修改Lesson类适配指定教室需求

    1. 更新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; }
    }
    
    1. 调整约束逻辑(可选)
      如果需要强制所有课程必须指定教室,添加硬约束确保classRoom不为空:
    private Constraint ensureClassRoomAssigned(ConstraintFactory constraintFactory) {
        return constraintFactory.from(Lesson.class)
                .filter(lesson -> lesson.getClassRoom() == null || lesson.getClassRoom().isBlank())
                .penalize("Unassigned classroom", HardSoftScore.ONE_HARD);
    }
    
    若允许部分课程自动分配教室,保留原有自动分配约束即可——Timefold会优先使用传入的classRoom值,仅在存在冲突时调整。
    1. 初始化数据
      现在可以用你提供的代码添加课程:
    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启动流程。
  • 分步落地自己的需求
    1. 明确所有规划实体与资源:比如你的场景需要Lesson、Room、TimeSlot三类对象。
    2. 标记规划变量:用@PlanningVariable注解标记classRoom等需要Solver分配的属性,可设置nullable=false强制分配。
    3. 梳理约束清单:先列硬约束(资源冲突类),再列软约束(业务偏好类),按优先级设置分数权重。
  • 调试优化
    开启Solver日志,观察迭代过程中的分数变化;调整约束权重,让符合业务需求的方案得到更高分数。

内容的提问来源于stack exchange,提问作者Tan Teck Hock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:41:17