要通过JGAP(Java Genetic Algorithms Package -- Java遗传算法包)解决实际的问题之前,首先先来介绍一些关于遗传算法的知识。
遗传算法实际上是模拟达尔文进化论的自然训啊咋和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然选择过程搜索最优解的方法,它最初由美国Michigan大学J.Holland教授于1975年首先提出来的,并出版了颇有影响的专著《Adaptation in Natural and Artificial Systems》,GA这个名称才逐渐为人所知,J.Holland教授所提出的GA通常为简单遗传算法(SGA)。
维基百科的定义:
遗传算法是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,它借鉴了 达尔文的进化论和孟德尔的遗传学说。其本质是一种高效、并行、全局搜索的方法,它能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应的控制搜索过程以求得最优解。遗传算法操作使用适者生存的原则,在潜在的解决方案种群中逐次产生一个近似最优解的方案,在遗传算法的每一代中,根据个体在问题域中的适应度值和从自然遗传学中借鉴来的再造方法进行个体选择,产生一个新的近似解。这个过程导致种群中个体的进化,得到的新个体比原来个体更能适应环境,就像自然界中的改造一样。
遗传算法是计算机科学人工智能领域中用于解决最优化的一种搜索启发式算法,是进化算法的一种。这种启发式通常用来生成有用的解决方案来优化和搜索问题。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。
遗传算法在解决优化问题过程中有如下特点:
作为遗传算法生物背景的介绍,下面内容了解即可:
种群(Population):生物的进化以群体的形式进行,这样的一个群体称为种群。
个体:组成种群的单个生物。
基因 ( Gene ) :一个遗传因子。
染色体 ( Chromosome ) :包含一组的基因。
生存竞争,适者生存:对环境适应度高的、牛B的个体参与繁殖的机会比较多,后代就会越来越多。适应度低的个体参与繁殖的机会比较少,后代就会越来越少。
遗传与变异:新个体会遗传父母双方各一部分的基因,同时有一定的概率发生基因变异。
其实总结一下就是生物进化论的那8个字:自然选择,适者生存。
生物进化过程中,通过繁殖,会发生基因的交叉(Crossover),基因突变(Mutation)。新的个体产生后,适应度( Fitness )低的个体会被逐步淘汰,适应度高的个体就会生存下来,只是说适应度低的个体淘汰的几率比较高,而适应度高的个体,淘汰的几率比较低,并没有绝对。
借鉴生物进化论,遗传算法将要解决的问题模拟成一个生物进化的过程,通过复制、交叉、突变等操作产生下一代的解,并逐步淘汰掉适应度函数值低的解,增加适应度函数值高的解。这样进化N代后就很有可能会进化出适应度函数值很高的个体。
现在以代码的角度做一个解释:
1.编码:将问题的解编码成字符串的形式才能使用遗传算法。最简单的一种编码方式是二进制编码,即将问题的解编码成二进制位数组(二进制数组的每一位为一个基因,整个二进制数组为一个染色体)的形式。例如,问题的解是整数,那么可以将其编码成二进制位数组的形式。
2.进化:进化分为交叉和变异。
交叉即将上面编码的二进制字符串(取其中的两个)以某种规则进行部分的交换。
变异:即以一定的几率将某个二进制字符串的某个为上的值进行改变。以进制编码即,0变1,1变0。
3.选择:我们自定义一个适应度函数,通过适应度函数的逻辑,返回一个对染色体的一个整体评价。我们可以通过每个染色体的不同的评价来判断此染色体是否具有更好的适应性(或者说,是否朝更靠近我们想要得到的结果)。适应度高的染色体,我们以高几率保存下来,适应度较低的染色体,我们提高淘汰率。淘汰一部分之后,剩下的多数高质量的染色体,我们再进行进化,然后再选择……
经过N代进化和选择,存活下来的染色体,我们可以认为是质量比较高。就可以把相应的染色体打印出来,即我们想要的一个结果。
这里简单地对遗传算法做了一个介绍, 有生物学知识,理解这些其实相当的简单。
大家可在这里下载到Java遗传算法包JGAP:Java遗传算法包(JGAP)
大家也可以在这里下载一些关于搜集的遗传算法的资料:遗传算法资料