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

"揭开算法神秘的面纱"
在学习计算机相关知识时,我们必定会遇到算法的学习,我大学的老师说计算机中最值得学,最有价值的就是算法。以致于当时懵懵懂懂的我就跟着小伙伴一起边上数据结构边刷入门算法题了。以学习算法为目标的同学,对于蓝桥杯、ACM等比赛多少都有听过,但却相当一部分人不了解算法的真实应用,对此很是迷茫,甚至是觉得刷算法题就只是来参加比赛。对于算法的学习,应该更有规划,了解算法的实际应用场景,学习如何将普通的题库算法应用到实际场景中来,这样才能够在算法学习路上走得更远。

"遗传算法的基本原理"
在自然界中,人类以及动物的进化,总体上都是朝着好的方向发展,这就是所谓的进化,而遗传算法就是基于这个特点设计的。换句话说遗传算法是基于达尔文的进化论,利用计算机模拟自然选择,适者生存,通过遗传变异等方式,不断选择优良个体的算法。在自然界中,生物进化的主要过程包括染色体的选择,变异,交叉等,通过这些操作基本能够保证之后的个体基本上是最优的,毕竟只有适应环境的个体才能生存下来。因此只要依照遗传的原理再继续进化下去,原理上讲就可以一直保持最优。因此遗传算法是用于求解某个场景下最优解的算法。

比如对于动植物来说,外观的长相很大程度上是由自身染色体中的基因决定的。我们可以类似地构建模型,把动植物比作由50个正方形构成的个体,换言之它是由这50个正方体的属性和状态决定的,因此这些正方体就可以看做个体的基因亦或是染色体。对于动植物个体而言,繁衍后代是产生新基因的主要方式,在计算机中我们利用算法模拟这个过程,选择两个原有的个体,可从两个个体共100基因中选50条基因,或是交叉组成新基因。还需要定义一个函数用以判断当时个体是否符合条件,即个体是否符合环境条件,这个就是适应度函数。

在现实自然界的群体进化中,有诸多影响因素,但在算法的设计方面,不用面面俱到,只是做一个模拟的过程,能保证实现适者生存即可。算法实现的进化和淘汰过程中,经常会让种群演变前后总体数目保持不变,这样更便于我们的计算。演变的目的是使得适应条件的个体存在时间更长,从而模拟适者生存的方式。

在自然界中,种群的演变是永无止境的,但算法不能这样设计,需要根据拟定解决的问题设定合理的结束条件,满足其中一个条件就输出当前最好结果并终止程序。最普遍的一个终止条件是设定演变次数上限,在实际算法中,有时候出于客观条件无法达到既定适应度或适应度无明显变化的时候,就该考虑终止算法的运行。如设定演变次数上限200,个体满足既定条件即终止,或达到进化上限则输出当前最优个体。基于这个思想定义好个体属性和相关的繁衍、适应性、变异等函数并设定好终止条件后,定义一个数量较为合适的种群,让其不断进化、繁衍下去即可,最后会得到一个较为合适的结果。
遗传算法用Java代码实现的主体部分如下:




此处实现的大致思路为:定义期望的基因序列,此处使用包含64位字符的数组,并同时初始化种群,定义一个包含50个个体的种群,个体包括64位随机序列,并初始化个体适应度,用个体随机生成的序列跟期望序列比较得出个体适应度,根据终止条件的不同,适应度的计算不尽相同。在种群初始化之后就不断进行演变,模拟自然界进化,直至找到符合条件的个体或者达到进化上限选出最接近期望的个体,具体操作为利用已定义的淘汰数组选出两个较为优秀的个体,进行交叉,随机生成后代,生成新的群体,之后再根据先前定义的基于突变概率对种群进行概率变异,因为此处的个体为01数组,变异的方式为随机生成0或1。操作完成后,种群就完成了第一次进化。种群不断迭代进化,直到满足条件终止退出。

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

"遗传算法在组卷中应用"
遗传算法筛选问题最优解的原理可应用到实际很多功能中,本案例应用其思路到组卷功能中。算法应用的基本原理相同,但算法的各方面细节需要根据组卷的实际情况进行调整。算法中的个体为试卷,根据不同题库系统试卷的题型题量有所不同。

实际上现在网上已经有不少关于组卷的应用,对于组卷来说通用的属性为知识点的覆盖率、试卷难度系数等。试卷个体需要根据自定义组卷规则(RuleBean)进行初始化,基本属性包括个体期望难度系数、试卷总分、试卷所包含的知识点、单选题数量、单选题分数等,初始化个体时,根据组卷规则从数据库取出对应试题随机组成试卷,并计算试卷的适应度、难度系数和知识点覆盖率,根据实际问题中个体对象的不同,三者的计算方法也会随着改变。



个体变异的操作为根据定义好的变异几率进行概率突变,变异对象为试题,个体中的试题有一定几率突变成数据库中科目相同、类型相同的其他试题。利用淘汰数组选取种群中较为优秀的个体,具体操作为从种群中随机选取5个个体组成淘汰数组,返回淘汰数组中最优秀的个体。
组卷开始时,可定义进化次数,期望适应度,初始化种群后根据组卷规则进行迭代进化,由于数据库数据的限制,也许无论进化多少次都达不到期望的适应度,因此需要设置一个进化上限,例如100次,种群的初始数量不宜过多,在遗传算法应用组卷中,个体为试卷,在种群初始化时初始化个体,个体的初始化需要从数据库中取数据,种群数量过多会导致组卷速度缓慢,效率降低。在依照自定义规则进化过程中,当种群中存在个体满足要求时,则结束进化。此时最优个体即为符合的我们要求的个体,即一套试卷。

"总结"
此次实操是之前在网上零散的学习,也是第一次将算法应用到web的开发当中,算是对这方面的应用有一定的了解,算法的设计和原理也是边学习边写的,主要是根据算法的原理应用到组卷的功能模块。希望这篇文章能给其他小伙伴一点思路。

对计算机技术感兴趣的小伙伴,欢迎关注公众号:白帽学子

遗传算法在组卷中的应用相关推荐

  1. 协同进化遗传算法 代码_遗传算法在组卷中的应用

    最近看到之前做的项目,是关于使用遗传算法实现智能组卷的.所以这次为大家分享遗传算法的基本原理,以及在实际场景中的应用. "揭开算法神秘的面纱" 在学习计算机相关知识时,我们必定会遇 ...

  2. 遗传算法在自动组卷中的应用

    遗传算法 遗传算法(Genetic Algorithm)是一种模拟自然界的进化规律-优胜劣汰演化来的随机搜索算法,其在解决多种约束条件下的最优解这类问题上具有优秀的表现. 1. 基本概念 在遗传算法中 ...

  3. 粒子群算法组卷_概率表示的二进制粒子群算法在组卷中的应用

    概率表示的二进制粒子群算法在组卷中的应用 于庆梅 ; 杨争争 ; 雷景生 ; 刘怡乐 [期刊名称] <计算机仿真> [年 ( 卷 ), 期] 2012(029)009 [摘要] In or ...

  4. 基于遗传算法自动组卷的实现

    1  遗传算法介绍 1.1 遗传算法概要 遗传算法是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法,它是用来解决多约束条件下的最优问题. 遗传算法是 ...

  5. PHP实现基于遗传算法的组卷模块(Mysql+PHP)

    只考虑了难度系数影响的选择题生成 1.首先生成数据 这里随机生成了1000道选择题 每道题难度系数为 1-5 包含1-3个知识点 总共知识点为1-10 <?php$conn=new mysqli ...

  6. Java使用遗传算法实现智能组卷

    遗传算法实现智能组卷 0.需求:用户选择知识点.年级.难度系数.题型.题目总数量,一键智能生成试卷,如下 1.遗传算法: 1.0 参考博文: 理论概念详解:https://www.jianshu.co ...

  7. 遗传算法组卷使用心得

    1.什么是遗传算法? 遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法. 2.我们都用它来 ...

  8. 基于遗传算法的试题组卷

    基于遗传算法的试题组卷 IT企业每年都会在春季和秋季举行校园招聘,对于个性化定制的试卷需求量很大,如何组出又好又快的定制化试题对于IT企业非常重要.组卷技术主要针对知识点覆盖率,题型,难度系数,试题数 ...

  9. 遗传算法(二)之组卷算法

    组卷算法主要用于编制科学.公正的试卷的一种算法,具体大家可以百度看一下.我这篇文章主要是讲解如何通过遗传算法来实现组卷,遗传算法大家不清楚的地方仍然可以查看百度,不是这篇文章的重点. 一.遗传算法的表 ...

  10. 基于粒子群算法的组卷系统的研究与实现

    摘 要 组卷系统的主要任务是根据用户的需要用当前数据库中的试题组成一套符合用户需求的试卷.随着数据库与题量增大,传统采用随机选取和回朔试探法的组卷抽提算法因其抽题时间长,占用的空间复杂度太大,容易陷入 ...

最新文章

  1. 一步一步学Ruby(二十一):文件操作2
  2. POJ1330-Nearest Common Ancestors【tarjan,LCA】
  3. MySQL与Oracle的数据迁移注意事项,另附转换工具链接
  4. p语言是python吗-为什么说Python是一门动态语言--Python的魅力
  5. squirrelmail+change_sqlpass 认证 问题
  6. C语言进制转换以及原补反码位运算介绍
  7. STC12C5A60S2在LCD1602基本显示程序
  8. 【解决idea谷歌翻译失败问题】
  9. UE4学习日记——蓝图中的各种颜色代表什么
  10. movsw 汇编_汇编指令之ADC、SBB、XCHG、MOVS指令
  11. 六、HTML高级标签
  12. 基于SWT组件的IE内核Java简易浏览器
  13. redis的持久化机制详解
  14. python 程序运行时间长,python查看程序运行时间的方法
  15. 690家门店送万份小食 汉堡王“战舰世界堡胃战”活动开启
  16. kali2021安装百度网盘
  17. 2020年英语六级翻译
  18. 中国联通MEC边缘云架构与部署实践
  19. idea2017的获取注册码的方法
  20. 攻击篇--远程控制(一)生成被控端与主控端

热门文章

  1. 异步操作及定时任务框架quzrtz在donet平台的使用
  2. 黑莓开发新手入门教学帖,如何制作一个能控制LED颜色的程序(一)
  3. 急需“五彩连珠”小游戏的代码
  4. 设计模式【2】——责任链模式
  5. Matlab实现图像识别(九)
  6. stm32f405rgt6芯片手册
  7. COMSOL6.0软件安装说明+视频教程
  8. SPSS 独立样本t检验方法
  9. 模型思维2-如何增加用户对于某个商品的购买意愿?
  10. 解决AndroidStudio报错问题:Missing essential plugin