高校自动排课系统
基于C语言开发一种自动编排课表系统

时 开 授 ( 教 室 代 码 格 式 为 : M01, M02, M03, M04, M05, M06, M07, M08, M09,M10,M11, M12)。 2) 每节课的课时单元为两小时,连续一次排完。 3) 学院有授课老师四十位,教师职位(用输入编码代号的方式来代表输入教 授、副教授、讲师、助教)如表 3 示:
说明:第一个索引值“[4]”代表课表共有 4 列(第 1 ~ 4 节课),第二个索 引值“[5]”代表课表共有 5 行(星期一 ~ 星期五)如表 1 示:
表1
mask_array [0] [1] [2] [3] [4]
[0]
00000
[1]
00000
[2]
00100
[3]
00100
说明:若在程序执行中,若 mask_array[][]的值等于“1”,表示该老师 在该时段不能排课;若 mask_array[][]的值等于“0”,表示该老师在该时段 可以排课。在上图中表示该老师在星期三、四的下午不能排课。 2) data_array[40][12]
关键词:C语言;自动排课;系统
21 世 纪这 个信息 急 速发 达的时 代,办公 自 动化也已成 为现 实。智能 化的产 品 也 越 来 越多地 应 用于 学习 、办 公、教 育等 领域。智能化产 品不仅 能够 使人们 工作 和 学 习 越来越 轻 松,而且 可以 大大 提高 工 作效率。对于学校 来说,排 课 调课是高 校 教 务 管理的 一 项日 常工 作,因其 费时 费 力,手工 完成多易 出错,所 以 利用计算 机这个工具进行自动排课的想法自然 而生。
高校排课系统设计研究

给我们 带来 很大的便 利,为什 么我们不考虑使用云存储技术 实现系统的无环 境限制办公呢?计算机技术 日新月异 的变化,
2 0 1 3 年 第 8 期
( 总第 1 3 0期 )
信 息 通 信
I NF 0RM AT1 0N & C0M M UNI CAT1 0NS
2 O1 3
( S u m . N o 1 3 0 )
高校排课 系统设计研 究
翟 勇, 程高飞
( 攀枝 花学院 , 四川 攀枝花 6 1 7 0 0 0 )
相 关 论 文 的 研 究与 分 析 , 总 结 出 目前 系统 设 计 的优 势及 存在 问题 , 并 提 出今 后 系统 设 计 研 究 的发 展 方 向 。 关键词 : 排课 系统 ; 软件 ; 学分制 ; 教 学 中图分类号 : T P 3 l 1 . 5 2 文献标识码 : A 文 章编 号 : 1 6 7 3 — 1 1 3 1 ( 2 0 1 3 ) 0 8 一 O 1 5 6 — 0 l
配 教 学 资源 。 因 此 ,充 分 利 用 教 学 资 源 是 每 个 高校 需 要 解 决 的 问题 , 目前 也有 很 多 软件 公 司 涉 足 教 学 软 件 的 设 计 , 在 查 阅 了高 校排 课 系 统 相 关 论 文 后 ,结 合 我 校 的 实 际情 况 提 出 以下 看法 。
1 系统 设 计前 期 研 究方面
各设计人员在对高校教务需求方面 , 分别从学生人数、 教 学资源、 教师 、 课程等方面做了精 心的调研 。能根据各个高校 的实际情7 兄出发找到解 决方 案。但 是对 于适用于所有高校的 排课系统研 究方面还存在不 足。或者说只能认识到 问题但没 有具体的解决方案。 排课 系统是一个复杂的工程 , 课程安排是 否合理直接影响到教学效果。因此 , 应该有 专业 的团队来研 究 教学规律 、 教 学课表实施合理性等方面 。目前国内的几大教学 管理系统公司 ( 例如正方 、 金窗 、 青果) , 在排课系统设计方面 , 通用性框架搭建 比较合理, 基本 能满足普通高校的需求 。 但是
高校综合教务管理系统功能详解

高校综合教务管理系统功能详解in 教务管理, 教务管理系统, 教学管理系统高校综合教务管理系统(JWGL )是一个大型复杂的计算机网络信息系统,采用基于浏览器/ 服务器(B/S ),客户端/ 服务器(C/S )混合的应用体系结构来建设高校网络教务管理系统,使高校教务管理真正实现远程办公、异地办公。
满足各类高校现在和将来对信息资源采集、存储、处理、组织、管理和利用的需求,实现信息资源的高度集成与共享,实现信息资源的集中管理和统一调度。
为各级决策管理部门提出准确、及时的相关信息和快捷、方便、科学的决策分析处理系统;为信息交流、教务管理提供一个高效快捷的电子化手段;最终达到进一步提高各级领导科学决策水平,提高各院系、各部门管理人员管理水平与办公效率,减轻工作负担的目的。
系统简介随着我国高校教学体制改革的发展,更加体现出以人为本的教育方针政策。
学生自主地选择专业及专业方向、课程的选修机制、实验预约、成绩审核、学分制等管理方式的改革向传统的管理软件提出了新的挑战。
基于这种广泛的需求。
在充分综合各高校特点的前提下,在多年深入研究的基础上,推出了一整套能够适应新的教学体制、能够最大程度满足高校现代化管理要求的教务管理系统。
教务管理涉及到学生从入学到毕业的全过程管理,包括学籍管理、教学计划、开课/ 排课、选课、成绩管理、实验管理、毕业设计及教学质量监控等多个环节。
“高校综合教务管理系统”包括系统工具、教学资源、学籍管理、教学计划、开课管理、智能排课、选课、考务、成绩管理、毕业设计、开放性试验室、毕业资格审查,毕业环节管理,教学质量监控、教材管理等十余个子系统,适用于综合性大学、学院、专科、中专及职业学校,能够完成学年制、学年学分制、完全学分制学校教务管理部门对学生从入学到毕业离校的全过程管理。
高校教务管理工作是高等教育中的一个极为重要的环节,是整个院校管理的核心和基础。
面对种类繁多的数据和报表,手工处理方式已经很难跟上现代化管理的步伐,随着计算机及通讯技术的飞速发展,高等教育对教务管理工作提出了更高的要求。
智能排课系统设计与实现

智能排课系统设计与实现摘要排课问题是所有教育行业都要面对的问题,尤其针对高校纷繁复杂的课程和专业,一直没有很好解决方法。
但这又是每个学校在每个学期都会碰到的必修课。
本文在相关理论的指导下,在分析以往一些排课软件的基础上,提出一种排课系统的设计方法,对一些具体的...<P>摘 要<BR>排课问题是所有教育行业都要面对的问题,尤其针对高校纷繁复杂的课程和专业,一直没有很好解决方法。
但这又是每个学校在每个学期都会碰到的必修课。
本文在相关理论的指导下,在分析以往一些排课软件的基础上,提出一种排课系统的设计方法,对一些具体的问题给出相应解决方案。
希望对于相关部门有所帮助。
此系统主要被分为三个部分:界面的设计、排课算法的设计、以及报表的自动生成。
纵观全局,我们确定用Visual Basic 语言作为程序设计语言以及运用ACCESS 数据库作为后台的数据库支持(所有权: 毕业设计网) <BR><BR>目 录<BR>摘 要. I <BR>Abstract II <BR>第一章 引言. 1 <BR>第二章 可行性研究. 3 <BR>2.1 系统目标及任务. 3 <BR>2.2 开发工具的选择和介绍. 3 <BR>2.3 对现有的排课系统的分析. 5 <BR>2.4系统的逻辑模型. 6 <BR>2.4.1 系统结构图. 6 <BR>2.4.2 系统流程图. 6 <BR>2.4.3数据字典. 7 <BR>2.5 系统的可行性. 8 <BR>2.5.1经济可行性分析. 8 <BR>2.5.2操作可行性分析. 9<BR>2.5.3 技术可行性分析. 9 <BR>2.6成本效益分析. 9 <BR>第三章 需求分析. 10 <BR>3.1 系统的运行环境要求. 10 <BR>3.1.1硬件要求. 10 <BR>3.1.2软件要求. 10 <BR>3.2 系统的功能要求. 10<BR>3.3系统的性能要求. 11 <BR>3.3.1 E-R图. 11 <BR>第四章 总体设计. 13 <BR>4.1 模块设计. 13 <BR>4.2 功能分解. 14<BR>4.3 数据库设计. 14 <BR>4.3.1 定义属性表. 14 <BR>4.4 排课系统总构架. 16 <BR>第五章 详细设计. 17 <BR>(所有权: 毕业设计网) <BR>5.1用户界面设计. 17 <BR>5.1.1简单易用和个性化需求. 17<BR>5.1.2对数据的查询. 17 <BR>5.1.3系统菜单功能. 17 <BR>5.2 课程表的生成. 19 <BR>5.2.1 班级课程表查询打印设计. 19 <BR>5.2.2 教师课程表查询打印设计. 25 <BR>5.2.3 教室课程表查询打印设计. 31<BR>第六章 测试. 37 <BR>6.1 排课系统功能测试. 37<BR>6.2 排课系统课表合理性测试. 37 <BR>6.3 该系统的不足和改进方案. 37 <BR>第七章 总结. 39 <p class='Hfh874'></p> <BR>7.1软件设计小结. 39 <BR>参考文献. 40 <BR>附 录. 41<BR>Survey Report 45 <BR><BR>功能分解<BR>基本信息管理子系统功能:班级信息,教室信息和教室信息的添加、保存、编辑和删除:<BR>1、用户管理子系统功能:用户密码的设置和修改,用户权限的设置,用户重新登陆;<BR>2、数据管理子系统功能:包括对教室、教师、班级、教学计划和课表数据的保存、查询、更新、删除;<BR>3、教学计划管理子系统功能:某一确定的学期的教学工作计划,对于班级而言,每门课程的学时、开始周、结束周以及每门课程的任课教师,该子系统对教学计划进行管理和完善;<BR>4、排课管理子系统功能:包括自动排课,手动排课两个部分;<BR>5、课表查询子系统功能:对于具体的班级、教师、教室进行课表查询,打印<span class='Hfh874'></span> </P><P> </P><P> <font color='#9a9a9a'></font> </P><P></P><p>1、研究思路<br />本文首先从选题研究的背景、意义进行归纳研究。
高校自动排课算法的研究与实现

高校自动排课算法的研究与实现一、什么是自动排课你有没有遇到过这种情况:一到新学期,课程安排就像一场“天书”,你摸不着头脑,感觉整个时间表就像是用魔法弄出来的。
班级、教师、教室、时间,明明是这些看似简单的东西,却总是难得凑齐,仿佛是天上的星星每一颗都不在同一个轨道上。
别着急,其实我们要讲的就是这个“自动排课”——给你一个神器,它能把这些东西都给排好,让你不再迷失在一堆杂乱无章的课程表里。
说白了,自动排课其实就是一套系统,它帮助学校自动把各种课程、教室、老师、学生的安排都搞定。
听上去是不是很高大上?其实呢,它就是个程序,通过一堆看不见的算法,把这些繁琐的任务化繁为简,让你省下好多时间去做更有趣的事。
自动排课的好处,简直不言而喻,省时、省力,还能避免排错课、时间冲突这些糟心的事。
谁不希望能轻松一把,提前看到安排好的课程表?二、自动排课的难点说起自动排课,大家可能以为这就是一件简单的事,嗯,像点外卖一样,随便点点就好。
但你知道吗,排课可真不是那么简单!如果说排课是做饭,那自动排课就是一门高难度的烹饪技艺。
得确保教师的空闲时间与课程安排对上;得安排合适的教室,最好每个教室都有符合要求的设备;学生的选课情况得时刻盯着,不能让学生重复上同一门课或者时间冲突。
这些看似简单的小事,真是能让人头大。
有时候你会发现,一些课程本来应该按计划进行的,但就是有那么几个原因,让整个排课计划乱得不成样子。
比如说,老师突然生病了,或者有学生要参加什么重要的活动,这时候,怎么调整就变成了一个难题。
大家都知道,排课这事儿,真是个“见缝插针”的活儿。
哪怕是一个小小的调整,背后都可能牵扯到一大堆其他的事情。
所以,自动排课系统就成了各大高校的“救星”,它能通过精准的运算,把这些变量一一考虑进去,尽量避免冲突。
三、如何实现自动排课自动排课系统究竟是怎么做的呢?这里面可大有玄机!得把所有的课程、老师、教室、学生信息都给收集齐全。
你可能觉得这只是些数据,但实际上,这些数据就像一个个“线索”,只有把它们拼凑在一起,才能做出完整的排课方案。
基于.NET的高校排课系统设计与实现

第32卷第2期2013年2月绵阳师范学院学报Journal of Mianyang Normal University Vol.32No.2Feb.,2013收稿日期:2012-10-26作者简介:张正柱(1983-),男,讲师,硕士,主要研究方向:.NET 平台软件开发与教学工作.E -mail :zh.zz@qq.com基于.NET 的高校排课系统设计与实现张正柱,林风人(福建工程学院软件学院,福建福州350003)摘要:计算机信息管理与数据库处理技术,对高校排课问题进行归纳和分析,提出排课系统的逻辑模型以及基于SQL 关系运算的排课算法.结合实际排课需求,基于.NET 平台设计并实现了一个对全校的课程进行汇总,按照教学计划及教学资源,完成自动教学班组建,自动课程安排的高校排课系统.关键词:.NET ;排课系统;SQL 关系运算中图分类号:TP331.52文献标识码:A 文章编号:1672-612x (2013)02-0086-051引言随着计算机以及网络的飞速发展,高校招生规模逐年增加,班级数量、专业课程数量不断增多,采用传统的手工排课方式去实现排课,工作量巨大.由于学校资源众多,教学所需的教室类型也繁杂,加上人数众多,课程顺应技术的发展经常变化,所以,合理管理教学资源并且资源的充分利用及教学信息的管理非常重要.目前,高校排课问题已被证明是一个NP 完全问题,由于其具有难解性和复杂性,因此一直没有得到很好解决受到研究者的关注[1].大部分高校都相继推出教学管理系统并投入使用,但是在实际上的项目开发中,排课系统是一个相对复杂的系统.本文所设计的高校排课系统的主要任务是对全校的课程进行汇总,按照教学计划及教学资源,在学校范围内统一安排产生一个合适逻辑及规定的教学实践及教学空间,来满足教学的需要,并尽量优化教学资源及资源的使用顺序,来满足教学工作的需要.手工排课是件非常复杂、耗时、严谨思维、任务繁重的工作,计算机自动排课代替手工排课势在必行.2排课系统问题分析2.1排课问题概述由于扩招,排课最需要的教室资源在学生规模逐年增加的趋势下越发显得紧张.课表编排是一个充满着冲突的过程,主要冲突包括所开课程、上课时间、上课班级、上课地点、任课教师等多方面争夺某一教学资源,从而出现矛盾,导致教学工作不能正常进行[2].排课工作进行的难度就在于所受到的相对复杂的排课约束.只有系统了解排课所受的约束,才能根据约束在现有的资源情况下,更高效、更合理地安排上课时间地点[3].排课主要问题包括:必须根据教学计划进行课程安排;允许自由指定排课的节次;每门课可允许指定一天之内最多上几节,包括理论与实验节数;允许指定某教师一天最大的上课节数;指定某些节次不排课;指定某教室在某个节次不能排课;指定整个学院级的课程在某个节次排课或者不排课;指定某个专业班级课程在某个节次排课或者不排课;指定某个任课教师在某个节次上课或者不安排课;指定某课程在某个教室上课;指定某专业的所有课程都安排在哪个教学楼上课;排课顺序可以按照某种字段进行排序;选择教室时,必须考虑教学楼之间的间距;排课结束后,可以打印出班级课程表、教师课程表、教室课程表;能产生教师汇总表、教室汇总表,并统计使用率;产生的课程表一周之内的分布尽量均匀合理;班级使用的教室尽量集中;排课结果可以方便调整;排课结果不能冲突等.满足并解决这些问题,即可实现一个比较通用、使用方便、效率高的排课系统.可以看出,排课问题是一个多目标、有限资源条件下、并且带有模糊约束条件的组合规划问题,称为模糊组合规划.这里所指的多目标是指排课结果有多个解集,目标非唯一性.有限资源指有限的教室资源、时间节次资源、授课教师资源等.2.2排课系统的逻辑模型本排课系统在充分研究手工排课系统的基础上,结合计算机信息管理与数据库处理的技术,进行教学计划管理、开课课程信息管理、教师选课管理、教学班管理、排课管理等内容.本系统确定的排课对象是专业班级课程、节次、教室.整个排课的过程分成以下步骤:1.确定开课计划.开课计划是整个系统的起始,影响到各个专业班级的开课课程、选课与排课.2.确定某学年度某学期某专业班级的开课课程信息.3.教师选课、审核、审批.4.组建教学班.教学班是实施教学的基本单位,引入教学班的目的是区别大小班上课,通过教学班的管理,可以节约教师资源与教室资源.5.自动排课.在组建教学班的基础上,教学班是一个重要的排课对象,教学班所包含的信息很多、班级信息、教师选课信息、需要的授课教室类型信息、课程信息等,通过自动排课算法,根据需要的教室类型信息、寻找合适的节次,即可安排某教学班在某一节次在某一教室上课了.当然,为实现计算机自动排课,需要对以上这些表格进行编码管理,同时,还需要一系列的代码信息如教师信息、专业班级信息、教室类型信息、教室信息、周节次信息、课程信息等,采用数据库的管理,实现合理的安排.3排课算法分析与设计3.1排课对象分析排课算法研究的对象是上课班级、所开课程、任课教师、上课时间、上课地点这5个方面,在各种的排列组合中所发生的冲突和矛盾现象的解决与排除,进而得到一个符合教学习惯,满足各种约束条件的效果良好的最优课程表.综合上面5个排课对象问题,本排课系统引入教学班的概念,把排课对象问题从5个变成3个,即课程教学班、节次、教室问题.教学班是指,某门具体的课程,由哪些共同上这门课的班级组成,对该教学班指定一些重要的属性如课程名称、课时、授课教师、班级组成、人数、需要的教室类型等.对教学班课程排课,就是对教师排课,对班级排课,这样,就把班级、教师、课程这3个排课对象合并在一起考虑,根据内在的属性以及这些对象的约束条件进行系统的统一的规划.排课时,针对课程教学班,把它无冲突地放在一个周课程表的二维表中,并为这个周课程表的具体节次安排合适的满足要求的无冲突的教室,即可完成该课程教学班的排课任务.3.2排课算法的总体设计排课的过程主要分为两个步骤,首先对课程教学班进行时间节次分配,然后在时间节次分配的基础上进行教室分配.排课算法的作用就是将各种无序的原始数据(开课计划、选课课程)进行一系列操作,而生成有序的最终数据(课程表).目前的排课算法有基于优先级自动排课算法[4]、人工智能排课算法、专家系统排课算法、基于分组优化和矩阵运算的自动排课算法等,各自采用不同的方式实现排课系统的算法研究及实现[5].这一系列操作主要包括两个算法:时间节次安排算法和教室安排算法.在这2个算法的过程中,充分考虑各种条件因素,从而生成有效课表.其中时间节次安排算法和教室安排算法中,都采用基于SQL 的关系运算算法进行处理.教室安排算法依赖节次安排算法产生的节次结果,不同节次可能建立产生的教室资源不同,所以在动态的教室集合中,去寻找“最合适”的教室资源.自动排课算法选择尚未排课的教学班,然后顺序地对教学班进行课程表安排.优先安排带有约束条件的教学班,完成后,再安排正常的尚未排课的教学班,算法描述如图1所示.·78·张正柱等:基于.NET 的高校排课系统设计与实现第2期图1自动排课算法Fig.1Auto course scheduling algorithm4排课系统设计与实现4.1开发及运行平台本文所设计的排课系统是基于C /S 结构,采用微软的.NET 平台,以C#作为开发语言,使用Visual Stu-dio .NET 开发工具完成的.考虑版本升级及跟踪最新技术的各种新特性应用,以及各个版本的运行库安装包大小,选择.NET Framework 4.0作为我们系统的最低运行平台..NET Framework 4.0是一个集成在Win-dows 中的组件,它支持生成和运行下一代应用程序与XML Web Services.Visual Studio 2010是微软推出的集成化开发环境.这个工具集成了多语言环境的项目开发能力.可以说在.NET 平台上,只需要一个VisualStudio ,就能实现所要实现的大多数应用程序[6].4.2主程序框架本系统采用了基于Add -In 模式的可扩展框架,添加几个文件或者移除几个文件,就可以做到功能模块的添加和删除,方便未来版本的功能扩展与模块定制.易用的、可扩展的、即插即用的框架模式,是本系统框架的基本特征.通过带命令行参数-r 的主程序运行,即可动态缓存更新系统功能模块的更新与扩展,以响应动态链接库变化.以该框架技术为基础,C /S 模式下的软件版本升级、系统更新及维护后,客户端可实现免分发自动升级.4.3代码框架为使系统具有柔性的管理、并使得系统具有良好的可扩充行、可维护行,采用三层代码架构进行代码的开发.用户界面层(UI ):UI 用户处理用户界面与用户的操作.·88·第32卷绵阳师范学院学报(自然科学版)业务逻辑层(BLL ):BLL 用于处理业务逻辑.数据访问层(DAL ):DAL 用于处理数据访问.每个层次间提供清晰的访问界面,通过接口或者实体对象封装来访问.4.4系统实现本排课系统包括六大子系统:基础信息管理、专业班级开课管理、教师选课管理、排课管理、查询统计、系统管理,以及一些辅助的子系统如用户子系统、窗口管理等.系统功能结构图如图2所示.图2系统功能结构图Fig.2Structure chart of system function排课系统主界面如图3所示,自动排课界面如图4所示,综合统计报表界面如图5所示.图3排课系统主界面Fig.3Main interface of course scheduling system 图4自动排课界面Fig.4Interface of auto course scheduling·98·张正柱等:基于.NET 的高校排课系统设计与实现第2期图5报表界面Fig.5Interface of reports 5总结本系统最大的特色是引入专业培养方案开课计划以及教学班的概念.专业培养方案开课计划确定完整学年的开课计划,并在此基础上自动创建专业班级课程,教师选课后,自动组建教学班后自动排课,操作简单明了.本系统的另一特色是立足管理,从管理的角度进行排课系统的开发,排课不仅仅是一种目的,更是一种手段,后续的统计报表分析在排课结果及相关排课对象信息管理的基础上,整合相关模块,形成一个完整的教学系统管理体系.本系统经过福建工程学院软件学院近5个学期的试运行,运行效果良好,各项管理及参数设置简单有效,操作方便,达到预想的效果,在日常的查询与课程调整中,均有效方便.实践表明,该排课系统能完成日常的管理与课程安排任务,并在教务管理中,能实现开课计划管理、教学班管理、课程表查询与资源使用情况分析,并可进行课程调整与教室使用情况监督等功能,满足教务日常课程安排管理的需要.参考文献:[1]薛冬梅.充分利用资源科学合理排课[J ].中原工学院学报,2002,13(7):78-81.[2]宗薇.高校智能排课系统算法的研究与实现[J ].计算机仿真,2011,28(12):389-392.[3]赵晓瑜.基于.net 的高校排课管理系统[J ].软件导刊,2011(11):188-190.[4]陈谊,杨怡,张国龙,等.基于优先级自动排课算法PCSA 的设计与实现方案[J ].北京工商大学学报(自然科学版),2002,20(2):32-35.[5]林风人,焦宁波,张铮彬,等.基于关系运算的高校排课系统设计[J ].福建工程学院学报,2011,9(3):297-302.[6]吴绍兴,刘岩,明廷堂.C#项目开发案例导航[M ].北京:电子工业出版社,2012,2.Design and Implementation of CollegeCourse Scheduling System based on .NETZHANG Zheng -zhu ,LIN Feng -ren(Software College ,Fujian University of Technology ,Fuzhou ,Fujian 350003)Abstract :With the computer information management and the data processing technology ,the problem of college course arrangement was summarized and analyzed in this paper ,by putting forward course scheduling sys-tem based on course scheduling algorithm of SQL logical model and relational operation.An auto course schedu-ling system based on .NET was designed ,with the function of summarizing courses ,organizing teaching classes ,and arranging courses.Key words :NET ;course scheduling system ;relationship operation based on SQL ·09·第32卷绵阳师范学院学报(自然科学版)。
高校排课系统的应用与研究

ห้องสมุดไป่ตู้
遵 守 的最基本 的标准 ,T — S Q L 是 对S Q L 功 能 的 增 强 。T ~ S Q L( 事 务 查 询 语 句 ) 是 个 程 序 集 合 , 它对 现 有 的S Y b a S e 和 M i c r o s o f t 结 构 化 查 询 语 句 进 行 了扩 展 , 包 括 事 务 控 制 , 异 常 和 错 误 处 理 , 行 处 理 和 声 明 的 变 量 。M i c r o s o f t 的S Q L 服 务 器和S y b a s e 的服 务 器 都 支 持 T — S Q L 语句 。 T - S Q L 对使 用S O L S e r v e r  ̄ 常 重 要 。与 S Q L S e r v e r 通 讯 的 所 有 应 用 程 序 都 通 过 向服 务 器 发送 T — S Q L 语 句 来 进 行 通 讯 ,而 与 应 用程 序 的 用户 界 面 无关 。 2 . 3前 台开 发 工具M a c r o m e d i a D r e a m —
一
3 . 3 排 课 系 统 详 细 设 计 与 开 发 3 . 3 . 1用 户 登 陆 模 块 3 . 3 . 1 . 1 管 理 员 与 教 师 用 户 的 登 入 与注 销
W ea v eI
排 课 系 统 作 为 教 学 管 理 系 统 中地 位 重 要 , 也是 算 法 相 当 复 杂 的部 分 , 已经 成 为 国 内外 众 多 高 校 以 及 软 件 开 放 人 员 的 研 究 课 题 , 取 得 了许 多 这 方 面 的 理 论 成 果和 实现 方法 。但也存 在着 一些 问题 , 如 : 出 现 教 学 资 源 冲 突 或 利 用 率 低 下 的 情 况 , 工 作 琐 碎 , 工 作 量 大 , 尤 其 是 在 给 大 学 校 园 进 行 排 课 时 出 现 的 问 题 更 多 。 在 排 课 系 统 建 构 过 程 中 , 要 考 虑 到 许 多 细 致 繁 琐 的 问 题 , 比 如 教 室 资 源 时 间 安 排 、 教 师 个 人 时 间 安 排 、 学 生 课 程 时 间 安 排 :还 有 一 些 特 殊 的 条 件 限 制 ,
高校排课系统算法探究

高校排课系统算法探究排课问题早在上个世纪70年代,S.Even就证明是一个NP完全问题,即算法的计算时间是呈指数增长的,这一论断确立了排课问题的理论深度。
之后很多人尝试采用各种方法对此问题求解,如回溯算法、反复比较法、整数规划、规则系统、模糊理论。
这些非智能算法虽然在一定程度上解决了大学课程表问题,但都存在所求非最优解,课表质量不够满意的问题。
至9O年代初期,Colomim等人首先尝试应用遗传算法来解决课程表问题后,模拟退火、禁忌搜索、蚁群算法等智能优化算法,以及在此基础上的改进方法,都在课程表问题研究特别是理论研究上取得了一定的进展。
然而,面对纷繁复杂的实际情况,课程表问题在理论研究及其工程应用之间仍然存在很大的差距。
目前人们对NP完全问题研究的主要思想是如何降低其计算复杂度,即利用一个近似算法来代替,力争使得解决问题的时间从指数增长化简到多项式增长,这是解决排课问题一个很常见的思路。
一、几种常见排课算法1、遗传算法遗传算法是美国Michigan大学J.Holland教授于1975年首先提出来的,它是模拟达尔文生物进化论的计算模型,是一种具有鲁棒性、全局最优性、可并行处理性及高效性的搜索算法,用来对复杂系统进行优化,该算法应用到排课系统中的主要演算步骤如下:(1)根据排课因素产生基因编码和染色体,并随机产生一定数目的初始种群(一定数目的班级课程表);(2)对个体(班级课程表)适应度进行评估,如果个体的适应度符合优化准则,则输出最佳个体及其代表的最优解,并结束计算,否则转向第(3)步;(3)依据适应度选择再生个体;(4)按照一定的交叉概率和交叉方法生成新的个体;(5)按照一定的变异概率和变异方法生成新的个体;(6)由交叉和变异生成新一代的种群,然后返回第(2)步。
最后进行冲突的检测与消除。
2、蚂蚁算法20世纪90年代初意大利学者Dorigo.Maniez—ZO依照蚂蚁觅食原理提出了第一个“蚂蚁算法(antcolony algorithm)”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//简化版高校自动排课系统//排课任务简化后包含:年级专业(教学班级,如计科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 <sstream>#include <string>#include <vector>#include <bitset>#include <random>#include <iomanip>using namespace std;//原始数据文件中的每一行数据的数据结构struct schedule {string grade_special; //年级专业string course; //课程名称string teacher; //任课教师string total_hour; //总学时string teach_hour; //讲课学时string experiment_hour; //实验学时string practice_hour; //课程实践学时string credit; //学分string week_hour; //周学时string start_stop; //起止周string speciality_orientation; //专业方向string person_num; //人数};//排课任务的数据结构struct arrange {arrange(string gs, string c, string t, int ct = -1) : grade_special(gs), course(c), teacher(t),classroom_time(ct) {}string grade_special;//年级专业string course;//课程名称string teacher;//任课教师//string classroom;//上课地点//string time;//上课时间int classroom_time;//上课地点、时间};//教师倒排表数据结构,通过教师姓名找到该教师的排课情况struct teacher_inverted {teacher_inverted(string tea, int cl = -1, int ar = -1) : teacher(tea), class_loc(cl), arrange_loc(ar) {}string teacher;int class_loc;int arrange_loc;};//教室倒排表数据结构,通过教室名称查找该教室的排课情况struct classroom_inverted {classroom_inverted(string cr, int cl = -1, int ar = -1) : classroom(cr), class_loc(cl), arrange_loc(ar) {}string classroom;int class_loc;int arrange_loc;};int main(int argc, char** argv) {if (argc != 3) {cout << "程序调用格式错误!\n调用格式:csp 排课计划文件可用教室文件\n";return 0;}ifstream infile(argv[1]);vector<schedule> plan;string s;getline(infile, s);while (getline(infile, s)) {schedule sch;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();vector<vector<arrange>> arranges; //整个系的排课安排vector<arrange> arr; //一个班的排课安排string gs(""); //教学班级for (auto it = 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 (unsigned i = 0; i < arranges.size(); ++i) {for (unsigned j = 0; j < arranges[i].size(); ++j) {string tea = arranges[i][j].teacher;if (tea == "未定") continue;unsigned k = 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()) {vector<teacher_inverted> ti; //一个教师的排课信息倒排表ti.push_back(teacher_inverted(tea, i, j));teachers.push_back(ti);}}}const int N = 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(); //待排课数目unsigned class_num = arranges.size(); //教学班级数目unsigned classroom_num = classrooms.size(); //教室数目uniform_int_distribution<unsigned> u(0, classroom_num * 20 - 1); //为教室时段分配随机数default_random_engine e(time(0));vector<unsigned> class_loc(class_num, 0); //教学班级已分配状况unsigned class_cur = 0; //待分配的教学班级序号,轮流为每个班级排课,一次安排一个班的一门课for (unsigned n = 0; n < arrange_num; ++n) {unsigned k = u(e);//如果某个班级的排课任务已经分配完成,则选择下一个班级继续排课while (class_loc[class_cur] == arranges[class_cur].size()) {class_cur = (class_cur + 1) % class_num;}//找到待排课任务的对应教师string tea = arranges[class_cur][class_loc[class_cur]].teacher;unsigned i = 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 < class_loc[class_cur]; ++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; //教师未定unsigned j = 0;for (; j < teachers[i].size(); ++j) {int m = 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];//将待排课班级号+1class_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;}int class_table[4][5];for (unsigned m = 0; m < 4; ++m)for (unsigned n = 0; n < 5; ++n)class_table[m][n] = -1;for (j = 0; j < arranges[i].size(); ++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 (unsigned m = 0; m < 4; ++m) {if (m % 2 == 0)cout << "============================================================================== ======================================================\n";elsecout << "------------------------------------------------------------------------------------------------------------------------------------\n";for (unsigned m1 = 0; m1 < 3; ++m1) {if (m1 == 1)cout << setw(12) << time_slot[m];elsecout << setw(12) << "";for (unsigned n = 0; n < 5; ++n) {if (class_table[m][n] != -1) {j = class_table[m][n];if (m1 == 0)cout << setw(24) << arranges[i][j].course;else if (m1 == 1)cout << setw(24) << classrooms[arranges[i][j].classroom_time / 20];elsecout << setw(24) << arranges[i][j].teacher;}elsecout << setw(24) << " ";}cout << "\n";}}cout << "============================================================================== ======================================================\n";cout << resetiosflags(ios_base::left);} while (1);}else if (2 == choice) {unsigned i = 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;}int class_table[4][5];for (unsigned m = 0; m < 4; ++m)for (unsigned n = 0; n < 5; ++n)class_table[m][n] = -1;for (j = 0; j < teachers[i].size(); ++j) {unsigned m = arranges[teachers[i][j].class_loc][teachers[i][j].arrange_loc].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) << " " << teachers[i][0].teacher << "老师课程表\n";cout << "============================================================================== ======================================================\n";cout << setw(12) << " " << setw(24) << "星期一" << setw(24) << "星期二" << setw(24) << "星期三" << setw(24) << "星期四" << setw(24) << "星期五" << "\n";for (unsigned m = 0; m < 4; ++m) {if (m % 2 == 0)cout << "============================================================================== ======================================================\n";elsecout << "------------------------------------------------------------------------------------------------------------------------------------\n";for (unsigned m1 = 0; m1 < 3; ++m1) {if (m1 == 1)cout << setw(12) << time_slot[m];elsecout << setw(12) << "";for (unsigned n = 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;else if (m1 == 1)cout << setw(24) << classrooms[arranges[teachers[i][j].class_loc][teachers[i][j].arrange_loc].classroom_time / 20];elsecout << setw(24) << arranges[teachers[i][j].class_loc][teachers[i][j].arrange_loc].grade_special;}elsecout << setw(24) << " ";}cout << "\n";}}cout << "============================================================================== ======================================================\n";cout << resetiosflags(ios_base::left);} while (1);} else if (3 == choice) {vector<vector<classroom_inverted>> classroomes;for (unsigned i = 0; i < classrooms.size(); ++i) {classroom_inverted cr(classrooms[i]);vector<classroom_inverted> crs;crs.push_back(cr);classroomes.push_back(crs);}unsigned i = 0, j = 0;for (i = 0; i < arranges.size(); ++i) {for (j = 0; j < arranges[i].size(); ++j) {unsigned m = arranges[i][j].classroom_time;if (classroomes[m / 20][0].class_loc == -1) {classroomes[m / 20][0].class_loc = i;classroomes[m / 20][0].arrange_loc = j;}else {classroomes[m / 20].push_back(classroom_inverted(classroomes[m / 20][0].classroom, i, j));}}}for (i = 0; i < classrooms.size(); ++i) {cout << i << ". " << classrooms[i] << "\t";if ((i + 1) % 4 == 0) cout << "\n";}cout << "\n";do {cout << "\n请输入待查询教室的序号:(输入-1结束查询)";cin >> i;if (i == -1) {break;}else if (i >= classrooms.size()) {cout << "非法选择\n";continue;}int class_table[4][5];for (unsigned m = 0; m < 4; ++m)for (unsigned n = 0; n < 5; ++n)class_table[m][n] = -1;for (j = 0; j < classroomes[i].size(); ++j) {unsigned m = arranges[classroomes[i][j].class_loc][classroomes[i][j].arrange_loc].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) << " " << classrooms[i] << "教室课程表\n";cout << "============================================================================== ======================================================\n";cout << setw(12) << " " << setw(24) << "星期一" << setw(24) << "星期二" << setw(24) << "星期三" << setw(24) << "星期四" << setw(24) << "星期五" << "\n";for (unsigned m = 0; m < 4; ++m) {if (m % 2 == 0)cout << "============================================================================== ======================================================\n";elsecout << "------------------------------------------------------------------------------------------------------------------------------------\n";for (unsigned m1 = 0; m1 < 3; ++m1) {if (m1 == 1)cout << setw(12) << time_slot[m];elsecout << setw(12) << "";for (unsigned n = 0; n < 5; ++n) {if (class_table[m][n] != -1) {j = class_table[m][n];if (m1 == 0)cout << setw(24) << arranges[classroomes[i][j].class_loc][classroomes[i][j].arrange_loc].course;else if (m1 == 1)cout << setw(24) << arranges[classroomes[i][j].class_loc][classroomes[i][j].arrange_loc].teacher;elsecout << setw(24) << arranges[classroomes[i][j].class_loc][classroomes[i][j].arrange_loc].grade_special;}elsecout << setw(24) << " ";}cout << "\n";}}cout << "============================================================================== ======================================================\n";cout << resetiosflags(ios_base::left);} while (1);}else {cout << "非法选择\n";}goto loop;}。