一个排课产品的从零到一

1.一句话描述

为每个班级,按照教学计划,以周为单位,通过人工和算法,来确定每天在哪里上什么课。

2.简化策略

从上述描述中,可以看到为了降低产品复杂度,我们对问题做了几个方面的简化。

2.1 以班级为粒度

排课1.0的粒度是班级而非个人。这是在计算资源有限的情况下,第一版本里做的简化处理。

这里的班级既包括传统的班级,也包括由于能力分层产生的分层班,以及兴趣班。同一个学生可能会在多种不同类型的班级中,当我们为每个班级分配好课程以后,从学生个体的角度看,就生成了“一生一课表”。

2.2 以周为单位

在传统学校,一个学期被划分为19到21周,学期课表就是周课表。排课1.0也是按周进行排课。

在学期初会为每一周生成基础课表,新的一周的课表一般会从这个基础课表复制而来,然后做一些调整,比如加入一些本周的临时活动。如果加入的活动和原来的课程计划产生冲突,则会根据本周的实际可用课时,取消一些课程。由此造成的进度的延误老师会在后面补回来。

教学计划一般按学期进行组织,会把需要教学的内容按课时组织到每次课上。长远来看,如果我们可以支持以学期为单位来进行排课,就能在系统层面追踪和优化活动安排及其影响。一个被冲掉的课时会被自动推后到后续日程安排中。当然我们也可以在一个学期里为可能的变化预留出buffer时段。

2.3 按坑位排课

考虑到计算的空间,1.0版本里面把一周的时间切分为5天,每天7个可排课坑位。这些离散的可组合方案构成了我们算法(主要基于遗传算法)的基础。如果是按连续时间直接排课,会使得可选方案数量大量增加,从中选择出最优解的计算时间也会大量增加。

3.排课流程

3.1 设置可排课坑位

一个学生的作息时间决定了他的上课时间。我们在排课时,会根据这种不同的作息时间分成小学和中学两大组(会为每个年级的学生设置相应的作息时间)。两组具有各自的作息时间及上课时长。小学的课程时长一般是35分钟(,也有一些课程是20分钟、50分钟),而中学的课程时长则是50分钟。这两组使用的排课算法则是同一套,由于是分开排课,所以算法中暂时也就没有考虑课程时长。当未来我们有中小学混上的课程时,则需要对算法做改进,可以粒度细化到学生维度,支持灵活选课。

3.2 设置学生分组,支持学生在多个分组中

传统上我们会把一个年级(如G7)分成几个班(如G7A班,G7B班),这是最常规的分法。在云谷推崇因材施教的理念之下,我们还会根据学生的学科能力再进行分组,比如G7英语初级班(G7EN1),G7英语中级班(G7EN2),G7英语高级班(G7EN3)。G7EN1会有来自G7A和G7B的学生。也就是说,一个学生既可能在G7A班级,也可能在G7B班级。

在排课系统里面,我们标记出可能存在学生重合的班级集合,这样在排课时就不会出现 G7A和G7EN1 在同一时间上课的情况,但G7A和G7B是可以同一时间不同教室上课的,同理,G7EN1和G7EN2、G7EN3也是可以在同一时间不同教室上课的。

3.3 设置课程及课程下的教学计划

每个课程会设置该课程的任课教师,可能有多名(教师名单会提前在系统里维护好)。课程也会设置好重复频率,如1周2次,2周1次等信息。更高级的,课程还可以设置偏好时间,比如某几天的上午。

每个课程还会关联一个教学计划,该计划决定了课程和学生分组的关系,比如“2018学年G7数学课程”需要G7A和G7B两个分组来参加。换个角度讲,教学计划为每个学生分组确定了各分组在每周需要参加的课程。

3.4 维护可用教室信息

在排课算法执行之前,最后一个要设置的信息就是教室的可用信息。我们可以设定规则说这个班级优先给哪个课程使用,哪个学生分组使用等,课程的适用教室优先级高于学生分组。

3.5 排课算法

上面我们已经多次提到过排课规则,这些规则的作用就是去干预和引导排课过程。我们在设置规则的时候会设定规则优先级,一套规则的优先级通过权重来体现,权重越高越优先执行,当权重为100%时,这条规则必须满足,否则就认为排课失败。权重较低时(如50%),我们则会尽量去满足该规则。

排课算法在执行排课时会按照权重从高到低来执行规则。算法会判断规则里涉及到哪些课程、班级和老师,根据这些信息找到对应的课节来排课。

排课算法的输入是:已经绑定好课程、学生分组,任课教师的课节

排课算法的输出是:这个课节被安排在哪个教室哪个时间坑位(即周几第几节)

3.6 手动排课

在排课算法执行前后,我们都允许手动排课。

人工排课比较灵活,可以不按坑位排,可以排给全校或者指定的年级、班级,也可以排给学生个人,目前主要用于学校各类拓展性活动、个别学生特需课程的排课。人工排课所占用的教师、学生的时间,在进行系统排课时,会自动避开。

我们也支持在机器排课完成后,通过换课,删课,加课来调整排课,当然前提是没有规则的冲突。


4.后续方向

4.1 支持跨年级选课的全流程管理

对于一些相对小众的课程,可支持多个年级的学生参加同一个班级,比如日语班

4.2 优化排课算法引擎,支持更丰富的排课场景

排课1.0目前支持的规则有限,后续会根据实际排课需求,不断丰富排课规则,让规则更贴近实际场景,易用性更好,满足更多场景。

目前作息表课位是年级内统一,后续根据实际排课的需求,可能会考虑班级差异、甚至个体差异,在有限的资源下,做到对学生个体需求的最大程度的支持。

4.3 支持一定策略下的系统分班、系统分配教学资源

目前每个教学班由人工设定,班级的教学资源(如教师、教室)也是由人工分配,未来考虑由系统实现一定策略下的系统分班、系统分配资源。在未来分层、分类课程种类增加、学生规模增加的情况下,学生课表的个体差异会越大,这种情况下,系统的帮助很有意义。

4.4 做资源缺口预估

在新学年开始时,我们可以做虚拟排课,可以设定新增学生数,预估出教师和场地的缺口。也可以根据当前的教师和场地情况预估出可招收新生数


云谷学校目前正在招聘产品经理,感兴趣的同学可以添加我微信

你可能感兴趣的:(一个排课产品的从零到一)