Exemple #1
0
        /// <summary>
        /// Produces offspring decks from the current population.
        /// </summary>
        private List <HSGAIndividual> ProduceNextGeneration(List <HSGAIndividual> localCurrentPop)
        {
            List <string>         cards       = new List <string>();
            List <HSGAIndividual> localNewPop = new List <HSGAIndividual>();


            while (localNewPop.Count != 10)
            {
                GeneFunctions         gene     = new GeneFunctions();
                List <HSGAIndividual> parents  = new List <HSGAIndividual>();
                List <HSGAIndividual> children = new List <HSGAIndividual>();

                // select parents
                parents.Add(gene.SelectIndividual(localCurrentPop, logger));
                parents.Add(gene.SelectIndividual(localCurrentPop, logger));



                //crossover
                children = gene.Crossover(parents, crossoverProbability, logger);
                //mutation
                children[0].cardList = MutateIndividual(children[0].cardList);

                // sort the newly edited list
                List <Card> test = new List <Card>();
                test.AddRange(children[0].cardList.OrderBy(Card => Card._CardID.Split('_')[1].ToCharArray()[0])
                              .ThenBy(Card => Card._CardID.Split('_').Count() >= 3 ? Card._CardID.Split('_')[2].ToCharArray()[0] : Card._CardID.Split('_')[1].ToCharArray()[0]).ToList());
                children[0].cardList.Clear();
                children[0].cardList.AddRange(test);

                cards.Clear();
                for (int i = 0; i < children[0].cardList.Count; i++)
                {
                    cards.Add(children[0].cardList[i]._CardID);
                }

                children[1].cardList = MutateIndividual(children[1].cardList);

                cards.Clear();
                for (int i = 0; i < children[1].cardList.Count; i++)
                {
                    cards.Add(children[1].cardList[i]._CardID);
                }
                // add children to new population
                localNewPop.Add(children[0]);
                localNewPop.Add(children[1]);
            }
            return(localNewPop);
        }