排课算法的核心原理:
我们先将所有的班级从数据库中取出来,为所有的班级添加上每周 20 个
时间片(时间片的意思是一个班级在一周内所能上课的时间点),然后我们将所
有的班级随机加入该班级要上的课程,加入完成后我们将其按照从大到小的顺
序排序,然后我们循环 20 个时间片,分别取出该时间片内的所有班级,然后
我们将教室取出来并且按从大到小排序,我们进行对比,一旦该教室的人数大
于等于相关班级,我们就将教室名称放入班级记录,之后我们开始判断该班级
的相关的教师是否存在,如果没有直接将班级放入失败表,如果教师存在,我
们将这些老师在成功的表内查询,该老师是的在该时间片已经有课了,如果没
有课,我们将老师分配给该班级,将记录加入成功表并且教室计数自加一,如
果该老师有课我们判断下一个教该课程的老师,如果所有老师都有课,则该班
级在该时间点是没有老师教授该课程,该班级在该时间点排课失败,放入失败
表。如果教室的人数小于相关班级,我们就将判定该班级该时间段内不能找到
符合条件的班级,我们就将其放入失败表。
排课部分核心代码:
int[] a = { 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43,44, 51, 52, 53, 54 };
List<Integer> list=(List<Integer>) HibernateTemple.query("select s.sid from Student s group by
className)", null);
for(int k=0;k<list.size();k++){
List<Course> l = (List<Course>) HibernateTemple.query(
"from Course where sid=?", list.get(k));// 取出课程
List<Student> cl = (List<Student>) HibernateTemple.query(
"from Student where sid=?",list.get(k));// 取出班级
Collections.shuffle(cl);// 打乱
int size = l.size();
if (size > 20&&l!=null) {
for (int i = 0; i < size; i++) {
if (i <= 20) {
cl.get(i).setCourseId(l.get(i).getCid());// 放入课程
评论28