目前流行的几种排课算法的介绍
2 目前流行的几种排课算法的介绍
2.1. 自动排课算法
1 .问题的描述
我们讨论的自动排课问题的简化描述如下:
1 , C
2 , ., Cn} ,课程总数为n , 而各门课程每周安排次数(每次为连续的2 学时) 为{ N1 , N2 , ., Nn}
教学日最多安排4 次课程教学,即1 ~ 2 节、3 ~ 4 节、5 ~ 6 节和7 ~8 节(以下分别称第1 、2 、种假设下,显然每周的教学总时间段数为5 ×4 = 20 ,并存在以下约束关系:
n ≤20 , (1)
???N = 6n,i =1,Ni ≤20. (2)
适当的数据结构和算法, 以确定{ C1 , C2 , ., Cn } 中每个课程的教学应占据的时间段,并且保证任何一个时
据.
2 .主要数据结构
配2 个字节的“时间段分配字”(无符号整数) :{ T1 , T2 , ., Tn} . 其中任何一个时间段分配字(假设为Ti 格式定义为:unsigned int .Ti 的最高位是该课程目前是否是有效的标志,0 表示有效,1 表示无效(如停课等)占连续的3 个位(bit) ,表示某教学日(星期一~星期五) 安排该课程的时间段的值,0 表示当日未安排,1 ~
时间段(超过4 的值无效) .
时间段分配字的值应小于32 768 (十六进制8000) , 而大于等于32 768 的时间段分配字对应于那些当前无配位已设置好也如此) , 因此很容易实现停课/ 开课处理.
3 .排课算法
在上述假设下,自动排课算法的目标就是确定{ C1 , C2 , ., Cn} 所对应的{ T1 , T2 , ., Tn} .
共有(即有A(20,(N-20)))20 !/ (20 - N) !种排法( N 的含义见(2) 式) . 如果有4 门课,每门课一周上
就会有20 !/ (20 - 8) ! = 5 079 110 400 ,即50 多亿种. 如果毫无原则地在其中选择一种方案,将会耗费巨确定的排课原则. 我们采用轮转分配法作为排课原则:从星期一第1 时间段开始按{ C1 , C2 , ., Cn} 中所列,再按该顺序继续向后面的时间段进行安排,直到所有课程的开课次数符合{ 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 ]的值减
如果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[2 ] , T [3 ] , ., T [ n ]} 中的某个分配字是否存在相同课程分配, T [3 ] , .,T[ n ]} 中是否存在与T [1 ] 冲突的时间段分配字. 为简化起见,在以下算法描述中假设所有时
为0.
算法2 冲突检测算法
输入T1 和{ T2 , ., Tn} .
输出与T1 冲突的{ T2 , ., Tn} 中的时间段分配字.
①对c-index = 2 ,3 , ., n 做以下操作:
初始化屏蔽字mask = 7
对星期值week = 1 ,2 ,3 ,4 ,5 做以下操作:
如果T[1] & mask 等于T[c-index] & mask ,而且二者不等于0
则: T[ 1 ]与T[c-index ]相冲突,转①
mask 左移3 位(或乘8)
②算法结束
本算法时间复杂度为O ( n) ( n 为课程门数)
5.算法分析
,进行搜索匹配,取最先匹配的值;具有占有空间少,运算速度快的特点。但其未对数据进行择优选取,所也不能满足一些特殊要求(比如有些老师喜欢上午上课,有些老师偏向于集中式上课;有些课程安排到上
程不能安排到上午等)。
2.2 基于优先级的排课算法
是一个在时间、教师、学生和教室四维空间, 以教学计划和各种特殊要求为约束条件的组合规划问题。其实的冲突。在设计算法时, 为了降低课程调度的算法复杂性, 我们主要采用了化整为零的思想及优先级算法:
1.排课的预处理
1.等价类的划分
任务划分在同一等价类中, 在每个等价类之间只存在地点上的冲突, 而没有时间上的冲突。然后按照的大小
等价类的划分可以先按年级分, 然后再按系别分,如下所示:
听课对象等价类的划分
自控系机械系化工系管理系.
99 级N 1 子类1 子类2 子类3 子类4 .
98 级N 2 子类5 子类6 子类7 子类8 .
97 级N 3 子类9 子类10 子类11 子类12 .
96 级N 4 子类13 子类14 子类15 子类16 .
个类: 99 级(N 1) , 98 级(N 2) , 97 级(N 3) , 96 级(N 4) , 而对每一个等价类N 1、N 2、N 3、N 4 又个子类, 然后对每个子类分别进行排课处理, 这样做就可以大大降低算法的复杂性
2.教室分类
用教室, 我们采用了教室分类的办法,以便尽可能在课程编排过程中避免上课人数少的课程盲目强占容量大的分为若干个等价类, 如下所示,然后, 根据教室的容量再分别对每个教室等价类进行划分: 如分为0~30 人
0 人、90~120 人、120~180 人等若干种
教室等价类的划分:
教室类型等价类R 教室类型等价类R
普通教室R1 听力教室R5
投影教室R2 物理实验室R6
多媒体教室R3 化学实验教室R7
制图教室R4 计算机实验教学R8