最近看到之前做的项目,是关于使用遗传算法实现智能组卷的。所以这次为大家分享遗传算法的基本原理,以及在实际场景中的应用。
"揭开算法神秘的面纱"
在学习计算机相关知识时,我们必定会遇到算法的学习,我大学的老师说计算机中最值得学,最有价值的就是算法。以致于当时懵懵懂懂的我就跟着小伙伴一起边上数据结构边刷入门算法题了。以学习算法为目标的同学,对于蓝桥杯、ACM等比赛多少都有听过,但却相当一部分人不了解算法的真实应用,对此很是迷茫,甚至是觉得刷算法题就只是来参加比赛。对于算法的学习,应该更有规划,了解算法的实际应用场景,学习如何将普通的题库算法应用到实际场景中来,这样才能够在算法学习路上走得更远。
"遗传算法的基本原理"
在自然界中,人类以及动物的进化,总体上都是朝着好的方向发展,这就是所谓的进化,而遗传算法就是基于这个特点设计的。换句话说遗传算法是基于达尔文的进化论,利用计算机模拟自然选择,适者生存,通过遗传变异等方式,不断选择优良个体的算法。在自然界中,生物进化的主要过程包括染色体的选择,变异,交叉等,通过这些操作基本能够保证之后的个体基本上是最优的,毕竟只有适应环境的个体才能生存下来。因此只要依照遗传的原理再继续进化下去,原理上讲就可以一直保持最优。因此遗传算法是用于求解某个场景下最优解的算法。
比如对于动植物来说,外观的长相很大程度上是由自身染色体中的基因决定的。我们可以类似地构建模型,把动植物比作由50个正方形构成的个体,换言之它是由这50个正方体的属性和状态决定的,因此这些正方体就可以看做个体的基因亦或是染色体。对于动植物个体而言,繁衍后代是产生新基因的主要方式,在计算机中我们利用算法模拟这个过程,选择两个原有的个体,可从两个个体共100基因中选50条基因,或是交叉组成新基因。还需要定义一个函数用以判断当时个体是否符合条件,即个体是否符合环境条件,这个就是适应度函数。
在现实自然界的群体进化中,有诸多影响因素,但在算法的设计方面,不用面面俱到,只是做一个模拟的过程,能保证实现适者生存即可。算法实现的进化和淘汰过程中,经常会让种群演变前后总体数目保持不变,这样更便于我们的计算。演变的目的是使得适应条件的个体存在时间更长,从而模拟适者生存的方式。
在自然界中,种群的演变是永无止境的,但算法不能这样设计,需要根据拟定解决的问题设定合理的结束条件,满足其中一个条件就输出当前最好结果并终止程序。最普遍的一个终止条件是设定演变次数上限,在实际算法中,有时候出于客观条件无法达到既定适应度或适应度无明显变化的时候,就该考虑终止算法的运行。如设定演变次数上限200,个体满足既定条件即终止,或达到进化上限则输出当前最优个体。基于这个思想定义好个体属性和相关的繁衍、适应性、变异等函数并设定好终止条件后,定义一个数量较为合适的种群,让其不断进化、繁衍下去即可,最后会得到一个较为合适的结果。
遗传算法用Java代码实现的主体部分如下:
此处实现的大致思路为:定义期望的基因序列,此处使用包含64位字符的数组,并同时初始化种群,定义一个包含50个个体的种群,个体包括64位随机序列,并初始化个体适应度,用个体随机生成的序列跟期望序列比较得出个体适应度,根据终止条件的不同,适应度的计算不尽相同。在种群初始化之后就不断进行演变,模拟自然界进化,直至找到符合条件的个体或者达到进化上限选出最接近期望的个体,具体操作为利用已定义的淘汰数组选出两个较为优秀的个体,进行交叉,随机生成后代,生成新的群体,之后再根据先前定义的基于突变概率对种群进行概率变异,因为此处的个体为01数组,变异的方式为随机生成0或1。操作完成后,种群就完成了第一次进化。种群不断迭代进化,直到满足条件终止退出。
进化终止可自定义条件,如本例中定义的终止条件为找到期望的序列,根据具体场景要求可以规定进化次数,或规定适应度上限。
"遗传算法在组卷中应用"
遗传算法筛选问题最优解的原理可应用到实际很多功能中,本案例应用其思路到组卷功能中。算法应用的基本原理相同,但算法的各方面细节需要根据组卷的实际情况进行调整。算法中的个体为试卷,根据不同题库系统试卷的题型题量有所不同。
实际上现在网上已经有不少关于组卷的应用,对于组卷来说通用的属性为知识点的覆盖率、试卷难度系数等。试卷个体需要根据自定义组卷规则(RuleBean)进行初始化,基本属性包括个体期望难度系数、试卷总分、试卷所包含的知识点、单选题数量、单选题分数等,初始化个体时,根据组卷规则从数据库取出对应试题随机组成试卷,并计算试卷的适应度、难度系数和知识点覆盖率,根据实际问题中个体对象的不同,三者的计算方法也会随着改变。
个体变异的操作为根据定义好的变异几率进行概率突变,变异对象为试题,个体中的试题有一定几率突变成数据库中科目相同、类型相同的其他试题。利用淘汰数组选取种群中较为优秀的个体,具体操作为从种群中随机选取5个个体组成淘汰数组,返回淘汰数组中最优秀的个体。
组卷开始时,可定义进化次数,期望适应度,初始化种群后根据组卷规则进行迭代进化,由于数据库数据的限制,也许无论进化多少次都达不到期望的适应度,因此需要设置一个进化上限,例如100次,种群的初始数量不宜过多,在遗传算法应用组卷中,个体为试卷,在种群初始化时初始化个体,个体的初始化需要从数据库中取数据,种群数量过多会导致组卷速度缓慢,效率降低。在依照自定义规则进化过程中,当种群中存在个体满足要求时,则结束进化。此时最优个体即为符合的我们要求的个体,即一套试卷。
"总结"
此次实操是之前在网上零散的学习,也是第一次将算法应用到web的开发当中,算是对这方面的应用有一定的了解,算法的设计和原理也是边学习边写的,主要是根据算法的原理应用到组卷的功能模块。希望这篇文章能给其他小伙伴一点思路。