高校自动排课系统.docx
《高校自动排课系统.docx》由会员分享,可在线阅读,更多相关《高校自动排课系统.docx(19页珍藏版)》请在冰豆网上搜索。
高校自动排课系统
//简化版高校自动排课系统
//排课任务简化后包含:
年级专业(教学班级,如计科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<iostream>
#include<fstream>
#include
#include
#include
#include<bitset〉
#include 〈random〉
#include<iomanip>
usingnamespacestd;
//原始数据文件中的每一行数据的数据结构
structschedule {
stringgrade_special;//年级专业
ﻩstringcourse;//课程名称
string teacher;//任课教师
stringtotal_hour; //总学时
ﻩstringteach_hour;//讲课学时
ﻩstring experiment_hour;//实验学时
ﻩstringpractice_hour; //课程实践学时
stringcredit;//学分
ﻩstringweek_hour;//周学时
stringstart_stop;//起止周
ﻩstring speciality_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;//上课地点、时间
};
//教师倒排表数据结构,通过教师姓名找到该教师的排课情况
struct teacher_inverted{
ﻩteacher_inverted(string tea,int cl= -1,intar=-1) :
teacher(tea), class_loc(cl),arrange_loc(ar){}
ﻩstringteacher;
ﻩintclass_loc;
ﻩintarrange_loc;
};
//教室倒排表数据结构,通过教室名称查找该教室的排课情况
structclassroom_inverted{
classroom_inverted(string cr,intcl =-1,int ar = -1) :
classroom(cr),class_loc(cl),arrange_loc(ar) {}
string classroom;
ﻩintclass_loc;
intarrange_loc;
};
intmain(intargc,char**argv){
if(argc!
=3) {
ﻩcout〈〈”程序调用格式错误!
\n调用格式:
csp排课计划文件 可用教室文件\n”;
ﻩreturn0;
ﻩ}
ﻩifstream infile(argv[1]);
ﻩvectorﻩstrings;
ﻩgetline(infile,s);
while(getline(infile,s)) {
ﻩschedulesch;
istringstream record(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();
vectorarranges; //整个系的排课安排
ﻩvector<arrange>arr;//一个班的排课安排
string gs("”);//教学班级
ﻩ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<vector〈teacher_inverted>>teachers;//教师数组
for(unsignedi =0;i〈arranges。
size();++i){
ﻩfor(unsignedj = 0;j〈arranges[i]。
size();++j){
ﻩstringtea= arranges[i][j].teacher;
if(tea==”未定”)continue;
ﻩﻩunsignedk=0;
ﻩfor(;k〈teachers。
size();++k){
ﻩﻩﻩif (teachers[k][0].teacher==tea){
ﻩteachers[k].push_back(teacher_inverted(tea,i,j));
ﻩﻩbreak;
ﻩ}
ﻩ}
ﻩﻩif(k == teachers.size()) {
ﻩﻩvectorti;//一个教师的排课信息倒排表
ﻩﻩti。
push_back(teacher_inverted(tea,i, j));
ﻩﻩﻩteachers。
push_back(ti);
ﻩ}
ﻩ}
ﻩ}
constintN=256;
bitset〈N〉ct;//教室时段的分配状况
ﻩinfile。
open(argv[2]);;
ﻩvector<string〉classrooms;//教室数组
while (getline(infile,s)){
ﻩﻩclassrooms.push_back(s);
ﻩ}
ﻩinfile.close();
ﻩunsigned arrange_num =plan.size();//待排课数目
ﻩunsignedclass_num= arranges。
size(); //教学班级数目
ﻩunsignedclassroom_num=classrooms.size();//教室数目
ﻩuniform_int_distribution〈unsigned〉u(0,classroom_num*20-1); //为教室时段分配随机数
default_random_enginee(time(0));
vectorﻩunsignedclass_cur=0; //待分配的教学班级序号,轮流为每个班级排课,一次安排一个班的一门课
ﻩfor (unsignedn=0;n〈 arrange_num;++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<teachers.size();++i){
ﻩif(tea ==teachers[i][0].teacher)break;
}
ﻩ//找出与该教师无时间冲突的时段
ﻩdo{
ﻩﻩﻩdo{
while(ct。
test(k)) {k=(k+1) %(classroom_num*20); }
ﻩﻩunsigned m = 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< teachers[i]。
size();++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; //如果与该教师的时间无冲突,则k可用
ﻩk=(k+ 1)%(classroom_num * 20);//如果有冲突则检查下一个教室时段是否可用
ﻩ}while
(1);
//排课
ﻩarranges[class_cur][class_loc[class_cur]]。
classroom_time=k;
ﻩct。
set(k);
ﻩ//将当前班级的排课号+1
ﻩ++class_loc[class_cur];
ﻩﻩ//将待排课班级号+1
ﻩclass_cur= (class_cur+1)%class_num;
ﻩ}
loop:
//输出
ﻩcout<〈”\t\t高校自动排课系统\n";
ﻩcout〈<"选择查询条件:
1. 按班级2. 按教师3。
按教室\n";
cout<<"请输入查询序号:
(输入—1退出系统)";
ﻩunsigned choice=0;
cin〉〉choice;
if(-1 == choice){
ﻩcout 〈〈"正常退出系统\n”;
return 0;
}
ﻩelse if(1 == choice) {
unsigned i =0,j=0;
for (;i〈arranges.size();++i){
ﻩcout<< i〈<”。
"<< arranges[i][0].grade_special<〈 ”\t”;
ﻩﻩif ((i+1)%4==0)cout〈〈"\n”;
}
ﻩcout〈〈”\n";
ﻩdo {
ﻩﻩcout<〈”\n请输入待查询班级的序号:
(输入—1结束查询)";
ﻩﻩcin>> i;
ﻩif (i==-1) {
ﻩﻩbreak;
ﻩ}
ﻩﻩelse if(i〉=arranges.size()) {
ﻩcout<〈 ”非法选择\n”;
ﻩcontinue;
ﻩ}
ﻩintclass_table[4][5];
ﻩfor(unsignedm=0;m 〈4;++m)
for(unsigned n=0;n〈5; ++n)
ﻩﻩclass_table[m][n]=-1;
ﻩfor(j =0;jsize();++j) {
ﻩﻩunsigned m= arranges[i][j]。
classroom_time%20;
class_table[m /5][m%5]=j;
ﻩﻩﻩ}
ﻩﻩstring time_slot[4]={ ”8:
00-9:
40","10:
00-11:
40",”14:
00—15:
40”,"16:
00-17:
40”};
ﻩﻩcout<〈setiosflags(ios_base:
:
left);
ﻩﻩﻩcout <<setw(54)<< ” "〈〈 arranges[i][0].grade_special〈<"班级课程表\n";
ﻩcout<<"====================================================================================================================================\n";
ﻩﻩcout〈〈setw(12) <〈""<<setw(24)〈<”星期一”〈〈setw(24)〈〈"星期二”<<setw(24)<〈 ”星期三”〈<setw(24) 〈〈"星期四"〈〈setw(24)<<"星期五"〈〈"\n";
ﻩﻩfor(unsignedm= 0;m〈4;++m){
ﻩﻩﻩﻩif(m %2 ==0)
ﻩﻩﻩcout〈<”====================================================================================================================================\n";
ﻩﻩﻩelse
ﻩcout〈<”——-——---—----—-——-—--—-——---—-—-——--—---——-——--—---——---——--———-——--—-—-—--——-—--———-——-—--——-——-—-———---—--——-———---—-—-——-———————-\n”;
ﻩfor(unsignedm1=0; m1 < 3; ++m1){
ﻩﻩﻩif (m1== 1)
ﻩﻩﻩﻩcout<<setw(12) << time_slot[m];
ﻩﻩﻩﻩelse
ﻩﻩﻩﻩcout<〈setw(12)〈<”";
ﻩﻩfor(unsignedn=0;n< 5;++n) {
ﻩﻩif (class_table[m][n]!
=-1) {
ﻩﻩﻩﻩﻩﻩj =class_table[m][n];
if(m1== 0)
ﻩﻩcout<〈 setw(24)<course;
ﻩﻩﻩﻩelseif(m1==1)
ﻩﻩﻩcout〈〈setw(24) 〈〈classrooms[arranges[i][j]。
classroom_time/20];
ﻩﻩﻩﻩﻩﻩﻩelse
ﻩﻩﻩﻩﻩﻩﻩcout〈ﻩ}
ﻩﻩﻩﻩelse
ﻩﻩﻩﻩcout 〈ﻩﻩ}
ﻩﻩcout<<”\n”;
ﻩﻩ}
ﻩ}
ﻩﻩcout〈<"====================================================================================================================================\n”;
ﻩﻩcout〈〈resetiosflags(ios_base:
:
left);
ﻩ}while
(1);
ﻩ}
ﻩelseif(2 == choice) {
ﻩﻩunsignedi= 0,j= 0;
for(;i<teachers。
size();++i){
ﻩcout 〈〈i<〈 ”。
” <<teachers[i][0].teacher<<”\t";
ﻩif((i+1)% 4==0)cout <〈"\n”;
ﻩ}
cout<<”\n”;
ﻩﻩdo{
ﻩcout <<"\n请输入待查询教师的序号:
(输入-1结束查询)";
ﻩcin>〉i;
if(i==—1){
ﻩbreak;
ﻩ}
ﻩelse if(i〉=teachers.size()){
ﻩﻩcout〈〈"非法选择\n";
ﻩﻩﻩcontinue;
ﻩﻩ}
ﻩﻩintclass_table[4][5];
ﻩfor(unsignedm=0;m<4;++m)
ﻩﻩfor (unsigned n=0;n〈5;++n)
ﻩﻩﻩclass_table[m][n]=-1;
for(j=0;j〈teachers[i]。
size();++j) {
ﻩﻩunsignedm=arranges[teachers[i][j]。
class_loc][teachers[i][j].arrange_loc]。
classroom_time /20;
ﻩﻩﻩﻩclass_table[m/5][m%5]=j;
ﻩﻩ}
ﻩstringtime_slot[4]= {"8:
00—9:
40",”10:
00-11:
40”,"14:
00—15:
40”, "16:
00—17:
40”};
cout<< setiosflags(ios_base:
:
left);
ﻩcout<〈setw(54) 〈〈""<〈 teachers[i][0]。
teacher〈<”老师课程表\n”;
cout〈〈 ”====================================================================================================================================\n";
ﻩcout<〈 setw(12)〈<”" 〈< setw(24)〈〈 ”星期一"<ﻩﻩfor(unsignedm=0;m〈4;++m) {
ﻩﻩﻩif (m%2==0)
ﻩﻩﻩcout〈〈"====================================================================================================================================\n”;
ﻩﻩelse
ﻩﻩﻩﻩcout 〈<"——--—————---————----—-——--—-—-—---—---—-—---——--—--—--————---———----———-----—-—-——-——---—-------——-——--———--—-——————-——--————-—-—---\n";
ﻩfor (unsignedm1=0;m1〈3;++m1) {
ﻩif(m1==1)
ﻩﻩcout〈ﻩﻩﻩﻩelse
cout〈< setw(12)<〈””;
ﻩﻩﻩfor(unsignedn=0;n 〈5; ++n) {
ﻩﻩif (class_table[m][n]!
=-1){
ﻩﻩﻩﻩﻩj=class_table[m][n];
ﻩﻩﻩﻩif(m1==0)
ﻩcout〈〈 setw(24) 〈〈 arranges[teachers[i][j]。
class_loc][teachers[i][j].arrange_loc]。
course;
ﻩﻩﻩﻩelseif (m1==1)
ﻩﻩﻩﻩﻩcout〈class_loc][teachers[i][j]。
arrange_loc]。
classroom_time/20];
ﻩﻩelse
ﻩﻩﻩﻩﻩﻩcout<〈setw(24)<