void NextGeneration() { List <GameObject> toDestroy = new List <GameObject>(); for (int i = 0; i < PopulationSize; i++) { toDestroy.Add(((RobotIndividual)_population[i]).Robot.gameObject); } Individual best = _population[0]; double totalFitness = best.Fitness; for (int i = 1; i < PopulationSize; i++) { RobotIndividual individual = (RobotIndividual)_population[i]; totalFitness += individual.Fitness; if (individual.Fitness > best.Fitness) { best = individual; } _container.Add(individual); } if (best.Fitness > _best) { _best = best.Fitness; } //DataCollection.WriteData(new [] {_best.ToString(), (totalFitness / PopulationSize).ToString(), _container.GetAmount().ToString()}); _population = _selection.Select(_population, _container); foreach (Variation variation in _variations) { _population = variation.Vary(_population, _gen); } for (int i = 0; i < PopulationSize; i++) { Destroy(toDestroy[i]); RobotIndividual individual = (RobotIndividual)_population[i]; Robot robot = Instantiate(Robot).GetComponent <Robot>(); robot.Initialize(individual.Genome); _population[i] = new RobotIndividual(robot, individual.Parents); } }
void Initialize() { if (_population.Length > 0) { for (int i = 0; i < PopulationSize; i++) { Destroy(((RobotIndividual)_population[i]).Robot.gameObject); } } _population = new Individual[PopulationSize]; List <NeatGenome> genomeList = _genomeFactory.CreateGenomeList(PopulationSize, 0); for (int i = 0; i < PopulationSize; i++) { Robot robot = Instantiate(Robot).GetComponent <Robot>(); robot.Initialize(genomeList[i]); RobotIndividual individual = new RobotIndividual(robot, null); _population[i] = individual; } if (_epoch >= _parameters.Length) { _experiment++; _epoch = 0; } EvolutionParameters parameters = _parameters[_epoch]; _selection = parameters.Selection; _container = parameters.Container; _container.Clear(); _variations = parameters.Variations; DataCollection.NewExperiment(parameters); _best = 0; }