遗传算法在试题组卷中的应用 ,我用c#的windows下编写遗传算法,不知道哪位高手可以帮我解决燃眉之急啊?我现在的水平真是没办法编写这个遗传算法啊,求助!下面是有关遗传算法的介绍。
遗传算法描述
遗传算法是一种并行的、能够有效优化的算法,以Morgan的基因理论及Eldridge 与Gould间断平衡理论为依据,同时融合了Mayr的边缘物种形成理论和Bertalanffv一般系统理论的一些思想,模拟达尔文的自然界遗传学:继承(基因遗传)、进化(基因突变)优胜劣汰(优的基因大量被遗传复制,劣的基因较少被遗传复制)。其实质就是一种把自然界有机体的优胜劣汰的自然选择、适者生存的进化机制与同一群体中个体与个体间的随机信息交换机制相结合的搜索算法。运用遗传算法求解问题首先需将所要求解的问题表示成二进制编码,然后根据环境进行基本的操作:selection,crossover,mutation……这样进行不断的所谓“生存选择”,最后收敛到一个最适应环境条件的个体上,得到问题的最优解。[6,7]
4 遗传算法应用
一般来说,用户在自动组卷时会对试卷的质量提出多方面的要求,如总题量、平均难度、题型比例、章节比例、重点章节比例、知识点的交叉与综合等,自动组卷就应最大程度的满足用户的要求。因此,在组卷之前,我们首先为自动组卷过程建立控制指标相应状态空间D,
D=[]
D的每一行由某一试题的控制指标组成,如题号、题型、章节、难度等,并且这些属性指标都进行编码表示成二进制形式,而每一列是题库中的某一指标的全部取值。在具体出题时,考方可能不会用到所有的指标,所以D包含的个体d_target可以表示为d_request和d_void,d_request表示考方要求的控制指标,d_void表示考方不要求的控制指标。即
d_target::=<d_request>:<d_void>
<d_request>::={0,1}m
<d_void>::={0,1}n
试题库[STK]中的每一道试题在建库时都输入了相应的属性指标。试题模型的产生形式是:
if <data> then
<model>
<data>::={0,1,#}m
#表示0和1之间的任意一位。
考试自动出题的遗传算法如下:
(1) 根据考方的出题要求,规划状态空间库D中的数据,保留d_request部分,而不要d_void部分,对其剩余部分进行编码D [1],D[2],……D[i]。
(2) 初始化试题库[STK]。随机从题库中抽出一组试题,并进行编号STK[1],STK[2]……STK[j],确定合适的交换概率Pc和变异概率Pm;并定义其适应值flexibility[k](k=1,2……j)
flexibility[k]<-0 (k=1,2……j)
(3) 从试题库[STK]中取出STK[m](0≤m≤j)与状态空间库[D]中的指标D[n] (0≤n≤i)进行匹配。如果STK[m]与D[n]完全匹配,则
flexibility[k]<-flexibility[k]+1
如果不匹配,则有
flexibility[k]<-flexibility[k]+0
(4) 进行淘汰选择,保留具有高适应度的试题。即把flexibility[k]为0的STK[m]去掉,这样就生成了一个新的试题模型STK[h]。
(5) 重复过程2生成新的试题模型STK[p]。按一定的交换概率Pc从[STK]中随机选取模型STK[h]和STK[p],交换彼此位串中对应的值,产生新的试题模型STK[h]、STK[p],如
交换前STK[h]=1 1 0 1 0 1 1
STK[p]=0 0 1 1 1 1 0
交换前STK[h]=1 1 1 1 0 1 1
STK[p]=1 1 1 1 1 1 0
(6) 按一定的变异概率从题库[STK]中随机选出一试题模型STK[h]进行基因突变,产生一个新的试题模型。
(7) 在完成以上选择、交叉、变异步骤后,产生一个考试试题模型,按照事先确定的误差精度对其进行收敛性的判别,当其适应度高时,试题组卷成功,转向步骤8,如果其适应度低,则转向步骤3继续执行。
(8) 输出相应的考试试题,组卷结束。
以上用遗传算法抽题时,交换概率Pc和变异概率Pm的确定很重要。Pc
太小使选题工作进展缓慢,太大则会破坏适应值高的试题模型。通常规定其为0.4。同样,Pm太小就不能产生新的试题模型,太大又会产生过多的试题模型。它宜规定为0.1。
在自动选题时,选题的方式可采用父辈挑选和生存选择两种。父辈挑选就是采用不返回随机抽样,它使每个题目都有被选中的可能;生存选择采用允许父辈和子代进行竞争,并让其中的优良者进入下一轮竞争环境的二分之一择优选择。两种选择方式共同作用于选题保证了选题的顺利完成。在选题的过程中,哪一道题目被选中是一个非均匀随机事件,其概率依赖于上一次选题的过程。