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;
    }