遗传算法代码(遗传算法在组卷中的应用)

/ 0评 / 0

遗传算法代码(遗传算法在组卷中的应用)

最近看了之前做的项目,是关于应用遗传算法实现智能组卷的。所以这次,我将分享遗传算法的基本原理及其在实际场景中的应用。

“揭开算法之谜”

在学习计算机相关知识时,我们必然会遇到算法学习。我的大学老师说计算机中最有价值和价值的东西是算法。以至于我当时懵懵懂懂,在构造数据的同时跟着朋友刷入门算法题。以学习算法为目的的同学听说过蓝桥杯、ACM等比赛,但相当一部分人并不了解算法的真正应用,非常费解。他们甚至认为刷算法题只是为了加入竞争。对于算法的学习,要多做规划,了解算法的实际应用场景,学会如何将普通的题库算法应用到实际场景中,这样才能在算法学习的道路上走得更远。

“遗传算法的基本原理”

在自然界中,人类和动物的进化一般都是朝着好的方向发展的,这叫进化,遗传算法就是基于这一特点而设计的。换句话说,遗传算法是基于达尔文的进化论,利用计算机模仿自然选择,适者生存,通过遗传变异不断选择优秀的个体。自然界中,生物进化的重要过程包括染色体选择、变异、交叉等。通过这些操作,可以保证下面的个体从根本上是最优的,只有适应环境的个体才能生存。因此,只要我们继续按照遗传的原则进化,原则上,我们总能坚持到最好。因此,遗传算法是一种求解特定场景下最优解的算法。

例如,对于动物和植物来说,外观很大程度上是由它们染色体中的基因决定的。我们同样可以构建一个模型,把动植物比作由50个方块组成的个体,换句话说,是由这50个方块的属性和条件决定的,所以这些方块可以看作是个体的基因或染色体。对于单个动植物来说,繁殖是产生新基因的重要方法。在计算机中,我们用算法模拟这个过程,选择两个原始个体,从两个个体的100个基因中选择50个基因,或者杂交形成新的基因。还需要定义一个函数来确定个体是否满足当时的条件,即个体是否满足环境条件。这就是健身功能。

真实自然界的群体进化有很多影响因素,但在算法设计方面,我们不需要面面俱到,只需要做一个模仿的过程来保证优胜劣汰。在算法的进化和淘汰过程中,进化前后的种群总数将始终保持不变,这对于我们的计算更加方便。进化的目标是让适应条件的个体生存更久,从而模仿适者生存的方法。

在自然界中,种群的进化是无止境的,但算法不能这样设计。需要根据要解决的问题设置合理的停车条件。如果满足这些条件之一,将输出当前的最佳结果,并且程序将被终止。最广泛的终止条件之一是设定进化时间的上限。在实际算法中,有时当由于客观条件而无法达到既定的适应度或适应度没有发生显著变化时,就需要考虑算法的终止性。如果进化次数上限设置为200,则满足给定条件的个体将被终止,或者达到进化上限的个体将输出当前最优个体。基于这种思想,在定义了个体属性和相关的繁殖、适应、变异等函数并设置终止条件后,定义一个具有合适数量的种群,让它不断进化繁殖,最终得到一个合适的结果。

用Java代码实现的遗传算法的主要部分如下:

图1基本参数设置代码

图2实现种群进化的代码

图3基因交叉实现代码

图5选择更好的单独实现代码。

这里的总体思路是:定义期望基因序列,这里应用一个64个字符的数组,同时初始化种群,定义一个50个个体的种群,每个个体包含64个随机序列,初始化个体适应度,将随机生成的个体序列与期望序列进行比较,得到个体适应度。根据不同的终止条件,适合度的计算是不一样的。种群初始化后,会继续进化,模仿自然界的进化,直到找到符合条件的个体或达到进化上限时选出最接近期望的个体。具体操作是应用定义的淘汰数组选择两个较好的个体,跨越技术资源网络,随机产生后代,产生新的种群,然后根据之前定义的变异概率对种群进行概率变异,因为这里的个体是01数组,变异方法是随机产生0或1。运营后,技术资源网络的人口完成了第一次进化。种群迭代进化,直到条件满足,种群退出。

进化终止可以定制。例如,本例中定义的终止条件是找到预期的序列。根据具体的场景要求,可以指定进化的次数或适应度的上限。

“遗传算法在组卷中的应用”

遗传算法筛选问题最优解的原理可以应用于实际技术资源网络的多种功能,本案例将其思想应用于组卷功能。算法的基本原理是一样的,但是算法的细节要根据生成试卷的实际情况进行调整。算法中的个体是一张试卷,试卷中的题目数量根据不同的题库系统而有所不同。

其实现在网上有很多生成试卷的应用。对于生成试卷,常见的属性有知识点覆盖率、试卷难度系数等。单项试卷要按照自定义的RuleBean进行初始化,基本属性包括单项预期难度系数、试卷总分、试卷包含的知识点、选择题数量、选择题分数等。初始化个体时,根据试卷规则从数据库中随机抽取相应的试题,计算试卷的适应度、难度系数和知识点覆盖率。根据实际问题中个体对象的不同,三者的计算方法也会有所变化。

图6个人难度系数计算代码

图7个人知识覆盖率实现代码

图8计算个体适应度的实现代码

个体变异的操作是根据定义的变异概率进行概率变异。变异对象是试题,个体中的试题有一定概率变异成数据库中其他科目、类型相似的试题。使用消除数组选择群体中较好的个体。具体操作是从种群中随机选择5个个体组成淘汰阵列,并返回淘汰阵列中的最佳个体。

在生成试卷的开始,可以定义进化的次数和期望适合度。初始化种群后,可以按照生成试卷的规则迭代进化。因为数据库数据的限制,也许无论进化多少次都达不到预期的适应度,就需要设定一个进化的上限,比如100次,种群的初始数量不宜过多。在使用遗传算法生成试卷时,个体是试卷,在群体初始化时对个体进行初始化。个体的初始化需要从数据库中获取数据,种群数量过多。在按照自定义规则进化的过程中,当种群中有满足要求的个体时,停止设置。这时,最优的个体就是符合我们要求的个体,也就是一套试卷。

“摘要”

这种做法以前是互联网上零敲碎打的研究,也是第一次将算法应用到web的开发中。对这方面的应用是有一定了解的。算法的设计和原理也是边学边写的。重要的是将算法原理应用到组卷效能模块中。希望这篇文章能给其他朋友一些思路。

对IT技能感兴趣的小伙伴们,欢迎关注公众号:白帽同学。