Exemple #1
0
        public ObservableCollection <Plant> StartGeneration <T>(IEnumerable <T> newPlantsFromLastRound,
                                                                IEnumerable <T> initPlantsFromLastRound, Plant wishPlant, int genNumber, ExecutionReport er, BackgroundWorker bgw)
        {
            // Aggregate Plants from Gen - 2 & Gen - 1 in PlantPool for current Gen
            List <Plant> plantPool = new List <Plant>(initPlantsFromLastRound.Count() + newPlantsFromLastRound.Count());

            plantPool.AddRange((List <Plant>)initPlantsFromLastRound);
            plantPool.AddRange(((IEnumerable <Plant>)newPlantsFromLastRound).ToList());

            // Remove non valid plants from first round
            if (genNumber == 1)
            {
                ((List <Plant>)newPlantsFromLastRound).RemoveAll(p => !p.isValid);
            }


            //// Prepare PlantPool for current Gen by removing Invalid & Worst plant
            //foreach (var newPlant in newPlantsFromLastRound)
            //{
            //    plantPool.RemoveAll(p => !p.isValid);
            //    plantPool.RemoveAll(p => ((Plant)(object)newPlant).IsBetterThanOrEqualTo(p));
            //}
            //// Invalid & Worst plant removed are also removed from newPlantsFromLastRound
            //((IEnumerable<Plant>)newPlantsFromLastRound).ToList().RemoveAll(p => !plantPool.Contains(p, new PlantEqualityComparer()));

            // Out condition : If gen > 3 or no more new plants
            if ((newPlantsFromLastRound.Count() == 0 && genNumber != 1) || genNumber > 1)
            {
                ObservableCollection <Plant> lp = new ObservableCollection <Plant>();
                lp = new ObservableCollection <Plant>(((List <Plant>)plantPool)
                                                      //.OrderByDescending(p => p.GetDistanceFrom(wishPlant))
                                                      .OrderByDescending(p => p.GetScore())
                                                      .ThenBy(p => p.GetComplexity()).Take(10).ToList());

                return(lp);
            }
            ;

            List <Plant> newPlantPool = new List <Plant>();
            int          cpt          = 0;

            bgw.ReportProgress(ExecutionReport.Combinations(40, 5) * 40);
            foreach (var currentPlant in ((IEnumerable <Plant>)newPlantsFromLastRound).ToList())
            {
                for (var index = 2; index < 5; index++)
                {
                    foreach (IEnumerable <T> permutation in PermuteUtils.PermuteUnique <T>((IEnumerable <T>)plantPool, index))
                    {
                        //bgw.ReportProgress(cpt++);
                        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.isValid && !plantPool.Exists(p => p.IsBetterThanOrEqualTo(newPlant)) &&
                            !newPlantPool.Exists(p => p.IsBetterThanOrEqualTo(newPlant)))
                        {
                            newPlantPool.Add(newPlant);
                        }
                    }
                }
            }
            return(StartGeneration(newPlantPool, plantPool, wishPlant, ++genNumber, er, bgw));
        }