ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2020-12-28

2020-12-28 13:32:36  阅读:204  来源: 互联网

标签:12 表格 33 调换 28 课表 2020 老师 思路


一个萌新对教务排课程序的思考

前言

##前言
本篇文章只是用来记录下萌新对于一个程序的思考历程的哦。
以前总觉得没有什么数据的处理是用程序代码解决不了的,直到我遇到了下面的这个问题:
假设学校教务处要用一个排课系统,要求输入老师信息和班级信息,要在满足所有的要求下合理的分配课程,应该怎么做?

程序具体要求

一个学校的课表安排前,我们先来了解下一个全校教师数据的构成,如下图,表格内容是教师名字:
输入的教师信息
给定这样的信息表格,如图可见,老师有是否班主任的属性,不同的年级也有不同的课程安排,比如七年级没有物理化学,八年级有物理没化学,九年级有物理也有化学。现在的要求就是要给每个班级都做一个课表。输出两组表格,一组是每个老师用的课表,选取其中一个如下图:在这里插入图片描述
还有一组是每个班级用的课表,如下图,表格内容是课程名字和授课的教师名字:在这里插入图片描述

思路

我对这个问题最开始的理解,就好像是一个数学才学过一维坐标的学生,刚开始接触三维坐标,为什么这么说呢?因为这里输入的是一个表格,但是输出的排课结果要满足三个表格,第一个就是上图的表格,指定老师上指定的班,第二个是每个老师自己的课表,不能有重的课程,每个老师的课程数量要有限制,第三个是班级的课表,要满足学校的特殊要求,比如一二节课不能是体育课,还比如连堂不能超过3节。要满足这些所有的条件,得到结果。

第一次尝试

最开始,我想这不就是复杂一点的数独题嘛,就像把123456789按照要求塞进33方格里,于是我最开始的编程思路就是这样:随机的把所有的老师放在课表里,然后检查是否全部满足条件,不满足就重新随机,再次判断是否满足,按照这样循环。打个比方,这个思路就像是往数独题里随机塞数字,塞完再检查是不是对的,如果不对就再来。程序写好了,一运行就运行了1个多小时也没有得到结果。最后这样的思路就以失败告终。
总结一下:是我高估了计算机的计算速度,越是这种大量的数据,复杂的条件,越是不能用这种不断尝试的思路。还记得以前学数学有这样一个题,跟我的思路很像:班上有n个座位,n名学生要坐进来,问有几种座法,自然是用阶乘(n!=n
(n-1)(n-2)21),这就跟我这种乱塞的方法差不多,用阶乘的算式可以看出,阶乘是个单调递增而且导数还不断增大的函数,如果输入的值很大的话,计算次数就会难以预估,这就是导致我的程序运行不出结果的原因。

第二次尝试

既然乱塞的方法没有奏效,我又想到一种局部乱塞的方法,说来好笑,因为本质上都是一样的,具体思路是这样,同样就拿数独题打比方吧。就像是要做一个99的数独题,原来是直接把所有的元素填进表格再判断对错,这次我就一个一个来,先把99表格分成9个33的表格,用原来的方法把33表格试出来,把第一个33试对了,再去做下一个33,。最后程序运行时,速度快了很多,结果把前面大多数老师和班级的课表都弄好了,但是最后几个老师和班级的课表无论怎么试错,都得不到正确结果。
总结一下:这也是在情理之中,拼魔方把一个面拼好很简单,但是只求拼一个面就不会考虑其他面,所以这样的思路,是难以把魔方所有面都拼完的。这样的思路得出的结果其实也几乎可以投入实用情境了,因为只差最后几班课表出现问题,这个时候人工调整也不会花太多时间。

第三次思考

但是我还是想让程序能一次性得出满意结果,目前有一个想法,就是在上一个思路的基础上添加自动调整。上一次尝试,已经很接近成功了,最后的留下的小毛病,我想这样解决:让电脑帮忙调换。通常最后几个班的课表问题都出在这里:某一节课应该上语文数学英语,但是对应的老师已经在其他班安排好了,因此无论随机到哪个老师,都无法填入这个表格,这个时候让电脑帮忙调换,随机选择一个另一个班的某一堂课,与这个课做调换,如果调换后能实现调换双方都没出问题,都满足条件,就保存调换,不然就取消调换,另外再随机选择一个课调换,以此循环,直到所有的课经过调换都满足条件为止。但是这个思路我还正在尝试,不知道能否奏效。
如果行得通,我再更新到这篇文章。

标签:12,表格,33,调换,28,课表,2020,老师,思路
来源: https://blog.csdn.net/weixin_42696624/article/details/111840781

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有