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

"揭开算法神秘的面纱"

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

"遗传算法的基本原理"

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

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

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

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

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

图1 基本参数设定代码

图2 种群进化实现代码

图3 基因交叉实现代码

图4 个体基因突变实现代码

图5 选择较优秀个体实现代码

此处实现的大致思路为:定义期望的基因序列,此处使用包含64位字符的数组,并同时初始化种群,定义一个包含50个个体的种群,个体包括64位随机序列,并初始化个体适应度,用个体随机生成的序列跟期望序列比较得出个体适应度,根据终止条件的不同,适应度的计算不尽相同。

在种群初始化之后就不断进行演变,模拟自然界进化,直至找到符合条件的个体或者达到进化上限选出最接近期望的个体,具体操作为利用已定义的淘汰数组选出两个较为优秀的个体,进行交叉,随机生成后代,生成新的群体,之后再根据先前定义的基于突变概率对种群进行概率变异,因为此处的个体为01数组,变异的方式为随机生成0或1。操作完成后,种群就完成了第一次进化。种群不断迭代进化,直到满足条件终止退出。

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

"遗传算法在组卷中应用"

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

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

图6 个体难度系数计算实现代码

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

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

个体变异的操作为根据定义好的变异几率进行概率突变,变异对象为试题,个体中的试题有一定几率突变成数据库中科目相同、类型相同的其他试题。利用淘汰数组选取种群中较为优秀的个体,具体操作为从种群中随机选取5个个体组成淘汰数组,返回淘汰数组中最优秀的个体。

组卷开始时,可定义进化次数,期望适应度,初始化种群后根据组卷规则进行迭代进化,由于数据库数据的限制,也许无论进化多少次都达不到期望的适应度,因此需要设置一个进化上限,例如100次,种群的初始数量不宜过多,在遗传算法应用组卷中,个体为试卷,在种群初始化时初始化个体,个体的初始化需要从数据库中取数据,种群数量过多会导致组卷速度缓慢,效率降低。在依照自定义规则进化过程中,当种群中存在个体满足要求时,则结束进化。此时最优个体即为符合的我们要求的个体,即一套试卷。

"总结"

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

回顾往期内容

销售型工程师的感悟

工控安全与信息安全

国内DCS系统发展现状

工业控制网络现状

IT学子

与你一起成长

长按扫码关注

协同进化遗传算法 代码_遗传算法在组卷中的应用相关推荐

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

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

  2. python自动组卷系统_基于遗传算法(C#编写)的智能组卷系统优化

    原创 guodongwe1991 机器学习算法与Python学习 2016-08-25 最近由于项目的需要,基于.Net 4.0框架和WPF开发window的客户端(开发环境为win7 旗舰版:Vis ...

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

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

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

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

  5. java遗传算法编程_遗传算法示例程序

    评论 # re: 遗传算法示例程序  回复  更多评论 2007-05-06 00:18 by 橙子的希望 我可不可以表示晕倒? # re: 遗传算法示例程序[未登录]  回复  更多评论 2007- ...

  6. word 流水号 自动增加_以自动组卷软件为例浅谈Python自动化办公

    Python作为一种学习门槛低.简洁并且编码效率高的热门编程语言,在很多行业都有广泛的应用.在自动化办公领域,掌握一点Python知识就能够把或复杂或繁琐的工作交由计算机自动处理,堪称解放劳动力的利器 ...

  7. nlm算法matlab代码_遗传算法GA的MATLAB代码

    MATLAB 实现算法代码: GA (遗传算法)--整数编码 function [BestGene,aa] = GA(MaxGeneration,GeneSize,GeneNum,pcross,pmu ...

  8. python 遗传算法 字符串_遗传算法——Python

    好久没写博客了,最近看了个东西,觉得不错,整理了一下: 遗传算法 遗传算法 ( GA , Genetic Algorithm ) ,也称进化算法 . 遗传算法是受达尔文的进化论的启发,借鉴生物进化过程 ...

  9. 深度置信网络预测算法matlab代码_深度学习双色球彩票中的应用研究资料

    点击蓝字关注我们 AI研习图书馆,发现不一样的世界 深度学习在双色球彩票中的应用研究 前言 人工神经网络在双色球彩票中的应用研究网上已经有比较多的研究论文和资料,之前比较火的AlphaGo中用到的深度 ...

最新文章

  1. 科学计算机坏了怎么办,科学家:如果人脑像电脑一样运行,1分钟内就会烧坏!...
  2. 使用FPM快速生成RPM包
  3. 学习CTF(二进制安全)一个月多的奇妙冒险~;
  4. 视频云下半场 向前走还是向“厚”走?
  5. mysql分组区某列最后一条_[MySQL]MySQL数据库如何按某列分组排序后查询每个分组的最后一条数据?...
  6. 【虚拟化】支持IDE/SATA/SCSI
  7. 图片裁剪_如何使用word裁剪图片图形?如何使用word修整图片?
  8. PHP关闭自动过滤,php怎么关闭自动过滤输入和输出
  9. LA 4490 Help Bubu
  10. C T1 汉字大写金额
  11. java 对话框计算器,《Java程序设计》第16周礼拜四:GUI编程及文件对话框的使用 计算器...
  12. 机器视觉实验三 工件尺寸和面积测量
  13. Jump gameII
  14. Problem L: 卡拉兹猜想
  15. 如何通过组策略统一为公司电脑设置“兼容性视图设置”
  16. Tiny6410学习移植usb无线网卡(一)
  17. 独家送书福利(6本)【隐秘而伟大】这群神秘的程序员,干了票大的
  18. Linux编程:mktime通过时间获取时间戳
  19. WVP-PRO+ZLMediaKit搭建GB28181视频平台(linux详细教学)
  20. 1017. A除以B

热门文章

  1. Hollis要转行了?
  2. FastJson稍微使用不当就会导致StackOverflow
  3. 山哥新作:架构师必备技能之业务分析
  4. 如何看待李开复演讲称早期帮旷视拿了蚂蚁金服大量人脸数据,以及李开复、蚂蚁和旷视的澄清?该如何保护隐私?...
  5. 【技术文档】JEECG整合JXLS步骤与开发
  6. Activiti 工作流会签开发设计思路
  7. memcached学习笔记1(windows 7 64bit 环境下安装memcached)
  8. 数据结构基础(15) --基数排序
  9. hadoop--集群崩溃处理方法
  10. cocoapods的安装与使用