设计
简介
通过学生做题结果判定学生章节掌握度
掌握判定条件
学生掌握度由经验值计算,达到所需经验值 exp_end
后则为掌握。
主要由学生做题数量和做题结果决定,目标越高需要练习的题量也越高。
学生在系统里做题时,每做 n
道题为一组,每组到达最低正确率 p_min
后开始计算经验值,最低加成为 exp_min
,达到最高正确率 p_max
加成最大为 exp_max
,设有最直接通过正确率 p_end
,达到后经验值加满为掌握(当出现跨组间的连对时也当作满足直接通过条件)。满足中点正确率 p_mid
的组数达到足够数量 m
后被判定为累积掌握。不管做题对错,所做每道题增加经验值 exp_did
。
目标 | 掌握级别 | 每组题目数量 | 每组最低正确率 | 每组最高正确率 | 每组直接通过正确率 | 中点正确率 | 掌握所需达到中点正确率的组数 | 练习题目的难度 |
---|---|---|---|---|---|---|---|---|
一本 | 了解 | 5 | 50% | 90% | 100% | 80% | 2 | 根据章节不同而不同 |
一本 | 理解 | 5 | 50% | 90% | 100% | 80% | 3 | 根据章节不同而不同 |
一本 | 应用 | 5 | 50% | 90% | 100% | 80% | 3 | 根据章节不同而不同 |
二本 | 了解 | 5 | 50% | 90% | 100% | 80% | 2 | 根据章节不同而不同 |
二本 | 理解 | 5 | 50% | 90% | 100% | 80% | 2 | 根据章节不同而不同 |
二本 | 应用 | 5 | 50% | 90% | 100% | 80% | 1 | 根据章节不同而不同 |
初始定位
由测试卷得分结果决定学生初始经验值,用默认在系统中已经做了几组题为标准。若需要更加精确,则可以由学生试卷的做题结果相关,如:某题做错代表某章掌握度不高。
初始得分 | 了解已经完成组数 | 理解已经完成组数 | 应用已经完成组数 |
---|---|---|---|
120-150 | 2 | 2 | 1 |
100-119 | 1 | 1 | 0 |
0-99 | 0 | 0 | 0 |
插值评分换算
经验值最高为 exp_end
(取 600
数字较大方便做小步长,能够被小的质数整除便于划分),中点正确率组数 m
为最少所需步数。以中点正确率 p_mid
转折点向最大与最小正确率作线性变化。
以目标一本的应用难度掌握度为例,中点正确率为 80%
,所需步数为 3
,则每次学生做题组正确率达到 80%
,经验值增加 600/3 = 200
点。最低正确率为 50%
,满足时增加最小设定为 50
点,则正确率 a%<80%
时增加 (a-50)*(200-50)/(80-50)+50
点(当 a=60
时,经验值增加100)。当正确率 a%>90%
时,增加最大经验值 300
。
以最大经验值的目标层次为基础,其余目标层次递减。
难度大的层次对低难度有影响。理解层次对了解层次有 100%
的效果,应用层次对理解层次有 30%
的效果
掌握率需要产品表现为初始时很快,越接近满分提升越慢,则掌握率在经验值得基础上乘以一个幂函数达到要求。公式为 degree = norm * exp^r
,其中 degree
为掌握率;norm
为归一化系数,使得 degree
在一定区间内;r
为幂系数。
数据结构
数据表
学生掌握度统计表
CREATE TABLE tb_student_mastery_degree
(
id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
student_id BIGINT(20) COMMENT '学生',
chapter_id BIGINT(20) COMMENT '章',
section_id BIGINT(20) COMMENT '节,可以为空,表示为本记录为章掌握率',
difficulty INT COMMENT '对应理解层次(了解,理解,应用)',
degree DOUBLE COMMENT '掌握率',
exp INTEGER COMMENT '经验值',
latest_prolems VARCHAR(200) COMMENT '最近做题数组记录n条,可配置',
problem_results VARCHAR(20) COMMENT '做题结果,记录m条,可配置',
created_dt DATETIME,
updated_dt DATETIME,
version INT(11) DEFAULT '0'
);
CREATE UNIQUE INDEX UN_Student_Section_Diff ON tb_student_mastery_degree(student_id, section_id, difficulty)
章节配置表(题目要求难度,每章要求配置)
CREATE TABLE tb_student_mastery_degree
(
id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
chapter_id BIGINT(20) COMMENT '章',
section_id BIGINT(20) COMMENT '节,可以为空,表示为本记录为章掌握率',
layer INT COMMENT '对应理解层次(了解,理解,应用)',
difficulties VARCHAR(20) COMMENT '满足的题目难度列表',
over_count DOUBLE COMMENT '掌握所需达到中点正确率的组数',
created_dt DATETIME,
updated_dt DATETIME,
version INT(11) DEFAULT '0'
);
配置参数
经验值算法中,针对每个不同层次,每组题目数量 n
;中点正确率 p_mid
, 每组达到中点正确率的题目增加的经验值 exp_mid
;最低正确率 p_min
,最低正确率 增加经验值 exp_min
;最大正确率 p_max
,最大正确率经验值增加 exp_max
;掌握所需中点正确率组数 m
,直接判定为掌握的正确率 p_end
;跨组连对所需题目数量 allow_combo
,无论对错每道题增加的经验值 exp_did
;
向下影响力,理解层次对了解 inf21
,应用层次对理解层次inf32
,应用层次对了解inf31
;
掌握度与经验值算法中,公式为 degree = norm * exp^r
,其中 degree
为掌握率;norm
为归一化系数,使得 degree
在一定区间内;r
为幂系数。
程序结构
主要流程
- 输入学生做题记录
- 预处理必要信息,题目或学生相关
- 通过题目所属章节获取相关学生掌握度记录
- 判断连对状态
- 判断是否达到分组个数,
- 若没有达到,记录题目信息,经验值加上题目经验值。
- 若达到要求个数,计算分组正确率,换算成经验值。
- 经验值增加,换算成掌握率。
- 存储新的学生记录。
类结构
流程控制类 Engine
控制整个学生章节掌握度的评估流程,调用不同的方法。
题目信息预处理类 ProblemPre
将题目预处理成包含全部必要输入信息的VO
经验值计算类 ExpCalculator
输入做题信息和学生之前的记录,得到本次经验值
掌握度判定类 DegreeDeterminer
将经验值转换为掌握度
完结