高校自动排课系统.docx
- 文档编号:1872718
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:14
- 大小:18.24KB
高校自动排课系统.docx
《高校自动排课系统.docx》由会员分享,可在线阅读,更多相关《高校自动排课系统.docx(14页珍藏版)》请在冰豆网上搜索。
高校自动排课系统
//简化版高校自动排课系统
//排课任务简化后包含:
年级专业(教学班级,如计科13)、课程名称、任课教师、上课地点和时间
//教学班级简化为不分人数,不分专业方向。
//上课教室简化为不分理论课、实验课,不分教室容纳人数,不分是否多媒体。
//上课时段简化为:
一周五天,周一到周五,白天上课,上午四节,下午四节,
//1~2(8:
00~9:
400)、3~4(10:
00~11:
40)、5~6(14:
00~15:
40)、7~8(16:
00~17:
40)
//为了便于处理,将五天的所有上课时段用数字0~19表示
//上课地点和时间组合成一个整数数组(位集,bitset),每20个为1组为一个教室的上课时段安排
//约束条件:
1、教学班级的上课时间不能冲突
//2、每个教室不能同时安排多个教学班级上课
//3、任课教师的上课时间不能冲突
//
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
//原始数据文件中的每一行数据的数据结构
structschedule{
stringgrade_special;//年级专业
stringcourse;//课程名称
stringteacher;//任课教师
stringtotal_hour;//总学时
stringteach_hour;//讲课学时
stringexperiment_hour;//实验学时
stringpractice_hour;//课程实践学时
stringcredit;//学分
stringweek_hour;//周学时
stringstart_stop;//起止周
stringspeciality_orientation;//专业方向
stringperson_num;//人数
};
//排课任务的数据结构
structarrange{
arrange(stringgs,stringc,stringt,intct=-1):
grade_special(gs),course(c),teacher(t),classroom_time(ct){}
stringgrade_special;//年级专业
stringcourse;//课程名称
stringteacher;//任课教师
//stringclassroom;//上课地点
//stringtime;//上课时间
intclassroom_time;//上课地点、时间
};
//教师倒排表数据结构,通过教师姓名找到该教师的排课情况
structteacher_inverted{
teacher_inverted(stringtea,intcl=-1,intar=-1):
teacher(tea),class_loc(cl),arrange_loc(ar){}
stringteacher;
intclass_loc;
intarrange_loc;
};
//教室倒排表数据结构,通过教室名称查找该教室的排课情况
structclassroom_inverted{
classroom_inverted(stringcr,intcl=-1,intar=-1):
classroom(cr),class_loc(cl),arrange_loc(ar){}
stringclassroom;
intclass_loc;
intarrange_loc;
};
intmain(intargc,char**argv){
if(argc!
=3){
cout<<"程序调用格式错误!
\n调用格式:
csp排课计划文件可用教室文件\n";
return0;
}
ifstreaminfile(argv[1]);
vector
strings;
getline(infile,s);
while(getline(infile,s)){
schedulesch;
istringstreamrecord(s);
record>>sch.grade_special>>sch.course>>sch.teacher>>sch.total_hour>>sch.teach_hour
>>sch.experiment_hour>>sch.practice_hour>>sch.credit>>sch.week_hour>>sch.start_stop
>>sch.speciality_orientation>>sch.person_num;
plan.push_back(sch);
}
infile.close();
vector
vector
stringgs("");//教学班级
for(autoit=plan.begin();it!
=plan.end();++it){
if(gs!
=it->grade_special){
if(!
arr.empty()){
arranges.push_back(arr);//教学计划按教学班级顺序排列
arr.clear();
}
gs=it->grade_special;
}
arr.push_back(arrange(it->grade_special,it->course,it->teacher));
}
arranges.push_back(arr);
vector
for(unsignedi=0;i for(unsignedj=0;j stringtea=arranges[i][j].teacher; if(tea=="未定")continue; unsignedk=0; for(;k if(teachers[k][0].teacher==tea){ teachers[k].push_back(teacher_inverted(tea,i,j)); break; } } if(k==teachers.size()){ vector ti.push_back(teacher_inverted(tea,i,j)); teachers.push_back(ti); } } } constintN=256; bitset infile.open(argv[2]);; vector while(getline(infile,s)){ classrooms.push_back(s); } infile.close(); unsignedarrange_num=plan.size();//待排课数目 unsignedclass_num=arranges.size();//教学班级数目 unsignedclassroom_num=classrooms.size();//教室数目 uniform_int_distribution default_random_enginee(time(0)); vector unsignedclass_cur=0;//待分配的教学班级序号,轮流为每个班级排课,一次安排一个班的一门课 for(unsignedn=0;n unsignedk=u(e); //如果某个班级的排课任务已经分配完成,则选择下一个班级继续排课 while(class_loc[class_cur]==arranges[class_cur].size()){ class_cur=(class_cur+1)%class_num; } //找到待排课任务的对应教师 stringtea=arranges[class_cur][class_loc[class_cur]].teacher; unsignedi=0; for(;i if(tea==teachers[i][0].teacher)break; } //找出与该教师无时间冲突的时段 do{ do{ while(ct.test(k)){k=(k+1)%(classroom_num*20);} unsignedm=0; for(;m if(arranges[class_cur][m].classroom_time%20==k%20)break; } if(m==class_loc[class_cur])break;//如果与前面已安排的该班级时间无冲突,则k可用 k=(k+1)%(classroom_num*20);//如果有冲突则检查下一个教室时段是否可用 }while (1); if(i==teachers.size())break;//教师未定 unsignedj=0; for(;j intm=arranges[teachers[i][j].class_loc][teachers[i][j].arrange_loc].classroom_time; if(m! =-1&&(m%20==k%20))break; } if(j==teachers[i].size())break;//如果与该教师的时间无冲
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高校 自动 系统