排课问题分析修订稿
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
排课问题分析
Coca-cola standardization office【ZZ5AB-ZZSYT-ZZ2C-ZZ682T-ZZT18】
排课问题分析
摘要:
本题要求我们对多约束条件的典型组合进行分析,求解,并作最优化处理。
基于此种原因,我们先对各个元素间的冲突做预处理,进行约束条件的规划,再通过matlab软件将教室、教师、课程和时间间的约束条件统一化,构成R-T-C表(详见附表),再将各个元素进行优先级的计算,从而根据排课的优化模型,求出最优解。
经过对所给的表格,数据的深入分析,我们可以得知,教师明显缺少,比如课程学时要求有160个课时,然而教师能上的课时仅有116个课时,所以开始排课时,不考虑教师,向教师中安排课程。
由于同类课程最好不要放在一起,同时根据老师的需求和教室的开放时间进行分配,经过与我们实际的课表的排课情况的分析,比如隔一天排同一课,课程类别不同的课程不在同一时间上课,我们可以大致的排出一个按教室上课的表,即R-T-C表。
通过对R-T-C表的分析,发现有很多课没老师上和老师没课上的情况,我们就对其进行相应的,合理的调整。
最后发现还是老师要外聘。
将外聘14名老师去上相应没人上的科目,具体情况见附表。
最后,我们得到了一张相对优化的,以教室为准的课表(详见附表),从而解决问题(1)的要求。
对于我们课表的安排,发现再没对晚自习有其他条件约束是不会对所排的课表有所影响。
关键词:排课问题组合规划多目标函数数据量化优先级
一、问题重述
对于有课程40门,教师共有25名,教室18间的条件下合理的安排课程表,而课程、教师、教室的具体属性及要求详见附表(表1,表2,表3)
对于课表德编排,题目有如下规则:每周以5天为单位进行编排;每天最多只能编排8节课(上午4节,下午4节),特殊情况下可以编排10节课(晚上2节),每门课程以2节课为单位进行编排,同类课程尽可能不安排在同一时间。
要求所要解决的问题:
1.请你结合实际情况建立数学模型,通过编程计算,给出较为合理的课表编排方案,分析你所给
出的方案的合理性。
2.如果不准晚上排课,排课结果是否有所变化,如何变化
3.对教师聘用,教室配置给出合理化建议。
二、问题分析
随着现代教学的改革及各项教育工程的实施,新的教育体制对课表的编排提出了更高的要求。
但现实生活中,排课问题屡屡皆是,小学如此,中学如此,大学更是如此,不仅科目多样,而且教室、老师多变,这使得排课问题往往是很令人费解的。
经过分析,排课问题就是的多资源组合问题,问题的求解就是找出各个元素间的对应关系。
进而将各个元素间的联系进一步确定,转化成一个可以量度其大小的值,从而确定优先级,而我们又将如何确定各元素间的关系,目标函数的确定
根据已有知识可以知道,本题主要分析的是建立一个排课的优化模型。
而它是一个在课程类别、教师编号、教师及时间上的一个四维空间模型,在各种约束条件下的组合规划问题,其实质就是解决各因素间的冲突问题。
在模型建立后,我们有根据什么参量得到排课的最优解。
三、基本假设
模型假设:
1、学校的教师和教室资源及学生班结构在一个学期内不会有的变动
2、所有的教室都在同一个校区,且1~2节课的教室到3~4节课的教室的路程不超过10min
3、在一学期内,任课教师身体都非常健康,不存在因病因事缺课的情况
4、各种教学资源(课桌、多媒体、机房电脑)在一学期内都不会发生故障,影响上课
5、在上课期间,老师、学生都不迟到,不影响上课质量
6、当有3个课时时,我们当做2个课时处理,及3节连堂上
符号说明: 相关名词解释:
时间段效率:经上网
查询及对相关资料的查阅,我们得知一天内听课效率最高的是上午8~10,下午1~3,故我们定义上午1~2的听课效率为3,其余见附
表。
教室利用率:为充分
利用教室资源,我们定义:
教室利用率=
教室最大容纳量
上课总人数
,
四、问题的分析及模型的建
立
问题分析(1)
从数学角度上讲,本题主要分析建立一个排课模型,而它是一个在课程类别、教师编号、教师及时间上的一个四维空间模型,在各种约束条件下的组合规划问题,其实质就是解决各因素间的冲突问题。
在此为了简化处理,先从课程类别、教室编号入手,建立一个关于C-R 的关系表,再采用化零为整的思路建立我们的目标函数——优化模型,最后,我们根据各因素对排课模型的优先度,求解出排课模型的最优解。
在对问题初始化分析时,我们发现课程类别、教室编号、教师、上课时间存在这么一个对关系:
1)1—1的对应关系 2)1—n 的对应关系 3)n —n 的对应关系
进而,我们再对它们之间的属性分析,根据它们间的联系求出一种相对合理的排课方案,最后,对方案的合理性进行分析。
模型的建立
经过分析,我们需将所有课程尽量合理的安排在一个星期内。
首先我们将一个星期划分为五天,记作1、2、3、4、5,将一天分为四个部分,记作1、2、3、4,进而,我们将得到一个5×4的矩阵。
其中,j=1、2、3、4、5分别表示星期一、星期二、星期三、星期四、星期五;i=1、2、3、4分别表示1~2节课、3~4节课、5~6节课、7~8节课。
即有:
我们记作P (T R C )是一个T ×R ×C 维的数列矩阵,表示T 老师在R 教室上C 课, 我们定义P (T R C )=1时,即老师、教室、课程三者都相互符合是记作1 而P (T R C )=0时,即老师、教室、课程三者中有一项不符合记作0 规定:A(TR)表示T 老师到R 教室上了一次课是,即2个节 B(TR)表示T 老师到R 教室上总课时
约束条件:
1)每一个时间段都不能多于一个老师在一个教室上课,此时应满足的条件是:
1)(25
1∑=≤t TRC P n ∈N (N=1、2、3…25)
2)每位老师在每一天不能同时对同一个班上上两次课,
3)某位老师在某一间教室上课时,安排的课就该在这间教室排完,此时应满足的条件是:
当一位老师连续两天对同一个班上两次课以上的次数越少、课程安排在听课效率高的时间段次数越多和老师与老师之间的冲突(满意度)次数越少,此时定义:
Q=∑∑∑
===18140
1
25
1)(r c t TRC P
同时有满足以上的约束条件,Q 将取到最优值,即此时安排的课表最优化
排课的预处理
1) 同一教师在同一时间内不能安排两门课 同一教室在同一时间内不能安排两门课
同一时间内安排的课时总数不能大于教室的课时总数 所提供的教室属性安排课程的所需教室属性一致 2) 优化级的计算:
考虑到课表的安排是为了按时保量的完成教学任务,而其影响因素有众多,这里我们主要考虑一下三种:
1)时间段效率 2)教室利用率 3)教师满意度
所以我们对课表的安排原则将依据优先级的大小进行排课。
先对以上三个因素进行量化处理可得到:
D= W 1×X 1+×X 2+ W 3×X 3
其中W1 W2 W3表示相应参数,可根据实际情况进行调整的
通过上式,我们可以很容易得知上课的时间段效率、教室利用率、教师满意度越大,D值就越大即优先级越大,就优先排课;反之,D值越小,优先级就越小,就相对后排课。
通过模型得到的T-R-C表(见附表),再根据优先级的排课,我们可得到一个相对优化的课表:
模型的评价与改进
优点:
到了一种排课的方法,即将课程表按课时数撤分,再按没门课程的优先顺序依次放入课表中。
在考虑其他因素(某课程只能安排在固定的某时间段上课,教师只在固定时间段安排课程)的情况下,本模型便于进一步发展、完善(只需改变最优解的参数加相应限制就可解决)。
比起目前最相对合理的遗产法简单易懂很多。
缺点:
有很多待改进之处,该算法的优先级只是根据经验常识来进行优先级安排课程,具有一定的非科学性,如果能根据一定的科学知识,对课程的优先级进行科学的评定,科学的地算出其优先级系数,再确定其优先级,会具有更好的合理性。
再解题过程中限制条件多,数据量大,过程相对较繁琐。
模型推广
本模型有编程优化的模块,但排课表是人为因素较多,也是为了满足课程的安排过程中更人性化。
因此本模型适用于中小规模的排课,其主要限制因素是程序完善度不高,如要进行推广,则必须增加程序的模块,使其更完善,相信改进完善后,即可更科学的实现大规模大排
参考文献:
[1] 数学建模(上册),成都电子机械高等专科学校,二零一零年三月
[2] 数学建模资料——最优化模型.pdf
[3] 回溯法——
[4] 贪婪法——view/tp=0_10
[5] 一天的最有听课效率时间段——.
附表:
表4:T-R-C表
程序附录:clear;
C=[
1 2 2 1 1 1 2 1 2 -1 1 3 1 2 -1 1 2 1 1 1
1 2 3 2 -1
2 2 4 2 -1 2 2 2 1 1 2 1 1 2 1 2 2 1 2 -1
2 2 1 1 1
3 3 3 2 1 3 2
4 2 1 3 3 2 1 -1 3 1 1 2 -1
3 2 1 2 -1
4 2 1 1 1 4 2 3 2 -1 4 3 4 2 1 4 2 2 1 1
4 1 2 2 1
5 2 1 2 1 5 2 1 1 -1 5 2 1 2 1
5 3 3 2 -1
5 2 4 1 1
6 2 2 1 -1
6 2 1 2 -1
6 2 1 2 -1
6 2 2 1 1
6 2 1 2 -1
7 3 1 2 1
7 2 1 1 -1
7 2 3 2 0
7 2 4 1 1
7 2 2 2 -1
8 3 1 3 0
8 2 1 3 1
8 1 1 3 1
8 2 3 3 -1
8 2 2 3 0
];
T=[
1 8 4 4 1 4 0
1 0 4
2 -1 0 0
1 0 6
2 1 0 0
2 0 4 1 1 1 0
2 0 4 2 -1 0 0
2 0 6 2 0 0 0
3 0
4 2 1 0 0
3 8 3 5 -1 0 0 3 0
4 2 1 11 18
3 0 6 1 1 0 0
4 0 8 2 -1 9 0 4 0 4 2 0 0 0
4 0 6 1 -1 0 0
5 0 2 2 1 0 0
5 8 3 5 -1 23 0
5 0 4 2 1 0 0
6 0 4 2 -1 0 0 6 0 6 2 0 9 0
6 0 4 1 -1 0 0
7 0 4 2 1 0 0
7 0 6 2 -1 0 0 7 0 6 1 1 0 0
3 8
4
5 0 15 0
4 8 6
5 1 0 0
6 8 4 5 -1 0 0 ];
R=[
4 1
4 2
4 2
2 1
2 2
2 2
2 2
3 2
3 2
3 1
3 2
3 3
1 3
1 3
1 3
1 1
2 2
1 2
];
%Rt为教室与老师的关系
Rt=zeros(25,18);
for i=1:18
for m=1:25
for n=1:40
if R(i,1)>=C(n,3)
i1=C(n,1);
if T(m,1)==i1||T(m,2)==i1
i4=T(m,4);
switch (i4)
case 1
if R(i,2)==1
Rt(m,i)=1;
end
case 2
if R(i,2)==2
Rt(m,i)=1;
end
case 3
if R(i,2)==3
Rt(m,i)=1;
end
case 4
if R(i,2)==1||R(i,2)==3 Rt(m,i)=1;
end
case 5
if R(i,2)==2||R(i,2)==3
Rt(m,i)=1;
end
end
end
end
end
end
end
Rt;
%Rc为教室与课程的关系
Rc=zeros(18,40);
for i=1:18
for n=1:40
if R(i,1)>=C(n,3)&&R(i,2)==C(n,4)
Rc(i,n)=1;
end
end
end
Rc;
%Tc
for m=1:25
for n=1:40
if T(m,1)==C(n,1)||T(m,2)==C(n,1)
if T(m,3)>=2*C(n,2)
q=T(m,4);
t=T(m,5);
switch q
case 1
if C(n,4)==1
switch t
case 1
if C(n,5)==1
Tc(m,n)=1;
end
case -1
if C(n,5)==-1
Tc(m,n)=1;
end
case 0
if C(n,5)==1||C(n,5)==-1||C(n,5)==0 Tc(m,n)=1;
end
end
end
case 2
if C(n,4)==2
switch t
case 1
if C(n,5)==1
Tc(m,n)=1;
end
case -1
if C(n,5)==-1
Tc(m,n)=1;
end
case 0
if C(n,5)==1||C(n,5)==-1||C(n,5)==0 Tc(m,n)=1;
end
end
end
case 3
if C(n,4)==3
switch t
case 1
if C(n,5)==1
Tc(m,n)=1;
end
case -1
if C(n,5)==-1
Tc(m,n)=1;
end
case 0
if C(n,5)==1||C(n,5)==-1||C(n,5)==0 Tc(m,n)=1;
end
end
end
case 4
if C(n,4)==1||C(n,4)==3
switch t
case 1
if C(n,5)==1
Tc(m,n)=1;
end
case -1
if C(n,5)==-1
Tc(m,n)=1;
end
case 0
if C(n,5)==1||C(n,5)==-1||C(n,5)==0
Tc(m,n)=1;
end
end
end
case 5
if C(n,4)==2||C(n,4)==3
switch t
case 1
if C(n,5)==1
Tc(m,n)=1;
end
case -1
if C(n,5)==-1
Tc(m,n)=1;
end
case 0
if C(n,5)==1||C(n,5)==-1||C(n,5)==0
Tc(m,n)=1;
end
end
end
end
end
end
end
end
Tc;
%在完全满足的情况下课程选择最优化的老师
%Ct说明行代表课程,列代表能上该课的老师编号
%if有相同编号的老师那针对该门课程进行求最优值,将值最大的老师放入相应课程中Ct=[1 0 0;
2 0 0;
0 0 0;
1 0 0;
2 0 0;
5 6 0;
4 0 0;
6 0 0;
5 6 0;
4 0 0;
0 0 0;
7 9 23;
0 0 0;
8 23 0;
23 0 0;
0 0 0;
11 12 0;
24 0 0;
0 0 0;
12 24 0;
16 0 0;
0 0 0;
16 0 0;
0 0 0;
0 0 0;
19 0 0;
17 18 25;
17 18 25;
0 0 0;
17 18 25;
0 0 0;
0 0 0;
0 0 0;
22 0 0;
21 0 0;
0 0 0;
1 23 24;
1 23 24;
23 25 0;
23 0 0;
];
%具体实现
Ct1=zeros(40,1);%用于存放最终值
%先判断只有一个老师上课的课程
for n=1:40
for nn=n+1:40
if length(Ct(Ct(n,:)~=0))==1
if nn~=n
for u=1:3
if Ct(n,1)==Ct(nn,u) %判断老师编号相同
u1=Ct(n,1);%获取老师编号
a1=n;%获取课程号
a2=nn;%获取课程号
b1=T(u1,3)-2*C(a1,2);%计算老师课时与课程课时的差 b2=T(u1,3)-2*C(a2,2);%计算老师课时与课程课时的差 if b1<=b2
if Ct1(a1)==0
Ct1(a1)=u1;
end
else
if Ct(a2)==0
Ct(a2)=u1;
end
end
if Ct(n,2)==Ct(nn,u) %判断老师编号相同
u1=Ct(n,1);%获取老师编号
a1=n;%获取课程号
a2=nn;%获取课程号
b1=T(u1,3)-2*C(a1,2);%计算老师课时与课程课时的差 b2=T(u1,3)-2*C(a2,2);%计算老师课时与课程课时的差 if b1<=b2
if Ct1(a1)==0
Ct1(a1)=u1;
end
else
if Ct(a2)==0
Ct(a2)=u1;
end
end
end
if Ct(n,3)==Ct(nn,u) %判断老师编号相同
u1=Ct(n,1);%获取老师编号
a1=n;%获取课程号
a2=nn;%获取课程号
b1=T(u1,3)-2*C(a1,2);%计算老师课时与课程课时的差 b2=T(u1,3)-2*C(a2,2);%计算老师课时与课程课时的差 if b1<=b2
if Ct1(a1)==0
Ct1(a1)=u1;
end
else
if Ct(a2)==0
Ct(a2)=u1;
end
end
end
end
end
if length(Ct(Ct(n,:)~=0))~=1
if nn~=n
for u=1:3
if Ct(n,1)==Ct(nn,u) %判断老师编号相同
u1=Ct(n,1);%获取老师编号
a1=n;%获取课程号
a2=nn;%获取课程号
b1=T(u1,3)-2*C(a1,2);%计算老师课时与课程课时的差 b2=T(u1,3)-2*C(a2,2);%计算老师课时与课程课时的差
if Ct1(a1)==0
Ct1(a1)=u1;
end
else
if Ct(a2)==0
Ct(a2)=u1;
end
end
end
if Ct(n,2)==Ct(nn,u) %判断老师编号相同
u1=Ct(n,1);%获取老师编号
a1=n;%获取课程号
a2=nn;%获取课程号
b1=T(u1,3)-2*C(a1,2);%计算老师课时与课程课时的差 b2=T(u1,3)-2*C(a2,2);%计算老师课时与课程课时的差 if b1<=b2
if Ct1(a1)==0
Ct1(a1)=u1;
end
else
if Ct(a2)==0
Ct(a2)=u1;
end
end
end
if Ct(n,3)==Ct(nn,u) %判断老师编号相同
u1=Ct(n,1);%获取老师编号
a1=n;%获取课程号
a2=nn;%获取课程号
b1=T(u1,3)-2*C(a1,2);%计算老师课时与课程课时的差 b2=T(u1,3)-2*C(a2,2);%计算老师课时与课程课时的差 if b1<=b2
if Ct1(a1)==0
Ct1(a1)=u1;
end
else
if Ct(a2)==0
Ct(a2)=u1;
end
end
end
end
end
end
end
Ct1;
%T-R-C优化 [老师教室]
TRC=[1 10;%1-3
2 18;
3 18;
6 2;%6-9
4 4;
6 18;
5 18;
7 2;%12-21
10 4;
8 18;
9 18;
13 16;
11 8;
24 2;
11 5;
12 5;
16 18;
19 4;%26-28
18 18;
17 18;
20 8;%33-35
22 1;
21 5;
15 13;%38-40
25 12;
23 12;
];
%定义时间片
%B[周几上课时间段老师一周几节] B=zeros(26,4);
%课程1
%课程1
B=zeros(10,4,20);
n=1;
for a=1:5
a1=a;
for b=1:2
b1=b;
for n=n+1:20
B(1,:,n)=[a1 b1 1 2]; break
%课程2
n=1;
for a=1:5
a1=a;
for b=3:4
b1=b;
for n=n+1:20
B(2,:,n)=[a1 b1 2 2]; break
end
end
end
%课程3
n=1;
for a=1:5
a1=a;
for b=3:4
b1=b;
for n=n+1:20
B(3,:,n)=[a1 b1 3 3];
break
end
end
end
%课程6
n=1;
for a=1:5
a1=a;
for b=3:4
b1=b;
for n=n+1:20
B(4,:,n)=[a1 b1 6 2];
break
end
end
end
%课程7
n=1;
for a=1:5
a1=a;
for b=1:2
b1=b;
for n=n+1:20
end
end
end
%课程8
n=1;
for a=1:5
a1=a;
for b=1:2
b1=b;
for n=n+1:20 B(6,:,n)=[a1 b1 6 1]; break
end
end
end
%课程9
n=1;
for a=1:5
a1=a;
for b=3:4
b1=b;
for n=n+1:20 B(7,:,n)=[a1 b1 5 2]; break
end
end
end
%课程12
n=1;
for a=1:5
a1=a;
for b=1:2
b1=b;
for n=n+1:20 B(8,:,n)=[a1 b1 7 2]; break
end
end
end
%课程13
n=1;
for a=1:5
a1=a;
for b=3:4
for n=n+1:20 B(9,:,n)=[a1 b1 10 3]; break
end
end
end
%课程14
n=1;
for a=1:5
a1=a;
for b=1:2
b1=b;
for n=n+1:20 B(10,:,n)=[a1 b1 8 1]; break
end
end
end
%课程15
n=1;
for a=1:5
a1=a;
for b=3:4
b1=b;
for n=n+1:20 B(11,:,n)=[a1 b1 9 2]; break
end
end
end
%课程16
n=1;
for a=1:5
a1=a;
for b=1:2
b1=b;
for n=n+1:20 B(12,:,n)=[a1 b1 13 2]; break
end
end
end
%课程17
n=1;
for a=1:5
for b=3:4
b1=b;
for n=n+1:20 B(13,:,n)=[a1 b1 11 2]; break
end
end
end
%课程18
n=1;
for a=1:5
a1=a;
for b=1:2
b1=b;
for n=n+1:20 B(14,:,n)=[a1 b1 24 3]; break
end
end
end
%课程19
n=1;
for a=1:5
a1=a;
for b=1:2
b1=b;
for n=n+1:20 B(15,:,n)=[a1 b1 11 2]; break
end
end
end
%课程20
n=1;
for a=1:5
a1=a;
for b=1:2
b1=b;
for n=n+1:20 B(16,:,n)=[a1 b1 12 1]; break
end
end
end
%课程21
for b=1:2
b1=b;
for n=n+1:20
B(17,:,n)=[a1 b1 16 2];
break
end
end
end
%课程26
n=1;
for a=1:5
a1=a;
for b=3:4
b1=b;
for n=n+1:20
B(18,:,n)=[a1 b1 19 2];
break
end
end
end
%课程27
n=1;
for a=1:5
a1=a;
for b=3:4
b1=b;
for n=n+1:20
B(19,:,n)=[a1 b1 18 2]; break end
end
end
%课程28
n=1;
for a=1:5
a1=a;
for b=3:4
b1=b;
for n=n+1:20
B(20,:,n)=[a1 b1 17 2]; break end
end
end
%课程33
for b=1:4
b1=b;
for n=n+1:20
B(21,:,n)=[a1 b1 20 2]; break end
end
end
%课程34
n=1;
for a=1:5
a1=a;
for b=1:2
b1=b;
for n=n+1:20
B(22,:,n)=[a1 b1 22 2]; break end
end
end
%课程35
n=1;
for a=1:5
a1=a;
for b=3:4
b1=b;
for n=n+1:20
B(23,:,n)=[a1 b1 21 2]; break end
end
end
%课程38
n=1;
for a=1:5
a1=a;
for b=1:2
b1=b;
for n=n+1:20
B(24,:,n)=[a1 b1 15 1]; break end
end
end
%课程39
n=1;
for a=1:5
for b=3:4
b1=b;
for n=n+1:20
B(25,:,n)=[a1 b1 25 2]; break
end
end
end
%课程40
n=1;
for a=1:5
a1=a;
for b=1:4
b1=b;
for n=n+1:20
B(26,:,n)=[a1 b1 23 2]; break
end
end
end
%判断B中同一时间同一教室的情况
z=1;
for i=1:26
i1=i;
for n=1:20
n1=n;
for ii=1:26
for iii=ii+1:26
for nn=1:20
for nnn=nn+1:20
if B(ii,1,nn)==B(iii,1,nnn)&&B(ii,2,nn)==B(iii,2,nnn)%判断星期时间段相同
if TRC(ii,2)~=TRC(iii,2)%判断教室相同
for w=1:B(i1,4,n1)%取出相应
for z=z+1:26
Q(z,:,w)=B(i1+1,:,n1);%将面包片取出相应个数 end
end
end
end
end
end
end
end
end
end。