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); }
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); }
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); }
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()); }
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); } }
public void SmacOptimizer_ArgumentCheck_RandomSearchPointCount() { var sut = new SmacOptimizer(new[] { new GridParameterSpec(0, 1, 2) }, 10, 20, 30, 40, 0); }
public void SmacOptimizer_ArgumentCheck_FunctionEvaluationsPerIterationCount() { var sut = new SmacOptimizer(new[] { new GridParameterSpec(0, 1, 2) }, 10, 20, 0); }
public void SmacOptimizer_ArgumentCheck_Iterations() { var sut = new SmacOptimizer(new[] { new GridParameterSpec(0, 1, 2) }, 0); }
public void SmacOptimizer_ArgumentCheck_ParameterRanges() { var sut = new SmacOptimizer(null, 20); }