基因遗传算法是一种灵感源于达尔文自然进化理论的启发式搜索算法。该算法反映了自然选择的过程,即最适者被选定繁殖,并产生下一代。本文简要地介绍了遗传算法的基本概念和实现,希望能为读者展示启发式搜索的魅力。_

如上图(左)所示,遗传算法的个体由多条染色体组成,每条染色体由多个基因组成。上图(右)展示了染色体分割和组合的方式。_

遗传算法的概念

自然选择的过程从选择群体中最适应环境的个体开始。后代继承了父母的特性,并且这些特性将添加到下一代中。如果父母具有更好的适应性,那么它们的后代将更易于存活。迭代地进行该自然选择的过程,最终,我们将得到由最适应环境的个体组成的一代。

这一概念可以被应用于搜索问题中。我们考虑一个问题的诸多解决方案,并从中搜寻出最佳方案。

遗传算法含以下五步:初始化

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

选择运算

交叉运算

变异运算

初始化

该过程从种群的一组个体开始,且每一个体都是待解决问题的一个候选解。

个体以一组参数(变量)为特征,这些特征被称为基因,串联这些基因就可以组成染色体(问题的解)。

在遗传算法中,单个个体的基因组以字符串的方式呈现,通常我们可以使用二进制(1 和 0 的字符串)编码,即一个二进制串代表一条染色体串。因此可以说我们将基因串或候选解的特征编码在染色体中。

种群、染色体和基因

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

个体评价利用适应度函数评估了该个体对环境的适应度(与其它个体竞争的能力)。每一个体都有适应度评分,个体被选中进行繁殖的可能性取决于其适应度评分。适应度函数值越大,解的质量就越高。适应度函数是遗传算法进化的驱动力,也是进行自然选择的唯一标准,它的设计应结合求解问题本身的要求而定。

选择运算

选择运算的目的是选出适应性最好的个体,并使它们将基因传到下一代中。基于其适应度评分,我们选择多对较优个体(父母)。适应度高的个体更易被选中繁殖,即将较优父母的基因传递到下一代。

交叉运算

交叉运算是遗传算法中最重要的阶段。对每一对配对的父母,基因都存在随机选中的交叉点。

举个例子,下图的交叉点为 3:

父母间在交叉点之前交换基因,从而产生了后代。

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

变异运算

在某些形成的新后代中,它们的某些基因可能受到低概率变异因子的作用。这意味着二进制位串中的某些位可能会翻转。

变异运算前后

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

终止

在群体收敛的情况下(群体内不产生与前一代差异较大的后代)该算法终止。也就是说遗传算法提供了一组问题的解。

案例实现

种群的规模恒定。新一代形成时,适应度最差的个体凋亡,为后代留出空间。这些阶段的序列被不断重复,以产生优于先前的新一代。

这一迭代过程的伪代码:START

Generate the initial population

Compute fitness

REPEAT

Selection

Crossover

Mutation

Compute fitness

UNTIL population has converged

STOP

Java 中的实例实现

以下展示的是遗传算法在 Java 中的示例实现,我们可以随意调试和修改这些代码。给定一组五个基因,每一个基因可以保存一个二进制值 0 或 1。这里的适应度是基因组中 1 的数量。如果基因组内共有五个 1,则该个体适应度达到最大值。

如果基因组内没有 1,那么个体的适应度达到最小值。该遗传算法希望最大化适应度,并提供适应度达到最大的个体所组成的群体。注意:本例中,在交叉运算与突变运算之后,适应度最低的个体被新的,适应度最高的后代所替代。import java.util.Random;

/**

*

* @author Vijini

*/

//Main class

public class SimpleDemoGA {

Population population = new Population();

Individual fittest;

Individual secondFittest;

int generationCount = 0;

public static void main(String[] args) {

Random rn = new Random();

SimpleDemoGA demo = new SimpleDemoGA();

//Initialize population

demo.population.initializePopulation(10);

//Calculate fitness of each individual

demo.population.calculateFitness();

System.out.println("Generation: " + demo.generationCount + " Fittest: " + demo.population.fittest);

//While population gets an individual with maximum fitness

while (demo.population.fittest < 5) {

++demo.generationCount;

//Do selection

demo.selection();

//Do crossover

demo.crossover();

//Do mutation under a random probability

if (rn.nextInt()%7 < 5) {

demo.mutation();

}

//Add fittest offspring to population

demo.addFittestOffspring();

//Calculate new fitness value

demo.population.calculateFitness();

System.out.println("Generation: " + demo.generationCount + " Fittest: " + demo.population.fittest);

}

System.out.println("\nSolution found in generation " + demo.generationCount);

System.out.println("Fitness: "+demo.population.getFittest().fitness);

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

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

System.out.print(demo.population.getFittest().genes[i]);

}

System.out.println("");

}

//Selection

void selection() {

//Select the most fittest individual

fittest = population.getFittest();

//Select the second most fittest individual

secondFittest = population.getSecondFittest();

}

//Crossover

void crossover() {

Random rn = new Random();

//Select a random crossover point

int crossOverPoint = rn.nextInt(population.individuals[0].geneLength);

//Swap values among parents

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

int temp = fittest.genes[i];

fittest.genes[i] = secondFittest.genes[i];

secondFittest.genes[i] = temp;

}

}

//Mutation

void mutation() {

Random rn = new Random();

//Select a random mutation point

int mutationPoint = rn.nextInt(population.individuals[0].geneLength);

//Flip values at the mutation point

if (fittest.genes[mutationPoint] == 0) {

fittest.genes[mutationPoint] = 1;

} else {

fittest.genes[mutationPoint] = 0;

}

mutationPoint = rn.nextInt(population.individuals[0].geneLength);

if (secondFittest.genes[mutationPoint] == 0) {

secondFittest.genes[mutationPoint] = 1;

} else {

secondFittest.genes[mutationPoint] = 0;

}

}

//Get fittest offspring

Individual getFittestOffspring() {

if (fittest.fitness > secondFittest.fitness) {

return fittest;

}

return secondFittest;

}

//Replace least fittest individual from most fittest offspring

void addFittestOffspring() {

//Update fitness values of offspring

fittest.calcFitness();

secondFittest.calcFitness();

//Get index of least fit individual

int 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[5];

int geneLength = 5;

public Individual() {

Random rn = new Random();

//Set genes randomly for each individual

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

genes[i] = rn.nextInt() % 2;

}

fitness = 0;

}

//Calculate fitness

public void calcFitness() {

fitness = 0;

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

if (genes[i] == 1) {

++fitness;

}

}

}

}

//Population class

class Population {

int popSize = 10;

Individual[] individuals = new Individual[10];

int fittest = 0;

//Initialize population

public void initializePopulation(int size) {

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

individuals[i] = new Individual();

}

}

//Get the fittest individual

public Individual getFittest() {

int maxFit = Integer.MIN_VALUE;

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

if (maxFit <= individuals[i].fitness) {

maxFit = i;

}

}

fittest = individuals[maxFit].fitness;

return individuals[maxFit];

}

//Get the second most fittest individual

public Individual getSecondFittest() {

int maxFit1 = 0;

int maxFit2 = 0;

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

if (individuals[i].fitness > individuals[maxFit1].fitness) {

maxFit2 = maxFit1;

maxFit1 = i;

} else if (individuals[i].fitness > individuals[maxFit2].fitness) {

maxFit2 = i;

}

}

return individuals[maxFit2];

}

//Get index of least fittest individual

public int getLeastFittestIndex() {

int minFit = 0;

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

if (minFit >= individuals[i].fitness) {

minFit = i;

}

}

return minFit;

}

//Calculate fitness of each individual

public void calculateFitness() {

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

individuals[i].calcFitness();

}

getFittest();

}

}本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载

作者:MallawaarachchiFollow

原文:https://medium.com/towards-da...

机器之心编译,参与:俞云开、蒋思源

近期热文推荐:

觉得不错,别忘了随手点赞+转发哦!

Java实现一元函数遗传算法_遗传算法的基本概念和实现,附Java实现案例!相关推荐

  1. java学习文档_资深程序员带你深入了解JAVA知识点,实战篇,PDF文档

    JAVA 集合JAVA 集合面对浩瀚的网络学习资源,您是否为很难找到适合自己的学习资源而感到苦恼过?那么,您来对地方了.在这里我们帮助大家整理了一份适于轻松学习 Java 文章的清单.JVM 文字太多 ...

  2. java时间规划书_【计算机本科补全计划】Java学习笔记(九) Java日期时间

    正文之前 终于好像仿佛看完了菜鸟教程的Java课程,感觉自己收获颇丰!很好,Java看完之后正愁如何开始进阶呢!结果发现菜鸟还准备了Java实例这种好东西!简直就是教程界的良心啊 !!!没事,先写写笔 ...

  3. java无ide编译_[转]无IDE时编译和运行Java

    本文由 ImportNew - Grey 翻译自 dzone.欢迎加入Java小组.转载请参见文章末尾的要求. 最近Java subreddit出现了一篇"在没有IDE的情况下编译Java包 ...

  4. java语言就业方向_四大就业方向彻底解决你学习Java语言编程的后顾之忧-生活感悟与随笔 -亦是美网络...

    前面的文章中已经给大家介绍了关于Java编程语言的优势.特点以及就业前景等内容,大家之所以这么热衷于Java编程学习,不仅是因为Java是编程市场上最为广泛流行的语言,大家更关心的是学习了Java编程 ...

  5. java 字符串 字节数组_字符串到字节数组,字节数组到Java中的字符串

    java 字符串 字节数组 Today we will learn how to convert String to byte array in java. We will also learn ho ...

  6. java ee 值范围_一篇文章带你读懂: Java EE

    原标题:一篇文章带你读懂: Java EE 点击上图,查看教学大纲 何为 Java EE Java EE是一个标准中间件体系结构 不要被名称"Java PlatformEnterprise ...

  7. java解析xlsb文件_读取XLSB文件Apache POI的异常java.io.CharConversionException

    我正在开发一种使用Apache POI读取excel xlsb文件的Java应用程序,但是在读取时出现异常,我的代码如下: import java.io.IOException; import jav ...

  8. java小恐龙游戏_【分享】 chrome恐龙小游戏 java

    本帖最后由 leiyanfu 于 2019-5-3 14:27 编辑 最近学习java也有一段时间了 前些天打开网站老是出出现小恐龙所以就萌生了想模仿着写一个 无奈一些东西我还没学到 比如java的窗 ...

  9. c语言与java的最大区别_【干货!!】来看看java和c语言的一些大体区别

    原标题:[干货!!]来看看java和c语言的一些大体区别 对于这两门计算机语言大多数人接触的都不是很多,一般都是到了大学的时候学计算机专业的一些同学才刚接触到c语言这么课程.刚学习的时候会感到非常的陌 ...

最新文章

  1. 中文分词jieba的简单使用
  2. 分析unix系统日期析取ftp登陆和断开信息
  3. spark.kubernetes.file.upload.path的作用
  4. C++对象确定性解析单例模式
  5. WPF 用 DataTemplate 合并DataGrid列表列头类似报表设计及行头列头样式 - 学习
  6. Tomcat乱码解决
  7. Dubbo 集成 ZooKeeper 注册中心实现服务调用
  8. fastdfs笔记_fastdfs基于group的扩容
  9. rpm deb命令集合
  10. android学习--TabHost选项卡组件
  11. java datediff函数_JPA Criteria 中 DATEDIFF 函数的使用
  12. 与afreez一起学习DSP中浮点转定点运算--浮点数的存储格式
  13. WKWebView加载HTTPS的链接
  14. webgame源码下载及网页游戏开发资源精华集合
  15. Pytorch求向量的L1范数或L2范数
  16. matlab 拟合优度检验,卡方拟合优度检验在教学中的应用及Matlab实现_刘泽显
  17. 适合前端学习的几个网站
  18. 设置网页宽高的比例为16:9
  19. 云计算是什么 如何分类 有什么
  20. Performance Counter的使用

热门文章

  1. 媲美Geomagic -- 一款高效、完备的点云和网格交互处理平台SXLib3D
  2. GAN生成式对抗网络总结
  3. 图像特征提取之--PCA方法
  4. python的静态变量声明_python“静态”变量、实例变量与本地变量的声明示例
  5. i386 和 x86-64 有什么区别?
  6. 【Win10】屏幕常亮解决方案
  7. vue 无法进入response拦截器_Vue添加请求拦截器
  8. linux 自动同步时间命令,LINUX系统时间怎么设置同步脚本或命令?
  9. 高并发软件系统设计原理与实践——前言-高岩峰-专题视频课程
  10. 在计算机中程序主要存放在什么中,在计算机中.指令主要存放在( )中.A.存储器 B.键盘 C.鼠标 D.运算器——青夏教育精英家教网——...