public Genotype[] Select(Specie[] species, int offspringCount)
        {
            var sumMeanAdjustedFitness = GetSumMeanAdjustedFitness(species);

              var orderedSpecies = species.OrderByDescending(sp => sp.MeanAdjustedFitness)
            .ToList();

              var offspring = orderedSpecies
            .SelectMany(sp => GetOffspring(sp, offspringCount, sumMeanAdjustedFitness))
            .Take(offspringCount)
            .ToList();

              // Fill gap by producing additional offspring from top performers
              var diff = offspringCount - offspring.Count;
              if (diff > 0) {
            var additionalOffspring = orderedSpecies
              .Take(diff)
              .Select(sp => sp.ProduceOffspring(crossover))
              .ToList();
            Debug.LogFormat("Producing {0} additional offspring", additionalOffspring.Count);
            offspring.AddRange(additionalOffspring);
              }

              var selectedOffspring = offspring.ToArray();
              Assert.AreEqual(offspringCount, selectedOffspring.Length,
            "Must select the correct number of offspring");
              return selectedOffspring;
        }
        public List<Phenotype> Select(Specie[] species, int eliteCount)
        {
            var orderedSpecies = species.OrderByDescending(sp => sp.BestFitness);

              var elites = orderedSpecies.Select(sp => {
            var orderedSpecie = sp.OrderByDescending(pt => pt.Fitness);
            return orderedSpecie.First();
              }).Take(eliteCount).ToList();

              Assert.AreEqual(eliteCount, elites.Count,
            "Must return the expected number of elites");

              return elites;
        }