public List <Plant> StartGeneration <T>(IEnumerable <T> newPlantsFromLastRound, IEnumerable <T> initPlantsFromLastRound, Plant wishPlant, int genNumber, ExecutionReport er) { er.nbOfGenerationForFinding = genNumber; if ((newPlantsFromLastRound.Count() == 0 && genNumber != 1) || genNumber > 2) { List <Plant> lp = new List <Plant>(); lp = ((List <Plant>)initPlantsFromLastRound) .OrderByDescending(p => p.genome.GetDistanceFrom(wishPlant.genome)) .ThenBy(p => p.GetComplexity()).Take(5).ToList(); return(lp); // Plant best = new Plant("WWWWWW"); //foreach (var plant in (List<Plant>)initPlantsFromLastRound) //{ // best = plant.genome.GetDistanceFrom(wishPlant.genome) > best.genome.GetDistanceFrom(wishPlant.genome) ? // best = plant : best; //} //return best; } ; Console.WriteLine("\nStarting Generation of breeding - number: " + genNumber); List <Plant> plantPool = new List <Plant>(initPlantsFromLastRound.Count() + newPlantsFromLastRound.Count()); plantPool.AddRange((List <Plant>)initPlantsFromLastRound); plantPool.AddRange((List <Plant>)newPlantsFromLastRound); List <Plant> plantsToRemoveFromLastRound = new List <Plant>(); //Console.WriteLine("Removing plants..."); var countBeforeRemoving = plantPool.Count(); foreach (var newPlant in newPlantsFromLastRound) { plantPool.RemoveAll(p => ((Plant)(object)newPlant).IsBetterThan(p)); plantPool.RemoveAll(p => !p.IsValid()); } Console.WriteLine(countBeforeRemoving - plantPool.Count() + " plants have been removed."); ((List <Plant>)newPlantsFromLastRound).RemoveAll(p => !plantPool.Contains(p, new PlantEqualityComparer())); List <Plant> newPlantPool = new List <Plant>(); Console.WriteLine("Number of plants in input: " + plantPool.Count() + " / 15625 plants possible."); Console.WriteLine("Number of new plants in previous Generation: " + newPlantsFromLastRound.Count()); foreach (var currentPlant in (List <Plant>)newPlantsFromLastRound) { for (var index = 2; index < 5; index++) { foreach (IEnumerable <T> permutation in PermuteUtils.PermuteUnique <T>((IEnumerable <T>)plantPool, index)) { List <Plant> permutedPlants = new List <Plant>(); permutedPlants.Add(currentPlant); foreach (T i in permutation) { permutedPlants.Add((Plant)(object)i); } Plant newPlant = new Plant(permutedPlants); //if (newPlant.genome.GetDistanceFrom(wishPlant.genome) == 6) //{ // return new List<Plant>().Add(newPlant); //} //else if (!plantPool.Contains(newPlant, new PlantEqualityComparer()) && !newPlantPool.Contains(newPlant, new PlantEqualityComparer())) { newPlantPool.Add(newPlant); } } } } return(StartGeneration(newPlantPool, plantPool, wishPlant, ++genNumber, er)); }