2020-12-28
作者:互联网
一个萌新对教务排课程序的思考
前言
##前言
本篇文章只是用来记录下萌新对于一个程序的思考历程的哦。
以前总觉得没有什么数据的处理是用程序代码解决不了的,直到我遇到了下面的这个问题:
假设学校教务处要用一个排课系统,要求输入老师信息和班级信息,要在满足所有的要求下合理的分配课程,应该怎么做?
程序具体要求
一个学校的课表安排前,我们先来了解下一个全校教师数据的构成,如下图,表格内容是教师名字:
给定这样的信息表格,如图可见,老师有是否班主任的属性,不同的年级也有不同的课程安排,比如七年级没有物理化学,八年级有物理没化学,九年级有物理也有化学。现在的要求就是要给每个班级都做一个课表。输出两组表格,一组是每个老师用的课表,选取其中一个如下图:
还有一组是每个班级用的课表,如下图,表格内容是课程名字和授课的教师名字:
思路
我对这个问题最开始的理解,就好像是一个数学才学过一维坐标的学生,刚开始接触三维坐标,为什么这么说呢?因为这里输入的是一个表格,但是输出的排课结果要满足三个表格,第一个就是上图的表格,指定老师上指定的班,第二个是每个老师自己的课表,不能有重的课程,每个老师的课程数量要有限制,第三个是班级的课表,要满足学校的特殊要求,比如一二节课不能是体育课,还比如连堂不能超过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