选课问题、数学建模

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2013-2014第一学期
数学建模课程设计
题目:学生选课
姓名:刘金星
班级:网络工程\
2014年1月6日—1月10日
一.模型摘要
摘要:对于习惯了中小学课程(所有的课程由学校统一安排,而且科目从小学到高中有连续性)的大学新生来说,大学的课程多得令他们眼花缭乱,课程分类也比较复杂,因此选课对他们而言还是一件新鲜而陌生的事物。

但大学的学习与选课有莫大的关系,必须了解它,才能掌握主动权。

而要了解选课制,首先要对大学的课程设置有所认识。

大学的课程按大类来说一般分为必修课和选修课。

必修一般指学校或院系规定学生必须修习某课程,学校对必修课程一般有统一的要求和安排。

选修是指根据学生个人兴趣或专业需要自由选择修习某课程。

简言之,必修就是必须修读,选修就是选择性修读。

一般来说,基础性的知识都作为必修课程。

有些知识不是基础性的,与兴趣和研究方向有关,这部分知识可以选择。

这是大学与中学最大的不同之处。

本文针对关于大学生选课时所需要考虑到的问题,根据学校规定的要求达到的学分与每门课的学分多少,运用排列组合的知识建立模型,通过分析输出各种情况下所需的选课方案
关键字:matlab,矩阵,排列组合
二. 问题重述
某同学考虑下学期的选课,其中必修课只有一门(2学分),可供选修的限定选修课(限选课)有8门,任意选修课(任选课)有10门。

由于有些课程之间相学分 5 5 4 4 3 3 3 2 同时选修要求 1 2 任选课课号 9 10 11 12 13 14 15 16 17 18 学分 3 3 3 2 2 2 1 1 1 1 限选课课号 1 2 3 4 5 6 7 8 同时选修要求
8
6
4
5
7
6
在上述18门课中至少选修18个学分,学校还规定学生每学期选修任选课的比例不能少于所修总学分(包括2个必修学分)的1/6,也不能超过所修总学分的1/3。

学院也规定,课号为5,6,7,8的课程必须至少选一门。

1)为了达到学校和院系的规定,该同学下学期最少应该选几门课?应该选哪几门课?
2)若考虑在选修最少学分的情况下,该同学最多可以选修几门课?选哪几门?
三.模型假设
(1)学生选修任何课程都是随机的,不存在主观意图。

实际生活中选课程是有主观意图的,但是本问题中不考虑这一点。

(2)学生只要选修某门课程,就认为他能够获得该门课程的学分,不考虑实际生活中的考试不及格得不到学分的情况。

(3)学校所给的课程,不管任何课程,都应当是做过调研,一般情况下学生只要选择,就能选上,而不会出现连选几门都选不上的局面。

也就是说选课所给的限制人数应当是合理的限制。

四.问题分析
根据提出的问题,学生要选修的课程必须同时满足下列四条: (a )任何学生每个学期选修的总学分数不能少于20学分(包括2个必修学分),所以除了必修课程外,任何学生必须在上述18门课中至少选修18个学分 (b )学校规定,课号为5,6,7,8的课程必须至少选一门。

(c )同时选修的课必须同时选修,不能不选修。

例如某学生选9号课,那么他
也必须同时选修8号课。

同时选修的矩阵是⎥


⎢⎣⎡675468211413121110975
(d )学校规定学生每学期选修任选课的比例不能少于所修总学分(包括2个必修学分)的1/6,也不能超过所修总学分的1/3。

即3
6
总修学分任选课学分总修学分≤≤。

注意,总修学分包括必修课的2学分。

两个个问题都需要选课方案。

比如第一个问题,“为了达到学校和院系的规定,该同学下学期最少应该选几门课?应该选哪几门课?”学校规定最少学分是20分,去掉2分的必修学分,那么要从剩下18门课程中选择至少18个学分。

问题问的是“最少应选几门课?”按照最少18分的限制,从1门、2门、3门、4门、5门……收入来思考,发现至少应该选5门课,因为如果选4门课,要达到最少学分势必需要选那些学分值大的课,只能选1、2、3、4这四门课,这四门课的学分加了起来正好是18分,但虽然学分数满足了,可是并不满足其余的三条,所以这种选法是不对的。

选5门课就能得到要求。

例如选1、2 、3 、6 、10 、14就其中一种选课方案,它满足上述4条。

四条规定相互制约,错综复杂,单靠人力来一组一组的确定是不可能完成的。

五.模型建立
本问题的解答模型就是排列组合的知识。

首先说明一点,因为课程号码有的与学分值的数目相同,为了避免在计算机上处理过程中出现紊乱,我们统一把课程号码加上10,课号1-18,就变成了11-28。

假设这个同学在符合学校规定要求的前提下要选n 门课,185≤≤n :
第一步,首先把11-28门课程抽出n 门课进行组合,共有n
C 18种。

利用Matlab
的命令就是combntns([11:28],n),这个命令产生的结果是一个矩阵,每一行就是n 门课的一个组合。

令选课组合xkzuhe=combntns([11:28],n) 第二步 以下分四个模块,每个模块使用一个矩阵来存储该模块筛选合格的数据。

(a )第一个模块是判断每个n 门课组合的学分总和是否大于18分,如果大于等于18分,就保留,并且把该条n 门课组合添加到矩阵a 中。

矩阵a 用来存储满足了大于18分的n 门课的组合。

(b )第二个模块是判断矩阵a 中每个n 门课的组合是否是含有5,6,7,8至少一门课。

如果是至少含有5,6,7,8至少一门课,就把该行记录添加到b 矩阵里,矩阵b 用来存储满足了含有5,6,7,8至少一门课的组合
(c )第三个模块是c 模块,用来存放满足同时选修要求的n 门课的组合数
据。

同时选修的矩阵是⎥
⎦⎤
⎢⎣⎡16171514161812112413222120191715。

先分析以下同时选修的要求,在一个n 门课的组合中,比如有15号课,就必须有11号课;有17号课,就必须有12号课;有19号课,就必须有18号课等等。

一方面,要判断任意一个n 门课组合是不是符合上述要求,比如它含有15号课,又同时含有11号课,那么就保留这个n 门课组合;另一方面,经过上述的判断保留,b 矩阵就删除了一部分不符合要求的,但是保留的却也不是都适合,比如一个记录,含有15号课且含有11号课,保留下来了,但是如果这个记录同时含有17号课且不
含有12号课,那么这个记录就不适合,需要再次删除。

因此,第三个模块需要分成两个子模块来判断,就是上面的两个方面。

第一个子模块先大范围的保留基本适合的,8对同时选修课,只要含有至少一对就保留。

第二个模块是分别对每对选修课进行检验,含有15号课不含有11号课的或者含有17号课不含有12号课的或者含有19号课不含有18号课的或者含有20号课不含有16号课的……等等,都全部删除。

经过这两个子模块的判断,剩下的数据给c 矩阵。

(d )第四个模块是判断上述c 矩阵内的数据是否适合
3
6总修学分任选课学分总修学分≤
≤的规定。

注意,总修学分包括必修课的2学分。


合的就保留下来给d 矩阵。

最后的d 矩阵就是符合要求的n 门课的组合。

六.模型求解
一、 第一个问题“为了达到学校和院系的规定,该同学下学期最少应该选几门课?应该选哪几门课?”
答:应该选5门课,在筛选程序内给定n=5,可得到应该选的5门的组合: 1 2 6 10 14 1 4 6 10 11 2 4 6 10 11
选修最少学分的情况下,该同学最多可以选修几门课?选哪几门?
把程序里面的s>=18改成s=18,然后依次把选课门数改成5、6、7、8等,可以看出最多选8门课,8门课的组合是:
1 3 5 1
2 15 16 17 18 1
3 6 1
4 1
5 1
6 1
7 1
8 1 4 5 12 15 16 17 18 1 4 6 14 15 16 17 18 1 5 6 8 12 15 16 17 1 5 6 8 12 15 16 18 1 5 6 8 12 15 17 18 1 5 6 8 12 16 17 18 1 5 6 8 14 15 16 17 1 5 6 8 14 15 16 18 1 5 6 8 14 15 17 18 1 5 6 8 14 16 17 18 2 3 6 14 15 16 17 18 2 3 7 8 15 16 17 18 2 3 7 13 15 16 17 18 2 4 6 14 15 16 17 18 2 4 7 8 15 16 17 18 2 4 7 13 15 16 17 18 2 6 7 8 13 15 16 17 2 6 7 8 13 15 16 18
2 6 7 8 1
3 15 17 18
2 6 7 8 1
3 16 17 18
2 6 7 8 14 15 16 17
2 6 7 8 14 15 16 18
2 6 7 8 14 15 17 18
2 6 7 8 14 16 17 18
3 4 6 8 14 15 16 17
3 4 6 8 14 15 16 18
3 4 6 8 14 15 17 18
3 4 6 8 14 16 17 18
七.模型分析与改进
1.模型分析与检验:
本题主要采用的是排列组合的方法,首先把11-28门课程抽出n门课进行种。

利用Matlab的命令就是combntns([11:28],n),这个命令产C
组合,共有n
18
生的结果是一个矩阵,每一行就是n门课的一个组合。

令选课组合xkzuhe=combntns([11:28],n)。

再将其分四个模块,每个模块使用一个矩阵来存储该模块筛选合格的数据。

不断筛选满足要求的矩阵,最后剩余的矩阵即为符合要求的n门课的组合。

2.模型评价
2.1 模型优点:能够很快的解决简单的筛选问题。

2.2 模型缺点:对于条件比较多的筛选问题则很难快速的解决。

3 模型改进和推广:
1.还可以参照最小费用最大流算法适当地进行建模。

2.也可以使用多次背包算法,先把给出的图用拓扑排序算法构建成树,在树里面的每个结点使用背包算法,计算出当前点以下用一定时间能得到的最大学分,多个背包向父亲结点背包。

3.本文建立的模型可推广到各种复杂的筛选问题。

八.建模心得
数学建模,对于我们专业的大二学生来说是一个完全陌生的课程,然而在本学期末的课程设计中却开设了数学模型,这才使我们初步了解了什么叫做数学建模。

使我们在学习之中,锻炼了我们的能力,获益非浅。

真正用到了数学的理论知识去解决我们在实际生活上的一些问题。

从最初的“建模”简介,我们了解到数学在实际生活中的应用之广、之深、之切。

小到日常的衣食住行,大到科技进步,人类生存。

庞大的数学知识体系良好地规范我们的生活,与我们每个人都息息相关,并随着科技的进步,数学与我们的关系也越来越密切。

终于明白了,为什么数学是真正的科学工具,是人类发展进步的基础学科,它既能规范现在,又能预测未来。

在这次实践中,我们组选择的是关于学生选课模型,这个模型说说简单也简单,说难也难,关键看如何灵活的建立模型,并借助计算机软件的优势,巧妙的解决此问题。

在确立了题目之后,我们两个就开始着手分头行动,经过多天的努力模型基本建成。

通过这次合作完成任务,我们感觉到团队精神是数学建模是否取得好成绩的最重要的因素,只有将大家的智慧集中到一起,才能做出更加完美的成果!
参考文献:
[1]费浦生数学建模及其基础知识详解,武汉大学出版社
[2周义仓数学建模实验西安交通大学出版社 1999年
[3]韩明数学实验(Matlab)同济大学出版社 2009年
附录:
Matlab筛选程序如下:
n=input('请输入选课的门数:','s');
xk=[11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28;5 5 4 4 3 3 3 2 3 3 3 2 2 2 1 1 1 1]; xkzuhe=combntns([11:28],n);
[hang,lie]=size(xkzuhe);
a=zeros(1,lie);
for i=1:hang
s=0;
for j=1:lie
[xkhang,xklie]=find(xk==xkzuhe(i,j));
s=s+xk(2,xklie);
end;
if s>=18
a=[a;xkzuhe(i,:)];
end;
end;
[ahang,alie]=size(a);
a=a(2:1:ahang,:);
*************以上第一模块
[ahang,alie]=size(a);
b=zeros(1,alie);
for i=1:ahang
p=0;
for j=1:alie
if a(i,j)==15||a(i,j)==16||a(i,j)==17||a(i,j)==18 p=p+1;
end;
end;
if p>=1
b=[b;a(i,:)];
end;
end;
[bhang,blie]=size(b);
b=b(2:1:bhang,:);
*************以上第二模块
[bhang,blie]=size(b);
c=zeros(1,blie);
for i=1:bhang
p1=-1;p2=-2;
p3=-1;p4=-2;
p5=-1;p6=-2;
p7=-1;p8=-2;
p9=-1;p10=-2;
p11=-1;p12=-2;
p13=-1;p14=-2;
p15=-1;p16=-2;
p17=-1;p18=-2;
for j=1:blie
if b(i,j)==15
p1=1;
end;
if b(i,j)==10
p2=1;
end;
if b(i,j)==17
p3=1;
end;
if b(i,j)==12
p4=1;
end;
if b(i,j)==19
p5=1;
end;
if b(i,j)==18
p6=1;
end;
if b(i,j)==20
p7=1;
end;
if b(i,j)==16
p8=1;
end;
if b(i,j)==21
p9=1;
end;
if b(i,j)==14
p10=1;
end;
if b(i,j)==22
p11=1;
end;
if b(i,j)==15
p12=1;
end;
if b(i,j)==23
p13=1;
end;
if b(i,j)==17
p14=1;
end;
if b(i,j)==24
p15=1;
end;
if b(i,j)==16
p16=1;
end;
end;
if p1==p2||p3==p4||p5==p6||p7==p8||p9==p10||p11==p12||p13==p14||p15==p16
end;
end;
[chang,clie]=size(c);
c=c(2:1:chang,:);
…………..以上第三模块的第一子模块[chang,clie]=size(c);
i=1;
while i<=chang
p1=0;p2=0;
p3=0;p4=0;
p5=0;p6=0;
p7=0;p8=0;
p9=0;p10=0;
p11=0;p12=0;
p13=0;p14=0;
p15=0;p16=0;
p17=0;p18=0;
for j=1:clie
if c(i,j)==15
p1=1;
end;
if c(i,j)==11
p2=1;
end;
if c(i,j)==17
p3=1;
end;
if c(i,j)==12
p4=1;
end;
if c(i,j)==19
p5=1;
end;
if c(i,j)==18
p6=1;
end;
if c(i,j)==20
p7=1;
end;
if c(i,j)==16
p8=1;
end;
if c(i,j)==21
end;
if c(i,j)==14
p10=1;
end;
if c(i,j)==22
p11=1;
end;
if c(i,j)==15
p12=1;
end;
if c(i,j)==23
p13=1;
end;
if c(i,j)==17
p14=1;
end;
if c(i,j)==24
p15=1;
end;
if c(i,j)==16
p16=1;
end;
end;
if
(p1==1&p2==0)||(p3==1&p4==0)||(p5==1&p6==0)||(p7==1&p8==0)||(p9==1&p10==0)||(p11==1 &p12==0)||(p13==1&p14==0)||(p15==1&p16==0)
c(i,:)=[];
[chang,clie]=size(c);
i=i-1;
end;
i=i+1;
end;
****************以上第三模块的第二子模块
[chang,clie]=size(c);
d=zeros(1,clie);
for i=1:chang
zxf=0;zrxf=0;
for j=1:clie
[h,l]=find(xk==c(i,j));
zxf=zxf+xk(2,l);
if c(i,j)>=19
zrxf=zrxf+xk(2,l);
end;
数学建模课程设计
end;
if zrxf>=(zxf+2)/6&&zrxf<=(zxf+2)/3
d=[d;c(i,:)];
end;
end;
[dhang,dlie]=size(d);
d=d(2:1:dhang,:);
f=ones(size(d));
zh=d-f*10
第11 页共11 页。

相关文档
最新文档