目前很多高校内部的课程管理及排课过程均是采用人工排课后再导入系统内部生成课程表,提供给学生用户查看。人工排课过程较为复杂,增加了排课错误的可能性,本次毕业设计基于java实现遗传算法实现自动排课,整体提供学生管理,课程管理,教师管理,班级管理,排课管理,教室管理等功能。
一、程序设计
本次基于遗传算法的自动排课系统主要内容涉及:
主要功能模块:班级设置、教室设置、课程设置、教师设置、排课管理、用户管理,查看分课、查看课表、查看空教室等
主要包含技术:java,Mysql,springboot,mybatis,javascript,html,css,layerUI
主要包含算法及方法:遗传算法
系统采用前端采用LayerUI框架实现,后台服务基于springboot+Mysql+mybatis搭建,配合遗传算法实现自动排课解决排课过程中的冲突问题,系统前后端数据交互,采用Ajax异步调用传输JSON实现。
二、效果实现
系统登录
班级设置
课程分配
教室设置
自动排课
查看课表
其他效果省略
三、排课算法设计
本次毕设系统在自动排课过程中,主要采用遗传算法,针对排课需要考虑的课程信息,教师信息,教室信息,班级信息等抽象成排课因素,实现排课冲突解决,生成学生课程表等。系统遗传算法实现的主要逻辑流程,如下图所示:
排课算法代码
// 1、获得开课任务
List<ClassTask> classTaskList = classTaskDao.selectBySemester(classTask);
QueryWrapper<ClassTask> wrapper = new QueryWrapper<ClassTask>().eq("semester", semester);
List<ClassTask> classTaskList = classTaskDao.selectList(wrapper);
// 没有任务,排课失败
if (classTaskList == null) {
return ServerResponse.ofError("排课失败,查询不到排课任务!");
}
// 2、将开课任务的各项信息进行编码成染色体,分为固定时间与不固定时间
List<Map<String, List<String>>> geneList = coding(classTaskList);
// 3、给初始基因编码随机分配时间,得到同班上课时间不冲突的编码
List<String> resultGeneList = codingTime(geneList);
// 4、将分配好时间的基因编码以班级分类成为以班级的个体,得到班级的不冲突时间初始编码
Map<String, List<String>> individualMap = transformIndividual(resultGeneList);
// 5、遗传进化
individualMap = geneticEvolution(individualMap);
// 6、分配教室并做教室冲突检测
List<String> resultList = finalResult(individualMap);
// 7、解码最终的染色体获取其中的基因信息
List<CoursePlan> coursePlanList = decoding(resultList);
// 8、写入tb_course_plan上课计划表
coursePlanDao.deleteAllPlan(); // 先删除原来的课程计划
for (CoursePlan coursePlan : coursePlanList) {
coursePlanDao.insertCoursePlan(coursePlan.getGradeNo(), coursePlan.getClassNo(), coursePlan.getCourseNo(),
coursePlan.getTeacherNo(), coursePlan.getClassroomNo(), coursePlan.getClassTime(), semester);
}
log.info("完成排课,耗时:" + (System.currentTimeMillis() - start));
return ServerResponse.ofSuccess("排课成功!");