private AlpsGeneticAlgorithm CreateAlpsGaSymRegSample() { AlpsGeneticAlgorithm alpsGa = new AlpsGeneticAlgorithm(); #region Problem Configuration var provider = new VladislavlevaInstanceProvider(); var instance = provider.GetDataDescriptors().Single(x => x.Name.StartsWith("Vladislavleva-5 F5")); var symbRegProblem = new SymbolicRegressionSingleObjectiveProblem(); symbRegProblem.Load(provider.LoadData(instance)); symbRegProblem.MaximumSymbolicExpressionTreeDepth.Value = 35; symbRegProblem.MaximumSymbolicExpressionTreeLength.Value = 35; var grammar = (TypeCoherentExpressionGrammar)symbRegProblem.SymbolicExpressionTreeGrammar; grammar.Symbols.OfType <Exponential>().Single().Enabled = false; grammar.Symbols.OfType <Logarithm>().Single().Enabled = false; #endregion #region Algorithm Configuration alpsGa.Name = "ALPS Genetic Programming - Symbolic Regression"; alpsGa.Description = "An ALPS-GP to solve a symbolic regression problem (Vladislavleva-5 dataset)"; alpsGa.Problem = symbRegProblem; SamplesUtils.ConfigureAlpsGeneticAlgorithmParameters <GeneralizedRankSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(alpsGa, numberOfLayers: 1000, popSize: 100, mutationRate: 0.25, elites: 1, plusSelection: false, agingScheme: AgingScheme.Polynomial, ageGap: 15, ageInheritance: 1.0, maxGens: 500); #endregion return(alpsGa); }
public void SymbolicDataAnalysisExpressionContextAwareCrossoverPerformanceTest() { var problem = new SymbolicRegressionSingleObjectiveProblem(); var crossover = problem.OperatorsParameter.Value.OfType <SymbolicDataAnalysisExpressionContextAwareCrossover <IRegressionProblemData> >().First(); SymbolicDataAnalysisCrossoverPerformanceTest(crossover); }
private static void SymbolicDataAnalysisCrossoverPerformanceTest(ISymbolicDataAnalysisExpressionCrossover <IRegressionProblemData> crossover) { var twister = new MersenneTwister(31415); var dataset = Util.CreateRandomDataset(twister, Rows, Columns); var grammar = new FullFunctionalExpressionGrammar(); var stopwatch = new Stopwatch(); grammar.MaximumFunctionArguments = 0; grammar.MaximumFunctionDefinitions = 0; grammar.MinimumFunctionArguments = 0; grammar.MinimumFunctionDefinitions = 0; var trees = Util.CreateRandomTrees(twister, dataset, grammar, PopulationSize, 1, MaxTreeLength, 0, 0); foreach (ISymbolicExpressionTree tree in trees) { Util.InitTree(tree, twister, new List <string>(dataset.VariableNames)); } var problemData = new RegressionProblemData(dataset, dataset.VariableNames, dataset.VariableNames.Last()); var problem = new SymbolicRegressionSingleObjectiveProblem(); problem.ProblemData = problemData; var globalScope = new Scope("Global Scope"); globalScope.Variables.Add(new Core.Variable("Random", twister)); var context = new ExecutionContext(null, problem, globalScope); context = new ExecutionContext(context, crossover, globalScope); stopwatch.Start(); for (int i = 0; i != PopulationSize; ++i) { var parent0 = (ISymbolicExpressionTree)trees.SampleRandom(twister).Clone(); var scopeParent0 = new Scope(); scopeParent0.Variables.Add(new Core.Variable(crossover.ParentsParameter.ActualName, parent0)); context.Scope.SubScopes.Add(scopeParent0); var parent1 = (ISymbolicExpressionTree)trees.SampleRandom(twister).Clone(); var scopeParent1 = new Scope(); scopeParent1.Variables.Add(new Core.Variable(crossover.ParentsParameter.ActualName, parent1)); context.Scope.SubScopes.Add(scopeParent1); crossover.Execute(context, new CancellationToken()); context.Scope.SubScopes.Remove(scopeParent0); // clean the scope in preparation for the next iteration context.Scope.SubScopes.Remove(scopeParent1); // clean the scope in preparation for the next iteration } stopwatch.Stop(); double msPerCrossover = 2 * stopwatch.ElapsedMilliseconds / (double)PopulationSize; Console.WriteLine(crossover.Name + ": " + Environment.NewLine + msPerCrossover + " ms per crossover (~" + Math.Round(1000.0 / (msPerCrossover)) + " crossover operations / s)"); foreach (var tree in trees) { HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Tests.Util.IsValid(tree); } }
public void SymbolicDataAnalysisExpressionDepthConstrainedCrossoverPerformanceTest() { var problem = new SymbolicRegressionSingleObjectiveProblem(); var crossover = problem.OperatorsParameter.Value.OfType <SymbolicDataAnalysisExpressionDepthConstrainedCrossover <IRegressionProblemData> >().First(); crossover.DepthRangeParameter.Value = crossover.DepthRangeParameter.ValidValues.First(s => s.Value == "HighLevel"); SymbolicDataAnalysisCrossoverPerformanceTest(crossover); crossover.DepthRangeParameter.Value = crossover.DepthRangeParameter.ValidValues.First(s => s.Value == "Standard"); SymbolicDataAnalysisCrossoverPerformanceTest(crossover); crossover.DepthRangeParameter.Value = crossover.DepthRangeParameter.ValidValues.First(s => s.Value == "LowLevel"); SymbolicDataAnalysisCrossoverPerformanceTest(crossover); }
static void Main(string[] args) { var path = @"D:\Data\Sinus\SimpleSinusHeuristicLab.csv"; var parser = new TableFileParser(); parser.Parse(path, columnNamesInFirstLine: true); var dataset = new Dataset(parser.VariableNames, parser.Values); var problemData = new RegressionProblemData(dataset, dataset.DoubleVariables.Take(dataset.Columns - 1), dataset.DoubleVariables.Last()); var grammar = new TypeCoherentExpressionGrammar(); var add = new Addition(); // var sub = new Subtraction(); // var mul = new Multiplication(); // var div = new Division(); grammar.ConfigureAsDefaultRegressionGrammar(); var problem = new SymbolicRegressionSingleObjectiveProblem { ProblemData = problemData, SymbolicExpressionTreeInterpreter = new SymbolicDataAnalysisExpressionTreeLinearInterpreter(), SymbolicExpressionTreeGrammar = grammar, EvaluatorParameter = { Value = new SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator() }, SolutionCreatorParameter = { Value = new SymbolicDataAnalysisExpressionTreeCreator() } }; var ga = new GeneticAlgorithm { PopulationSize = { Value = 1000 }, MaximumGenerations = { Value = 100 }, Problem = problem, MutationProbability = new PercentValue(25), Engine = new SequentialEngine() }; var manipulator = new MultiSymbolicExpressionTreeManipulator(); ga.MutatorParameter.ValidValues.Add(manipulator); ga.ExecutionStateChanged += OnExecutionStateChanged; ga.ExecutionTimeChanged += OnExecutionTimeChanged; ga.Prepare(); ga.Start(); mutex.WaitOne(); }
private IAlgorithm CreateOSGP() { // configure strict osgp var alg = new OffspringSelectionGeneticAlgorithm.OffspringSelectionGeneticAlgorithm(); var prob = new SymbolicRegressionSingleObjectiveProblem(); prob.MaximumSymbolicExpressionTreeDepth.Value = 7; prob.MaximumSymbolicExpressionTreeLength.Value = 15; alg.Problem = prob; alg.SuccessRatio.Value = 1.0; alg.ComparisonFactorLowerBound.Value = 1.0; alg.ComparisonFactorUpperBound.Value = 1.0; alg.MutationProbability.Value = 0.15; alg.PopulationSize.Value = 200; alg.MaximumSelectionPressure.Value = 100; alg.MaximumEvaluatedSolutions.Value = 20000; alg.SelectorParameter.Value = alg.SelectorParameter.ValidValues.OfType <GenderSpecificSelector>().First(); alg.MutatorParameter.Value = alg.MutatorParameter.ValidValues.OfType <MultiSymbolicExpressionTreeManipulator>().First(); alg.StoreAlgorithmInEachRun = false; return(alg); }
private AlpsGeneticAlgorithm CreateAlpsGaSymRegSample() { AlpsGeneticAlgorithm alpsGa = new AlpsGeneticAlgorithm(); #region Problem Configuration var provider = new VladislavlevaInstanceProvider(); var instance = provider.GetDataDescriptors().Single(x => x.Name.StartsWith("Vladislavleva-5 F5")); var symbRegProblem = new SymbolicRegressionSingleObjectiveProblem(); symbRegProblem.Load(provider.LoadData(instance)); symbRegProblem.MaximumSymbolicExpressionTreeDepth.Value = 35; symbRegProblem.MaximumSymbolicExpressionTreeLength.Value = 35; var grammar = (TypeCoherentExpressionGrammar)symbRegProblem.SymbolicExpressionTreeGrammar; grammar.Symbols.OfType<Exponential>().Single().Enabled = false; grammar.Symbols.OfType<Logarithm>().Single().Enabled = false; #endregion #region Algorithm Configuration alpsGa.Name = "ALPS Genetic Programming - Symbolic Regression"; alpsGa.Description = "An ALPS-GP to solve a symbolic regression problem (Vladislavleva-5 dataset)"; alpsGa.Problem = symbRegProblem; SamplesUtils.ConfigureAlpsGeneticAlgorithmParameters<GeneralizedRankSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(alpsGa, numberOfLayers: 1000, popSize: 100, mutationRate: 0.25, elites: 1, plusSelection: false, agingScheme: AgingScheme.Polynomial, ageGap: 15, ageInheritance: 1.0, maxGens: 500); #endregion return alpsGa; }
private IAlgorithm CreateOSGP() { // configure strict osgp var alg = new OffspringSelectionGeneticAlgorithm.OffspringSelectionGeneticAlgorithm(); var prob = new SymbolicRegressionSingleObjectiveProblem(); prob.MaximumSymbolicExpressionTreeDepth.Value = 7; prob.MaximumSymbolicExpressionTreeLength.Value = 15; alg.Problem = prob; alg.SuccessRatio.Value = 1.0; alg.ComparisonFactorLowerBound.Value = 1.0; alg.ComparisonFactorUpperBound.Value = 1.0; alg.MutationProbability.Value = 0.15; alg.PopulationSize.Value = 200; alg.MaximumSelectionPressure.Value = 100; alg.MaximumEvaluatedSolutions.Value = 20000; alg.SelectorParameter.Value = alg.SelectorParameter.ValidValues.OfType<GenderSpecificSelector>().First(); alg.MutatorParameter.Value = alg.MutatorParameter.ValidValues.OfType<MultiSymbolicExpressionTreeManipulator>().First(); alg.StoreAlgorithmInEachRun = false; return alg; }
private GeneticAlgorithm CreateGpSymbolicRegressionSample() { GeneticAlgorithm ga = new GeneticAlgorithm(); #region Problem Configuration SymbolicRegressionSingleObjectiveProblem symbRegProblem = new SymbolicRegressionSingleObjectiveProblem(); symbRegProblem.Name = "Tower Symbolic Regression Problem"; symbRegProblem.Description = "Tower Dataset (downloaded from: http://www.symbolicregression.com/?q=towerProblem)"; RegressionRealWorldInstanceProvider provider = new RegressionRealWorldInstanceProvider(); var instance = provider.GetDataDescriptors().Where(x => x.Name.Equals("Tower")).Single(); var towerProblemData = (RegressionProblemData)provider.LoadData(instance); towerProblemData.TargetVariableParameter.Value = towerProblemData.TargetVariableParameter.ValidValues .First(v => v.Value == "towerResponse"); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "x1"), true); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "x7"), false); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "x11"), false); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "x16"), false); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "x21"), false); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "x25"), false); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "towerResponse"), false); towerProblemData.TrainingPartition.Start = 0; towerProblemData.TrainingPartition.End = 3136; towerProblemData.TestPartition.Start = 3136; towerProblemData.TestPartition.End = 4999; towerProblemData.Name = "Data imported from towerData.txt"; towerProblemData.Description = "Chemical concentration at top of distillation tower, dataset downloaded from: http://vanillamodeling.com/realproblems.html, best R² achieved with nu-SVR = 0.97"; symbRegProblem.ProblemData = towerProblemData; // configure grammar var grammar = new TypeCoherentExpressionGrammar(); grammar.ConfigureAsDefaultRegressionGrammar(); grammar.Symbols.OfType <VariableCondition>().Single().InitialFrequency = 0.0; var varSymbol = grammar.Symbols.OfType <Variable>().Where(x => !(x is LaggedVariable)).Single(); varSymbol.WeightMu = 1.0; varSymbol.WeightSigma = 1.0; varSymbol.WeightManipulatorMu = 0.0; varSymbol.WeightManipulatorSigma = 0.05; varSymbol.MultiplicativeWeightManipulatorSigma = 0.03; var constSymbol = grammar.Symbols.OfType <Constant>().Single(); constSymbol.MaxValue = 20; constSymbol.MinValue = -20; constSymbol.ManipulatorMu = 0.0; constSymbol.ManipulatorSigma = 1; constSymbol.MultiplicativeManipulatorSigma = 0.03; symbRegProblem.SymbolicExpressionTreeGrammar = grammar; // configure remaining problem parameters symbRegProblem.BestKnownQuality.Value = 0.97; symbRegProblem.FitnessCalculationPartition.Start = 0; symbRegProblem.FitnessCalculationPartition.End = 2300; symbRegProblem.ValidationPartition.Start = 2300; symbRegProblem.ValidationPartition.End = 3136; symbRegProblem.RelativeNumberOfEvaluatedSamples.Value = 1; symbRegProblem.MaximumSymbolicExpressionTreeLength.Value = 150; symbRegProblem.MaximumSymbolicExpressionTreeDepth.Value = 12; symbRegProblem.MaximumFunctionDefinitions.Value = 0; symbRegProblem.MaximumFunctionArguments.Value = 0; symbRegProblem.EvaluatorParameter.Value = new SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator(); #endregion #region Algorithm Configuration ga.Problem = symbRegProblem; ga.Name = "Genetic Programming - Symbolic Regression"; ga.Description = "A standard genetic programming algorithm to solve a symbolic regression problem (tower dataset)"; SamplesUtils.ConfigureGeneticAlgorithmParameters <TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>( ga, 1000, 1, 50, 0.15, 5); var mutator = (MultiSymbolicExpressionTreeManipulator)ga.Mutator; mutator.Operators.OfType <FullTreeShaker>().Single().ShakingFactor = 0.1; mutator.Operators.OfType <OnePointShaker>().Single().ShakingFactor = 1.0; ga.Analyzer.Operators.SetItemCheckedState( ga.Analyzer.Operators .OfType <SymbolicRegressionSingleObjectiveOverfittingAnalyzer>() .Single(), false); ga.Analyzer.Operators.SetItemCheckedState( ga.Analyzer.Operators .OfType <SymbolicDataAnalysisAlleleFrequencyAnalyzer>() .First(), false); #endregion return(ga); }
private OffspringSelectionGeneticAlgorithm CreateGpSymbolicRegressionSample() { var osga = new OffspringSelectionGeneticAlgorithm(); #region Problem Configuration var provider = new VariousInstanceProvider(seed); var instance = provider.GetDataDescriptors().First(x => x.Name.StartsWith("Spatial co-evolution")); var problemData = (RegressionProblemData)provider.LoadData(instance); var problem = new SymbolicRegressionSingleObjectiveProblem(); problem.ProblemData = problemData; problem.Load(problemData); problem.BestKnownQuality.Value = 1.0; #region configure grammar var grammar = (TypeCoherentExpressionGrammar)problem.SymbolicExpressionTreeGrammar; grammar.ConfigureAsDefaultRegressionGrammar(); //symbols square, power, squareroot, root, log, exp, sine, cosine, tangent, variable var square = grammar.Symbols.OfType <Square>().Single(); var power = grammar.Symbols.OfType <Power>().Single(); var squareroot = grammar.Symbols.OfType <SquareRoot>().Single(); var root = grammar.Symbols.OfType <Root>().Single(); var log = grammar.Symbols.OfType <Logarithm>().Single(); var exp = grammar.Symbols.OfType <Exponential>().Single(); var sine = grammar.Symbols.OfType <Sine>().Single(); var cosine = grammar.Symbols.OfType <Cosine>().Single(); var tangent = grammar.Symbols.OfType <Tangent>().Single(); var variable = grammar.Symbols.OfType <Variable>().Single(); var powerSymbols = grammar.Symbols.Single(s => s.Name == "Power Functions"); powerSymbols.Enabled = true; square.Enabled = true; square.InitialFrequency = 1.0; foreach (var allowed in grammar.GetAllowedChildSymbols(square)) { grammar.RemoveAllowedChildSymbol(square, allowed); } foreach (var allowed in grammar.GetAllowedChildSymbols(square, 0)) { grammar.RemoveAllowedChildSymbol(square, allowed, 0); } grammar.AddAllowedChildSymbol(square, variable); power.Enabled = false; squareroot.Enabled = false; foreach (var allowed in grammar.GetAllowedChildSymbols(squareroot)) { grammar.RemoveAllowedChildSymbol(squareroot, allowed); } foreach (var allowed in grammar.GetAllowedChildSymbols(squareroot, 0)) { grammar.RemoveAllowedChildSymbol(squareroot, allowed, 0); } grammar.AddAllowedChildSymbol(squareroot, variable); root.Enabled = false; log.Enabled = true; log.InitialFrequency = 1.0; foreach (var allowed in grammar.GetAllowedChildSymbols(log)) { grammar.RemoveAllowedChildSymbol(log, allowed); } foreach (var allowed in grammar.GetAllowedChildSymbols(log, 0)) { grammar.RemoveAllowedChildSymbol(log, allowed, 0); } grammar.AddAllowedChildSymbol(log, variable); exp.Enabled = true; exp.InitialFrequency = 1.0; foreach (var allowed in grammar.GetAllowedChildSymbols(exp)) { grammar.RemoveAllowedChildSymbol(exp, allowed); } foreach (var allowed in grammar.GetAllowedChildSymbols(exp, 0)) { grammar.RemoveAllowedChildSymbol(exp, allowed, 0); } grammar.AddAllowedChildSymbol(exp, variable); sine.Enabled = false; foreach (var allowed in grammar.GetAllowedChildSymbols(sine)) { grammar.RemoveAllowedChildSymbol(sine, allowed); } foreach (var allowed in grammar.GetAllowedChildSymbols(sine, 0)) { grammar.RemoveAllowedChildSymbol(sine, allowed, 0); } grammar.AddAllowedChildSymbol(sine, variable); cosine.Enabled = false; foreach (var allowed in grammar.GetAllowedChildSymbols(cosine)) { grammar.RemoveAllowedChildSymbol(cosine, allowed); } foreach (var allowed in grammar.GetAllowedChildSymbols(cosine, 0)) { grammar.RemoveAllowedChildSymbol(cosine, allowed, 0); } grammar.AddAllowedChildSymbol(cosine, variable); tangent.Enabled = false; foreach (var allowed in grammar.GetAllowedChildSymbols(tangent)) { grammar.RemoveAllowedChildSymbol(tangent, allowed); } foreach (var allowed in grammar.GetAllowedChildSymbols(tangent, 0)) { grammar.RemoveAllowedChildSymbol(tangent, allowed, 0); } grammar.AddAllowedChildSymbol(tangent, variable); #endregion problem.SymbolicExpressionTreeGrammar = grammar; // configure remaining problem parameters problem.MaximumSymbolicExpressionTreeLength.Value = 50; problem.MaximumSymbolicExpressionTreeDepth.Value = 12; problem.MaximumFunctionDefinitions.Value = 0; problem.MaximumFunctionArguments.Value = 0; var evaluator = new SymbolicRegressionConstantOptimizationEvaluator(); evaluator.ConstantOptimizationIterations.Value = 5; problem.EvaluatorParameter.Value = evaluator; problem.RelativeNumberOfEvaluatedSamplesParameter.Hidden = true; problem.SolutionCreatorParameter.Hidden = true; #endregion #region Algorithm Configuration osga.Problem = problem; osga.Name = "Offspring Selection Genetic Programming - Symbolic Regression"; osga.Description = "Genetic programming with strict offspring selection for solving a benchmark regression problem."; SamplesUtils.ConfigureOsGeneticAlgorithmParameters <GenderSpecificSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(osga, 100, 1, 25, 0.2, 50); var mutator = (MultiSymbolicExpressionTreeManipulator)osga.Mutator; mutator.Operators.OfType <FullTreeShaker>().Single().ShakingFactor = 0.1; mutator.Operators.OfType <OnePointShaker>().Single().ShakingFactor = 1.0; osga.Analyzer.Operators.SetItemCheckedState( osga.Analyzer.Operators .OfType <SymbolicRegressionSingleObjectiveOverfittingAnalyzer>() .Single(), false); osga.Analyzer.Operators.SetItemCheckedState( osga.Analyzer.Operators .OfType <SymbolicDataAnalysisAlleleFrequencyAnalyzer>() .First(), false); osga.ComparisonFactorModifierParameter.Hidden = true; osga.ComparisonFactorLowerBoundParameter.Hidden = true; osga.ComparisonFactorUpperBoundParameter.Hidden = true; osga.OffspringSelectionBeforeMutationParameter.Hidden = true; osga.SuccessRatioParameter.Hidden = true; osga.SelectedParentsParameter.Hidden = true; osga.ElitesParameter.Hidden = true; #endregion return(osga); }
public void SymbolicDataAnalysisExpressionDepthConstrainedCrossoverPerformanceTest() { var problem = new SymbolicRegressionSingleObjectiveProblem(); var crossover = problem.OperatorsParameter.Value.OfType<SymbolicDataAnalysisExpressionDepthConstrainedCrossover<IRegressionProblemData>>().First(); crossover.DepthRangeParameter.Value = crossover.DepthRangeParameter.ValidValues.First(s => s.Value == "HighLevel"); SymbolicDataAnalysisCrossoverPerformanceTest(crossover); crossover.DepthRangeParameter.Value = crossover.DepthRangeParameter.ValidValues.First(s => s.Value == "Standard"); SymbolicDataAnalysisCrossoverPerformanceTest(crossover); crossover.DepthRangeParameter.Value = crossover.DepthRangeParameter.ValidValues.First(s => s.Value == "LowLevel"); SymbolicDataAnalysisCrossoverPerformanceTest(crossover); }
public void SymbolicDataAnalysisExpressionContextAwareCrossoverPerformanceTest() { var problem = new SymbolicRegressionSingleObjectiveProblem(); var crossover = problem.OperatorsParameter.Value.OfType<SymbolicDataAnalysisExpressionContextAwareCrossover<IRegressionProblemData>>().First(); SymbolicDataAnalysisCrossoverPerformanceTest(crossover); }
private static void SymbolicDataAnalysisCrossoverPerformanceTest(ISymbolicDataAnalysisExpressionCrossover<IRegressionProblemData> crossover) { var twister = new MersenneTwister(31415); var dataset = Util.CreateRandomDataset(twister, Rows, Columns); var grammar = new FullFunctionalExpressionGrammar(); var stopwatch = new Stopwatch(); grammar.MaximumFunctionArguments = 0; grammar.MaximumFunctionDefinitions = 0; grammar.MinimumFunctionArguments = 0; grammar.MinimumFunctionDefinitions = 0; var trees = Util.CreateRandomTrees(twister, dataset, grammar, PopulationSize, 1, MaxTreeLength, 0, 0); foreach (ISymbolicExpressionTree tree in trees) { Util.InitTree(tree, twister, new List<string>(dataset.VariableNames)); } var problemData = new RegressionProblemData(dataset, dataset.VariableNames, dataset.VariableNames.Last()); var problem = new SymbolicRegressionSingleObjectiveProblem(); problem.ProblemData = problemData; var globalScope = new Scope("Global Scope"); globalScope.Variables.Add(new Core.Variable("Random", twister)); var context = new ExecutionContext(null, problem, globalScope); context = new ExecutionContext(context, crossover, globalScope); stopwatch.Start(); for (int i = 0; i != PopulationSize; ++i) { var parent0 = (ISymbolicExpressionTree)trees.SampleRandom(twister).Clone(); var scopeParent0 = new Scope(); scopeParent0.Variables.Add(new Core.Variable(crossover.ParentsParameter.ActualName, parent0)); context.Scope.SubScopes.Add(scopeParent0); var parent1 = (ISymbolicExpressionTree)trees.SampleRandom(twister).Clone(); var scopeParent1 = new Scope(); scopeParent1.Variables.Add(new Core.Variable(crossover.ParentsParameter.ActualName, parent1)); context.Scope.SubScopes.Add(scopeParent1); crossover.Execute(context, new CancellationToken()); context.Scope.SubScopes.Remove(scopeParent0); // clean the scope in preparation for the next iteration context.Scope.SubScopes.Remove(scopeParent1); // clean the scope in preparation for the next iteration } stopwatch.Stop(); double msPerCrossover = 2 * stopwatch.ElapsedMilliseconds / (double)PopulationSize; Console.WriteLine(crossover.Name + ": " + Environment.NewLine + msPerCrossover + " ms per crossover (~" + Math.Round(1000.0 / (msPerCrossover)) + " crossover operations / s)"); foreach (var tree in trees) HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Tests.Util.IsValid(tree); }
private GeneticAlgorithm CreateGpSymbolicRegressionSample() { GeneticAlgorithm ga = new GeneticAlgorithm(); #region Problem Configuration SymbolicRegressionSingleObjectiveProblem symbRegProblem = new SymbolicRegressionSingleObjectiveProblem(); symbRegProblem.Name = "Tower Symbolic Regression Problem"; symbRegProblem.Description = "Tower Dataset (downloaded from: http://www.symbolicregression.com/?q=towerProblem)"; RegressionRealWorldInstanceProvider provider = new RegressionRealWorldInstanceProvider(); var instance = provider.GetDataDescriptors().Where(x => x.Name.Equals("Tower")).Single(); var towerProblemData = (RegressionProblemData)provider.LoadData(instance); towerProblemData.TargetVariableParameter.Value = towerProblemData.TargetVariableParameter.ValidValues .First(v => v.Value == "towerResponse"); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "x1"), true); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "x7"), false); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "x11"), false); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "x16"), false); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "x21"), false); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "x25"), false); towerProblemData.InputVariables.SetItemCheckedState( towerProblemData.InputVariables.Single(x => x.Value == "towerResponse"), false); towerProblemData.TrainingPartition.Start = 0; towerProblemData.TrainingPartition.End = 3136; towerProblemData.TestPartition.Start = 3136; towerProblemData.TestPartition.End = 4999; towerProblemData.Name = "Data imported from towerData.txt"; towerProblemData.Description = "Chemical concentration at top of distillation tower, dataset downloaded from: http://vanillamodeling.com/realproblems.html, best R² achieved with nu-SVR = 0.97"; symbRegProblem.ProblemData = towerProblemData; // configure grammar var grammar = new TypeCoherentExpressionGrammar(); grammar.ConfigureAsDefaultRegressionGrammar(); grammar.Symbols.OfType<VariableCondition>().Single().InitialFrequency = 0.0; var varSymbol = grammar.Symbols.OfType<Variable>().Where(x => !(x is LaggedVariable)).Single(); varSymbol.WeightMu = 1.0; varSymbol.WeightSigma = 1.0; varSymbol.WeightManipulatorMu = 0.0; varSymbol.WeightManipulatorSigma = 0.05; varSymbol.MultiplicativeWeightManipulatorSigma = 0.03; var constSymbol = grammar.Symbols.OfType<Constant>().Single(); constSymbol.MaxValue = 20; constSymbol.MinValue = -20; constSymbol.ManipulatorMu = 0.0; constSymbol.ManipulatorSigma = 1; constSymbol.MultiplicativeManipulatorSigma = 0.03; symbRegProblem.SymbolicExpressionTreeGrammar = grammar; // configure remaining problem parameters symbRegProblem.BestKnownQuality.Value = 0.97; symbRegProblem.FitnessCalculationPartition.Start = 0; symbRegProblem.FitnessCalculationPartition.End = 2300; symbRegProblem.ValidationPartition.Start = 2300; symbRegProblem.ValidationPartition.End = 3136; symbRegProblem.RelativeNumberOfEvaluatedSamples.Value = 1; symbRegProblem.MaximumSymbolicExpressionTreeLength.Value = 150; symbRegProblem.MaximumSymbolicExpressionTreeDepth.Value = 12; symbRegProblem.MaximumFunctionDefinitions.Value = 0; symbRegProblem.MaximumFunctionArguments.Value = 0; symbRegProblem.EvaluatorParameter.Value = new SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator(); #endregion #region Algorithm Configuration ga.Problem = symbRegProblem; ga.Name = "Genetic Programming - Symbolic Regression"; ga.Description = "A standard genetic programming algorithm to solve a symbolic regression problem (tower dataset)"; SamplesUtils.ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>( ga, 1000, 1, 50, 0.15, 5); var mutator = (MultiSymbolicExpressionTreeManipulator)ga.Mutator; mutator.Operators.OfType<FullTreeShaker>().Single().ShakingFactor = 0.1; mutator.Operators.OfType<OnePointShaker>().Single().ShakingFactor = 1.0; ga.Analyzer.Operators.SetItemCheckedState( ga.Analyzer.Operators .OfType<SymbolicRegressionSingleObjectiveOverfittingAnalyzer>() .Single(), false); ga.Analyzer.Operators.SetItemCheckedState( ga.Analyzer.Operators .OfType<SymbolicDataAnalysisAlleleFrequencyAnalyzer>() .First(), false); #endregion return ga; }