예제 #1
0
        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];
        }
예제 #2
0
        //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);
        }