public IList <IGenome <T> > Generate(IList <IGenome <T> > genomes) { IList <IGenome <T> > result; IList <IGenome <T> > babies; int n; n = Count(genomes); result = new List <IGenome <T> >(n); Selector.BeforeAllSelections(genomes); while (result.Count < n) { babies = Crossover.Crossover(Selector.SelectNext()); if (babies.Count == 0) { ThrowInvalidChildProducedCount(); } foreach (var babie in babies) { Mutator.Mutate(babie); result.Add(babie); if (result.Count() > n) { break; } } } if (result.Count() > n) { result = result.Take(n).ToArray(); } if (result.Count() != n) { ThrowInvalidBreadCount(result.Count(), n); } return(result); }