- func main() {
- beforeQuadTime := time.Now()
- quadraticMain()
- afterQuadTime := time.Since(beforeQuadTime)
- fmt.Printf("%d\n", afterQuadTime)
- before3dQuadTime := time.Now()
- quadratic3dMain()
- after3dQuatTime := time.Since(before3dQuadTime)
- fmt.Printf("%d\n", after3dQuatTime)
- }
很像以前,一个新的人口被创造出来,人口的成员将会世代交配,而他们的后代可能携带突变。一小我的表示越好,就越有可能交配。跟着时光的推移,算法术敛到最好的谜底,或者至少是一个相当不错的谜底。
那么当它运行时,它返回了什么呢?
如今来计算每个项的机能,以求二次函数求出的二次函数来求出一个新的X值的办法:
不坏!因为人口范围只有5、20代,并且输入典范围被限制在[0 100],这一搜刮就钉在了顶点上。
如今,您可能想知道为什愦我定义了所有的接口办法来返回“接口{}”。这就像Go和generics一样。没有对象,是以没有对象类型返回,然则没有描述的大年夜小的数据仍然可以在客栈上传递。这本质上也是这个返回类型的含义:它传递一些已知的和类似的类型的对象。有了这个“泛型”,我就可以将GA移动到它本身的包中,并将雷同的代码移到多个不合类型的数据上。
既然已经为二次实现创建了接口,那么GA本身须要完成:
我们有两个输入的3D二次方程,而不是一个二维二次方程的单个输入。接口办法只须要很小的改变:
- type Quad3D struct {
- x, y float64
- }
- func makeNewQuadEntry(newX, newY float64) Quad3D {
- return Quad3D{
- x: newX,
- y: newY,
- }
- }
- func calculate3D(entry Quad3D) float64 {
- return math.Pow(entry.x, 2)- 6 * entry.x + math.Pow(entry.y, 2)- 6 * entry.y + 2
- }
- type Quadratic3dGA struct {
- }
- func (l Quadratic3dGA) GenerateInitialPopulation(populationSize int)[]interface{}{
- initialPopulation := make([]interface{}, 0, populationSize)
- for i:= 0; i < populationSize; i++ { initialPopulation = append(initialPopulation, makeNewQuadEntry(makeNewEntry(), makeNewEntry())) } return initialPopulation } func (l Quadratic3dGA) PerformCrossover(result1, result2 interface{}, mutationRate int) interface{}{ r1Entry, r2Entry := result1.(Quad3D), result2.(Quad3D) return makeNewQuadEntry((r1Entry.x + r2Entry.x) / 2, (r1Entry.y + r2Entry.y) / 2,) } func (l Quadratic3dGA) PerformMutation(_ interface{}) interface{}{ return makeNewQuadEntry(makeNewEntry(), makeNewEntry()) } func (l Quadratic3dGA) Sort(population []interface{}){ sort.Slice(population, func(i, j
推荐阅读
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 10 月浏览器市场份额数据显示,Chrome 市场份额持续晋升,下个月有望冲破 60% 。Edge 浏览器的份额出现下>>>详细阅读
本文标题:Go语言如何实现遗传算法
地址:http://www.17bianji.com/lsqh/38942.html
1/2 1