コード例 #1
0
        public void SmacOptimizer_Optimize()
        {
            var parameters = new MinMaxParameterSpec[]
            {
                new MinMaxParameterSpec(0.0, 100.0, Transform.Linear)
            };

            var sut = new SmacOptimizer(parameters,
                                        iterations: 80,
                                        randomStartingPointCount: 20,
                                        functionEvaluationsPerIterationCount: 1,
                                        localSearchPointCount: 10,
                                        randomSearchPointCount: 1000,
                                        epsilon: 0.00001,
                                        seed: 42);

            var actual = sut.Optimize(MinimizeWeightFromHeight);

            var expected = new OptimizerResult[]
            {
                new OptimizerResult(new double[] { 90.513222660177 }, 114559.431919558),
                new OptimizerResult(new double[] { 41.8333740634068 }, 806.274612132759),
            };

            Assert.AreEqual(expected.First().Error, actual.First().Error, Delta);
            Assert.AreEqual(expected.First().ParameterSet.First(), actual.First().ParameterSet.First(), Delta);

            Assert.AreEqual(expected.Last().Error, actual.Last().Error, Delta);
            Assert.AreEqual(expected.Last().ParameterSet.First(), actual.Last().ParameterSet.First(), Delta);
        }
コード例 #2
0
        public void SmacOptimizer_OptimizeBest_MultipleParameters()
        {
            var parameters = new MinMaxParameterSpec[]
            {
                new MinMaxParameterSpec(-10.0, 10.0, Transform.Linear),
                new MinMaxParameterSpec(-10.0, 10.0, Transform.Linear),
                new MinMaxParameterSpec(-10.0, 10.0, Transform.Linear),
            };

            var sut = new SmacOptimizer(parameters,
                                        iterations: 80,
                                        randomStartingPointCount: 20,
                                        functionEvaluationsPerIterationCount: 1,
                                        localSearchPointCount: 10,
                                        randomSearchPointCount: 1000,
                                        epsilon: 0.00001,
                                        seed: 42);

            var actual = sut.OptimizeBest(Minimize);

            Assert.AreEqual(-0.964878416222769, actual.Error, Delta);
            Assert.AreEqual(actual.ParameterSet.Length, 3);

            Assert.AreEqual(-7.8487638560350819, actual.ParameterSet[0], Delta);
            Assert.AreEqual(6.2840940040927826, actual.ParameterSet[1], Delta);
            Assert.AreEqual(0.036385473812179825, actual.ParameterSet[2], Delta);
        }
コード例 #3
0
        public void SmacOptimizer_OptimizeBest_SingleParameter()
        {
            var parameters = new MinMaxParameterSpec[]
            {
                new MinMaxParameterSpec(0.0, 100.0, Transform.Linear)
            };

            var sut = new SmacOptimizer(parameters,
                                        iterations: 80,
                                        randomStartingPointCount: 20,
                                        functionEvaluationsPerIterationCount: 1,
                                        localSearchPointCount: 10,
                                        randomSearchPointCount: 1000,
                                        epsilon: 0.00001,
                                        seed: 42);

            var actual = sut.OptimizeBest(MinimizeWeightFromHeight);

            Assert.AreEqual(109.616853578648, actual.Error, Delta);
            Assert.AreEqual(37.6315924979893, actual.ParameterSet.Single(), Delta);
        }
コード例 #4
0
        OptimizerResult RunOpenLoopOptimizationTest(List <OptimizerResult> results)
        {
            var parameters = new MinMaxParameterSpec[]
            {
                new MinMaxParameterSpec(-10.0, 10.0, Transform.Linear),
                new MinMaxParameterSpec(-10.0, 10.0, Transform.Linear),
                new MinMaxParameterSpec(-10.0, 10.0, Transform.Linear),
            };

            var iterations = 80;
            var randomStartingPointsCount            = 20;
            var functionEvaluationsPerIterationCount = 1;

            var sut = new SmacOptimizer(parameters,
                                        iterations: iterations,
                                        randomStartingPointCount: randomStartingPointsCount,
                                        functionEvaluationsPerIterationCount: functionEvaluationsPerIterationCount,
                                        localSearchPointCount: 10,
                                        randomSearchPointCount: 1000,
                                        epsilon: 0.00001,
                                        seed: 42);

            // Using SmacOptimizer in an open loop.
            var initialParameterSets  = sut.ProposeParameterSets(randomStartingPointsCount, results);
            var initializationResults = sut.RunParameterSets(Minimize, initialParameterSets);

            results.AddRange(initializationResults);

            for (int i = 0; i < iterations; i++)
            {
                var parameterSets    = sut.ProposeParameterSets(functionEvaluationsPerIterationCount, results);
                var iterationResults = sut.RunParameterSets(Minimize, parameterSets);
                results.AddRange(iterationResults);
            }

            return(results.Where(v => !double.IsNaN(v.Error)).OrderBy(r => r.Error).First());
        }
コード例 #5
0
        public override double Evaluate(IChromosome chromosome)
        {
            try
            {
                var parameters = Config.Genes.Select(s =>
                                                     new MinMaxParameterSpec(min: (double)(s.MinDecimal ?? s.MinInt.Value), max: (double)(s.MaxDecimal ?? s.MaxInt.Value),
                                                                             transform: Transform.Linear, parameterType: s.Precision > 0 ? ParameterType.Continuous : ParameterType.Discrete)
                                                     ).ToArray();


                IOptimizer optimizer = null;
                if (Config.Fitness != null)
                {
                    if (Config.Fitness.OptimizerTypeName == Enums.OptimizerTypeOptions.RandomSearch.ToString())
                    {
                        optimizer = new RandomSearchOptimizer(parameters, iterations: Config.Generations, seed: 42, maxDegreeOfParallelism: Config.MaxThreads);
                    }
                    else if (Config.Fitness.OptimizerTypeName == Enums.OptimizerTypeOptions.ParticleSwarm.ToString())
                    {
                        optimizer = new ParticleSwarmOptimizer(parameters, maxIterations: Config.Generations, numberOfParticles: Config.PopulationSize,
                                                               seed: 42, maxDegreeOfParallelism: Config.MaxThreads);
                    }
                    else if (Config.Fitness.OptimizerTypeName == Enums.OptimizerTypeOptions.Bayesian.ToString())
                    {
                        optimizer = new BayesianOptimizer(parameters: parameters, iterations: Config.Generations, randomStartingPointCount: Config.PopulationSize,
                                                          functionEvaluationsPerIterationCount: Config.PopulationSize, seed: 42);
                        //optimizer = new BayesianOptimizer(parameters, iterations: Config.Generations, randomStartingPointCount: Config.PopulationSize,
                        //    functionEvaluationsPerIteration: Config.MaxThreads, seed: 42, maxDegreeOfParallelism: Config.MaxThreads, allowMultipleEvaluations: true);
                    }
                    else if (Config.Fitness.OptimizerTypeName == Enums.OptimizerTypeOptions.GlobalizedBoundedNelderMead.ToString())
                    {
                        optimizer = new GlobalizedBoundedNelderMeadOptimizer(parameters, maxRestarts: Config.Generations,
                                                                             maxIterationsPrRestart: Config.PopulationSize, seed: 42, maxDegreeOfParallelism: Config.MaxThreads);
                    }
                    else if (Config.Fitness.OptimizerTypeName == Enums.OptimizerTypeOptions.Smac.ToString())
                    {
                        optimizer = new SmacOptimizer(parameters, iterations: Config.Generations, randomSearchPointCount: Config.PopulationSize, seed: 42);
                    }
                    else if (Config.Fitness.OptimizerTypeName == Enums.OptimizerTypeOptions.GridSearch.ToString())
                    {
                        optimizer = new GridSearchOptimizer(parameters);
                    }
                    else if (Config.Fitness.OptimizerTypeName == Enums.OptimizerTypeOptions.Genetic.ToString())
                    {
                        throw new Exception("Genetic optimizer cannot be used with Sharpe Maximizer");
                    }
                }

                Func <double[], OptimizerResult> minimize = p => Minimize(p, (Chromosome)chromosome);

                // run optimizer
                _hasActualValues = true;
                var result = optimizer.OptimizeBest(minimize);

                Best = ToChromosome(result, chromosome);

                return(result.Error);
            }
            catch (Exception ex)
            {
                LogProvider.ErrorLogger.Error(ex);
                return(ErrorFitness);
            }
        }
コード例 #6
0
 public void SmacOptimizer_ArgumentCheck_RandomSearchPointCount()
 {
     var sut = new SmacOptimizer(new[] { new GridParameterSpec(0, 1, 2) },
                                 10, 20, 30, 40, 0);
 }
コード例 #7
0
 public void SmacOptimizer_ArgumentCheck_FunctionEvaluationsPerIterationCount()
 {
     var sut = new SmacOptimizer(new[] { new GridParameterSpec(0, 1, 2) },
                                 10, 20, 0);
 }
コード例 #8
0
 public void SmacOptimizer_ArgumentCheck_Iterations()
 {
     var sut = new SmacOptimizer(new[] { new GridParameterSpec(0, 1, 2) },
                                 0);
 }
コード例 #9
0
 public void SmacOptimizer_ArgumentCheck_ParameterRanges()
 {
     var sut = new SmacOptimizer(null, 20);
 }