智能排课系统(参考文档)_第1页
智能排课系统(参考文档)_第2页
智能排课系统(参考文档)_第3页
智能排课系统(参考文档)_第4页
智能排课系统(参考文档)_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

智能排课系统设计与实现摘要排课,是给学校各专业的教学方案中设置的课程安排适宜的时间和地点,也就是给每个班的课程安排时间和地点。排课工作在教学管理中很重要也很繁琐,计算机智能排课系统,可以降低排课人员的工作量,减少排课中的人为因素[1-2]。但排课问题属于NP问题,即无法直接得到答案,只能通过猜想获取可能结果。通常NP问题虽无答案,却有算法,算法不能直接告诉答案,但可以用来判断可能的结果是否正确可行。因此,要做好排课工作,提高排课效率,实现智能排课是必不可少的。本文在查阅大量相关文献的根底上,对高校的排课问题进行了分析,设计和实现了该功能,此系统主要被分为三个局部:界面的设计、排课算法的设计、以及报表的自动生成。本系统是采用MicrosoftVisualStudio2005作为前台开发工具,SQLServer2005作为后台数据库平台的管理系统。关键词:智能排课、贪心、分治、VisualStudio2005、SQLServer2005。目录TOC\o"1-3"\h\z摘要IIAbstractIII1绪论11.1系统开发背景11.2系统开发环境及方法11.2.1.开发环境1开发方法32可行性分析42.1技术可行性42.2经济可行性42.3操作可行性52.4法律可行性53系统需求分析63.1系统功能需求63.2系统非功能需求6排课中的根本原那么6排课的根本要求74总体设计84.1系统总体构架84.2系统功能结构84.3排课算法9目前常用算法94.3.2排课问题描述104.3.3排课问题的数学表示11排课问题的优先级问题11算法思想124.3.6算法分析135数据库设计145.1系统数据表145.2UML建模图145.3数据字典155.4数据库关系图186详细设计与实现196.1数据库访问模块196.2条件设置模块226.3教学方案模块256.4排课模块266.5课程表查询模块44结束语46致谢47参考文献48绪论1.1系统开发背景在高校各项教学管理工作中,排课一直是最根本的、最重要的工作,其实质就是给教学方案中设置的课程安排适宜的时问和地点,保证整个教学工作能够顺利地进行;同时,排课工作也是一项很复杂的工作,排课是一个NP问题,就是始终找不到一个最优的方法能够解决的问题,因为这个问题涉及了多种因素进行组合规划,有教师、学生的因素,也有教室的因素。尤其在目前各高校规模不断扩大,教学资源面临紧张,教师总数缺乏的前提下,排课工作问题更为凸出。随着计算机技术的飞速开展,特别是计算机的应用已普及到经济和社会生活的各个领域。使原本的旧的管理方法越来越不适应现在社会的开展。许多人还停留在以前的手工操作。这大大地阻碍了人类经济的开展。为了适应现代社会人们高度强烈的时间观念,利用计算机实现高校排课系统势在必行。对于各大高校来说,利用计算机支持学校管理员排课,是适应现代学校的制度要求、推动学校管理走向科学化、系统化、标准化的必要条件,从而到达提高校管理效率的目的。给同学和老师带来方便。1.2系统开发环境及方法.开发环境在计算机硬件和软件快速开展的今天,计算机硬件和软件已经远远满足本管理系统的要求。在数据库编程工具方面,各种可视化编程方法的出现,一改正去程序设计的概念和方法,用户用鼠标就可以快速、简捷地创立应用程序,极大地提高了编程效率。选用MicrosoftVisualStudio2005中文版数据库开发的应用程序可以独立运行于windows平台,而且SQLServer2005产生的数据库适用范围广,因此本系统采用MicrosoftVisualStudio2005中文版来完成高校排课系统的设计。VisualStudio是微软公司推出的开发环境。是目前最流行的Windows平台应用程序开发环境。2005年,微软发布了VisualStudio2005。.NET字眼从各种语言的名字中被抹去,但是这个版本的VisualStudio仍然还是面向.NET框架的〔版本2.0〕。它同时也能开发跨平台的应用程序,如开发使用微软操作系统的的程序等。总体来说是一个非常庞大的软件,甚至包含代码测试功能。这个版本的VisualStudio包含有众多版本,分别面向不同的开发角色。同时还永久提供免费的VisualStudioExpress版本。使用VisualStudio2005,专业开发人员能够:〔1〕使用改良后的可视化设计工具、编程语言和代码编辑器,享受高效率的开发环境;〔2〕在统一的开发环境中,开发并调试多层次的效劳器应用程序;〔3〕使用集成的可视化数据库设计和报告工具,创立SQLServer2005解决方案;〔4〕使用VisualStudioSDK创立可以扩展VisualStudioIDE的工具[6-8]。VB2005是visualStudio2005中最重要的组件之一,是新一代的VB,但它并不是VB.NET2003的简单升级,从开发界面到控件,VB2005与VB.NET2003之间还是有比拟大的区别[6]。新一版SQLServer的设计目标正是帮助企业单位应对上述挑战。作为Microsoft公司的下一代数据管理与分析软件,SQLServer2005有助于简化企业数据与分析应用的创立、部署和管理,并在解决方案伸缩性、可用性和平安性方面实现重大改良。基于SQLServer2000技术优势构建的SQLServer2005将提供集成化信息管理解决方案,可帮助任何规模的组织机构:〔1〕创立并部署更具伸缩性、可靠性和平安性的企业级应用。〔2〕降低数据库应用创立、部署与管理的复杂程度,进而实现IT效率最大化。〔3〕凭借可供创立更具平安保障之数据库应用的丰富、灵活、现代化开发环境增强开发人员工作效能。〔4〕跨越多种平台、应用和设备实现数据共享,进而简化内部系统与外部系统连接。〔5〕实现功能强劲的集成化商务智能解决方案,从而在整个企业范围内推进科学决策,提高工作效率。〔6〕在不必牺牲性能表现、可用性或伸缩性的前提下控制本钱费用水平[9-10]。开发方法以各高校的排课需求为应用背景,开发一个典型的高校智能排课系统。考虑实际情况,本系统将采用结构化生命周期法进行系统分析和设计,并采用原型法进行系统实施。图1-1原型法生命周期图原型法的根本思想是在投入大量的人力,物力之前,在限定的时间内,用最经济的方法开发出一个可实际运行的系统模型,用户在运行使用整个原型的根底上,通过对其评价,提出改良意见,对原型进行修改,统一使用,评价过程反复进行,使原型逐步完善,直到完全满足用户的需求为止。这样能有效防止盲目开发问题,同时能充分的发挥原型法的优势,能顺利实现系统的实施[4-5]。2可行性分析2.1技术可行性该系统对软、硬件系统要求较低,所需硬件设备,市场上销售且价格较低,甚至可以使用原有的设备。软件上,操作系统采用Windows系列操作系统、MicrosoftVisualStudio2005作为前台开发工具,它具有的“编辑后继续运行(editandcontinue)”的特性,超越了旧的编辑—编译—测试模式。它还引入了面向对象的程序设计思想和“控件”概念,使得大量已经编好的VisualBasic程序可以直接拿来使用。同时,VisualBasic又是最容易学习与应用的程序语言之一。它的功能非常强大,已成为一种专业化的开发语言和环境。采用SQLServer2005作为后台数据库平台的管理系统,它在电子商务、数据仓库和数据库解决方案等应用中起着核心作用,可为企业的数据管理提供强大的支持,对数据库中的数据提供有效的管理,并采用有效的措施实现数据的完整性、数据的平安性以及数据的可靠易用性等等。这些软件在高校排课系统开发中已被大量应用,技术上都比拟成熟。因此在技术上是可行的。2.2经济可行性当今学校内部没有完善的高校排课系统,管理水平差,学校课程不能得到合理分配。迫切需要提高现代化管理水平、管理质量和管理高校课程。高校排课系统的初步现代化的开发和使用,能够大大提高学校管理者的工作效率,节省本钱提高经济效益。它把从事教务管理的人员从繁重的手工操作中解脱出来,用更多精力从事创造性的管理活动和其它重要的活动中去,从而到达节省人力、物力,财力的目标;它能使决策、方案和其它管理活动更加科学、精确、灵活。因此,开发一个专门针对高校排课系统,在经济上也是可行的。2.3操作可行性本系统灵活方便,快捷迅速,适应处理多项数据。采用友好、直观的视窗界面,鼠标、键盘两种操作方式任意选择,方便快捷。界面统一标准,提示信息功能完整,稍一接触就可以上手进行所有操作。2.4法律可行性本系统纯为个人设计,在开发过程中没有涉及合同、责任、版权等与国家相关法律规定相抵触的方面。因此,本系统在法律上是可行的。3系统需求分析3.1系统功能需求智能排课系统需要实现对学校教师、教室、班级、及课程的信息管理,对高校排课,都有智能的管理,主要实现如下的一些功能:班级各种信息的输入,包括班级号,班级名称,年级,班级人数,是否合班。教师各种信息的输入,包括教师号,教师姓名,职称,联系方式。学校课程的增加,删除,修改。学校课程方案的制定。学校的自定义排课,根据需要,人工排课。学校的智能排课,根据需要,随机智能排课。有一些相关的提示。课表查课界面,根据不同条件,查看课程安排。3.2系统非功能需求排课中的根本原那么在课程的编排中应遵循一定的规那么,只有按照根本规那么来进行课程的编排才能够减少冲突的发生,这些根本规那么主要有以下几条:1)同一班级的学生在同一时间(某些特定的选修课时间除外)不能安排两门课程2)同一教师在同一时间不能安排两门课程3)同一教室在同一时间不能安排两门课程4)同一时间安排的课程总数不能大于所能提供的教室总数5)某一课程参加学习的总人数不应大于所安排教室的座位数6)所提供教室的属性与课程所需教室的属性一致在时间、教师、班级、教室、课程这五维关系中,时间、教师、班级三者之间存在着紧密关系。相对而言,教室与它们关系就不那么密切。排课的根本要求课程的安排不是任意的,为了到达最好的教学效果应遵循一定的要求。这些要求主要有:1)要尽量为所排课程安排上该类课效果最好的时间2)课程在一周上屡次时,要有一定的间隔性3)公共课等涉及面广、学时多的课程应优先处理4)对同一教师,同一上课对象应尽量选择相对固定的几个教室5)对同一个班级的课程应选择相对固定的教室6)连着的课的教室选择不应相隔太远7〕同一天有几门课时尽量把课分散8)优先满足一些特殊要求〔比方有些教室喜欢上上午的课,可以优先满足〕4总体设计4.1系统总体构架本系统采用客户/效劳器〔Client/Server〕模式。又叫主从式架构,简称C/S结构,是一种网络架构,它把客户端(Client)〔通常是一个采用图形用户界面的程序〕与效劳器(Server)区分开来。每一个客户端软件的实例都可以向一个效劳器或应用程序效劳器发出请求。图4-1系统体系结构图C/S的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给效劳器。可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销对应的优点就是客户端响应速度快。4.2系统功能结构高校排课系统可以用于支持各高校完成高校排课的难题,有如下几个个方面的目标:支持各高校输入班级信息;支持各高校输入教师信息,班级教师的增删改等方面。支持输入教室,还有自定义排课和智能排课以及课表查询。系统分为四大模块:条件设置、课程方案、排课管理、课表查询、系统管理。图4-2功能模块图具体设计目标如下:(1)界面友好,操作简单,帮您轻松上手。(2)系统具有灵活、严格的权限设定功能,采用非常周密有效的权限设置,确保高校各类资料的可靠性和保密性,防止错误和违规操作。系统管理:可修改管理员权限及密码。(3)高校排课系统,资料详细周到,同窗多页的界面方式让你轻松完成所有工作。(4)友善的登录界面,包括学生登录,教师登录,和管理员登陆,根据身份不同,进入的界面也4.3排课算法目前常用算法目前,解决排课问题常用的方法有:着色算法[11],通过研究时间资源库的形成策略,分析基于时间资源的排课算法[12]。基于分层分治、贪心算法的排课系统的设计与实现[13],基于图论方法的自动优化排课模型研究[14],基于资源受限的非线性约束多目标排课模型及算法[15],整数规划解决排课问题[16],基于遗传禁忌算法结合解决排课问题[17]等。这些方法虽然提高了搜索效率,但由于高校普遍存在课程量大,教室、教师资源紧张,排课约束条件多且条件经常变化等问题,排课算法的应用仍然受到很大限制[19]。排课问题描述.1排课问题的约束条件排课即要满足一定的硬约束条件来协调处理教师、教室、学生、时间之间的多维冲突,同时还要尽可能满足一些软约束条件,从而使排出的课表更加合理,满足人性化需求。硬约束条件要求系统必须满足的条件,而软约束条件是在满足硬约束条件以后要考虑的约束条件,软约束条件不要求系统必须满足,但满足这些条件能得到较优解。常用的硬约束条件有:(1)所有的课程都必须被安排;(2)除合班课外,同一时间,一个教室只能被一个班级占用;(3)除选修课外,同一时间,一个班级只能安排一门课程;(4)同一时间,一个教师只能在一个教室上课;(5)同一个教师所上的不同课程不能发生在同一时间;(6)两门课程不能在同一个时间安排在同一个教室;(7)教室的类型必须与课程要求一致;(8)教室的最大容纳人数必须大于等于在该教室上课的学生人数等;(9)不同课程时间段不同,如体育课只能在白天且不安排在第一节,选修课不能安排在早上等。常用的软约束条件有:(1)同一门课程的上课时间尽量间隔均匀。例如某课程周学时为4学时,以2学时为一个教学单位,需安排两次。两次的安排时间尽量间隔一天或者一天以上;(2)每个学生的课程均匀的分布在工作日中;(3)学生的上课时间要尽量选择在较好的上课时间段;(4)对班级、教室、教师的单双周上课时间点尽量匹配,以节约教学资源;排课问题的数学表示如果用C表示课程、S表示班级、N表示时间、R表示教室,T表示教师,排课问题的目标就是找出满足约束条件的(C,S,N,R,T)组合。并且,这五种元素之间存在一定的对应关系:①C与S之间的对应关系,即每个班级有其特定要上的课程;②C与T之间的对应关系,即每门课程有一定的任课教师;③(N,R)与(S,C,T)之间的对应关系,即每个教室在某一时间段只能有一个班级上一门课程。排课问题的实质就是对于给定的一组(S,C,T)要分配其一个满足上课条件的时空片(N,R)。即找到(N,R)与(S,C,T)之间的一一对应关系。排课问题的优先级问题排课中有很多等待分配时空片的(S,C,T),如何安排它们的分配次序,不仅关系到算法的性能、安排的合理性,更关系到最终能否求出可行解。因此,分配次序的好坏也是每个算法中要仔细处理的问题。在本文的算法中,是对每一组(S,C,T)设定优先级,然后按照优先级的上下次序分配时空片。设定(S,C,T)优先级要考虑的因素有:①(S,C,T)中课程C的类别,对于不同类别的课程,给它们设定相应的优先值,本算法中针对课程类别的优先级设定如下:专业根底课、公共根底课、专业限选课、专业选修课、公选课优先级别依次降低,其中专业根底课级别最高,公选课级别最低;②(S,C,T)中课程C在一周内要上的次数。即一门课程周学时越多,优先级越高;③(S,C,T)中班级S所需要上的课程总数的大小。即学生每周要上的课程总数越多,优先级越高;④(S,C,T)中学生S中的人数的大小。最后根据各个因素的重要性不同,给每个因素设置一定的权重系数p[0]、p[1]、p[2]、p[3],最后求四种因素的带权累加和,即得到一个(S,C,T)的优先级,每次按照(S,C,T)的优先级的降序次序来分配时空片。算法思想该算法在选择每一组教学任务(S,C,T)时是按贪心策略来选择,即按(S,C,T)优先级的降序次序选择优先级最高的教学任务。接下来在进行时空片分配过程中采用分治的策略,在分配过程中分为三个层次:1〕即先分配要上课的星期数〔星期数是指星期一到星期五的任意一天〕,2〕再分配其该天的上课时间段〔在本文中某天的上课时间段分为5个时间段,上午1、2节为第1个时间段,上午3、4节为第2个时间段,下午1、2节为第3个时间段,下午3、4节为第4个时间段,晚上1、2节或者1、2、3节为第5个时间段〕,3〕最后分配上课的教室。同时在每一阶段的分配过程中,都要对资源总数和使用状况作统计和记录,从而防止不计后果的资源滥用。算法主要步骤如下:Step1:初始化。Step1.1:初始化,将所有教室按类型划分,并在每一类型中按教室容量统计可用教室资源的数目。例如,可将教室划分为:普通教室、多媒体教室、语音室、物理实验室、机房等。然后按教室可容纳人数分为0-60人、60-120人、120-140人这4个不同等级。然后统计记录每一类型不同容量范围的可用教室资源数目。Step1.2:预排序,将待排的所有课程先按周学时降序排列,然后再将待排的所有课程先按所需教室类型升序排列,再按所需教室容量降序分配,即先为上课人数多的课程分配教室,防止较小的班级占用大教室,最后再将所有需要使用同一类型和容量教室的课程按优先级降序排序。Step2:分配上课的星期数。按照排序后的次序,再参照剩余的可用资源记录来分配每组(S,C,T)在一周内要上课的星期数。同时参考总课表,使得班级和教师的上课时间在一周内尽可能均匀分布。Step3:分配某天内上课的时间段。Step3.1对每种类型和大小的教室资源按其在一周内的某一天的5个时段的分配情况作统计。Step3.2在分配时间段的时候,从第一个时段到第5个时段依次查看是否还有剩余资源,假设有,那么为其分配相应的是时间段,否那么看能否将某个已被占用的时间段调整后再为其分配。分配的过程中要参照总课表,防止时间冲突。Step3.3假设有不能分配的,查找与其相关的已经分配了时间段的课程,并看看能否重新为它分配时间段,从而将原来的时间段让给不能成功找到时间段的那个课程使用。Step4:分配上课的教室:根据每一课程要求的上课时间和教室类型及大小为其分配教室。对于每个已经分配了星期数和时间段的课程,一般来说,都是找得到可用教室的,因为在前两个分配阶段中,是严格按照资源剩余状况来进行分配的。同时在分配上课所用的教室时,也考虑到单双周情况,以便充分利用教室资源。算法分析基于分治贪心相结合的排课算法主要分为3个阶段:即分配上课星期数、分配上课时间段、分配上课的教室。这里对算法的时间复杂度进行分析。第一阶段:分配上课星期数,为每一门课程分配上课星期数的运算次数主要与课程数目有关;第二阶段:分配上课的时段,为一次课分配上课时段所进行判断的次数最坏为5次,分配上课时段的运算次数主要和每周上的总课程次数有关。第三阶段:根据上课星期数和上课时段分配教室;因此该算法主要和问题的规模有关,即与要排课的课目数、课程的周学时数及教室数目有关。和基于贪心策略、基于随机分配时间片的排课算法进行比拟,该算法的运行时间介于二者之间,效率略低于基于贪心策略的排课算法,比基于随机分配时间片的排课算法效率要高。但该算法在成功排课的数量上,性能比基于贪心策略的算法会略好。因为分治与贪心相结合的算法中是当有满足条件的资源时,便一定会为其分配。而贪心策略中,可能虽然存在可用资源时仍会遗漏可行解。5数据库设计5.1系统数据表根据系统需求分析,以及考虑到数据表之间的关联性,系统需要建立7个表,2个视图,其用途说明如下表4.1所示。表5-1系统数据表数据表名称数据表描述Class保存班级根本信息Hb保存组成各合班的班级号Teacher记录教师信息Classroom记录教室信息Course保存课程信息Lesson_plans保存教学方案R_L存储总课表表5-2系统视图数据表名称数据表描述Lp_view保存需要排课的信息,利于排课RL_view保存教室安排信息,利于查询班级时间及教室时间5.2UML建模图以下图主要是对应实体关系图,经过分析了各实体及其属性,用MicrosoftOfficeVisio2007画出以下图。图5-1UML建模图5.3数据字典以下表5.2到表5.8给出7个数据表:班级信息表、合班表、教室信息表、教师信息表、课程信息表、教学方案表、总课表的具体描述,包括数据描述、数据名称、数据类型等。表5-3Course-班级信息表字段名称说明数据类型长度主/外键约束备注Class_id班级编号Char10主键Class_name班级名Char20非空Department专业Char20grade年级Char10number人数Int非空Hb是否合班int非空默认0〔否〕表5-4hb-合班表字段名称说明数据类型长度主/外键约束备注Hb_id合班号Char10主键Class_id小班号Char10外键非空表5-5classroom-教室信息表字段名称说明数据类型长度主/外键约束备注Cr_id教室编号Char10主键Capacity教室容量IntCategory教室类别Char10非空表5-6Teacher-教师信息表字段名称说明数据类型长度主/外键约束备注T_id教师编号Char10主键T_name教室姓名Char10非空profession职称Char10age年龄IntDepartment所属学院Char10表5-7Course-课程信息表字段名称说明数据类型长度主/外键约束备注C_id课程号Char10主键C_name课程名Char20非空表5-8lesson_plans-教学方案表字段名称说明数据类型长度主/外键约束备注Lesson_id课程方案号Char10主键C_id课程号Char10外键非空参照course表中的c_idClass_id班级号Char10外键非空参照class表中class_idT_id教师编号Char10外键非空参照Teacher表中t_idC_nature课程性质Char10W_jieci周节次Int非空Z_jieci总节次IntPaike是否排课Int默认为0〔未排课〕Category教室性质Char10Qz权重Int自动计算表5-9R_L-总课表字段名称说明数据类型长度主/外键约束备注Kc_id排课标号自动编号主键Week星期Char10非空Jieci节次Char10非空Cr_id教室编号Char10外键非空参照classroom表Lesson_id教学方案号Char10外键非空参照lesson_plans表Available时间可用Int非空Dsz单双周标记Char105.4数据库关系图图5-2系统数据库关系图6详细设计与实现6.1数据库访问模块该模块中包含数据库连接、查询、插入、和更新。本系统将数据库操作做成一个公共模块,实现代码的重用。建立数据库连接对象PublicobjSqlConnectionAsSqlConnection=NewSqlConnection("datasource=(local);initialcatalog=智能排课;"&"integratedsecurity=SSPI;userid=sa;password=123")数据查询方法,返回dataset类型。PublicFunctionGetDataFromDB(ByValsqlstrAsString)AsDataSetobjDataSet=NewDataSet()objDataSet.Clear()TryobjSqlConnection.Open()objDataAdpter=NewSqlDataAdapter(sqlstr,objSqlConnection)objDataAdpter.Fill(objDataSet)objSqlConnection.Close()CatchexAsExceptionMsgBox("错误号:"&Err.Number&"错误描述:"&Err.Description)EndTryReturnobjDataSetobjDataSet=NothingEndFunction数据更新方法,返回boolean型PublicFunctionUpdateData(ByValsqlstrAsString)AsBooleanDimobjCommandAsSqlCommand=NewSqlCommand()TryobjSqlConnection.Open()objCommand.Connection=objSqlConnectionobjCommand.CommandText=sqlstrobjCommand.CommandType=CommandType.TextobjCommand.ExecuteNonQuery()objSqlConnection.Close()CatchexAsExceptionMsgBox("错误号:"&Err.Number&"错误描述:"&Err.Description)ReturnFalseEndTryReturnTrueEndFunction数据插入方法,返回boolean型PublicFunctionInsertData(ByValsqlstrAsString)AsBooleanDimobjCommandAsSqlCommand=NewSqlCommand()TryobjSqlConnection.Open()objCommand.Connection=objSqlConnectionobjCommand.CommandText=sqlstrobjCommand.CommandType=CommandType.TextobjCommand.ExecuteNonQuery()objSqlConnection.Close()CatchexAsExceptionMsgBox("错误号:"&Err.Number&"错误描述:"&Err.Description)ReturnFalseEndTryReturnTrueEndFunction数据删除方法,返回boolean型PublicFunctionDeleteData(ByValsqlstrAsString)AsBooleanDimobjCommandAsSqlCommand=NewSqlCommand()TryobjSqlConnection.Open()objCommand.Connection=objSqlConnectionobjCommand.CommandText=sqlstrobjCommand.CommandType=CommandType.TextobjCommand.ExecuteNonQuery()objSqlConnection.Close()CatchexAsExceptionMsgBox("错误号:"&Err.Number&"错误描述:"&Err.Description)ReturnFalseEndTryReturnTrueEndFunction6.2条件设置模块图6-1班级信息管理运行界面图6-2插入班级信息运行界面添加合班的代码:PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimi,numberAsIntegerDimgradeAsStringDimmydsAsDataSetnumber=0grade="null"sqlstr="insertintoclass(class_id,class_name,department,hb)values('"&TextBox1.Text&"','"&TextBox2.Text&"','"&TextBox3.Text&"','1')"InsertData(sqlstr)Fori=0ToListBox1.Items.Count-1sqlstr="select*fromclasswhereclass_name='"&ListBox1.Items.Item(i)&"'"myds=GetDataFromDB(sqlstr)number=myds.Tables(0).Rows(0)("number")+numbergrade=myds.Tables(0).Rows(0)("grade")sqlstr="insertintohb(hb_id,class_id)values('"&TextBox1.Text&"','"&myds.Tables(0).Rows(0)("class_id")&"')"InsertData(sqlstr)Nextsqlstr="updateclasssetgrade='"&grade&"',number='"&number&"'whereclass_id='"&TextBox1.Text&"'"UpdateData(sqlstr)MessageBox.Show("插入合班成功")bj_form.智能排课DataSet._Class.Clear()bj_form.ClassTableAdapter.Fill(bj_form.智能排课DataSet._Class)Me.Close()EndSub删除班级程序代码:PrivateSubButton5_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton5.ClickDimdeleteAsString=DataGridView1.SelectedCells(0).Value.ToStringDimhbAsInteger=DataGridView1.SelectedCells(4).Valuesqlstr="select*fromlesson_planswhereclass_id='"&delete&"'"IfGetDataFromDB(sqlstr).Tables(0).Rows.Count>0ThenMessageBox.Show("该班已安排课程,请先删除教学方案")ElseIfhb=0Thensqlstr="deletefromclasswhereclass_id='"&delete&"'"DeleteData(sqlstr)MessageBox.Show("删除成功")Elsesqlstr="deletefromhbwherehb_id='"&delete&"'"DeleteData(sqlstr)sqlstr="deletefromclasswhereclass_id='"&delete&"'"DeleteData(sqlstr)MessageBox.Show("删除成功")EndIfMe.智能排课DataSet._Class.Clear()Me.ClassTableAdapter.Fill(Me.智能排课DataSet._Class)EndIfEndSub条件设置中其他三个功能,课程管理、教室管理、教师管理与班级管理类似,限于篇幅,在此不再表达。6.3教学方案模块图6-3教学方案管理模块删除教学方案代码:PrivateSubButton5_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton5.ClickDimdeleteAsString=DataGridView1.SelectedCells(0).Value.ToStringsqlstr="select*fromrl_viewwherecr_id='"&delete&"'"IfGetDataFromDB(sqlstr).Tables(0).Rows.Count>0ThenMessageBox.Show("该教学方案已安排,请先删除课表中涉及该教学方案的课程")Elsesqlstr="deletefromlesson_planswherelesson_id='"&delete&"'"DeleteData(sqlstr)MessageBox.Show("删除成功")Me.智能排课DataSet.Lesson_plans.Clear()Me.Lesson_plansTableAdapter.Fill(Me.智能排课DataSet.Lesson_plans)EndIfEndSub6.4排课模块智能排课模块程序代码:排课方法,返回boolean型PublicFunctionArrangeLesson()AsBoolean'初始化及预排序,返回资源是否够分Test=InitQZ()IfTest=FalseThenReturnFalseEndIfsqlstr="deletefromR_l"DeleteData(sqlstr)sqlstr="updatelesson_planssetpaike=0"UpdateData(sqlstr)sqlstr="select*fromlp_vieworderbyqzdesc"myds=GetDataFromDB(sqlstr)Fori=0Tomyds.Tables(0).Rows.Count-1'给出最适宜的星期addkc=1myRow=myds.Tables(0).Rows(i)Test=ArrangeWeek(myRow)IfTest=FalseThenReturnFalseEndIf'安排节次Test=ArrangeJieci(myRow,week)IfTest=FalseThenTest=AdjustLesson(myRow)IfTest=FalseThenReturnFalseEndIfEndIfArrangeCRoom(myRow,week)IfmyRow("w_jieci")=4ThenTest=ArrangeJieci(myRow,week1)IfTest=FalseThenTest=AdjustLesson(myRow,week)IfTest=FalseThenReturnFalseEndIfEndIfTest=ArrangeCRoom(myRow,week1)IfTest=FalseThenReturnFalseEndIfElseIfmyRow("w_jieci")=3ThenTest=ArrangeDSZ(myRow)IfTest=FalseThenAdjustLesson(myRow,week1)Test=ArrangeCRoomDSZ(myRow,week1)EndIfEndIfsqlstr="updatelesson_planssetpaike=1wherelesson_id='"&myRow("lesson_id")&"'"UpdateData(sqlstr)NextReturnTrueEndFunction以下方法是初始化及预排序,返回资源是否够分PublicFunctionInitQZ()AsBooleanDimqz,numberAsIntegerDimcategory,c_natureAsStringDimInitdsAsDataSetsqlstr="updateLP_viewsetqz=0"UpdateData(sqlstr)sqlstr="select*fromLP_view"Initds=GetDataFromDB(sqlstr)'初始化权重Fori=0ToInitds.Tables(0).Rows.Count-1qz=0myRow=Initds.Tables(0).Rows(i)'按周节次降序IfmyRow("w_jieci")=4Thenqz=qz+2ElseIfmyRow("w_jieci")=3Thenqz=qz+1EndIf'按所需教室类型降序category=myRow("category")Ifcategory.Trim="多媒体"Thenqz=qz+60ElseIfcategory.Trim="普通教室"Thenqz=qz+50ElseIfcategory.Trim="运动场"Thenqz=qz+40ElseIfcategory.Trim="计算机实验室"Thenqz=qz+30ElseIfcategory.Trim="语音室"Thenqz=qz+20ElseIfcategory.Trim="物理实验室"Thenqz=qz+10EndIf'按人数降序number=myRow("number")Ifnumber<60Thenqz=qz+3000ElseIfnumber<120Thenqz=qz+2000ElseIfnumber<140Thenqz=qz+1000Else'特大班先排,如体育这些课qz=qz+10000EndIf'按课程性质降序c_nature=myRow("c_nature")Ifc_nature.Trim="专业根底课"Thenqz=qz+500ElseIfc_nature.Trim="专业公共课"Thenqz=qz+400ElseIfc_nature.Trim="专业限选课"Thenqz=qz+300ElseIfc_nature.Trim="专业任选课"Thenqz=qz+200ElseIfc_nature.Trim="公共选修课"Thenqz=qz+100EndIfsqlstr="updatelesson_planssetqz="&qz&"wherelesson_id='"&myRow("lesson_id")&"'"UpdateData(sqlstr)Next'仅检查多媒体资源sqlstr="selectcount(*)fromclassroomwherecategory='多媒体'"Initds=GetDataFromDB(sqlstr)Fori=0To6Forj=0To4dmt(i,j)=Initds.Tables(0).Rows(0)(0)NextNextsqlstr="selectsum(w_jieci)fromlp_viewwherecategory='多媒体'"Initds=GetDataFromDB(sqlstr)IfInitds.Tables(0).Rows(0)(0)>dmt(0,0)*5*5ThenMessageBox.Show("教室不够安排")ReturnFalseEndIfReturnTrueEndFunction以下方法是给出适宜的星期,即老师和班级的课程最少的一天,PublicFunctionArrangeWeek(ByValRowAsDataRow)AsBooleanDimkAsIntegerDimtestds,fbdsAsDataSetDimmysqlstrAsStringFork=0To4weekn(k)=0Next'分班只加上合班每天的上课数IfRow("hb")=0Then'计算本班每天上课数sqlstr="selectweek,count(*)ascountfromrl_viewwhereclass_id='"&Row("class_id")&"'groupbyweek"testds=GetDataFromDB(sqlstr)AddWeek(testds)GetHBWeek(Row)Elsesqlstr="selectclass_idfromhbwherehb_id='"&Row("class_id")&"'"testds=GetDataFromDB(sqlstr)mysqlstr="selectdistincthb_idfromhbwhereclass_id='"Fork=0Totestds.Tables(0).Rows.Count-1sqlstr="selectweek,count(*)ascountfromrl_viewwhereclass_id='"&testds.Tables(0).Rows(k)("class_id")&"'groupbyweek"fbds=GetDataFromDB(sqlstr)AddWeek(fbds)Ifk<testds.Tables(0).Rows.Count-1Thenmysqlstr=mysqlstr&testds.Tables(0).Rows(k)("class_id")&"'orclass_id='"Elsemysqlstr=mysqlstr&testds.Tables(0).Rows(k)("class_id")&"'"EndIfNextDimhbdsAsDataSet=GetDataFromDB(mysqlstr)Fork=0Tohbds.Tables(0).Rows.Count-1sqlstr="selectweek,count(*)ascountfromrl_viewwhereclass_id='"&hbds.Tables(0).Rows(k)("hb_id")&"'groupbyweek"testds=GetDataFromDB(sqlstr)AddWeek(testds)NextEndIfGetTeacherWeek(Row)Dimminweek,secondweek,JAsIntegerJ=weekn(0)minweek=0secondweek=0Fork=0To4IfJ>weekn(k)ThenJ=weekn(k)minweek=kEndIfNextsecondweek=minweek+2Ifsecondweek>4Thensecondweek=0EndIfweek=NumberToWeek(minweek+1)week1=NumberToWeek(secondweek+1)IfJ>10ThenReturnFalseEndIfReturnTrueEndFunction以下方法是得到老师每天上课数,用于计算最闲时间PublicFunctionGetTeacherWeek(ByValrowAsDataRow)AsBooleanDimtdsAsDataSetsqlstr="selectweek,count(*)ascountfromRL_viewwheret_id='"&row("t_id")&"'groupbyweek"tds=GetDataFromDB(sqlstr)AddWeek(tds)ReturnTrueEndFunctionPublicFunctionGetHBWeek(ByValrowAsDataRow)AsBooleanDimhbds,testdsAsDataSetDimkAsIntegersqlstr="selecthb_idfromhbwhereclass_id='"&row("class_id")&"'"hbds=GetDataFromDB(sqlstr)Fork=0Tohbds.Tables(0).Rows.Count-1sqlstr="selectweek,count(*)ascountfromrl_viewwhereclass_id='"&hbds.Tables(0).Rows(k)("hb_id")&"'groupbyweek"testds=GetDataFromDB(sqlstr)AddWeek(testds)NextReturnTrueEndFunction下面的方法是给课程安排适合的节次PublicFunctionArrangeJieci(ByValrowAsDataRow,ByValwAsString)AsBooleanDimjiecinumberAsIntegerDimIsRightAsBooleanDimtestdsAsDataSetIfrow("c_name").ToString.TrimLike"体育"Thenjiecinumber=2jieci="第二节"ElseIfrow("c_nature").ToString.TrimLike"选"Thenjiecinumber=3jieci="第三节"Elsejiecinumber=1jieci="第一节"EndIfIsRight=FalseWhile(IsRight=False)sqlstr="select*fromRL_viewwhereclass_id='"&row("class_id")&"'andweek='"&w&"'andjieci='"&jieci&"'"testds=GetDataFromDB(sqlstr)Iftestds.Tables(0).Rows.Count>0Thenjiecinumber=jiecinumber+1jieci=NumberToJieci(jiecinumber)Ifrow("c_name").ToString.TrimLike"体育"ThenIfjiecinumber>4ThenReturnFalseEndIfElseIfjiecinumber>5ThenReturnFalseEndIfEndIfElsesqlstr="select*fromRL_viewwheret_id='"&row("t_id")&"'andweek='"&w&"'andjieci='"&jieci&"'"testds=GetDataFromDB(sqlstr)Iftestds.Tables(0).Rows.Count>0Thenjiecinumber=jiecinumber+1jieci=NumberToJieci(jiecinumber)Ifrow("c_name").ToString.TrimLike"体育"ThenIfjiecinumber>4ThenReturnFalseEndIfElseIfjiecinumber>5ThenReturnFalseEndIfEndIfElseIsRight=TrueEndIfEndIfEndWhileReturnTrueEndFunction下面的方法是计算每天上课的节数PublicFunctionAddWeek(ByValdsAsDataSet)AsBooleanDimkAsIntegerDimwAsStringFork=0Tods.Tables(0).Rows.Count-1w=ds.Tables(0).Rows(k)("week")SelectCasew.TrimCase"星期一"weekn(0)=weekn(0)+ds.Tables(0).Rows(k)("count")Case"星期二"weekn(1)=weekn(1)+ds.Tables(0).Rows(k)("count")Case"星期三"weekn(2)=weekn(2)+ds.Tables(0).Rows(k)("count")Case"星期四"weekn(3)=weekn(3)+ds.Tables(0).Rows(k)("count")Case"星期五"weekn(4)=weekn(4)+ds.Tables(0).Rows(k)("count")EndSelectNextReturnTrueEndFunction下面的方法是安排教室PublicFunctionArrangeCRoom(ByValrowAsDataRow,ByValwAsString)AsBooleanDimcapacity,w_jieci,availableAsIntegerDimcategory,lesson_id,cr_id,kc_id,dszAsStringDimroomdsAsDataSetIfrow("paike")=0Thencategory=row("category")capacity=row("number")sqlstr="selectcr_idfromClassroomwherecapacity>"&capacity&"andcategory='"&category&"'andcr_idnotin(selectcr_idfromR_Lwhereweek='"&w&"'andjieci='"&jieci&"')orderbycapacityasc"roomds=GetDataFromDB(sqlstr)Ifroomds.Tables(0).Rows.Count<1ThenReturnFalseEndIfcr_id=roomds.Tables(0).Rows(0)("cr_id")lesson_id=row("lesson_id")w_jieci=row("w_jieci")available=0dsz=""kc_id="kc1"&addkc&lesson_idaddkc=addkc+1sqlstr="insertintoR_L(kc_id,week,jieci,cr_id,available,lesson_id,dsz)values('"&kc_id&"','"&w&"','"&jieci&"','"&cr_id&"','"&available&"','"&lesson_id&"','"&dsz&"')"InsertData(sqlstr)EndIfReturnTrueEndFunction下面的方法是安排周节次为3的课程及有单双周问题PublicFunctionArrangeDSZ(ByValrowAsDataRow)AsBooleanDimtestds,roomds,fbds,hbdsAsDataSetDimk,jAsIntegerDimcr_id,class_id,kc_id,mysqlstrAsStringDimInsertAsBooleankc_id="kc31"&row("lesson_id")sqlstr="select*fromR_Lwhereavailable=1"roomds=GetDataFromDB(sqlstr)Ifroomds.Tables(0).Rows.Count>0Then'如果有单周上教室能用的查看是否可以安排Fork=0Toroomds.Tables(0).Rows.Count-1Dimkc_id1AsString=roomds.Tables(0).Rows(k)("kc_id")week=roomds.Tables(0).Rows(k)("week")jieci=roomds.Tables(0).Rows(k)("jieci")cr_id=roomds.Tables(0).Rows(k)("cr_id")class_id=row("class_id")sqlstr="select*fromRL_viewwherejieci='"&jieci&"'andweek='"&week&"'andclass_id='"&class_id&"'"testds=GetDataFromDB(sqlstr)IsRight=TrueInsert=TrueWhile(IsRight=True)Iftestds.Tables(0).Rows.Count>0Then'本班有课IsRight=FalseInsert=FalseElse'本班没有课看是否是合班不是那么安排时间成功否那么看小班是否适宜Ifrow("hb")=1Then'是合班检查分班及组成的合班sqlstr="selectclass_idfromhbwherehb_id='"&row("class_id")&"'"MessageBox.Show(row("class_id"))fbds=GetDataFromDB(sqlstr)mysqlstr="selectdistincthb_idfromhbwhereclass_id='"Forj=0Tofbds.Tables(0).Rows.Count-1sqlstr="select*fromRL_viewwherejieci='"&jieci&"'andweek='"&week&"'andclass_id='"&fbds.Tables(0).Rows(j)("class_id")&"'"testds=GetDataFromDB(sqlstr)Iftestds.Tables(0).Rows.Count>0ThenIsRight=FalseInsert=FalseEndIfIfj=fbds.Tables(0).Rows.Count-1Thenmysqlstr=mysqlstr&fbds.Tables(0).Rows(j)("class_id")&"'"Elsemysqlstr=mysqlstr&fbds.Tables(0).Rows(j)("class_id")&"'orclass_id='"EndIfNexthbds=GetDataFromDB(mysqlstr)Ifhbds.Tables.Count>0ThenForj=0Tohbds.Tables(0).Rows.Count-1sqlstr="select*fromrl_viewwherejieci='"&jieci&"'andweek='"&week&"'andclass_id='"&hbds.Tables(0).Rows(j)("hb_id")&"'"testds=GetDataFromDB(sqlstr)Iftestds.Tables(0).Rows.Count>0ThenIsRight=FalseInsert=FalseEndIfNextEndIfMessageBox.Show("fbdehb"&Insert)IfInsert=TrueThensqlstr="select*fromRL_viewwheret_id='"&row("t_id")&"'andweek='"&week&"'andjieci='"&jieci&"'"testds=GetDataFromDB(sqlstr)Iftestds.Tables(0).Rows.Count>0ThenInsert=FalseEndIfEndIf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论