当前位置: 首页 > 工具软件 > JGAP > 使用案例 >

Java遗传算法(JGAP)简单介绍

申屠宏胜
2023-12-01

       要通过JGAP(Java Genetic Algorithms Package -- Java遗传算法包)解决实际的问题之前,首先先来介绍一些关于遗传算法的知识。

       遗传算法实际上是模拟达尔文进化论的自然训啊咋和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然选择过程搜索最优解的方法,它最初由美国Michigan大学J.Holland教授于1975年首先提出来的,并出版了颇有影响的专著《Adaptation in Natural and Artificial Systems》,GA这个名称才逐渐为人所知,J.Holland教授所提出的GA通常为简单遗传算法(SGA)。

       维基百科的定义:

       遗传算法是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,它借鉴了 达尔文的进化论和孟德尔的遗传学说。其本质是一种高效、并行、全局搜索的方法,它能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应的控制搜索过程以求得最优解。遗传算法操作使用适者生存的原则,在潜在的解决方案种群中逐次产生一个近似最优解的方案,在遗传算法的每一代中,根据个体在问题域中的适应度值和从自然遗传学中借鉴来的再造方法进行个体选择,产生一个新的近似解。这个过程导致种群中个体的进化,得到的新个体比原来个体更能适应环境,就像自然界中的改造一样。

       遗传算法是计算机科学人工智能领域中用于解决最优化的一种搜索启发式算法,是进化算法的一种。这种启发式通常用来生成有用的解决方案来优化和搜索问题。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传突变自然选择以及杂交等。

       遗传算法在解决优化问题过程中有如下特点:

  • 遗传算法在适应度函数选择不当的情况下有可能收敛于局部最优,而不能达到全局最优。
  • 初始种群的数量很重要,如果初始种群数量过多,算法会占用大量系统资源;如果初始种群数量过少,算法很可能忽略掉最优解。
  • 对于每个解,一般根据实际情况进行编码,这样有利于编写变异函数和适应度函数(Fitness Function)。
  • 在编码过的遗传算法中,每次变异的编码长度也影响到遗传算法的效率。如果变异代码长度过长,变异的多样性会受到限制;如果变异代码过短,变异的效率会非常低下,选择适当的变异长度是提高效率的关键。
  • 变异率也是一个重要的参数。
  • 对于动态数据,用遗传算法求最优解比较困难,因为染色体种群很可能过早地收敛,而对以后变化了的数据不再产生变化。对于这个问题,研究者提出了一些方法增加基因的多样性,从而防止过早的收敛。其中一种是所谓触发式超级变异,就是当染色体群体的质量下降(彼此的区别减少)时增加变异概率;另一种叫随机外来染色体,是偶尔加入一些全新的随机生成的染色体个体,从而增加染色体多样性。
  • 选择过程很重要,但交叉和变异的重要性存在争议。一种观点认为交叉比变异更重要,因为变异仅仅是保证不丢失某些可能的解;而另一种观点则认为交叉过程的作用只不过是在种群中推广变异过程所造成的更新,对于初期的种群来说,交叉几乎等效于一个非常大的变异率,而这么大的变异很可能影响进化过程。
  • 遗传算法很快就能找到良好的解,即使是在很复杂的解空间中。
  • 遗传算法并不一定总是最好的优化策略,优化问题要具体情况具体分析。所以在使用遗传算法的同时,也可以尝试其他算法,互相补充,甚至根本不用遗传算法。
  • 遗传算法不能解决那些“大海捞针”的问题,所谓“大海捞针”问题就是没有一个确切的适应度函数表征个体好坏的问题,使得算法的进化失去导向。
  • 对于任何一个具体的优化问题,调节遗传算法的参数可能会有利于更好的更快的收敛,这些参数包括个体数目、交叉率和变异率。例如太大的变异率会导致丢失最优解,而过小的变异率会导致算法过早的收敛于局部最优点。对于这些参数的选择,现在还没有实用的上下限。
  • 适应度函数对于算法的速度和效果也很重要。

 

  作为遗传算法生物背景的介绍,下面内容了解即可:
  种群(Population):生物的进化以群体的形式进行,这样的一个群体称为种群。
  个体:组成种群的单个生物。
  基因 ( Gene ) :一个遗传因子。
  染色体 ( Chromosome ) :包含一组的基因。
  生存竞争,适者生存:对环境适应度高的、牛B的个体参与繁殖的机会比较多,后代就会越来越多。适应度低的个体参与繁殖的机会比较少,后代就会越来越少。
  遗传与变异:新个体会遗传父母双方各一部分的基因,同时有一定的概率发生基因变异。

       其实总结一下就是生物进化论的那8个字:自然选择,适者生存。

       生物进化过程中,通过繁殖,会发生基因的交叉(Crossover),基因突变(Mutation)。新的个体产生后,适应度( Fitness )低的个体会被逐步淘汰,适应度高的个体就会生存下来,只是说适应度低的个体淘汰的几率比较高,而适应度高的个体,淘汰的几率比较低,并没有绝对。

 

       借鉴生物进化论,遗传算法将要解决的问题模拟成一个生物进化的过程,通过复制、交叉、突变等操作产生下一代的解,并逐步淘汰掉适应度函数值低的解,增加适应度函数值高的解。这样进化N代后就很有可能会进化出适应度函数值很高的个体。

      现在以代码的角度做一个解释:

      1.编码:将问题的解编码成字符串的形式才能使用遗传算法。最简单的一种编码方式是二进制编码,即将问题的解编码成二进制位数组(二进制数组的每一位为一个基因,整个二进制数组为一个染色体)的形式。例如,问题的解是整数,那么可以将其编码成二进制位数组的形式。

      2.进化:进化分为交叉和变异。

                  交叉即将上面编码的二进制字符串(取其中的两个)以某种规则进行部分的交换。

                  变异:即以一定的几率将某个二进制字符串的某个为上的值进行改变。以进制编码即,0变1,1变0。

      3.选择:我们自定义一个适应度函数,通过适应度函数的逻辑,返回一个对染色体的一个整体评价。我们可以通过每个染色体的不同的评价来判断此染色体是否具有更好的适应性(或者说,是否朝更靠近我们想要得到的结果)。适应度高的染色体,我们以高几率保存下来,适应度较低的染色体,我们提高淘汰率。淘汰一部分之后,剩下的多数高质量的染色体,我们再进行进化,然后再选择……

      经过N代进化和选择,存活下来的染色体,我们可以认为是质量比较高。就可以把相应的染色体打印出来,即我们想要的一个结果。

 

      这里简单地对遗传算法做了一个介绍, 有生物学知识,理解这些其实相当的简单。

      大家可在这里下载到Java遗传算法包JGAP:Java遗传算法包(JGAP)

      大家也可以在这里下载一些关于搜集的遗传算法的资料:遗传算法资料

 

 

 

 

 类似资料: