去语言实现遗传算法的实例代码

  

在没介绍正文之前先给大家补充点去语言基本知识及实例。

  

  

去是一个开源的编程语言,它能让构造简单,可靠且高效的软件变得容易。

  

去是2007年从末由罗伯特?Griesemer Rob Pike Ken Thompson主持开发,后来还加入了伊恩·兰斯泰勒拉斯考克斯等人,并最终于2009年11月开源,在2012年早些时候发布了去1稳定版本。现在走的开发已经是完全开放的,并且拥有一个活跃的社区。

  

  

简洁,快速、安全
  并行,有趣,开源
  内存管理,v数组安全,编译迅速

  

  

去语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。

  

对于高性能分布式系统领域而言,去语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

  

  

接下来我们来编写第一个去程序你好。去(去语言源文件的扩展是.go),代码如下:

  

实例         主要包   进口“fmt”   函数main () {   fmt。Println (“Hello, World !”)   }      

执行以上代码输出

        美元去运行hello.go   你好,世界!      

好了,正文开始。

  

出于好玩的心态,我决定学习一下走语言。我认为学习新语言最好的方法就是深入学习,并且尽可能多犯错误。这样做虽然可能会很慢,但是可以确保在后面的过程中再也不会出现编译的错误。

  

去语言与我习惯的其他语言不同.Go更喜欢自己单独实现,而其他像Java这类语言更喜欢继承。其实在去语言里面根本没有继承这种概念,因为它压根就没有对象这一说法,比如说C语言,它有结构体,但是没有类。但是这样它还是可以有像“构造者”这样的常见思想和设计模式(一种在这种情况下有序地产生结构体的方式)。

  

去语言坚决拥护组合(成分),同时也很反对继承的做法,在网络上引起了强烈的讨论,同时也让人们重新思考了语言该往哪个方向发展,所以,从这个角度来看,去语言与其它语言的差别可能也没有那么大。

  

本文将重点介绍如何用去语言实现遗传算法。如果你还没有参加过GoLang之旅,我还建议你快速看一下这门语言的介绍。

  

话不多说,让我们开始从代码说起吧!第一个例子与我以前做过的很类似:找到一个二次的最小值。

        GeneticAlgorithmSettings struct类型{   PopulationSize int   MutationRate int   CrossoverRate int   NumGenerations int   KeepBestAcrossPopulation bool   }   {GeneticAlgorithmRunner接口类型   GenerateInitialPopulation (populationSize int)[]接口{}   {}PerformCrossover (individual1 individual2接口,mutationRate int)接口{}   PerformMutation(个人界面{})接口{}   排序([]接口{})   }      

我立马定义了一组设置,以便在稍后启动的算法中用到。

  

第二部分的GeneticAlgorithmRunner这个看起来有点奇怪.GeneticAlgorithmRunner是一个接口,询问如何生成初始种群,执行corssovers和mutataions,并对答案进行排序,以便在人群中保持最好的个体,这样下一代才会更加优秀。我认为这看起来很奇怪,因为“接口“通常用于面向对象的语言,通常会要求对象实现某些特性和方法。这里没有什么差别。这一小段代码实际上是在说,它正在请求一些东西来定义这些方法的细节。我是这样做的:

        QuadraticGA struct类型{}   func (l QuadraticGA) GenerateInitialPopulation (populationSize int)[]接口{}{   initialPopulation:=([]接口{},0,populationSize)   我:=0;我& lt;populationSize;我+ + {   initialPopulation=append (initialPopulation makeNewEntry ())   }   返回initialPopulation   }   func (l QuadraticGA) PerformCrossover (result1,编写此表达式result2接口{}_ int)接口{}{   返回(result1。编写此表达式(float64) + result2。(float64))/2   }   func (l QuadraticGA) PerformMutation接口(接口{}_,_ int) {} {   返回makeNewEntry ()   }   func (l QuadraticGA)排序(人口[]接口{}){   排序。片(人口,func (i, j int) bool {   返回计算(人口[我]。(float64))比;(人口计算[j] . (float64))   })   }      

更奇怪的是,我从来没有提到过这些方法的接口。请记住,因为没有对象,也没有继承.QuadraticGA结构体是一个空白对象,隐式地作为GeneticAlgorithmRunner。每个必需的方法都在括号中绑定到该结构体,就像Java中的“@覆盖”。现在,结构体和设置需要传递给运行该算法的模块。

去语言实现遗传算法的实例代码