Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践
出于好玩的心态,我决定进修一下Go说话。我认为进修新说话最好的办法就是深刻进修,并且尽可能多犯缺点。如许做固然可能会很慢,然则可以确保在后面的过程中再也不会出现编译的缺点。
Go说话与我习惯的其他说话不合。Go更爱好本身零丁实现,而其他像Java这类说话更爱好持续。其实袈溱Go说话琅绫擎根本没有持续这种概念,因为它压根就没有对象这一说法。比如说C说话,它有构造体,然则没有类。然则如许它照样可以有像“构造者”如许的常见思惟和设计模式(一种在这种情况下有序地产生构造体的方法)。
Go说话果断拥戴组合(composition),同时也很否决持续的做法,在收集上引起了强烈的评论辩论,同时也让人们从新思虑了说话该往哪个偏向成长。所以,大年夜这个角度来看,Go说话与其它说话的差别可能也没有那么大年夜。
本文将重点介绍若何用Go说话实现遗传算法。如不雅你还没有参加过GoLang Tour,我还建议你快速看一下这门说话的介绍。
话不多说,让我们开端大年夜代码说起吧!第一个例子与我以前做过的很类似:找到一个二次的最小值。
- type GeneticAlgorithmSettings struct {
- PopulationSize int
- MutationRate int
- CrossoverRate int
- NumGenerations int
- KeepBestAcrossPopulation bool
- }
- type GeneticAlgorithmRunner interface {
- GenerateInitialPopulation(populationSize int) []interface{}
- PerformCrossover(individual1, individual2 interface{}, mutationRate int) interface{}
- PerformMutation(individual interface{}) interface{}
- Sort([]interface{})
- }
我立马定义了一组设置,以便在稍后启动的算法顶用到。
第二部分的GeneticAlgorithmRunner这个看起来竽暌剐点奇怪。GeneticAlgorithmRunner是一个接口,询问若何生成初始种群,履行corssovers和mutataions,并对谜底进行排序,以便在Population中保持最好的个别,如许下一代才会加倍优良。我认为这看起来很奇怪,因为“接口”平日用于面向对象的说话,平日会请求对象实现某些特点和办法。这琅绫腔有什么差别。这一小段代码实际上是在说,它正在请求一些器械来定义这些办法的细节。我是如许做的:
- type QuadraticGA struct {}
- func (l QuadraticGA) GenerateInitialPopulation(populationSize int) []interface{}{
- initialPopulation := make([]interface{}, 0, populationSize)
- for i:= 0; i < populationSize; i++ {
- initialPopulation = append(initialPopulation, makeNewEntry())
- }
- return initialPopulation
- }
- func (l QuadraticGA) PerformCrossover(result1, result2 interface{}, _ int) interface{}{
- return (result1.(float64) + result2.(float64)) / 2
- }
- func (l QuadraticGA) PerformMutation(_ interface{}, _ int) interface{}{
- return makeNewEntry()
- }
- func (l QuadraticGA) Sort(population []interface{}){
推荐阅读
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 10 月浏览器市场份额数据显示,Chrome 市场份额持续晋升,下个月有望冲破 60% 。Edge 浏览器的份额出现下>>>详细阅读
本文标题:Go语言如何实现遗传算法
地址:http://www.17bianji.com/lsqh/38942.html
1/2 1