数学模型 - 请你来排课

更新时间:2024-04-02 00:43:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

请你排课表

摘要:

该数学模型是在课程可以合理编排的前提下,以尽可能有效利用教室座位为主要准则进行编排,通过分析影响排课问题的各种条件,利用计算机算法及数据结构知识建立的,首先得出符合基本要求的没有时间、空间冲突的课程表,然后根据各个教师,课程的周课时数量进行筛选、优化,最后得出最合理方案。

该模型依据教师为主线排课表,考虑到相同课程尽量分散,循环程序没有以教师序号进行,可以满足要求。另外,由于第八类课程只能在机房上课,而且教师、课程数固定,可以在程序之外排入课表。

关键词:模型 程序优化 循环

一、提出问题

1. 现有课程40门,编号为C01~C40;教师共有25名,编号为T01~T25;教室18间,编号为R01~R18。具体属性及要求见表1,表2,表3:

2. 课表编排规则:每周以5天为单位进行编排;每天最多只能编排8节课(上午4节,下午4节),特殊情况下可以编排10节课(晚上2节),每门课程以2节课为单位进行编排,同类课程尽可能不安排在同一时间。 3.要解决的问题:

①请你结合实际情况建立数学模型,通过编程计算,给出较为合理的课表编排方案,分析你所给出的方案的合理性。

②如果不准晚上排课,排课结果是否有所变化,如何变化? ③对教师聘用,教室配置给出合理化建议。 二、分析问题

排课问题实质上是一个优化问题。在该问题中,我们首先分析影响排课方案的因素,得出合理方案以及最优方案的评价标准,层层递进,先建立合理排课方案的模型,再调整为最优排课方案的模型。本模型是在课程可以合理编排的前提下,以尽可能有效利用教室座位,为仔细的同学提供尽可能多的座位资源为主要准则进行编排。在问题一中利用算法、程序得出的合理排课方案,再分别根据具体要求筛选优化,得出最佳方案。

三、条件假设

1、不考虑单、双周,每周上课时间从星期一到星期五。由于每门课按两节为单位上课,将每天上午下午分别按两大节计算,晚上按一大节计算。对于某些3课时的课按两大节计算(由于占用某一节课,导致其他课程不能正常与其安排在同一半天)

2、假设所有的教室在同一栋楼里,并且教室的编号是按照顺序编排的。 四、模型的建立与求解

排课问题要考虑三大部分的相互协调,即:教师、课程、教室。在本模型中我们将以教师为主线,使另外两个因素尽量满足其要求。下面我们分析三部分之间的联系。

? 教师与课程 某个课程只能有固定几个教师任教,教师与课程所要求的教

室类型需要匹配,上课时间需要匹配。 ? 教师与教室 教师类型匹配

? 课程与教室 上课人数不大于教师座位数,教师类型匹配

? 教师每周的总课时数不得超过总课时数,对于同一门课程,所有教师的周课

时数加起来必须等于该课程要求的周课时数。

该问题涉及的数据极为繁杂,但是数据的处理方式具有简单性、重复性,人工计算耗时费力,我们借助于强大的程序设计工具Java 语言进行处理。

对于每个教师,我们的目标是输入数据后得到一个5*5矩阵的课表,因此可以得到基本步骤如下:

一、 根据每个教师所教授的课程类别,所要求的课程类别以及要求的上

课时间选择具体课程。

二、 根据步骤一得到的课程,按照座位数不少于上课人数和教室类型相

匹配两个原则选择教室。

三、 建立循环,得到教师一周的课程表。

四、 再建立外部循环,为所有教师排课表,加入课时对教师的限制。 五、 程序优化

为了方便用程序进行自动化计算,我们将原始数据进行符号化加工,得到计算机可以识别的数据类型(其中“普通教室”、“多媒体教室”、“机房”分别用数字“1”、“2”、“3”替换,上课时间,上午分两大节,用“1,2”表示,下午用“3,4”表示,晚上一大节课,用“5”表示): 课程数据库: 对教室座位对教室 课程编号 课程类别 周课时数 时间要求 最大要求数 类别要求 字符代号 KC ZKS ZW JS TIME C01 1 4 50 2 1,2 C02 1 4 30 1 3,4 C03 1 6 40 1 3,4 C04 1 4 25 2 1,2 C05 1 3 60 1 3,4 C06 2 4 100 1 3,4 C07 2 4 50 2 1,2 C08 2 2 30 1 1,2 C09 2 4 40 1 3,4 C10 2 3 25 2 1,2 C11 3 6 60 1 1,2 C12 3 4 80 1 1,2 C13 3 6 50 2 3,4 C14 3 2 30 1 3,4 C15 3 3 40 1 3,4 C16 4 4 25 2 1,2 C17 4 4 60 1 3,4 C18 4 6 90 1 1,2 C19 4 4 50 2 1,2 C20 4 2 50 1 1,2 C21 5 4 30 1 1,2 C22 5 4 40 2 3,4 C23 5 3 25 1 1,2 C24 5 6 60 1 3,4 C25 5 4 100 2 1,2 C26 6 3 50 2 3,4 C27 6 4 30 1 3,4 C28 6 4 40 1 3,4 C29 6 4 50 2 1,2 C30 6 4 30 1 3,4 C31 7 6 40 1 1,2 C32 7 4 25 2 3,4 C33 7 3 60 1 1,2,3,4,C34 C35 C36 C37 C38 C39 C40 7 7 8 8 8 8 8 4 4 6 4 2 4 4 80 50 30 40 25 60 50 2 1 3 3 3 3 3 5 1,2 3,4 1,2,3,4,5 1,2 1,2 3,4 1,2,3,4,5 教师数据库 能胜任课周最大 对教室类别教师编号 程类别 课时数 要求 字符代号 TKC TKC TJS T01 1 4 2 T02 1 4 1 T03 1 6 1 T04 2 4 2 T05 2 4 1 T06 2 6 1 T07 3 4 1 T08 3 3 1 T09 3 4 1 T10 3 6 2 T11 4 8 1 T12 4 4 1 T13 4 6 2 T14 5 2 1 T15 5 3 1 T16 5 4 1 T17 6 4 1 T18 6 6 1 T19 6 4 2 T20 7 4 1 T21 7 6 1 T22 7 6 2 T23 3 4 1 T24 4 6 1 T25 6 4 1 教室数据库 教室编号 最大座位数 上课时间要求 TTIME 1,2 3,4 1,2 1,2 3,4 1,2,3,4,5 1,2 3,4 1,2 1,2 3,4 1,2,3,4,5 3,4 1,2 3,4 1,2 3,4 1,2,3,4,5 3,4 1,2 3,4 1,2 1,2,3,4,5 1,2 3,4 尽可能不同天上课的教师 T4 T1 T11,T18 T9, T23 T9 T15 教室类别 字符代号 R01 R02 R03 R04 R05 R06 R07 R08 R09 R10 R11 R12 R13 R14 R15 R16 R17 R18 CZW 100 100 100 50 50 50 50 60 60 60 60 60 40 40 40 40 50 40 CLB 2 1 1 2 1 1 1 1 1 2 1 3 3 3 3 2 1 1

主要计算过程如下:

所要求的目标数组为25个教师的课表,用25个5*5字符矩阵表示,名称为 txt1[5][5]—txt25[5][5]

定义教师数据为25*5整数矩阵:teacher[25][5] 定义课程数据为40*5整数矩阵:kecheng[40][5] 定义教师数据为18*2整数矩阵: classroom[18][2] (以下程序中“i”表示教师矩阵的行数,“j”表示课程矩阵的行数,“k”表示教室矩阵的行数。) (一)、根据每个教师所教授的课程类别,所要求的课程类别以及要求的上课时间选择具体课程。

for(j=1,40,j++) //在所有课程中选择 {

if(teacher[i][1]=kecheng[j][1]; //课程类别匹配

teacher[i][3]=kecheng[j][4]; //教室类别匹配 teacher[i][4]=kecheng[j][5]) //上课时间匹配 {

txt1[m][n]=\选定上该课程

}

(二) 、根据步骤一得到的课程,按照座位数不少于上课人数和教室类型相匹配两个原则选择教室。 for(k=1,k<=18,k++) {

if(kecheng[j][4]=classroom[k][2]; //教室达到课程要求 kecheng[j][3]<=classroom[k][1]) //座位数达到课程要求

}

cla=k //使用该教室

为了使教室的座位得到充分利用尽量使用满足上课要求的小教室,为此,以下替换方案作为保证

For(k=2, k<=18,k++) {

If(kecheng[j][3]<=classroom[k][1]; //满足要求的教室 classroom[k][1]<=classroom[k-1][1]) //座位少的教室 cla=k //替换为小教室 txti[m][n]=”j”+”k” (三)、建立循环得到教室一周的课表 for(m= teacher[i][4]) { ? }

for(n=1,n<=5,n++) { ? }

将上述循环嵌套在以上程序之外即可,由于老师并不是全天上课,行的循环不能是简单的从一到五,而必须以教师可能的上课时间为限制,如程序所示:m=taecher[i][4]

为保证教师周课时对教师的限制,加入控制变量x,定义x初值为0,目标数组txt中每赋入一个值,则x增加2,知道达到教师教师周课时限制,循环自动停止,进入下一教师课表循环。

int x=0 //定义x并赋入初值0 ?? //此处加入主体循环 x+=2 //数组赋值后x增加2 if(x>teacher[i][2]) { break; //超出限制自动停止 }

(四)、建立循环,得到所有教师的课表

考虑到题目中要求同类课程尽量不安排在同一时间,而通过对数据的观察我们发现每一类课程有3-4名教师可以任教,所以我们建立循环的时候不能让同一类课程的教师按顺序挑选课程,故循环程序应分段编写,如下: for(i=1,i<=25,i+=4){?} for(i=2,i<=25,i+=4) {?}

for(i=3,i<=25,i+=4){?}

对于不能在同一天上课的教师,可以设置出口,放在循环开始处,自动停止.定义变量yjn,表示教师j在第n天是否有课,没有课则y=0,有课则y=1: for(n=1,n<=5) if{txtj=/0} y=1

出口语句: if(y=1) break (五)、程序优化

在数据,程序每天有错误的情况下,根据以上四步骤可以得到一系列课表,我们利用每门课的周课数进行筛选。如果在所有相关教师的课表中,同一门课程出现的次数不等于这门课所被规定的周课时数(大节),则舍去该解。

五、结论

①、由于数据存在较多问题,以及程序冗长的关系,并没有得到理想中的运算结果。但是,经过慎重思考,作者认为本模型以教师为主体表排课表并无不妥之处,而且教师、课程、教室之间关系分析到位,并无遗漏条件,没有结果输出属于不可控因素引起。本模型设计合理。

②、如果不准晚上课,则教师矩阵中及课程矩阵中的时间列中不再出现数字“5”,而且排课结果不会变化,因为只有教师5、12、18、23可以再晚上授课,他们分别教授第2、4、6、3类课程,但这几类课程并未提供晚上上课时间,所以原课表中没有出现晚上的课,因此,如果不准晚上上课,原有课表可以满足条件。

③对于教师聘用,最好停止采用一聘定终身的方法,要充分全面考核教师上岗后的表现,进行针对性培训。引入竞争淘汰机制。另外,多引进全才教师而不是授课面很窄,影响整体资源配置。

教室配置方面,首先,上课人数尽量接近于教室座位数,一方面节省资源,一方面腾出大教室方便更多同学上自习。其次,同一个班级的学生前后两节课的教室尽量靠近,避免换教室麻烦和课间交通拥挤。

六、参考文献

[1] 赵静、但琦.数学建模与数学实验(第二版).北京.高等教育出版社2003 [2] 姜启元,等.数学模型.第三版.北京.高等教育出版社 2004 [4] 美.Stephen R.Schach 软件工程Java语言实现 译者: 袁兆山等 机械工业出版社.1999 [3] 薛家庆.最优化原理与方法.北京.冶金工业出版社1983

[4] 美.Clifford A.Shaffer.数据结构与算法分析(JAVA版)张铭译.电子工业出版社.2001

[5] 王兵团.数学建模基础.清华大学出版社.2004

本文来源:https://www.bwwdw.com/article/sair.html

Top