1. 项目概述
高校排课系统一直是教务管理中的痛点问题。作为一名经历过多次手动排课折磨的开发者,我深知传统排课方式的低效与混乱。去年接手某高校的智能排课系统开发项目后,我基于SpringBoot+Vue技术栈实现了一套完整的解决方案。这个系统上线后,将原本需要3-5天的排课工作缩短到2小时内完成,排课冲突率从15%降至不足1%。
1.1 系统核心价值
这套系统主要解决了三个关键问题:
- 多维度约束条件下的自动排课:同时考虑教师时间、教室容量、课程类型等十余种约束条件
- 实时冲突检测:任何调整都能立即反馈冲突情况
- 可视化操作界面:教务人员可以直观地进行手动微调
提示:系统采用遗传算法作为排课核心算法,经过优化后能在30分钟内完成200个班级、500门课程的排课任务。
2. 技术架构设计
2.1 整体技术栈
系统采用前后端分离架构:
- 前端:Vue 3 + Element Plus + ECharts
- 后端:SpringBoot 2.7 + MyBatis-Plus + Redis
- 数据库:MySQL 8.0
- 算法层:自定义遗传算法实现
java复制// 排课核心算法接口定义
public interface SchedulingAlgorithm {
ScheduleResult generate(SchedulingConstraint constraints);
ScheduleResult optimize(ScheduleResult initial);
}
2.2 数据库设计
核心表结构设计考虑了排课系统的特殊需求:
2.2.1 课程表(course)
sql复制CREATE TABLE `course` (
`id` bigint NOT NULL AUTO_INCREMENT,
`course_code` varchar(32) NOT NULL COMMENT '课程代码',
`name` varchar(128) NOT NULL COMMENT '课程名称',
`credit` decimal(3,1) NOT NULL COMMENT '学分',
`hours_per_week` int NOT NULL COMMENT '周课时',
`course_type` tinyint NOT NULL COMMENT '1-必修 2-选修',
`max_students` int DEFAULT NULL COMMENT '最大学生数',
`require_lab` bit(1) DEFAULT b'0' COMMENT '是否需要实验室',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`course_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.2.2 排课结果表(schedule)
sql复制CREATE TABLE `schedule` (
`id` bigint NOT NULL AUTO_INCREMENT,
`semester_id` bigint NOT NULL,
`course_id` bigint NOT NULL,
`teacher_id` bigint NOT NULL,
`classroom_id` bigint NOT NULL,
`weekday` tinyint NOT NULL COMMENT '1-7对应周一到周日',
`time_slot` tinyint NOT NULL COMMENT '1-12对应第1-12节课',
`start_week` tinyint NOT NULL COMMENT '起始周',
`end_week` tinyint NOT NULL COMMENT '结束周',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_conflict` (`semester_id`,`classroom_id`,`weekday`,`time_slot`,`start_week`,`end_week`),
KEY `idx_course` (`semester_id`,`course_id`),
KEY `idx_teacher` (`semester_id`,`teacher_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能实现
3.1 智能排课算法
系统采用改进的遗传算法实现自动排课:
- 染色体编码:采用三维编码(课程、时间、教室)
- 适应度函数:考虑6个权重因子:
- 教师时间冲突(权重0.3)
- 教室冲突(权重0.25)
- 课程分布合理性(权重0.2)
- 特殊要求满足度(权重0.15)
- 教室容量匹配度(权重0.1)
java复制// 适应度计算核心逻辑
public double calculateFitness(ScheduleGene gene) {
double score = 0;
// 检查教师冲突
score += 0.3 * checkTeacherConflicts(gene);
// 检查教室冲突
score += 0.25 * checkClassroomConflicts(gene);
// 检查课程分布
score += 0.2 * evaluateCourseDistribution(gene);
// 其他因素计算...
return score;
}
3.2 冲突检测机制
系统实现了实时冲突检测功能,主要检查以下冲突类型:
-
硬冲突(绝对不允许):
- 同一时间同一教室安排多个课程
- 教师在同一时间上多门课
- 教室容量不足
-
软冲突(建议避免):
- 同一班级连续上多节理论课
- 教师单日课时过多
- 特殊课程安排在不当时间(如体育课安排在早上第一节)
javascript复制// 前端冲突检测交互
watchEffect(() => {
const conflicts = checkScheduleConflicts(currentSchedule);
if (conflicts.length > 0) {
showConflictAlert(conflicts);
}
});
4. 系统特色功能
4.1 可视化排课界面
开发了基于ECharts的课表可视化组件:
- 支持拖拽调整课程时间
- 颜色区分不同课程类型
- 实时显示冲突提示

4.2 多维度统计报表
系统提供多种统计视角:
- 教师工作量统计
- 教室使用率分析
- 课程分布统计
- 冲突历史记录
5. 部署与性能优化
5.1 系统部署方案
采用Docker Compose部署整套系统:
yaml复制version: '3'
services:
backend:
image: scheduling-backend:1.0
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
depends_on:
- redis
- mysql
frontend:
image: scheduling-frontend:1.0
ports:
- "80:80"
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=scheduling
redis:
image: redis:6.2
5.2 性能优化措施
-
缓存策略:
- 使用Redis缓存热门课程数据
- 课表数据二级缓存(内存+Redis)
-
算法优化:
- 并行化遗传算法计算
- 采用局部搜索优化初始种群
-
数据库优化:
- 关键查询添加适当索引
- 采用读写分离架构
6. 踩坑经验分享
在开发过程中遇到几个典型问题:
-
遗传算法收敛慢:
- 问题:初期算法需要200代才能收敛
- 解决:引入模拟退火机制,减少到80代
-
拖拽性能问题:
- 问题:课表项目多时拖拽卡顿
- 解决:采用虚拟滚动技术,只渲染可视区域
-
并发冲突:
- 问题:多人同时修改导致数据不一致
- 解决:引入乐观锁机制
注意:排课算法中的权重参数需要根据实际场景调整,我们通过3个学期的实际运行数据才确定最优参数组合。
7. 扩展方向
系统未来可扩展的方向:
- 移动端适配(微信小程序)
- 教室设备管理系统集成
- 基于历史数据的智能预测
- 多校区排课支持
这套系统目前已在3所高校稳定运行1年以上,日均处理排课调整200+次。最大的收获是看到教务老师从繁重的手工排课中解放出来,有更多时间投入到教学质量管理中。