随着计算机信息技术在教育教学中应用的深入,建立课程教学考试的试题库系统的需求多了起来。组卷是试题库系统的重要组成部分,而组卷策略(算法)是试题库系统的核心。许多文献[1]-][7]对计算机自动组卷策略及算法进行了有益的探讨,从最初的随机抽题到现今的智能组卷策略,诸如随机抽取法、回溯试探法和遗传算法等。笔者阅读这些文献时发现,许多算法存在一定的缺陷、并不太实用,而某些智能组卷算法如遗传算法有个收敛问题、存在无解的可能。事实上,组卷涉及两个问题:选取什么样的试题和如何选题。前者需要获取相关组卷约束、转换为所需的信息,而后者则是在这些信息的基础上实现抽取试题。本文结合课程考试的试题库系统的特点和笔者开发《数据结构》课程试题库系统的实践,从不同的角度探讨面向课程试题库系统新的组卷策略和算法。
1 试卷命题及分值分布
1.1 试卷命题的分值分布
课程考试(笔试)是课程教学效果检查的主要手段,人工试卷命题的过程,通常是由课程组(或教研室)根据教学大纲(或考试大纲)的要求、教学目标和学生的实际情况,划定命题范围(章)、试卷包含的题型及各类型试题所占的总分比例(或分值)、各章所占分值等;再由相关教师根据上述约定(即约束条件)进行试卷命题或选题,最后审定。这里的试题分类,主要指按答案将试题分为选择题、填充题、判断题和解答题,和按认知能力将试题分为概念、认知题、应用和综合应用。尽管不同课程对认知能力分类的结果不同,但均可分为类似的认知能力层次。
章 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
分值 |
4 |
8 |
12 |
8 |
12 |
16 |
18 |
10 |
12 |
表2 各章分值分布表
将上述试卷命题的分值分布以表格形式表示,可以得到相应的分值分布表,本文分别将这些分布称为题型分值分布表、各章分值分布表和认知能力分值分布表。如表1、表2和表的3示例所示。显然,这些分布表基本描述了试卷的总体框架,即试题的知识分布、题型结构和难易要求,是教师命题的依据。
表2 题型分值分布表
题型 |
选择题 |
填充题 |
判断题 |
解答题 |
分值 |
20 |
20 |
10 |
50 |
表3 认知能力分值分布表
认知能力 |
概念 |
认知 |
应用 |
综合应用 |
分值 |
20 |
20 |
40 |
20 |
1.2 多重分值分布的组卷模型
上述的分值分布从不同侧面对试卷提出约束要求,我们称为多重分值分布。这些分值分布对于试题库系统的组卷同样是有效和可行的,关键是如何转换为组卷时可操作的参数。分析题库中试题和标准化试卷的特点,不难发现,试卷通常将试卷的试题按表2组织成大题,且各大题的总分齐整,如“选择题”总分15分或20分、但不取19分或21分这样零碎的总分。其次,试卷中的选择题、填充题及判断题一般均分别取相等的分值,如每道选择题、判断题的分值为1分,填充题为2分;只有解答题的各题分值一般不相等。对于分值相等的试题,我们可以根据表2计算出这些试题的数目,再依据表1中各章的分值与总分的比率、以及表3中各认知能力分值与总分的比率,获得各章、各认知能力的相应试题数目;而解答题因其题分不等、仅据分布表还不能确知试题数目等信息。
但是,在标准化试卷中,选择题、填充题及判断题的答案简洁、所涉及的知识单元少,因此多为认知能力较低的试题;而综合应用、应用类试题的答案内容丰富、涉及知识单元较多,一般以解答题出现(有些概念题也可能是解答题)。因此,可以首先确定认知级最高的综合应用题(试题数目及其分值)。这样,问题便转化为如下更简单的数学问题:从取值不等的n(n>0)个正整数集合Q中,选取k(k>0)个正整数,且它们的和等于(或最接近)给定的正整数M(M>0)。理论上说,集合Q中不一定能选出k个正整数且其和恰好等于M。考虑组卷的需求,选取的试题还需满足知识单元分布合理、以及不与近期试卷的试题重复等约束,更难以完全满足约束,因此,应该允许对试题分值进行适度地调整(如对题分进行±1、±2分的调整);并且应满足:M≥Min{qi|qi∈Q},表2、表3中解答题的分值大于等于综合应用题的分值这些必要条件。
1.3 组卷策略
因此,组卷阶段选取试题时,可以对解答型试题和其他试题(这里指填充、选择和判断型试题)分别处理,即组卷选题时解答题优先、并按认知能力等级从高向低地选取,待解答题完成后,按选择题、填充题和判断题关于各单元、各认知能力的分值比例进行选题。
如何依据多重分值约束确定综合应用题的数目及其选取呢?思路是:首先获取题库中综合应用题的最高、最低参考分值得到分值区间,然后根据题分可调整的范围将该区间划分为若干子区间,将表3的综合应用题总分分派到这些子区间中,尔后据此在综合应用题的不同分值区间内选取试题。可以有许多算法实现这样的分解,以下为一个示例。
int score_assign(int mark[],int m,int max,int min)
{ max为表3给定的最大参考分值;min为表3给定的最小参考分值;
int k,step,mid;
k=1;
if(m
step=m*0.1; //设调整范围为±5%,step将取分范围划分为若干区间
mid=(max+min)/2;
while (m>0)
{ //mark数组按降序顺序存储
if (m>=max+min) { mark[k]=max; k++; m=m-max; }
else max=max-step;
if (max<=min) { mark[k]=m; m=0;}
else if (m
}
mark[0]=max;
mark[k+1]=min; //以最大、最小值构建选题区间--见过程expl_q_select()
return k;
}
假设解答型试题的参考分值的方差不大、且分布比较均匀,问题必定有解。综合应用题选取完成后,将表3的解答题剩余分值以类似的方式以认知能力等级从高到低选取解答题。
2 题库组织
试题库系统必然需要数据库来存储试题,题库的结构设计与组卷策略密切相关,为了利用上述的分值分布表进行自动组卷,题库的试题表结构如表4所示。为了配合组卷算法,题库更新输入新题时,其Last_ch_date应取题库中最早年份的日期。试题的知识单元属性Ch_Se采用教学大纲的划分(章、节)标识至二级单元,每个知识单元用4位10进制数字串表示,章和节从左向右各占2位;当试题涉及多个知识单元时,将其顺序首尾拼接。试题的认知能力属性K_cap直接用正整数(如1,2,……)表示。
表4 试题表主要结构 |
|
||||||||
Id |
questions |
answer |
Ch_Se |
Q_type |
Refe_val |
K_cap |
Last_ch_date |
fig |
|
主键 |
试题 |
答案 |
所属单元 |
题型 |
参考分值 |
认知能力 |
选取日期 |
插图 |
|
此外,试题库系统应建立对应上述分值分布表的数据表(或成组关联或合并为一个数据表),以便保存组卷参数,并利用试卷分析的反馈记录相关信息,向用户提供建议或有关帮助。
3 多重分值分布的组卷算法
为便于叙述,设用数组Tab_c[]、Tab_t[]、Tab_k[]分别代表上述的各章分值分布表、题型分值分布表和认知能力分值分布表,Curr_Questions[]代表当前选取试题的试题集,Curr_t_s表示试卷总分的剩余分值。若试题Curr_Questions[i]涉及k个知识单元,r=∑(Tab_c[j]/ Curr_t_s)(j为k个知识单元编码的前2位即章号),r越大,表明试题涉及章(Tab_c[j])的分值越大、且涉及的知识单元越多;d=abs(Curr_Questions[i]. Refe_val-mark[i])代表了当前试题参考分值与分派分值之差的绝对值,d越小则其1/2d越大;d_date=Current_date- Curr_Questions[i]. Last _ch_date,代表当前日期与试题前次选取日期的年份差。那么
f= Curr_Questions[i]. Refe_val*r*d_date/2d
代表当前试题的优先数。该优先数也包含了其他隐含约束:试题参考分值是否最接近分派(理想)的分值、试题选取日期间隔是否最长。显然,f值越大的试题应优先选取。
综合应用题选取过程的算法描述如下(以本文示例的分值分布表为例):
expl_q_select(int mark[],struct Curr_Questions[],int n,int *Curr_t_s)
{
//解答题选取的共用过程,Curr_Questions[]为试题集,Curr_t_s 为总分,n为认知能力编号
从Curr_Questions[]获取参考分值的最大、最小值分别存入max,min;
m=score_assign(mark,Tab_k[4], max, min)
disp=0; //disp记录mark[]分派分值与实际所选试题的题分差
h=1;
while (h<=m) //对m个试题从高分向低分进行选题
{ if(mark[h-1]== mark[h+1]) //若区间上下界相等则调整上下界
if(disp>0) {low=mark[h+1]-disp;up=mark[h-1];}
else {up=mark[h-1]-disp;low=mark[h+1];}
对low≤Curr_Questions[i].Ref_val≤up的试题计算f值并按升序排序;
//用公式d=abs(Curr_Questions[i].Refe_val-mark[h]-disp)计算,disp用于分差调整
i= Curr_Questions[i]最末元素的下标;
while (i)
(
k=strlen(Curr_Questions[i].ch_Se)/4; //计算试题的知识单元数目
if ( Score_check(Tab_c, Curr_Questions[i].Ref_val))
{ Tab_k[n]-= Curr_Questions[i]. Refe_val;
Tab_t[4]-= Curr_Questions[i]. Refe_val;
Disp+= Curr_Questions[i]. Refe_val-mark[h];
//disp记录试题分值与mark[h]分值之误差累计,以便后续选题时调整
*Curr_t_s-= Curr_Questions[i]. Refe_val //更新总分
提取Curr_Questions[i].Ch_Se所有知识单元及章号j;计算Tab_c[j]-= Curr_Questions[i]. Refe_val/k; //各知识单元减均分,注意非整除处理
试题Curr_Questions[i]放入试卷;
h++;
i=0; //选题成功,退出循环继续选题
}
else i--;
}
}
if (disp) 依据disp进行题分调整;//策略见后
Tab_k[n]=0;
}
其中:
1)Score_check(Tab_c, Curr_Questions[i])是检验函数,因为随着试题的选取和分布表中分值的减少,根据Curr_Questions[i].Ref_Ch_Se计算其知识单元数k,对k个知识单元所属的章j,检验Tab_c[j]是否满足:对于每个知识单元,从Tab_c[j]- Curr_Questions[i].Ref_val/k(j=1,2,…k,各章减掉拟选试题分值的均分),若Tab_c[j]≥0,则返回True;否则,返回False。
2)题分调整的策略是:若disp>0,那么从高分值的试题开始,逐题增加1分直到disp为0;若disp<0,那么从低分值的试题开始,逐题减少1分直到disp为0。由于在选题时已经根据累计分差disp调整了实际选取试题的分值,所以,选题结束时的disp必然很小。
这样,组卷算法大致如下:
1.当Tab_t[4]>0,从Tab_k[]最大下标元素开始,分别获取命题范围内相应认知能力的试题集,调用expl_select()过程选取解答题,直至Tab_t[4]为0;
2.计算Tab_c[]、Tab_k[]所有非0元素与当前(已减去选取试题的题分)总分Curr_t_s的比率,该比率与Tab_t[]中非0元素之积除以题分(取整处理)的结果,即为各章中需要选取的各题型、各认知能力的试题数目,从相应的试题集中按一定策略从高分到分低选取。
这里,解答题默认的选取是以认知能力从高向低顺序处理的,可能使得较低认知能力的解答题不被选取,但可采用附加选项、补充输入所需的信息来实现,例如改变处理顺序或划分部分的分值选取指定认知能力的解答题。即使试卷只包含解答题或选择题,,该组卷算法也能根据分值分布表正确组卷。
该组卷算法的开销,由两部分组成,即解答题和其他题型试题选取的开销;若选取的解答题为k题、且题库中的解答题数目为n,那么选取解答题时的开销小于k*n,因此,解答题选取的开销为O(n)。
4 结语
事实上,不同层次的教学单位、不同课程和不同的考查目标,组卷的策略和复杂性不同。与已有的组卷算法类似,本文所述基于多重分值分布的组卷约束及组卷算法,是从以往学校课程考试的试卷命题的总体规划归纳抽象而来,符合教师习惯和实际需求,组卷目标明确,灵活方便;而基于多重分值分布的组卷策略及算法,是通过分析课程考试标准化试卷中各类试题的特性,分解和简化了试题库组卷难度;虽然没有采用智能算法,但简捷而实用。同时,调整分值分布表中某些分布表的分值,将改变试卷的试题分布和难易度,这不仅使试题库的组卷更能适应课程教学的考试需要,也为试卷分析结果的反馈调整提供了有效的机制。
通过我们的实现和试验,上述组卷算法简单易行,是一个实用的试题库系统的组卷算法。