private void choose_crossover_method(bool isOrdered = true) { Console.WriteLine("Please Choose CrossOver Method :"); var methodsList = Enum.GetValues(typeof(CrossoverMethod)).Cast <CrossoverMethod>().ToList(); if (isOrdered == true) { for (int i = 0; i < 3; i++) { methodsList.RemoveAt(0); } } else { for (int i = 0; i < 4; i++) { methodsList.Remove(methodsList.Last()); } } for (int i = 0; i < methodsList.Count; i++) { Console.WriteLine((i + 1) + ". " + methodsList[i]); } int input = 0; do { input = get_input(); } while (input <= 0 || input > methodsList.Count); _crossoverMethod = methodsList[input - 1]; }
//Returns a list of new individuals bred from the current population private List <AIPlayer> BreedIndividuals() { int crossovers = (int)(Simulation.PopulationSize * Simulation.CrossoverBredAmount); int mutations = Simulation.PopulationSize - crossovers; int crossoverMutations = (int)(Simulation.MutateAfterCrossoverAmount * Simulation.MutateAfterCrossoverAmount); crossovers -= crossoverMutations; List <AIPlayer> newlyBred = new List <AIPlayer>(); for (int i = 0; i < mutations; i++) { AIPlayer parent = SelectIndividualRankBased(); Chromosome newChromosome = parent.Chromosome.GetMutated(Simulation.MutationRate); AIPlayer toAdd = new AIPlayer(newChromosome, parent, null, Simulation.NeuralNetworkMaker); newlyBred.Add(toAdd); } for (int i = 0; i < crossovers; i++) { AIPlayer parent1 = SelectIndividualRankBased(); AIPlayer parent2 = SelectIndividualRankBased(); CrossoverMethod crossoverMethod = Simulation.RandomCrossoverMethod(); Chromosome crossedChromosome = crossoverMethod.Cross(parent1.Chromosome, parent2.Chromosome); AIPlayer toAdd = new AIPlayer(crossedChromosome, parent1, parent2, Simulation.NeuralNetworkMaker); newlyBred.Add(toAdd); } for (int i = 0; i < crossoverMutations; i++) { AIPlayer parent1 = SelectIndividualRankBased(); AIPlayer parent2 = SelectIndividualRankBased(); CrossoverMethod crossoverMethod = Simulation.RandomCrossoverMethod(); Chromosome crossedChromosome = crossoverMethod.Cross(parent1.Chromosome, parent2.Chromosome); Chromosome crossedAndMutatedChromosome = crossedChromosome.GetMutated(Simulation.MutationRate); AIPlayer toAdd = new AIPlayer(crossedAndMutatedChromosome, parent1, parent2, Simulation.NeuralNetworkMaker); newlyBred.Add(toAdd); } //Parallel.For(0, newlyBred.Count, i => newlyBred[i].CalcFitness(Simulation.Game)); foreach (AIPlayer aip in newlyBred) { aip.CalcFitness(Simulation.Game); } return(newlyBred); }