Ejemplo n.º 1
0
        public void SteadyStateGeneticAlgorithm_Initialize_InvalidPopulationReplacement2()
        {
            SteadyStateGeneticAlgorithm config = new SteadyStateGeneticAlgorithm();
            PopulationReplacementValue  val    = new PopulationReplacementValue(101, ReplacementValueKind.Percentage);

            Assert.Throws <ValidationException>(() => config.PopulationReplacementValue = val);
        }
Ejemplo n.º 2
0
        public void SteadyStateGeneticAlgorithm_Serialization()
        {
            SteadyStateGeneticAlgorithm algorithm = new SteadyStateGeneticAlgorithm
            {
                PopulationReplacementValue = new PopulationReplacementValue(3, ReplacementValueKind.Percentage)
            };

            SteadyStateGeneticAlgorithm result = (SteadyStateGeneticAlgorithm)SerializationHelper.TestSerialization(
                algorithm, new Type[] { typeof(DefaultTerminator) });

            Assert.Equal(algorithm.PopulationReplacementValue.Kind, result.PopulationReplacementValue.Kind);
            Assert.Equal(algorithm.PopulationReplacementValue.Value, result.PopulationReplacementValue.Value);
        }
Ejemplo n.º 3
0
        public async Task SteadyStateGeneticAlgorithm_CreateNextGeneration_Percentage()
        {
            SteadyStateGeneticAlgorithm algorithm = new SteadyStateGeneticAlgorithm
            {
                GeneticEntitySeed          = new MockEntity(),
                PopulationSeed             = new SimplePopulation(),
                FitnessEvaluator           = new MockFitnessEvaluator(),
                PopulationReplacementValue = new PopulationReplacementValue(20, ReplacementValueKind.Percentage),
                SelectionOperator          = new MockSelectionOperator
                {
                    SelectionBasedOnFitnessType = FitnessType.Scaled
                },
                CrossoverOperator = new MockCrossoverOperator
                {
                    CrossoverRate = 1
                },
                MutationOperator = new MockMutationOperator
                {
                    MutationRate = 1
                }
            };

            algorithm.SelectionOperator = new MockSelectionOperator {
                SelectionBasedOnFitnessType = FitnessType.Scaled
            };
            algorithm.SelectionOperator.Initialize(algorithm);
            algorithm.CrossoverOperator = new MockCrossoverOperator {
                CrossoverRate = 1
            };
            algorithm.CrossoverOperator.Initialize(algorithm);
            algorithm.MutationOperator = new MockMutationOperator {
                MutationRate = 1
            };
            algorithm.MutationOperator.Initialize(algorithm);
            algorithm.FitnessEvaluator = new MockFitnessEvaluator();
            algorithm.FitnessEvaluator.Initialize(algorithm);

            await algorithm.InitializeAsync();

            PrivateObject    ssAccessor = new PrivateObject(algorithm);
            SimplePopulation population = GetPopulation(algorithm, 10);

            int prevPopCount = population.Entities.Count;

            await(Task) ssAccessor.Invoke("CreateNextGenerationAsync", population);

            Assert.Equal(1, ((MockSelectionOperator)algorithm.SelectionOperator).DoSelectCallCount);
            Assert.Equal(1, ((MockCrossoverOperator)algorithm.CrossoverOperator).DoCrossoverCallCount);
            Assert.Equal(2, ((MockMutationOperator)algorithm.MutationOperator).DoMutateCallCount);
            Assert.Equal(prevPopCount, population.Entities.Count);
        }
Ejemplo n.º 4
0
 public async Task SteadyStateGeneticAlgorithm_CreateNextGeneration_NullPopulation()
 {
     SteadyStateGeneticAlgorithm algorithm = new SteadyStateGeneticAlgorithm();
     PrivateObject accessor = new PrivateObject(algorithm);
     await Assert.ThrowsAsync <ArgumentNullException>(() => (Task)accessor.Invoke("CreateNextGenerationAsync", (Population)null));
 }
Ejemplo n.º 5
0
        public void Evaluate(GAParametersChromosome chromosome)
        {
            // if (chromosome.IsEvaluated) return;

            _evaluations++;

            GAParameters parameters = chromosome.GetValue(0);

            _function.Clear();

            int iters            = 10;
            int childEvaluations = 10000;
            int maxGenerations   = 100;

            double[] childGAFitnesses = new double[iters];

            var chromosomeRepresentation = GAParameters.ChromosomeRepresentation[parameters.ChromosomeRepresentationIndex];

            for (int i = 0; i < iters; i++)
            {
                if (chromosomeRepresentation == GAParameters.ChromosomeRepresentationType.Binary)
                {
                    IProblem <BinaryChromosome> problem = new FunctionMinimizationBinaryProblem(_function, _functionDimension, 4, -50, 150);
                    int    populationSize = GAParameters.PopulationSize[parameters.PopulationSizeIndex];
                    double crossoverRate  = GAParameters.CrossoverRate[parameters.CrossoverRateIndex];
                    ICrossoverOperator <BinaryChromosome> crossoverOperator;
                    ISelectionOperator <BinaryChromosome> selectionOperator;
                    int    tournamentSize    = GAParameters.TournamentSize[parameters.TournamentSizeIndex];
                    double selectivePressure = GAParameters.SelectivePressure[parameters.SelectivePressureIndex];
                    IMutationOperator <BinaryChromosome> mutationOperator;
                    double mutationRate             = GAParameters.MutationRate[parameters.MutationRateIndex];
                    GeneticAlgorithmVariant variant = GAParameters.GAVariant[parameters.GAVariantIndex];
                    double elitismRate   = GAParameters.ElitismRate[parameters.ElitismRateIndex];
                    double generationGap = GAParameters.GenerationGap[parameters.GenerationGapIndex];

                    var crossOperatorType = GAParameters.CrossoverOperator[parameters.CrossoverOperatorIndex];
                    if (crossOperatorType == GAParameters.CrossoverOperatorType.OnePoint)
                    {
                        crossoverOperator = new OnePointCrossoverOperator(crossoverRate);
                    }
                    else
                    {
                        crossoverOperator = new TwoPointCrossoverOperator(crossoverRate);
                    }

                    var mutationOperatorType = GAParameters.MutationOperator[parameters.MutationOperatorIndex];
                    if (mutationOperatorType == GAParameters.MutationOperatorType.BinaryBoundary)
                    {
                        mutationOperator = new BinaryBoundaryMutationOperator(mutationRate);
                    }
                    else if (mutationOperatorType == GAParameters.MutationOperatorType.BitFlip)
                    {
                        mutationOperator = new BitFlipMutationOperator(mutationRate);
                    }
                    else
                    {
                        mutationOperator = new SimpleMutationOperator(mutationRate);
                    }

                    if (GAParameters.SelectionOperator[parameters.SelectionOperatorIndex] == GAParameters.SelectionOperatorType.Tournament)
                    {
                        selectionOperator = new TournamentSelectionOperator <BinaryChromosome>(tournamentSize, problem);
                    }
                    else
                    {
                        selectionOperator = new RouletteWheelSelectionOperator <BinaryChromosome>(selectivePressure, problem);
                    }

                    IGeneticAlgorithm <BinaryChromosome> ga;

                    if (variant == GeneticAlgorithmVariant.Generational)
                    {
                        ga = new GenerationalGeneticAlgorithm <BinaryChromosome>(
                            problem,
                            populationSize,
                            selectionOperator,
                            crossoverOperator,
                            mutationOperator,
                            new CompositeTerminationCondition(
                                new MaxEvaluationsTerminationCondition(childEvaluations),
                                new MaxGenerationsTerminationCondition(maxGenerations)
                                ),
                            elitismRate
                            );
                    }
                    else
                    {
                        ga = new SteadyStateGeneticAlgorithm <BinaryChromosome>(
                            problem,
                            populationSize,
                            selectionOperator,
                            crossoverOperator,
                            mutationOperator,
                            new CompositeTerminationCondition(
                                new MaxEvaluationsTerminationCondition(childEvaluations),
                                new MaxGenerationsTerminationCondition(maxGenerations)
                                ),
                            generationGap,
                            new WorstFitnessReplacementOperator <BinaryChromosome>(problem)
                            );
                    }

                    // new GeneticAlgorithmRunner<BinaryChromosome>(ga).Run();

                    ga.Run();

                    childGAFitnesses[i] = ga.BestIndividual.Fitness;
                }
                else
                {
                    IProblem <FloatingPointChromosome> problem = new FunctionMinimizationFloatingPointProblem(_function, _functionDimension, -50, 150);
                    int    populationSize = GAParameters.PopulationSize[parameters.PopulationSizeIndex];
                    double crossoverRate  = GAParameters.CrossoverRate[parameters.CrossoverRateIndex];
                    ICrossoverOperator <FloatingPointChromosome> crossoverOperator;
                    ISelectionOperator <FloatingPointChromosome> selectionOperator;
                    int    tournamentSize    = GAParameters.TournamentSize[parameters.TournamentSizeIndex];
                    double selectivePressure = GAParameters.SelectivePressure[parameters.SelectivePressureIndex];
                    IMutationOperator <FloatingPointChromosome> mutationOperator;
                    double mutationRate             = GAParameters.MutationRate[parameters.MutationRateIndex];
                    GeneticAlgorithmVariant variant = GAParameters.GAVariant[parameters.GAVariantIndex];
                    double elitismRate   = GAParameters.ElitismRate[parameters.ElitismRateIndex];
                    double generationGap = GAParameters.GenerationGap[parameters.GenerationGapIndex];

                    var crossOperatorType = GAParameters.CrossoverOperator[parameters.CrossoverOperatorIndex];
                    if (crossOperatorType == GAParameters.CrossoverOperatorType.Arithmetic)
                    {
                        crossoverOperator = new ArithmeticCrossoverOperator(crossoverRate);
                    }
                    else
                    {
                        crossoverOperator = new HeuristicCrossoverOperator(crossoverRate);
                    }

                    var mutationOperatorType = GAParameters.MutationOperator[parameters.MutationOperatorIndex];
                    if (mutationOperatorType == GAParameters.MutationOperatorType.FloatingPointBoundary)
                    {
                        mutationOperator = new FloatingPointBoundaryMutationOperator(mutationRate);
                    }
                    else if (mutationOperatorType == GAParameters.MutationOperatorType.Uniform)
                    {
                        mutationOperator = new UniformMutationOperator(mutationRate);
                    }
                    else
                    {
                        mutationOperator = new GaussianMutationOperator(mutationRate);
                    }

                    if (GAParameters.SelectionOperator[parameters.SelectionOperatorIndex] == GAParameters.SelectionOperatorType.Tournament)
                    {
                        selectionOperator = new TournamentSelectionOperator <FloatingPointChromosome>(tournamentSize, problem);
                    }
                    else
                    {
                        selectionOperator = new RouletteWheelSelectionOperator <FloatingPointChromosome>(selectivePressure, problem);
                    }

                    IGeneticAlgorithm <FloatingPointChromosome> ga;

                    if (variant == GeneticAlgorithmVariant.Generational)
                    {
                        ga = new GenerationalGeneticAlgorithm <FloatingPointChromosome>(
                            problem,
                            populationSize,
                            selectionOperator,
                            crossoverOperator,
                            mutationOperator,
                            new CompositeTerminationCondition(
                                new MaxEvaluationsTerminationCondition(childEvaluations),
                                new MaxGenerationsTerminationCondition(maxGenerations)
                                ),
                            elitismRate
                            );
                    }
                    else
                    {
                        ga = new SteadyStateGeneticAlgorithm <FloatingPointChromosome>(
                            problem,
                            populationSize,
                            selectionOperator,
                            crossoverOperator,
                            mutationOperator,
                            new CompositeTerminationCondition(
                                new MaxEvaluationsTerminationCondition(childEvaluations),
                                new MaxGenerationsTerminationCondition(maxGenerations)
                                ),
                            generationGap,
                            new WorstFitnessReplacementOperator <FloatingPointChromosome>(problem)
                            );
                    }

                    // new GeneticAlgorithmRunner<FloatingPointChromosome>(ga).Run();

                    ga.Run();

                    childGAFitnesses[i] = ga.BestIndividual.Fitness;
                }
            }

            chromosome.Fitness = childGAFitnesses.Average();
        }