整体思路
为所有课程班找到一个时空序列。课程班,(有别于课程的概念)即特定老师所上的具体的课程。时空序列是指,某一教室某一天的某一课时的开始时间。在时空序列不冲突的情况下,再去解决老师上课时间的冲突。
文件介绍
`│ chromosomeSet.js`
`│ chromosomeSet1.js 第一个学期课程表结果`
`│ chromosomeSet2.js 第一个学期课程表结果`
`│ classRooms.js 教室`
`│ common.js 工具函数`
`│ config.js 配置文件`
`│ courses.js 所有课程`
`│ ga-demo.html`
`│ GA.js 遗传算法主要函数`
`│ lessonClasses_2020-2021-1.js 第一个学期课程`
`│ lessonClasses_2020-2021-2.js 第二个学期课程`
`│ teachers.js`
`│ view.js 页面显示`
`├─lib`
`│ │ echarts.min.js`
`│ │ vue.js`
`│ │`
`│ └─element-ui`
`│ │ index.css`
`│ │ index.js`
`│ │`
`│ └─fonts`
`│ element-icons.woff`
数据结构
adaptability:二维数组保存各个课程班,在各个时空序列的适应程度,根据是否符合条件打分。
`function initAdapt(){`
`adaptability = [];`
`for (let i = 0; i < lessons.length; i++) {`
`adaptability[i] = [];`
`for (let d = 0; d < DAYS; d++) {`
`for (let t = 0; t < TIMES; t++) {`
`for (let r = 0; r < classRooms.length; r++) {`
`// 判断不可用时段`
`if (unableDayTime[d] && unableDayTime[d].includes(t)){`
`adaptability[i][index] = 0;`
`continue;`
`}`
`var index = indexUtil.getIndex(d,t,r);`
`adaptability[i][index] = adapt(i,d,t,r);`
`}`
`}`
`}`
`}`
`}`
chromosomeSet:一组基因,geneOrder:每组基因按照课程班顺序保存对应时空序列,badSelect:冲突数,adapt:适应度
`this.getIndex = (day,time,roomIndex)=>{`
`return timeLength *roomIndex + times*day + time;`
`}`
`this.getPosition = (index)=>{`
`var room= Math.floor(index/timeLength);`
`var daytime = index%timeLength;`
`var day = Math.floor(daytime/ times);`
`var time = daytime%times;`
`return {day,time,room};`
`}`
其中:
days:一周上课日 规定 0-6为周一-周日
times:每天上课总时间
timeLength= days*times
此三个参数: (day,time,roomIndex)第几天,第几节课,教室下标
由于此处仅仅记录了,课程的上课时间。所以要限制上课开始时间。联排两课时的可以选择第一节,第三节开始,第五节开始。联排三次课的可以选择第7节课,第10节课开始。
`var unitUnableTime = { //此处时间为下标,从零开始`
`1: [],`
`2: [1,3,5,7,8,10,11],`
`3: [0,1,2,3,4,5,7,8,10,11],`
`};`