pg下载赏金下载 有关遗传算法的一个简单入门的例子(java语言实现)

频道:生活应用 日期: 浏览:38

遗传算法的java语言实现

摘要:本报告给出了一个可体现遗传算法原理的实例,着重于java语言的编程达成,结果较为出色地完成了算法的规定。基因遗传算法是一种灵感源自达尔文自然进化理论的启发式搜索算法。该算法展现了自然选择的进程,也就是最适应者被挑选出来繁殖,进而产生下一代。

起始说明:遗传算法属于一种进化算法,其根本原理是仿造生物界里头的“物竞天择,适者生存”的演化规则 。遗传算法将问题参数编码成染色体,接着依据所选定的适应度函数,运用迭代的模式开展选择、交叉、变异等运算去对个体加以筛选,致使适应值大的个体被留存,适应值小的个体被摒弃 。新的群体承接上一代的信息,还比上一代优越,像这样反复循环,直至满足结束条件,最终留下来的个体集中散布在最优解的周边,挑选出最优个体当作问题的解 。

算法设计背景:

给出一组五个基因,每个基因能够保存一个二进制值,要么是 0,要么是 1。关于这里的适应度,是基因组中 1 的数量。要是基因组里总共存在五个 1,那么该个体的适应度趋向于最大值。要是基因组里不存在 1,那么个体的适应度趋向于最小值。此遗传算法期望最大化适应度,并且给出适应度抵达最大的个体所构成的群体。在这个例子当中,于交叉运算以及突变运算之后,适应度处于最低的个体被新的、适应度处于最高的后代所替换。

算法原理:

从选择群体里最适应环境的个体起始自然选择的那种行动。接着父母的特性被后代获取,而且这些特性会被增添给下一代。倘若父母具备更好的适应性,那么其后代就会更便于存活。持续不断地开展进而进行自然选择的这个过程,最终,我们会得到由最适应环境的个体构成的一代。

遗传算法含以下五步:

1、初始化

2、计算适应度函数(个体评价)

3、选择运算

4、交叉运算

5、变异运算

初始化

此阶段起始于种群的一组个体,并且每一个体均是有待解决问题的一个候选解,。

个体具备一组参数(变量)作为其特征,而这些特征被称作基因,将这些基因串联在一起就能构成染色体(问题的解) 。

于遗传算法里,单个个体的基因组是以字符串之形式来呈现的,一般而言,我们能够采用二进制(也就是 1 和 0 所构成的字符串)编码,也就是说,一个二进制串代表着一条染色体串。故而能够讲,我们是把基因串或者候选解的特征编码于染色体之中的。

遗传算法原理详解_遗传算法Java实现_遗传算法应用生活实例

[id_1031388103]

计算适应度函数(个体评价)

个体评价借助适应度函数,评估了该个体针对环境的适应度,此适应度指的是与其它个体去竞争的能力。每一个体都存在适应度评分,个体被挑选出来进行繁殖的可能性,是由其适应度评分来决定的。适应度函数的值越大,那么解的质量也就越高。适应度函数是遗传算法进化的驱动力,同时也是进行自然选择的唯一标准,它的设计应当结合求解问题本身的要求来确定。

选择运算

选取运算的目标在于挑选出适应状况最佳的个体,并且让它们把基因遗传至下一代里面。依据其适应度的评分情况,我们挑选出多对相对优良的个体(父母)。适应度高的个体更具备被选中进行繁殖的可能性,也就是把较为优良的父母的基因传递至下一代 。

交叉运算

哪一个阶段是遗传算法里最为重要的呢,是交叉运算这个阶段。针对每一对进行配对的父母而言,基因当中都存在着通过随机的方式被选中的交叉点。

例如:

首先随机产生交叉点

遗传算法Java实现_遗传算法原理详解_遗传算法应用生活实例

父母间在交叉点之前互换产生子代

遗传算法应用生活实例_遗传算法原理详解_遗传算法Java实现

父母间交换基因,产生后代被添加到新种群中

遗传算法Java实现_遗传算法原理详解_遗传算法应用生活实例

变异运算

某些新形成的后代里,它们的特定基因,会受到低概率变异因子的作用,这就意味着,二进制位串中的部分位,会出现翻转的情况。

遗传算法应用生活实例_遗传算法Java实现_遗传算法原理详解

变异运算可用于保持种群内的多样性,并防止过早收敛。

终止

若是处于群体收敛的状况下,即群体内部不会产生和前一代存在较大差异的后代时,该算法就会终止。换个说法就是,遗传算法给出了一组关于问题的解。

种群呈现规模恒定的状态,当新一代开始形成之际,适应度最差的个体走向凋亡,目的是为后代留出相应空间。该序列在这些阶段被持续不断地重复,以此来产生优胜于先前的新一代,这一系列形成规律用以更好地延续种群。

这一迭代过程的伪代码:

算法仿真结果:

Generation: 0 Fittest: 4

Generation: 1 Fittest: 5

答案在第一代中被找到,被发现,被找寻到 。

Fitness: 5

Genes: 11111

算法的仿真结果呈现出这样的情况,在第0代也就是父母那一代的时候,最大适应度是4,之后迭代去到第1代得出结果,这时最大适应度变为5,此情况满足算法的终止条件,并且染色体里的基因是11111。

结束语:遗传算法属于放生类算法里的一种,此例借助java语言对一类简单的遗传算法做了仿真,遗传算法应用极为广泛,后续有诸多问题值得我们去学习探究,在之后的学习进程中,期望能用MATLAB语言对更多遗传算法予以仿真。

附件:(算法程序)

/*

已给定一组基因,这组基因有五个,五个之中的每一个基因,能够保存一个值,该值为二进制值,二进制值为 0 或者 1 。

* 这里的适应度是基因组中 1 的数量。

要是基因组里面总共具有五个 1,这般该个体适应度就会抵达最大值。要是基因组里面不存在 1,如此个体的适应度就会抵达最小值。

这种遗传算法有着让适应度实现最大化的期望,会给出一种以已达到最大适应度的个体所共同构成的群体 。

注意,在这个例子的情况里,于交叉运算以及突变运算之后,存在这样种情况是什么呢,那个适应度处于最低水平的个体,被新出现的,适应度处于最高水平的后代给替代了 。

* */

/*

* 伪代码

* START

*Compute fitness

*REPEAT

* Selection

* Crossover

* Mutation

* Compute fitness

直到,人口已经会聚在一起,形成了一种特定的状态,直到那种状态达成了,才会有后续的变化,才有可能进入下。

*STOP

* */

import java.util.Random;

//main class

public class SimpleGA

定义了一个Population类型的变量population,然后它被赋值为一个新创建的Population对象 。

创立了一个新的个体,将其赋值给个体适应度最高的那个变量呀。

产生一个新的个体,将其赋值给一个名为 secondFittest 的个体变量 。

int generationCount = 0;

//main method

公开的静态的无效的主函数,用于特定的主要操作,针对的是某个特定的应用程序入口,目的是启动该程序。

args)

创作出,起始的,人口数量,使之产生,使之成形,把它弄出来 。

Random rn = new Random();

SimpleGA这个类所对应的ga被实例化了呀,这是以主类为类别下的实例化操作呢,而这个实例化之后所对应的对象就是ga啦。

// Initialize population

ga种群进行初始化种群操作,个体数量设定为10个,有这一行为,是这样的情况 。

算一算,每个个体的适应度,是多少,是怎样的情况,其适应度究竟怎样 。

调用ga的population的calculateFitness方法, 。

把种群代数给显示出来,并且还要将算得上是最为匹配适宜的那个最大适应度具体是多少给输出呈现出来。

运用System.out.println方法,输出这样的内容,"Generation: " 加上ga.generationCount,再加上" Fittest: " 加上ga.population.fittest 。

当某一代种群,获取到具有最大适应程度之时终止循环,当某一代种群获得最大适应度时终止循环,当某一代种群获致最大适应度之际终止循环,当某一代种群取得最大适应度之时终止循环,当某一代种群得到最大适应度之时结束该循环,当某一代种群获得最大适应度时以此结束循环,当某一代种群取得最大适应度情况时循环停止.

while(ga.population.fittest < 5)

++ga.generationCount;

//Do selection

ga.selection();

//Do crossover

ga.crossOver();

在一个随机概率之下进行变异,进行突变呀 这里存在一个随机概率,在此概率之下去做变异,去做突变呢 使用一个随机概率,于该随机概率之下。

if(rn.nextInt(5) < 3)//0.6的概率变异

ga.mutation();

把最适应的后代添加到群体之中,可以这样去做,将其添加进去,加到群体里面,加入到群体之中,把最适应的那个后代添加进去,。

ga.addFittestOffspring();

算出那全新的健康适宜数值,用于计算,得出结果 。

ga.population.calculateFitness();

把System.out那边来进行println()操作,操作这个内容它是这样的说的,说的是“Generation: ”,然后接上ga.generationCount,再有这样两个空格之后了,再次从那个要输出的内容里接上“Fittest: ”,然后再去接上ga.population.fittest 。

//循环结束后,代表找到了最大适应度的种群

这一段代码是在Java语言里用于输出特定内容的语句,它会在控制台打印出换行符,接着输出“Solution found in generation”,意思表示在某一代中找到了解决方案,然后再输出变量“ga.generationCount”的值,表示对应的代次数量,最后输出一个换行符 。

向系统输出打印,内容为“Fitness: ”加上遗传算法种群中最适应的个体的适应度数值,句号。

System.out.print("Genes: ");

for(int i = 0; i < 5; i ++)

这似乎并不是一个完整可改写的句子呀,它看起来像是一段代码片段,你可以补充完整准确的句子内容以便我按照要求进行改写 。

);

System.out.println("\n");

//Selection

void selection()

挑选出,那个具有最为突出,最为合适特质的个体 。

适应能力最强的个体等于种群获取的适应能力最强的个体;。

//Crossover

void crossOver()

Random rn = new Random();

随机挑选出一个交叉点 ,这个交叉点是随机被挑选出来的 。

整数型的交叉点变量被定义为,随机数生成器据此生成的随机数作为,种群个体数量范围内,进行取整而得到的点 。

.genes.length);

//Swap values among parents

for(int i = 0;i < crossOverPoint; i ++)

int temp = fittest.genes

fittest.genes

= secondFittest.genes

secondFittest.genes

= temp;

//Mutation

void mutation()

Random rn = new Random();

选择一个随机的突变点,选取一个随机的突变之处,挑选一个随机的变异位点 。

把int mutationPoint = rn.nextInt改写为将整型的变异点设为随机数.nextInt,population.individuals改写为种群个体数量的 . 所关联的对象。。

.genes.length);

颠倒,在变异点的那些值之中的状态,也就是实现非翻转即翻转而非保持原样和翻转后并非还原那般 处修改,在变异的那个。

if(fittest.genes

mutationPoint

== 0)

fittest.genes

mutationPoint

= 1;

else

fittest.genes

mutationPoint

= 0;

if(secondFittest.genes

mutationPoint

== 0)

secondFittest.genes

mutationPoint

= 1;

else

secondFittest.genes

mutationPoint

= 0;

//Get fittest offspring

拿取最适应的后代,个体独立完成,这一行为,被称为,获取,最适应的后代,个体做的事 。

要是最适应者的适应度大于第二适应者的适应度 ,那又怎样 。

return fittest;

else

return secondFittest;

把最适应的后代当中,最不适应的个体替换掉,通过替代最少适应的个体,从最适应的后辈里进行替换,以此完成替换操作,从最适应的后代里,替换最不适应的个体pg下载通道pg下载麻将胡了A.旗舰厅进体育.cc,替换最少适应的个体,从而完成替换,从最。

void addFittestOffspring()

更新后代的适应度值,针对此操作,要进行相关处理去执行此项任务,以达成对其的更新,且更新过程要按照特定要求执行,。

fittest.calcFitness();

secondFittest.calcFitness();

提取最不适应个体的索引,其中“个体”是指最为没有适应性的那个,“索引”是用来表示其位置在哪的标识 。

声明一个整型变量,名为leastFittestIndex,它被赋值为population调用getLeastFittestIndex方法所返回的值。

//Replace least fittest individual from most fittest offspring

population.individuals

leastFittestIndex

= getFittestOffspring();

//Individual class

class Individual

int fitness = 0;

int genes

= new int

公共的特定个体()这个构造方法通常是用来进行初始化操作的 。

Random rn = new Random();

为每一个个体随机设置基因,每一个个体pg下载,随机选择基因,为个体随机安排 //基因,基因是要经过随机挑选来为个体设置的 。 基因依据个体。

for(int i = 0; i < genes.length; i ++)

genes

等于,rn调用nextInt方法,参数为2,这个操作会产生一个处于【0 1】范围之内的随机数,也就是说等同于【0 2)这个范围 。

fitness = 0;

//Calculate fitness

public void calcFitness()

fitness = 0;

for(int i = 0;i < 5; i ++)

if(genes

== 1)

fitness ++;

//Population class

class Population

Individual individuals

= new Individual

10

;//个体数组的实例化

int fittest = 0;

//Initialize population

致使公开无效的方法,使之初始化人口数量,其中具体数值为整数类型其有着一定规模大小,表述的是数值范畴为规定的规模大小 。

for(int i = 0; i < individuals.length; i ++)//i < individuals.length?

individuals

= new Individual();//匿名对象的使用

//Get the fittest individual

public修饰 Individual 用于获得 最适应的 东西,东西通过 getFittest 方法获取,返回值 是 一个 个体,个体 就是 返回值//。

//定义一个整型变量maxFit ,将其初始化为整型数据类型所能表示的最小整数值 。

int maxFit = 0;

for(int i = 0; i < individuals.length; i ++)

if(individuals

maxFit

.fitness individuals

maxFit1

.fitness)

maxFit2 = maxFit1;

maxFit1 = i;

else if(individuals

.fitness > individuals

maxFit2

.fitness)

maxFit2 = i;

return individuals

maxFit2

//Get index of least fittest individual

是公开的整型,用于获取最不健壮的索引值,对吧,有这样定义的方法,能获取最不健壮的索引值,对吧,。

int minFit = 0;

for(int i = 0; i < individuals.length; i ++)

if(individuals

minFit

.fitness >= individuals

.fitness)

minFit = i;

return minFit;

//Calculate fitness of each individual

关于公开这个行为去计算适应性这件事情对吧,这是一种行为对所做是吗并且以计算出适应性为目的,它是公开。

for(int i = 0;i < individuals.length; i ++)

individuals

.calcFitness();

getFittest();//寻找最适应的个体

网友留言(0)

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。