Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2974_Constants_Optimization/UnitTests/PerformanceTest.cs @ 16461

Last change on this file since 16461 was 16461, checked in by mkommend, 5 years ago

#2974: Added unit tests and refactoring.

File size: 8.9 KB
Line 
1using System;
2using HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm;
3using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
4using HeuristicLab.Persistence.Default.Xml;
5using HeuristicLab.Problems.DataAnalysis.Symbolic;
6using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
7using HeuristicLab.Selection;
8using Microsoft.VisualStudio.TestTools.UnitTesting;
9using System.Linq;
10using HeuristicLab.Problems.Instances.DataAnalysis;
11using HeuristicLab.Problems.DataAnalysis;
12using HeuristicLab.Optimization;
13using HeuristicLab.ParallelEngine;
14
15namespace UnitTests {
16  [TestClass]
17  public class PerformanceTest {
18    private static int seed = 1234;
19
20    //TODO remove performance test
21    [TestMethod]
22    [TestCategory("Problems.DataAnalysis.Symbolic.Regression")]
23    [TestProperty("Time", "long")]
24    public void ConstantsOptimization_Tower_Algorithm() {
25      var algorithm = CreateGpSymbolicRegressionSample();
26      var problem = (SymbolicRegressionSingleObjectiveProblem)algorithm.Problem;
27
28      algorithm.MaximumGenerations.Value = 1;
29      var evaluator = new ConstantsOptimizationEvaluator();
30      evaluator.ConstantOptimizationIterations.Value = 5;
31      problem.EvaluatorParameter.Value = evaluator;
32
33      algorithm.Prepare();
34      algorithm.Start();
35    }
36
37    private OffspringSelectionGeneticAlgorithm CreateGpSymbolicRegressionSample() {
38      var osga = new OffspringSelectionGeneticAlgorithm();
39      #region Problem Configuration
40      var provider = new RegressionRealWorldInstanceProvider();
41      var problemData =  provider.LoadData(new Tower());
42      var problem = new SymbolicRegressionSingleObjectiveProblem();
43      problem.ProblemData = problemData;
44      problem.Load(problemData);
45      problem.BestKnownQuality.Value = 1.0;
46
47      #region configure grammar
48
49      var grammar = (TypeCoherentExpressionGrammar)problem.SymbolicExpressionTreeGrammar;
50      grammar.ConfigureAsDefaultRegressionGrammar();
51
52      //symbols square, power, squareroot, root, log, exp, sine, cosine, tangent, variable
53      var square = grammar.Symbols.OfType<Square>().Single();
54      var power = grammar.Symbols.OfType<Power>().Single();
55      var squareroot = grammar.Symbols.OfType<SquareRoot>().Single();
56      var root = grammar.Symbols.OfType<Root>().Single();
57      var cube = grammar.Symbols.OfType<Cube>().Single();
58      var cuberoot = grammar.Symbols.OfType<CubeRoot>().Single();
59      var log = grammar.Symbols.OfType<Logarithm>().Single();
60      var exp = grammar.Symbols.OfType<Exponential>().Single();
61      var sine = grammar.Symbols.OfType<Sine>().Single();
62      var cosine = grammar.Symbols.OfType<Cosine>().Single();
63      var tangent = grammar.Symbols.OfType<Tangent>().Single();
64      var variable = grammar.Symbols.OfType<HeuristicLab.Problems.DataAnalysis.Symbolic.Variable>().Single();
65      var powerSymbols = grammar.Symbols.Single(s => s.Name == "Power Functions");
66      powerSymbols.Enabled = true;
67
68      square.Enabled = true;
69      square.InitialFrequency = 1.0;
70      foreach (var allowed in grammar.GetAllowedChildSymbols(square))
71        grammar.RemoveAllowedChildSymbol(square, allowed);
72      foreach (var allowed in grammar.GetAllowedChildSymbols(square, 0))
73        grammar.RemoveAllowedChildSymbol(square, allowed, 0);
74      grammar.AddAllowedChildSymbol(square, variable);
75
76      power.Enabled = false;
77
78      squareroot.Enabled = false;
79      foreach (var allowed in grammar.GetAllowedChildSymbols(squareroot))
80        grammar.RemoveAllowedChildSymbol(squareroot, allowed);
81      foreach (var allowed in grammar.GetAllowedChildSymbols(squareroot, 0))
82        grammar.RemoveAllowedChildSymbol(squareroot, allowed, 0);
83      grammar.AddAllowedChildSymbol(squareroot, variable);
84
85      cube.Enabled = false;
86      cuberoot.Enabled = false;
87      root.Enabled = false;
88
89      log.Enabled = true;
90      log.InitialFrequency = 1.0;
91      foreach (var allowed in grammar.GetAllowedChildSymbols(log))
92        grammar.RemoveAllowedChildSymbol(log, allowed);
93      foreach (var allowed in grammar.GetAllowedChildSymbols(log, 0))
94        grammar.RemoveAllowedChildSymbol(log, allowed, 0);
95      grammar.AddAllowedChildSymbol(log, variable);
96
97      exp.Enabled = true;
98      exp.InitialFrequency = 1.0;
99      foreach (var allowed in grammar.GetAllowedChildSymbols(exp))
100        grammar.RemoveAllowedChildSymbol(exp, allowed);
101      foreach (var allowed in grammar.GetAllowedChildSymbols(exp, 0))
102        grammar.RemoveAllowedChildSymbol(exp, allowed, 0);
103      grammar.AddAllowedChildSymbol(exp, variable);
104
105      sine.Enabled = false;
106      foreach (var allowed in grammar.GetAllowedChildSymbols(sine))
107        grammar.RemoveAllowedChildSymbol(sine, allowed);
108      foreach (var allowed in grammar.GetAllowedChildSymbols(sine, 0))
109        grammar.RemoveAllowedChildSymbol(sine, allowed, 0);
110      grammar.AddAllowedChildSymbol(sine, variable);
111
112      cosine.Enabled = false;
113      foreach (var allowed in grammar.GetAllowedChildSymbols(cosine))
114        grammar.RemoveAllowedChildSymbol(cosine, allowed);
115      foreach (var allowed in grammar.GetAllowedChildSymbols(cosine, 0))
116        grammar.RemoveAllowedChildSymbol(cosine, allowed, 0);
117      grammar.AddAllowedChildSymbol(cosine, variable);
118
119      tangent.Enabled = false;
120      foreach (var allowed in grammar.GetAllowedChildSymbols(tangent))
121        grammar.RemoveAllowedChildSymbol(tangent, allowed);
122      foreach (var allowed in grammar.GetAllowedChildSymbols(tangent, 0))
123        grammar.RemoveAllowedChildSymbol(tangent, allowed, 0);
124      grammar.AddAllowedChildSymbol(tangent, variable);
125      #endregion
126
127      problem.SymbolicExpressionTreeGrammar = grammar;
128
129      // configure remaining problem parameters
130      problem.MaximumSymbolicExpressionTreeLength.Value = 50;
131      problem.MaximumSymbolicExpressionTreeDepth.Value = 12;
132      problem.MaximumFunctionDefinitions.Value = 0;
133      problem.MaximumFunctionArguments.Value = 0;
134
135      var evaluator = new SymbolicRegressionConstantOptimizationEvaluator();
136      evaluator.ConstantOptimizationIterations.Value = 5;
137      problem.EvaluatorParameter.Value = evaluator;
138      problem.RelativeNumberOfEvaluatedSamplesParameter.Hidden = true;
139      problem.SolutionCreatorParameter.Hidden = true;
140      #endregion
141
142      #region Algorithm Configuration
143      osga.Problem = problem;
144      osga.Name = "Offspring Selection Genetic Programming - Symbolic Regression";
145      osga.Description = "Genetic programming with strict offspring selection for solving a benchmark regression problem.";
146      ConfigureOsGeneticAlgorithmParameters<GenderSpecificSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(osga, 100, 1, 25, 0.2, 50);
147      var mutator = (MultiSymbolicExpressionTreeManipulator)osga.Mutator;
148      mutator.Operators.OfType<FullTreeShaker>().Single().ShakingFactor = 0.1;
149      mutator.Operators.OfType<OnePointShaker>().Single().ShakingFactor = 1.0;
150
151      osga.Analyzer.Operators.SetItemCheckedState(
152        osga.Analyzer.Operators
153          .OfType<SymbolicRegressionSingleObjectiveOverfittingAnalyzer>()
154          .Single(), false);
155      osga.Analyzer.Operators.SetItemCheckedState(
156        osga.Analyzer.Operators
157          .OfType<SymbolicDataAnalysisAlleleFrequencyAnalyzer>()
158          .First(), false);
159
160      osga.ComparisonFactorModifierParameter.Hidden = true;
161      osga.ComparisonFactorLowerBoundParameter.Hidden = true;
162      osga.ComparisonFactorUpperBoundParameter.Hidden = true;
163      osga.OffspringSelectionBeforeMutationParameter.Hidden = true;
164      osga.SuccessRatioParameter.Hidden = true;
165      osga.SelectedParentsParameter.Hidden = true;
166      osga.ElitesParameter.Hidden = true;
167
168      #endregion
169      return osga;
170    }
171
172
173    public static void ConfigureOsGeneticAlgorithmParameters<S, C, M>(OffspringSelectionGeneticAlgorithm ga, int popSize, int elites, int maxGens, double mutationRate = 0.05, double maxSelPres = 100, int tournGroupSize = 0)
174      where S : ISelector
175      where C : ICrossover
176      where M : IManipulator {
177      ga.Elites.Value = elites;
178      ga.MaximumGenerations.Value = maxGens;
179      ga.MutationProbability.Value = mutationRate;
180      ga.PopulationSize.Value = popSize;
181      ga.MaximumSelectionPressure.Value = maxSelPres;
182      ga.Seed.Value = 0;
183      ga.SetSeedRandomly.Value = true;
184      ga.ComparisonFactorLowerBound.Value = 1;
185      ga.ComparisonFactorUpperBound.Value = 1;
186
187      ga.Selector = ga.SelectorParameter.ValidValues
188        .OfType<S>()
189        .First();
190
191      ga.Crossover = ga.CrossoverParameter.ValidValues
192        .OfType<C>()
193        .First();
194
195      ga.Mutator = ga.MutatorParameter.ValidValues
196        .OfType<M>()
197        .First();
198
199      var tSelector = ga.Selector as TournamentSelector;
200      if (tSelector != null) {
201        tSelector.GroupSizeParameter.Value.Value = tournGroupSize;
202      }
203      ga.Engine = new ParallelEngine();
204    }
205
206  }
207}
Note: See TracBrowser for help on using the repository browser.