目前很多高校內(nèi)部的課程管理及排課過程均是采用人工排課后再導(dǎo)入系統(tǒng)內(nèi)部生成課程表隐圾,提供給學(xué)生用戶查看。人工排課過程較為復(fù)雜掰茶,增加了排課錯(cuò)誤的可能性暇藏,本次畢業(yè)設(shè)計(jì)基于java實(shí)現(xiàn)遺傳算法實(shí)現(xiàn)自動(dòng)排課,整體提供學(xué)生管理濒蒋,課程管理盐碱,教師管理,班級(jí)管理沪伙,排課管理瓮顽,教室管理等功能。
一围橡、程序設(shè)計(jì)
本次基于遺傳算法的自動(dòng)排課系統(tǒng)主要內(nèi)容涉及:
主要功能模塊:班級(jí)設(shè)置暖混、教室設(shè)置、課程設(shè)置翁授、教師設(shè)置拣播、排課管理、用戶管理收擦,查看分課贮配、查看課表、查看空教室等
主要包含技術(shù):java炬守,Mysql牧嫉,springboot,mybatis,javascript酣藻,html曹洽,css,layerUI
主要包含算法及方法:遺傳算法
系統(tǒng)采用前端采用LayerUI框架實(shí)現(xiàn)辽剧,后臺(tái)服務(wù)基于springboot+Mysql+mybatis搭建送淆,配合遺傳算法實(shí)現(xiàn)自動(dòng)排課解決排課過程中的沖突問題,系統(tǒng)前后端數(shù)據(jù)交互怕轿,采用Ajax異步調(diào)用傳輸JSON實(shí)現(xiàn)偷崩。
二、效果實(shí)現(xiàn)
系統(tǒng)登錄
班級(jí)設(shè)置
課程分配
教室設(shè)置
自動(dòng)排課
查看課表
其他效果省略
三撞羽、排課算法設(shè)計(jì)
本次畢設(shè)系統(tǒng)在自動(dòng)排課過程中阐斜,主要采用遺傳算法,針對(duì)排課需要考慮的課程信息诀紊,教師信息谒出,教室信息,班級(jí)信息等抽象成排課因素邻奠,實(shí)現(xiàn)排課沖突解決笤喳,生成學(xué)生課程表等。系統(tǒng)遺傳算法實(shí)現(xiàn)的主要邏輯流程碌宴,如下圖所示:
排課算法代碼
// 1杀狡、獲得開課任務(wù)
List<ClassTask> classTaskList = classTaskDao.selectBySemester(classTask);
QueryWrapper<ClassTask> wrapper = new QueryWrapper<ClassTask>().eq("semester", semester);
List<ClassTask> classTaskList = classTaskDao.selectList(wrapper);
// 沒有任務(wù),排課失敗
if (classTaskList == null) {
return ServerResponse.ofError("排課失敗贰镣,查詢不到排課任務(wù)呜象!");
}
// 2、將開課任務(wù)的各項(xiàng)信息進(jìn)行編碼成染色體八孝,分為固定時(shí)間與不固定時(shí)間
List<Map<String, List<String>>> geneList = coding(classTaskList);
// 3董朝、給初始基因編碼隨機(jī)分配時(shí)間,得到同班上課時(shí)間不沖突的編碼
List<String> resultGeneList = codingTime(geneList);
// 4干跛、將分配好時(shí)間的基因編碼以班級(jí)分類成為以班級(jí)的個(gè)體子姜,得到班級(jí)的不沖突時(shí)間初始編碼
Map<String, List<String>> individualMap = transformIndividual(resultGeneList);
// 5、遺傳進(jìn)化
individualMap = geneticEvolution(individualMap);
// 6楼入、分配教室并做教室沖突檢測(cè)
List<String> resultList = finalResult(individualMap);
// 7哥捕、解碼最終的染色體獲取其中的基因信息
List<CoursePlan> coursePlanList = decoding(resultList);
// 8、寫入tb_course_plan上課計(jì)劃表
coursePlanDao.deleteAllPlan(); // 先刪除原來的課程計(jì)劃
for (CoursePlan coursePlan : coursePlanList) {
coursePlanDao.insertCoursePlan(coursePlan.getGradeNo(), coursePlan.getClassNo(), coursePlan.getCourseNo(),
coursePlan.getTeacherNo(), coursePlan.getClassroomNo(), coursePlan.getClassTime(), semester);
}
log.info("完成排課,耗時(shí):" + (System.currentTimeMillis() - start));
return ServerResponse.ofSuccess("排課成功嘉熊!");