排课冲突检测C语言
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
排课冲突检测C语言
课表编排实际上就是一个组合规划问题,也就是将时间、课程、教师、教室和学生这几点相结合的过程。
排课过程中的首要问题是解决冲突问题,也就是教师、教室和学生之间的安排要合理,不能产生冲突,例如一个教师只能给一个班上课,一个教室也不能同时容纳两个班上课(合班课除外),但是有冲突的课表一定不是好课表,那么有没有冲突也不是判断课表好坏的唯一条件。
例如有的课程或教师可能在时间上有一些具体的要求,有些课程还可能对教室或场地有不同的要求,这些都要求在排课过程中予以考虑。
在避免了冲突和考虑到所有特殊要求之后安排出的课表才能够符合学生和教师的需要,与学校的管理要求相符合。
从而提高学校资源的利用率,提高学生的学习效率。
在排课过程在之前,用户首先要在表格中输人原始的数据,然后按照前面的算法来进行操作,在排课过程中最主要的问题是数据结构的实现,在这里用用数据库中的多张表格来实现数据结构,然后再输人原始数据,所以这里必须要设计一种简洁合理的方式来实现这个问题。
在实现过程中,将这些先决条件分为两类:字典表维护类和排课初始信息设置类。
其中,维护字典表类主要是对排课用到的字典表(科目字典表、固定教室字典表、教师字典表)进行操作,这些操作相对来说比较简单,包括添加、删除(置无效)等。
由于这两张表会因学校情况不同而有不同数量的记录,并且在排课系统初始设置后一般不
会更改。
排课算法的优劣不仅仅在于它是否满足了所有的硬约束条件,还要看它是否满足尽可能多的软约束条件。
满足的软约束条件越多,排课的效果就越好。
为了避免冲突,我们在排课时还设定了不同的约束条件,这样才能保证教学工作的正常运行,例如一个教学班在同一时间内只能上--门课,一名教师在同--时间只能给-一个班上课(合班
课除外)。
设计排课算法的重点是对教师、时间、教室、课程等资源
进行组合优化,并能够;充分发挥各种资源的优势来避免冲突的发生。
这样才能取得最好的排课效果。
在实际计算的过程中每个约束条件都会被赋予一个优先级别,优先级别高的约束条件要首先满足,然后再考虑优先级别低的约束条件。
在这里,约束条件被分为三类:强制约束条件、特殊优先约束条件和相对约束条件,这三种约束条件的优先级别依次降低。
排出的课表是否合理、有效是衡量排课系统能否使用的关键因素,合理性、有效性是排课的基本要求,排课系统最关键的部分就是处理排课问题的算法问题,只有选择一个合适的算法才能保证排课结果的合理性。
自动排课所排出的课表不仅要合理,还要能够准确无误的反映出教师、班级之间的时间关系。
所以,采用适当的排课算法往往能起到事半功倍的效果,本文采用回溯算法来实现排课,在具体实现过程中将优先级与回溯算法相结合。
在排课完成之后,并不意味着排课结束,因为预排课程只
是系统给出的最佳排课方案,这只是逻辑上的最优解,而由于软约束
条件的抽象性,它的数据信息不能为计算机所识别,所以在实际情况中可能有明显的错误,或根本难以执行,所以,在排课系统自动排课完成之后还要根据实际情况针对这样或那样的问题进行手动微调。
最终形成一个多元向量(room_num,class_num,day,time,week)用来对结果进行存储。
基于上面设计的排课数据结构以及用到的排课控制算法,为了完成对课表的编排。
遵循这样的算法来解决排课过程中的各种冲突问题,也就是在排课过程中如何处理冲突问题的算法。
冲突的检查方法如图所示:
算法设计如下:
开始:(1)检查教室代码为room..num的教室在所给上课周次week下,在指定星期day的time上课时段是否占用。
如已占用则退出;否则转下一步;(2)根据教学班代码class__num获取其上课教师编码teach.num。
若为空转(4);否则转下一步;(3)检查教师编
码为teach.num的教师在上课周次week下,在指定星期day的time.上课时段是否安排课程。
若已安排则产生教师上课时段冲突异常并结束,报错eror;否则转下一步;(4)检查教学班代码为class__num 的课程在上课周次week下。
在指定星期day的time上课时段是否已被安排过。
若已安排则产生同一门课程上课时段冲突异常并结束:否则转下一步;(5)如果课程class_num为全校公共课,则转(6);否则检测当前上课周次week下指定星期day的time。
上课时段是否已经安排该专业年级的专业课。
若已安排则根据用户的需求来确定是退出或者继续安排;否则转(7);(6)检查课程class__num所在组的其它公共课程是否在已经安排过,让用户确保所划分的--组公共课程安排相同的上课时段,以方便排课及学生选课。
转下一步;(7)正式将排课向量(class__num,room_num,day,time,week)写人排课结果表。
根据排课控制算法刷新待排课课程信息。