/// <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); }