public void GivenAPopulationOfThree_WhenANewPopulationIsRetrieved_ItShouldCallTheEvaluateMethodThreeTimes()
        {
            Mock <IFitnessEvaluationStrategy> fitnessEvaluationMock     = new Mock <IFitnessEvaluationStrategy>();
            IFitnessEvaluationStrategy        fitnessEvaluationStrategy = fitnessEvaluationMock.Object;

            Mock <ICrossoverStrategy> crossoverMock = new Mock <ICrossoverStrategy>();

            crossoverMock.Setup(x => x.Cross(It.IsAny <Individual>(), It.IsAny <Individual>()))
            .Returns(new Individual(fitnessEvaluationStrategy, new Configuration()));
            ICrossoverStrategy crossoverStrategy = crossoverMock.Object;

            Mock <IMutationStrategy> mutationMock     = new Mock <IMutationStrategy>();
            IMutationStrategy        mutationStrategy = mutationMock.Object;

            Mock <ISelectionStrategy> selectionMock     = new Mock <ISelectionStrategy>();
            ISelectionStrategy        selectionStrategy = selectionMock.Object;

            DifferentialEvolution differentialEvolution = new DifferentialEvolution(mutationStrategy,
                                                                                    crossoverStrategy,
                                                                                    selectionStrategy,
                                                                                    selectionStrategy,
                                                                                    fitnessEvaluationStrategy,
                                                                                    new Configuration());

            differentialEvolution.population = new List <Individual>
            {
                new Individual(fitnessEvaluationStrategy, new Configuration()),
                new Individual(fitnessEvaluationStrategy, new Configuration()),
                new Individual(fitnessEvaluationStrategy, new Configuration())
            };

            differentialEvolution.GetNewPopulation();

            fitnessEvaluationMock.Verify(c => c.GetFitnessForIndividual(It.IsAny <Individual>()), Times.Exactly(3 * 2));
        }
        public void GivenADifferentialEvolutionAlgorithm_WhenTheAlgorithmIsRun_ItShouldResultInAPopulationWithAtLeastOneIndividual()
        {
            Mock <IFitnessEvaluationStrategy> fitnessEvaluationMock     = new Mock <IFitnessEvaluationStrategy>();
            IFitnessEvaluationStrategy        fitnessEvaluationStrategy = fitnessEvaluationMock.Object;

            Mock <ICrossoverStrategy> crossoverMock = new Mock <ICrossoverStrategy>();

            crossoverMock.Setup(x => x.Cross(It.IsAny <Individual>(), It.IsAny <Individual>()))
            .Returns(new Individual(fitnessEvaluationStrategy, new Configuration()));
            ICrossoverStrategy crossoverStrategy = crossoverMock.Object;

            Mock <IMutationStrategy> mutationMock     = new Mock <IMutationStrategy>();
            IMutationStrategy        mutationStrategy = mutationMock.Object;

            Mock <ISelectionStrategy> selectionMock = new Mock <ISelectionStrategy>();

            selectionMock.Setup(x => x.Select(It.IsAny <List <Individual> >()))
            .Returns(new Individual(fitnessEvaluationStrategy, new Configuration()));
            ISelectionStrategy selectionStrategy = selectionMock.Object;

            DifferentialEvolution differentialEvolution = new DifferentialEvolution(mutationStrategy,
                                                                                    crossoverStrategy,
                                                                                    selectionStrategy,
                                                                                    selectionStrategy,
                                                                                    fitnessEvaluationStrategy,
                                                                                    new Configuration());

            differentialEvolution.Run();

            Assert.IsTrue(differentialEvolution.population.Count > 0);
        }
        public void GivenFiveIterationsAndThreeIndividuals_WhenTheAlgorithmIsRun_ItShouldCallTheCrossoverStrategyFifteenTimes()
        {
            Mock <IFitnessEvaluationStrategy> fitnessEvaluationMock     = new Mock <IFitnessEvaluationStrategy>();
            IFitnessEvaluationStrategy        fitnessEvaluationStrategy = fitnessEvaluationMock.Object;

            Mock <ICrossoverStrategy> crossoverMock = new Mock <ICrossoverStrategy>();

            crossoverMock.Setup(x => x.Cross(It.IsAny <Individual>(), It.IsAny <Individual>()))
            .Returns(new Individual(fitnessEvaluationStrategy, new Configuration()));
            ICrossoverStrategy crossoverStrategy = crossoverMock.Object;

            Mock <IMutationStrategy> mutationMock     = new Mock <IMutationStrategy>();
            IMutationStrategy        mutationStrategy = mutationMock.Object;

            Mock <ISelectionStrategy> selectionMock = new Mock <ISelectionStrategy>();

            selectionMock.Setup(x => x.Select(It.IsAny <List <Individual> >()))
            .Returns(new Individual(fitnessEvaluationStrategy, new Configuration()));
            ISelectionStrategy selectionStrategy = selectionMock.Object;


            DifferentialEvolution differentialEvolution = new DifferentialEvolution(mutationStrategy,
                                                                                    crossoverStrategy,
                                                                                    selectionStrategy,
                                                                                    selectionStrategy,
                                                                                    fitnessEvaluationStrategy,
                                                                                    new Configuration());

            differentialEvolution.Run();

            crossoverMock.Verify(c => c.Cross(It.IsAny <Individual>(), It.IsAny <Individual>()), Times.Exactly(15));
        }
        /// <inheritdoc />
        protected override void InitializeContinuousOptimizer(
            Population basePopulation,
            IncumbentGenomeWrapper <TResult> currentIncumbent)
        {
            if (basePopulation == null)
            {
                throw new ArgumentNullException(nameof(basePopulation));
            }

            if (!basePopulation.GetCompetitiveIndividuals().Any())
            {
                throw new ArgumentOutOfRangeException(
                          nameof(basePopulation),
                          "Population must have competitive individuals.");
            }

            // Continue the parameter adaptation where we left off before, but re-initialize everything else.
            // If the adaptation was restarted every time, we would need quite long phases to actually see the
            // adaptation happening.
            this._differentialEvolutionRunner = this.CreateDifferentialEvolutionRunner(
                meanMutationFactor: this._differentialEvolutionRunner.MeanMutationFactor,
                meanCrossoverRate: this._differentialEvolutionRunner.MeanCrossoverRate);

            var initialPositions = this._informationFlow
                                   .DetermineInitialPoints(basePopulation, currentIncumbent?.IncumbentGenome)
                                   .ToList();

            this._differentialEvolutionRunner.Initialize(
                initialPositions,
                this._strategyConfiguration.MaximumNumberGenerations);

            LoggingHelper.WriteLine(
                VerbosityLevel.Debug,
                $"Tuning {initialPositions.First().Values.Count} continuous parameters.");
        }
Beispiel #5
0
        static void Main(string[] args)
        {
            IConfiguration             configuration = new Configuration();
            IMutationStrategy          trialVectorMutationStrategy       = new TrialIndividualMutationStrategy(configuration);
            ICrossoverStrategy         crossoverStrategy                 = new BinomialCrossoverStrategy(configuration);
            ISelectionStrategy         generationSelectionStrategy       = new MinimisationElitistSelectionStrategy();
            ISelectionStrategy         differenceVectorSelectionStrategy = new RandomSelectionStrategy();
            IFitnessEvaluationStrategy fitnessEvaluationStrategy         = new RastriginFitnessEvaluationStrategy();

            DifferentialEvolution differentialEvolution = new DifferentialEvolution(
                trialVectorMutationStrategy,
                crossoverStrategy,
                generationSelectionStrategy,
                differenceVectorSelectionStrategy,
                fitnessEvaluationStrategy,
                configuration
                );

            differentialEvolution.Run();

            var population = differentialEvolution.population;

            foreach (Individual individual in population)
            {
                foreach (double dimension in individual.Position)
                {
                    Console.Write(Math.Round(dimension) + ", ");
                }

                Console.WriteLine();
            }

            Console.Read();
        }
        public void GivenAPopulationOfOne_WhenANewPopulationIsRetrieved_ItShouldCallTheEvaluateMethodWithTheIndividualAsAParameter()
        {
            Mock <IFitnessEvaluationStrategy> fitnessEvaluationMock     = new Mock <IFitnessEvaluationStrategy>();
            IFitnessEvaluationStrategy        fitnessEvaluationStrategy = fitnessEvaluationMock.Object;

            Mock <ICrossoverStrategy> crossoverMock = new Mock <ICrossoverStrategy>();

            crossoverMock.Setup(x => x.Cross(It.IsAny <Individual>(), It.IsAny <Individual>()))
            .Returns(new Individual(fitnessEvaluationStrategy, new Configuration()));
            ICrossoverStrategy crossoverStrategy = crossoverMock.Object;

            Mock <IMutationStrategy> mutationMock     = new Mock <IMutationStrategy>();
            IMutationStrategy        mutationStrategy = mutationMock.Object;

            Mock <ISelectionStrategy> selectionMock     = new Mock <ISelectionStrategy>();
            ISelectionStrategy        selectionStrategy = selectionMock.Object;

            DifferentialEvolution differentialEvolution = new DifferentialEvolution(mutationStrategy,
                                                                                    crossoverStrategy,
                                                                                    selectionStrategy,
                                                                                    selectionStrategy,
                                                                                    fitnessEvaluationStrategy,
                                                                                    new Configuration());

            Individual individual = new Individual(fitnessEvaluationStrategy, new Configuration());

            differentialEvolution.population = new List <Individual>
            {
                individual
            };

            differentialEvolution.GetNewPopulation();

            fitnessEvaluationMock.Verify(c => c.GetFitnessForIndividual(It.Is <Individual>(p => p == individual)));
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="DifferentialEvolutionStrategy{TInstance, TResult}"/> class.
        /// </summary>
        /// <param name="configuration">Options used for this instance.</param>
        /// <param name="parameterTree">Provides the tunable parameters.</param>
        /// <param name="genomeBuilder">Responsible for creation, modification and crossover of genomes.
        /// Needs to be compatible with the given parameter tree and configuration.</param>
        /// <param name="genomeSorter">
        /// An <see cref="IActorRef" /> to a <see cref="GenomeSorter{TInstance,TResult}" />.
        /// </param>
        /// <param name="targetRunResultStorage">
        /// An <see cref="IActorRef" /> to a <see cref="ResultStorageActor{TInstance,TResult}" />
        /// which knows about all executed target algorithm runs and their results.
        /// </param>
        public DifferentialEvolutionStrategy(
            AlgorithmTunerConfiguration configuration,
            ParameterTree parameterTree,
            GenomeBuilder genomeBuilder,
            IActorRef genomeSorter,
            IActorRef targetRunResultStorage)
            : base(configuration, parameterTree, targetRunResultStorage, new GenomeSearchPointSorter <TInstance>(genomeSorter))
        {
            this._strategyConfiguration =
                this.Configuration.ExtractDetailedConfiguration <DifferentialEvolutionStrategyConfiguration>(
                    DifferentialEvolutionStrategyArgumentParser.Identifier);

            if (this._strategyConfiguration.FocusOnIncumbent)
            {
                this._informationFlow = new LocalDifferentialEvolutionInformationFlow(
                    this._strategyConfiguration,
                    parameterTree,
                    genomeBuilder);
            }
            else
            {
                this._informationFlow = new GlobalDifferentialEvolutionInformationFlow(
                    this._strategyConfiguration,
                    parameterTree,
                    genomeBuilder);
            }

            this._searchPointFactory = (vector, parent) => new GenomeSearchPoint(vector, parent, genomeBuilder);

            this._differentialEvolutionRunner = this.CreateDifferentialEvolutionRunner(
                this._strategyConfiguration.DifferentialEvolutionConfiguration.InitialMeanMutationFactor,
                this._strategyConfiguration.DifferentialEvolutionConfiguration.InitialMeanCrossoverRate);
        }
        public string Resolve(double [] coeffs, int degree)
        {
            TextToReturn = "";
            Polynom polynom           = ReadPolynom(coeffs, degree);
            int     numberOfRoots     = polynom.GetDegree();
            DifferentialEvolution alg = new DifferentialEvolution();

            for (int i = 0; i < numberOfRoots; ++i)
            {
                alg.SetEquation(polynom);

                double[] result = alg.ExecuteDifferential();

                Console.WriteLine("Solutia {0} : {1} + i*{2}", i, Math.Round(result[0], 4), Math.Round(result[1], 4));
                TextToReturn += string.Format("Solutia {0} : {1} + i*{2}\r\n", i, Math.Round(result[0], 4), Math.Round(result[1], 4));
                if (i < numberOfRoots - 1)
                {
                    polynom = polynom.SimplifyEquation(
                        new Complex(Math.Round(result[0], 5), Math.Round(result[1], 5))
                        );
                }
            }

            return(TextToReturn);
        }
        public void GivenADifferentialEvolutionAlgorithm_WhenThePopulationIsInitialisedWithAPopulationSizeOfTen_ItShouldReturnAPopulationOfTenIndividuals()
        {
            DifferentialEvolution differentialEvolution = new DifferentialEvolution(null, null, null, null, null, new Configuration());

            List <Individual> population = differentialEvolution.InitialisePopulation(10);

            Assert.AreEqual(10, population.Count);
        }
Beispiel #10
0
        public void ShouldRun()
        {
            var engine = new DifferentialEvolution(2, 10, new double[] { 10, 10 }, new double[] { -10, -10 }, (double[] d) => { return(-Math.Abs((d[0] + d[1]) - 5)); }, (double f) => { return(f == 0); });

            engine.RunUntilTargetReached();

            Assert.True(engine.BestFitness == 0);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="DifferentialEvolutionTest"/> class.
        /// </summary>
        public DifferentialEvolutionTest()
        {
            this._configuration = new DifferentialEvolutionConfiguration.DifferentialEvolutionConfigurationBuilder()
                                  .SetBestPercentage(0.2)
                                  .SetInitialMeanMutationFactor(0.5)
                                  .SetInitialMeanCrossoverRate(0.5)
                                  .SetLearningRate(0.1)
                                  .BuildWithFallback(null);
            this._runner =
                new DifferentialEvolution <SearchPoint>(this._sorter, this._searchPointFactory, this._configuration);

            Randomizer.Configure(0);
        }
        public void GivenAPopulationOfTwo_WhenANewPopulationIsRetrieved_ItShouldReturnTheExpectedPopulationOfTwo()
        {
            Mock <IFitnessEvaluationStrategy> fitnessEvaluationMock     = new Mock <IFitnessEvaluationStrategy>();
            IFitnessEvaluationStrategy        fitnessEvaluationStrategy = fitnessEvaluationMock.Object;

            Individual individual1 = new Individual(fitnessEvaluationStrategy, new Configuration());
            Individual child1      = new Individual(fitnessEvaluationStrategy, new Configuration());
            Individual individual2 = new Individual(fitnessEvaluationStrategy, new Configuration());
            Individual child2      = new Individual(fitnessEvaluationStrategy, new Configuration());

            Mock <ICrossoverStrategy> crossoverMock = new Mock <ICrossoverStrategy>();

            crossoverMock.Setup(x => x.Cross(It.IsAny <Individual>(), It.IsAny <Individual>()))
            .Returns(new Individual(fitnessEvaluationStrategy, new Configuration()));
            ICrossoverStrategy crossoverStrategy = crossoverMock.Object;

            Mock <IMutationStrategy> mutationMock     = new Mock <IMutationStrategy>();
            IMutationStrategy        mutationStrategy = mutationMock.Object;

            Mock <ISelectionStrategy> selectionMock = new Mock <ISelectionStrategy>();

            selectionMock.SetupSequence(x => x.Select(It.IsAny <List <Individual> >())).Returns(child1)
            .Returns(individual2);
            ISelectionStrategy selectionStrategy = selectionMock.Object;

            Mock <ISelectionStrategy> otherSelectionMock     = new Mock <ISelectionStrategy>();
            ISelectionStrategy        otherSelectionStrategy = otherSelectionMock.Object;

            DifferentialEvolution differentialEvolution = new DifferentialEvolution(mutationStrategy,
                                                                                    crossoverStrategy,
                                                                                    selectionStrategy,
                                                                                    otherSelectionStrategy,
                                                                                    fitnessEvaluationStrategy,
                                                                                    new Configuration());



            differentialEvolution.population = new List <Individual>
            {
                individual1, individual2
            };

            List <Individual> newPopulation = differentialEvolution.GetNewPopulation();

            Assert.AreEqual(2, newPopulation.Count);
            Assert.IsTrue(newPopulation.Contains(child1));
            Assert.IsTrue(newPopulation.Contains(individual2));
            Assert.IsFalse(newPopulation.Contains(child2));
            Assert.IsFalse(newPopulation.Contains(individual1));
        }
        public static void RunMain(string[] args)
        {
            CostFunction_RosenbrockSaddle f = new CostFunction_RosenbrockSaddle();

            int maxIterations       = 200;
            DifferentialEvolution s = new DifferentialEvolution(f);

            s.SolutionUpdated += (best_solution, step) =>
            {
                Console.WriteLine("Step {0}: Fitness = {1}", step, best_solution.Cost);
            };

            ContinuousSolution finalSolution = s.Minimize(f, maxIterations);
        }
        public void GivenAPopulationOfFour_WhenANewPopulationIsRetrieved_ItShouldCallTheMutationStrategyWithThreeDifferentIndividuals()
        {
            Mock <IFitnessEvaluationStrategy> fitnessEvaluationMock     = new Mock <IFitnessEvaluationStrategy>();
            IFitnessEvaluationStrategy        fitnessEvaluationStrategy = fitnessEvaluationMock.Object;

            Mock <ICrossoverStrategy> crossoverMock = new Mock <ICrossoverStrategy>();

            crossoverMock.Setup(x => x.Cross(It.IsAny <Individual>(), It.IsAny <Individual>()))
            .Returns(new Individual(fitnessEvaluationStrategy, new Configuration()));
            ICrossoverStrategy crossoverStrategy = crossoverMock.Object;

            Mock <IMutationStrategy> mutationMock     = new Mock <IMutationStrategy>();
            IMutationStrategy        mutationStrategy = mutationMock.Object;

            Individual individual  = new Individual(fitnessEvaluationStrategy, new Configuration());
            Individual target      = new Individual(fitnessEvaluationStrategy, new Configuration());
            Individual difference1 = new Individual(fitnessEvaluationStrategy, new Configuration());
            Individual difference2 = new Individual(fitnessEvaluationStrategy, new Configuration());

            Mock <ISelectionStrategy> selectionMock = new Mock <ISelectionStrategy>();

            selectionMock.SetupSequence(x => x.Select(It.IsAny <List <Individual> >())).Returns(target)
            .Returns(difference1)
            .Returns(difference2);
            ISelectionStrategy selectionStrategy = selectionMock.Object;

            DifferentialEvolution differentialEvolution = new DifferentialEvolution(mutationStrategy,
                                                                                    crossoverStrategy,
                                                                                    selectionStrategy,
                                                                                    selectionStrategy,
                                                                                    fitnessEvaluationStrategy,
                                                                                    new Configuration());


            differentialEvolution.population = new List <Individual>
            {
                individual, target, difference1, difference2
            };

            differentialEvolution.GetNewPopulation();

            mutationMock.Verify(c => c.GetTrialVector(target, new List <Individual>()
            {
                difference1, difference2
            }), Times.Once());
        }
        public void GivenAPopulationOfOne_WhenANewPopulationIsRetrieved_ItShouldCallTheSelectionStrategyWithTheIndividualAndTheChild()
        {
            Mock <IFitnessEvaluationStrategy> fitnessEvaluationMock     = new Mock <IFitnessEvaluationStrategy>();
            IFitnessEvaluationStrategy        fitnessEvaluationStrategy = fitnessEvaluationMock.Object;

            Individual individual = new Individual(fitnessEvaluationStrategy, new Configuration());
            Individual child      = new Individual(fitnessEvaluationStrategy, new Configuration());

            Mock <ICrossoverStrategy> crossoverMock = new Mock <ICrossoverStrategy>();

            crossoverMock.Setup(x => x.Cross(It.IsAny <Individual>(), It.IsAny <Individual>())).Returns(child);
            ICrossoverStrategy crossoverStrategy = crossoverMock.Object;

            Mock <IMutationStrategy> mutationMock     = new Mock <IMutationStrategy>();
            IMutationStrategy        mutationStrategy = mutationMock.Object;

            List <Individual>         receivedIndividuals = new List <Individual>();
            Mock <ISelectionStrategy> selectionMock       = new Mock <ISelectionStrategy>();

            selectionMock.Setup(x => x.Select(It.IsAny <List <Individual> >())).Callback((List <Individual> individualList) =>
                                                                                         receivedIndividuals = individualList
                                                                                         );
            ISelectionStrategy selectionStrategy = selectionMock.Object;

            DifferentialEvolution differentialEvolution = new DifferentialEvolution(mutationStrategy,
                                                                                    crossoverStrategy,
                                                                                    selectionStrategy,
                                                                                    selectionStrategy,
                                                                                    fitnessEvaluationStrategy,
                                                                                    new Configuration());



            differentialEvolution.population = new List <Individual>
            {
                individual
            };

            differentialEvolution.GetNewPopulation();

            Assert.AreEqual(2, receivedIndividuals.Count);
            Assert.IsTrue(receivedIndividuals.Contains(individual));
            Assert.IsTrue(receivedIndividuals.Contains(child));
        }
        public void GivenAPopulationOfThreeAndAnInvalidIndividual_WhenTheGettingTheDifferenceIndividual_ItShouldCallTheSelectionStrategyWithAPopulationExcludingTheInvalidIndividual()
        {
            Individual individual1 = new Individual(null, new Configuration())
            {
                Position = new double[] { 1.0, 2.0, 3.0 }
            };

            Individual individual2 = new Individual(null, new Configuration())
            {
                Position = new double[] { 2.0, 3.0, 4.0 }
            };

            Individual individual3 = new Individual(null, new Configuration())
            {
                Position = new double[] { 5.0, 6.0, 7.0 }
            };

            List <Individual> population = new List <Individual>
            {
                individual1, individual2, individual3
            };

            List <Individual> invalidIndividuals = new List <Individual>
            {
                individual2
            };

            List <Individual> resultingPopulation = new List <Individual>();

            Mock <ISelectionStrategy> mock = new Mock <ISelectionStrategy>();

            mock.Setup(c => c.Select(It.IsAny <List <Individual> >()))
            .Callback((List <Individual> validPopulation) => resultingPopulation = validPopulation);

            DifferentialEvolution differentialEvolution = new DifferentialEvolution(null, null, null,
                                                                                    mock.Object, null, new Configuration());

            differentialEvolution.SelectDifferenceIndividual(population, invalidIndividuals);

            Assert.AreEqual(2, resultingPopulation.Count);
            Assert.IsFalse(resultingPopulation.Contains(individual2));
            Assert.IsTrue(resultingPopulation.Contains(individual1));
            Assert.IsTrue(resultingPopulation.Contains(individual3));
        }
        public void GivenAPopulationOfOne_WhenANewPopulationIsRetrieved_ItShouldCallTheCrossoverStrategyWithTheIndividualAndTheTrialIndividual()
        {
            Mock <IFitnessEvaluationStrategy> fitnessEvaluationMock     = new Mock <IFitnessEvaluationStrategy>();
            IFitnessEvaluationStrategy        fitnessEvaluationStrategy = fitnessEvaluationMock.Object;

            Mock <ICrossoverStrategy> crossoverMock = new Mock <ICrossoverStrategy>();

            crossoverMock.Setup(x => x.Cross(It.IsAny <Individual>(), It.IsAny <Individual>()))
            .Returns(new Individual(fitnessEvaluationStrategy, new Configuration()));
            ICrossoverStrategy crossoverStrategy = crossoverMock.Object;

            Individual individual = new Individual(fitnessEvaluationStrategy, new Configuration());
            Individual mutant     = new Individual(fitnessEvaluationStrategy, new Configuration());

            Mock <IMutationStrategy> mutationMock = new Mock <IMutationStrategy>();

            mutationMock.Setup(x => x.GetTrialVector(It.IsAny <Individual>(), It.IsAny <List <Individual> >()))
            .Returns(mutant);
            IMutationStrategy mutationStrategy = mutationMock.Object;

            Mock <ISelectionStrategy> selectionMock     = new Mock <ISelectionStrategy>();
            ISelectionStrategy        selectionStrategy = selectionMock.Object;

            DifferentialEvolution differentialEvolution = new DifferentialEvolution(mutationStrategy,
                                                                                    crossoverStrategy,
                                                                                    selectionStrategy,
                                                                                    selectionStrategy,
                                                                                    fitnessEvaluationStrategy,
                                                                                    new Configuration());



            differentialEvolution.population = new List <Individual>
            {
                individual
            };

            differentialEvolution.GetNewPopulation();

            crossoverMock.Verify(c => c.Cross(individual, mutant), Times.Once());
        }
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(DifferentialEvolution obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }
Beispiel #19
0
        public void testDifferentialEvolution()
        {
            //BOOST_TEST_MESSAGE("Testing differential evolution...");

            /* Note:
             *
             * The "ModFourthDeJong" doesn't have a well defined optimum because
             * of its noisy part. It just has to be <= 15 in our example.
             * The concrete value might differ for a different input and
             * different random numbers.
             *
             * The "Griewangk" function is an example where the adaptive
             * version of DifferentialEvolution turns out to be more successful.
             */

            DifferentialEvolution.Configuration conf =
                new DifferentialEvolution.Configuration()
                .withStepsizeWeight(0.4)
                .withBounds()
                .withCrossoverProbability(0.35)
                .withPopulationMembers(500)
                .withStrategy(DifferentialEvolution.Strategy.BestMemberWithJitter)
                .withCrossoverType(DifferentialEvolution.CrossoverType.Normal)
                .withAdaptiveCrossover()
                .withSeed(3242);

            DifferentialEvolution.Configuration conf2 =
                new DifferentialEvolution.Configuration()
                .withStepsizeWeight(1.8)
                .withBounds()
                .withCrossoverProbability(0.9)
                .withPopulationMembers(1000)
                .withStrategy(DifferentialEvolution.Strategy.Rand1SelfadaptiveWithRotation)
                .withCrossoverType(DifferentialEvolution.CrossoverType.Normal)
                .withAdaptiveCrossover()
                .withSeed(3242);
            DifferentialEvolution deOptim2 = new DifferentialEvolution(conf2);

            List <DifferentialEvolution> diffEvolOptimisers = new List <DifferentialEvolution>();

            diffEvolOptimisers.Add(new DifferentialEvolution(conf));
            diffEvolOptimisers.Add(new DifferentialEvolution(conf));
            diffEvolOptimisers.Add(new DifferentialEvolution(conf));
            diffEvolOptimisers.Add(new DifferentialEvolution(conf));
            diffEvolOptimisers.Add(deOptim2);

            List <CostFunction> costFunctions = new List <CostFunction>();

            costFunctions.Add(new FirstDeJong());
            costFunctions.Add(new SecondDeJong());
            costFunctions.Add(new ModThirdDeJong());
            costFunctions.Add(new ModFourthDeJong());
            costFunctions.Add(new Griewangk());

            List <BoundaryConstraint> constraints = new List <BoundaryConstraint>();

            constraints.Add(new BoundaryConstraint(-10.0, 10.0));
            constraints.Add(new BoundaryConstraint(-10.0, 10.0));
            constraints.Add(new BoundaryConstraint(-10.0, 10.0));
            constraints.Add(new BoundaryConstraint(-10.0, 10.0));
            constraints.Add(new BoundaryConstraint(-600.0, 600.0));

            List <Vector> initialValues = new List <Vector>();

            initialValues.Add(new Vector(3, 5.0));
            initialValues.Add(new Vector(2, 5.0));
            initialValues.Add(new Vector(5, 5.0));
            initialValues.Add(new Vector(30, 5.0));
            initialValues.Add(new Vector(10, 100.0));

            List <EndCriteria> endCriteria = new List <EndCriteria>();

            endCriteria.Add(new EndCriteria(100, 10, 1e-10, 1e-8, null));
            endCriteria.Add(new EndCriteria(100, 10, 1e-10, 1e-8, null));
            endCriteria.Add(new EndCriteria(100, 10, 1e-10, 1e-8, null));
            endCriteria.Add(new EndCriteria(500, 100, 1e-10, 1e-8, null));
            endCriteria.Add(new EndCriteria(1000, 800, 1e-12, 1e-10, null));

            List <double> minima = new List <double>();

            minima.Add(0.0);
            minima.Add(0.0);
            minima.Add(0.0);
            minima.Add(10.9639796558);
            minima.Add(0.0);

            for (int i = 0; i < costFunctions.Count; ++i)
            {
                Problem problem = new Problem(costFunctions[i], constraints[i], initialValues[i]);
                diffEvolOptimisers[i].minimize(problem, endCriteria[i]);

                if (i != 3)
                {
                    // stable
                    if (Math.Abs(problem.functionValue() - minima[i]) > 1e-8)
                    {
                        QAssert.Fail("costFunction # " + i
                                     + "\ncalculated: " + problem.functionValue()
                                     + "\nexpected:   " + minima[i]);
                    }
                }
                else
                {
                    // this case is unstable due to randomness; we're good as
                    // long as the result is below 15
                    if (problem.functionValue() > 15)
                    {
                        QAssert.Fail("costFunction # " + i
                                     + "\ncalculated: " + problem.functionValue()
                                     + "\nexpected:   " + "less than 15");
                    }
                }
            }
        }