1. 项目背景与核心需求
高校排课系统是教务管理中的核心痛点,传统手工排课需要处理教师、教室、班级、课程四维约束条件。我去年协助某地方院校升级系统时,教务主任曾展示过他们的Excel排课表——37个班级、89名教师、56门课程需要手动协调,仅冲突检测就需要3个工作日。这正是智能排课系统的价值所在。
这个基于Java的毕设项目,本质上是要解决三个核心问题:
- 多维约束建模(教师专长、教室容量、课时时段)
- 冲突检测算法(硬冲突:同一教师同一时间;软冲突:相邻教学楼课程间隔)
- 可视化交互(让教务人员理解排课逻辑)
2. 技术架构解析
2.1 SpringBoot后端设计
采用经典三层架构,但有几个关键设计点值得注意:
- 领域模型特别设计了
TimeSlot值对象,用枚举定义工作日+节次(如MONDAY_AM2) - 教室资源聚合根包含
capacity和equipment字段,后者用bitmask存储多媒体设备 - 教师实体关联
teachableCourses集合,这是排课的核心约束条件
java复制// 典型领域模型示例
@Entity
public class Course {
@Id
private String code;
private String name;
private int credit;
@ManyToOne
private Teacher preferredTeacher; // 优先排课教师
}
2.2 排课算法实现
核心算法采用改进的遗传算法:
- 染色体编码:用三维数组[day][timeslot][room]表示课表
- 适应度函数:包含硬约束惩罚项(冲突直接置零)和软约束权重
- 变异操作:特别设计了教室交换变异和时段平移变异
实测数据:200个课程单元排课,在4核服务器上平均耗时47秒,冲突率低于0.3%
关键技巧:提前计算并缓存教师时间可用性矩阵,可减少30%计算量
3. 关键业务实现
3.1 冲突检测模块
实现了一个基于时间窗的冲突检测器:
java复制public class ConflictDetector {
public boolean checkConflict(Schedule existing, Schedule newSchedule) {
// 同一教室时间重叠检测
if (existing.getRoom().equals(newSchedule.getRoom())
&& timeOverlap(existing.getSlot(), newSchedule.getSlot())) {
return true;
}
// 教师时间冲突检测
// ...
}
}
3.2 可视化前端
使用Thymeleaf+ECharts实现:
- 教室视图:按周展示每个教室的课程热力图
- 教师视图:个人课表支持拖拽调整
- 冲突提示:用不同颜色区分硬/软冲突
4. 部署与优化
4.1 性能调优记录
遇到的核心性能问题及解决方案:
-
初始版本加载2000条课程数据超时
- 解决方案:添加
@Cacheable注解缓存基础数据 - 效果:响应时间从12s降至800ms
- 解决方案:添加
-
遗传算法早熟收敛
- 调整策略:动态变异概率(0.1→0.4)
- 效果:解的质量提升27%
4.2 典型问题排查
-
空指针异常:
- 场景:教师未设置可教课程时排课
- 修复:
@PrePersist校验可教课程非空
-
事务超时:
- 场景:批量导入课程数据
- 方案:分页处理+
@Transactional(timeout=30)
5. 项目扩展建议
在实际使用中,有几个值得深化的方向:
- 动态约束:允许教务人员临时设置特殊规则(如教师每周三下午不排课)
- 移动端适配:开发微信小程序供教师查课表
- 数据看板:统计教室利用率、教师工作量等指标
源码中特别推荐参考GeneticScheduler类的实现,其中包含了我调试多次才确定的理想参数组合。排课结果导出为Excel时,注意设置@ExcelIgnoreUnannotated避免字段泄漏
