1. 项目背景与需求分析
兰州信息科技学院作为一所快速发展的应用型本科院校,每年面临着近万名学生的课程安排需求。传统的手工排课方式存在三大痛点:一是教务人员需要花费2-3周时间进行人工排课,期间需要反复调整冲突;二是教室资源利用率不足,经统计平均使用率仅达到65%;三是学生选课冲突率高,每学期约有15%的学生需要申请调课。
基于J2EE的排课系统需要实现以下核心目标:
- 支持多维度约束条件(教师时间偏好、教室容量、课程连续性等)
- 实现冲突自动检测与可视化调整
- 生成最优化的教室资源分配方案
- 提供Web端和移动端的课表查询功能
提示:在高校信息化建设中,排课系统属于典型的多约束条件组合优化问题,需要平衡教学规律、资源利用和个性化需求三大要素。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 J2EE技术选型依据
采用分层架构设计,具体技术栈如下:
- 表现层:JSP+AJAX+ECharts实现动态数据可视化
- 控制层:Spring MVC 5.3.18(支持RESTful API)
- 业务层:Spring 5.3.18(声明式事务管理)
- 持久层:MyBatis 3.5.9 + PageHelper分页插件
- 数据库:MySQL 8.0(InnoDB集群部署)
选择J2EE而非Spring Boot的考虑因素:
- 学院现有教务系统基于J2EE开发,需保持技术栈统一
- 需要精细控制EJB容器的事务管理
- 已有成熟的WebLogic服务器运维团队
2.2 核心算法设计
排课核心算法采用改进的遗传算法实现:
java复制// 染色体编码示例
public class ScheduleGene {
private int courseId;
private int teacherId;
private int classroomId;
private int timeSlot; // 1-35表示周一到周五的7个时段
}
// 适应度函数
double fitness = 1/(1 + teacherConflict + classroomConflict + studentConflict);
算法优化点包括:
- 动态变异概率(初始0.1,迭代后期降至0.01)
- 精英保留策略(每代保留top 5%个体)
- 并行计算(使用Java ForkJoinPool)
3. 系统功能模块
3.1 基础数据管理
- 采用树形结构维护学院-专业-班级层级
- 教室资源池支持多维筛选(容量、类型、位置)
- 教师信息包含不可排课时间标记
3.2 智能排课引擎
-
预排课阶段:
- 处理固定约束(如体育课必须安排在下午)
- 识别硬冲突(同一教师同一时间多课程)
-
优化阶段:
- 计算班级课程离散度(避免全天单科连排)
- 平衡教师课时分配(标准差控制在2学时内)
-
人工调整:
- 提供冲突热力图可视化
- 支持拖拽式课表调整
3.3 课表发布与查询
- 学生端:支持按周次查看、课程提醒导出
- 教师端:显示教学任务统计(周课时/总课时)
- 管理端:生成教室使用率分析报表
4. 数据库设计要点
4.1 关键表结构
| 表名 | 主键 | 重要字段 | 索引设计 |
|---|---|---|---|
| t_course | course_id | course_name, credit, course_type | type_index |
| t_schedule | schedule_id | week_range, time_slot, classroom_id | composite_idx(week,time) |
| t_constraint | constraint_id | teacher_id, disable_time | teacher_idx |
4.2 性能优化措施
- 课表数据按学年分表(t_schedule_2023)
- 使用MySQL窗口函数计算冲突检测
- 热点数据缓存(Redis存储教师偏好设置)
5. 项目实施计划
5.1 开发里程碑
- 需求分析(4周):完成用例图和业务流程建模
- 原型设计(2周):使用Axure制作高保真原型
- 核心算法开发(6周):包含压力测试(模拟5000课程项)
- 系统集成(3周):与统一身份认证平台对接
5.2 测试方案
- 边界测试:模拟7*12全满课表的冲突检测
- 压力测试:JMeter模拟500并发查询
- 兼容性测试:覆盖IE11/Chrome/Firefox主流浏览器
6. 关键技术挑战与解决方案
6.1 大规模数据渲染性能
采用前后端分离方案:
- 后端只返回当前周次数据
- 前端使用Virtual Scroll技术
- 课表变更采用WebSocket实时推送
6.2 多维度冲突检测
建立冲突规则引擎:
sql复制-- 教室冲突检测SQL示例
SELECT COUNT(*) FROM t_schedule
WHERE classroom_id = ?
AND week_range & ? > 0
AND time_slot = ?
6.3 移动端适配
使用响应式布局技术:
- 课表卡片式展示(Bootstrap栅格系统)
- 手势操作支持(Hammer.js实现滑动切换周次)
- 离线缓存机制(Service Worker)
在实际开发中发现,使用遗传算法时需要特别注意局部最优解问题。我们的解决方案是引入模拟退火算法的思想,在迭代过程中允许一定概率接受次优解。具体实现时,在算法运行中期(第50-100代)将接受概率从5%提升到15%,有效避免了早熟收敛现象。
