code: func (ga *GeneticAlgorithm) Simulate() bool {
  
  	if ga.populationSize == 0 {
  		return false
  	}
  
  	ga.beginSimulation()
  	for i := 0; i < ga.populationSize; i++ {
  		ga.onNewGenomeToSimulate(&ga.population[i])
  	}
  	ga.syncSimulatingGenomes()
  	ga.Simulator.OnEndSimulation()
  
  	for {
  		elite := ga.getElite()
  		ga.Mater.OnElite(elite)
  		ga.EliteConsumer.OnElite(elite)
  		if ga.shouldExit(elite) {
  			break
  		}
  
  		time.Sleep(1 * time.Microsecond)
  
  		ga.beginSimulation()
  
  		newPopulation := ga.createPopulation()
  		for i := 0; i < ga.populationSize; i += 2 {
  			g1 := ga.Selector.Go(ga.population, ga.totalFitness)
  			g2 := ga.Selector.Go(ga.population, ga.totalFitness)
  
  			g3, g4 := ga.Mater.Go(g1, g2)
  
  			newPopulation[i] = g3
  			ga.onNewGenomeToSimulate(&newPopulation[i])
  
  			if (i + 1) < ga.populationSize {
  				newPopulation[i+1] = g4
  				ga.onNewGenomeToSimulate(&newPopulation[i+1])
  			}
  		}
  		ga.population = newPopulation
  		ga.syncSimulatingGenomes()
  		ga.Simulator.OnEndSimulation()
  	}
  
  	return true
  }
docs: // Simulate runs the genetic algorithm