Exemple #1
0
        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));
        }