目前流行的几种排课算法的介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2 目前流行得几种排课算法得介绍
2.1、自动排课算法
1 、问题得描述
我们讨论得自动排课问题得简化描述如下:
设要安排得课程为{ C1 , C2 , 、, Cn} ,课程总数为n ,
而各门课程每周安排次数(每次为连续得2 学时> 为{ N1 , N2 , 、, Nn} 。每周教案日共5 天,即星期一~星期五。每个教案日最多安排4 次课程教案,即1 ~ 2 节、3 ~ 4 节、5 ~ 6 节与7 ~ 8 节(以下分别称第1 、2 、3 、4 时间段> 、
在这种假设下,显然每周得教案总时间段数为5 ×4 = 20 ,并存在以下约束关系:
n ≤20 , (1>
N = 6n, i =1, Ni ≤20、 (2>
自动排课问题就是:设计适当得数据结构与算法, 以确定{ C1 , C2 , 、, Cn }
中每个课程得教案应占据得时间段,并且保证任何一个时间段仅由一门课程占据、
2 、主要数据结构
对于每一门课程,分配2 个字节得“时间段分配字”(无符号整数> :{ T1 , T2 , 、, Tn} 、
其中任何一个时间段分配字(假设为Ti > 都具有如下格式:
Ti 得数据类型C 语言格式定义为:unsigned int 、 Ti
得最高位就是该课程目前就是否就是有效得标志,0 表示有效,1
表示无效(如停课等> 。其它各位称为课程分配位, 每个课程分配位占连续得3
个位(bit> ,表示某教案日(星期一~星期五> 安排该课程得时间段得值,0
表示当日未安排,1 ~ 4 表示所安排得相应得时间段(超过4 得值无效> 、
在这种设计下, 有效得时间段分配字得值应小于32 768 (十六进制8000> , 而大于等于32 768 得时间段分配字对应于那些当前无效得课程(既使课程分配位已设置好也如此> ,
因此很容易实现停课/ 开课处理、
3 、排课算法
在上述假设下,自动排课算法得目标就就是确定{ C1 , C2 , 、, Cn} 所对应得{ T1 , T2 , 、, Tn} 、
从安排得可能性上瞧,共有20 !/ (20 - N> !种排法( N 得含义见(2> 式> 、如果有4
门课,每门课一周上2 次,则N = 8 ,这8 次课可能得安排方法就会有20 !/ (20 - 8> ! = 5 079 110 400 ,即50 多亿种、如果毫无原则地在其中选择一种方案,将会耗费巨大量得时间、
所以排课得前提就是必须有一个确定得排课原则、
我们采用轮转分配法作为排课原则:从星期一第1 时间段开始按{ C1 , C2 , 、, Cn}
中所列顺序安排完各门课程之后(每门课安排1
次> ,再按该顺序继续向后面得时间段进行安排,直到所有课程得开课次数符合{ N1 , N2 , 、, Nn} 中给定得值为止、在算法描述中将用{ C[1 ] , C[2 ] , 、, C[ n ]} 表示{ C1 , C2 , 、, Cn} , 对{ N1 , N2 , 、, Nn}
与{ T1 , T2 , 、, Tn} 也采用同样得表示法、
算法1 排课算法
输入{ C1 , C2 , 、, Cn} 、{ N1 , N2 , 、, Nn} 、
输出{ T1 , T2 , 、, Tn} 、
①初始化:
星期值week = 1
时间段值segment = 1
{ T [1 ] , T [2 ] , 、, T [ n ]} 中各时间段分配字清零
②新一轮扫描课程:
置继续处理标志flag = 0
对课程索引值c-index = 1 ,2 , 、, n 进行以下操作:
如果N[c-index ] > 0 ,则做以下操作:
把segment 得值写入T[c-index ]得第(week - 1> 3 3~week 3 3 - 1 位中N[c-index ]得值减1
如果N[c-index ] > 0 ,则置flag = 1
如果week = 5 并且segment = 4
则:置flag = 1 并转③
否则:如果segment = 4
则:置segment = 1 且week 增1
否则:segment 增1
检测就是否已全部安排完毕:
如果flag = 1
则:转②
否则:转③
③检测就是否成功:
如果flag = 1
则:开课次数过多
否则:课程安排成功
④算法结束
显然,本算法得时间复杂度为O ( N> ( N 为每周总开课次数, 见(2> 式> ,
而存储时间段分配字所用空间为2 n 个字节( n 为课程门数> 、
4 、冲突检测算法
有时在自动排课完毕后,需要人工调整某些课程得安排时间,如把第i
门课程在人工干预下改成星期数为week 、时间段为segment
得位置,则根据上述数据结构需做如下运算:
T [ i ] = T [ i ] &(~ (7 << (week - 1> * 3> > + (segment << (week - 1>*3> ,
其中&、~与n 分别为按位与、按位取反与按位左移运算符(下同> 、
问题就是如何判断就是否已有其它课程安排在同一个时间段上、设人工调整得时间段分配字为T[1 ] ,则该问题描述为:判断时间段分配字T [1 ] 与{ T[2 ] , T [3 ] , 、, T [ n ]}
中得某个分配字就是否存在相同课程分配位上得相等得非零时间段值, 或者说{ T [2 ] , T [3 ] , 、,T[ n ]} 中就是否存在与T [1 ] 冲突得时间段分配字、