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