Go语言如何实现遗传算法无标题文章

姓名:白国乐

学号:17021210898

专业:信号与信息处理

转载自:http://blog.csdn.net/dev_csdn/article/details/78521431,有删节

【嵌牛导读】微服务架构模式(Microservice Architect Pattern)。近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重点关注

【嵌牛鼻子】遗传算法、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{})

}

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{}){

sort.Slice(population, func(i, j int) bool {

return calculate(population[i].(float64)) > calculate(population[j].(float64))

})

}

现在,这个遗传算法可以改进了。与C一样,当将对象传递给方法时,将在堆栈上复制对象(读取数据)。随着对象大小的增长,最好不要反复复制它们,而是要在堆中创建它们,并在周围传递指针。目前,我将把它作为未来的工作。

Go也被用coroutines和信道的原生支持编写,利用多个内核来解决一个问题,比过去简单多了,相比于单核时代的其他语言来说,这是一个巨大的优势。我想要增强这个算法来使用这些工具,但这也必须留给以后的工作。

我很享受学习的过程。对于我来说,用组合而不是继承来考虑工程解决方案是很困难的,因为我已经习惯了8年以上的时间,也是我学会编程的方式。但是每种语言和方式都有各自的优点和缺点;每一种语言在我的工具中都是不同的工具。对于任何担心尝试的人,不要。有一个驼峰(更像是一个减速带),但你很快就会克服它,走上成功之路。

还有一些我喜欢的东西,我喜欢其他语言,主要是一组基本的函数方法来操作数据。我需要一个lambda函数和方法来映射、减少和筛选数据的数组或部分。设计人员反对功能实现的理由是,代码应该总是简单、易于阅读和编写,并且这与for循环是可实现的。我认为,映射、过滤和减少通常更容易读和写,但这是一场已经在肆虐的战争中的争论。

    原文作者:想一个名字好难_fc2e
    原文地址: https://www.jianshu.com/p/0cf6301d8506
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞