Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/StandardGP.cs @ 1856

Last change on this file since 1856 was 1856, checked in by gkronber, 15 years ago

Moved problem injectors from GP.StructureIdentification projects into HeuristicLab.Modeling and made some necessary adjustments (project name, references, plugin dependencies). #635

File size: 15.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using System.Text;
26using HeuristicLab.Core;
27using System.Xml;
28using System.Diagnostics;
29using HeuristicLab.DataAnalysis;
30using HeuristicLab.Operators;
31using HeuristicLab.Random;
32using HeuristicLab.Selection;
33using HeuristicLab.Logging;
34using HeuristicLab.Data;
35using HeuristicLab.Operators.Programmable;
36using HeuristicLab.Modeling;
37
38namespace HeuristicLab.GP.StructureIdentification {
39  public class StandardGP : AlgorithmBase, IEditable {
40
41    public virtual int MaxGenerations {
42      get { return GetVariableInjector().GetVariable("MaxGenerations").GetValue<IntData>().Data; }
43      set { GetVariableInjector().GetVariable("MaxGenerations").GetValue<IntData>().Data = value; }
44    }
45
46    public virtual int TournamentSize {
47      get { return GetVariableInjector().GetVariable("TournamentSize").GetValue<IntData>().Data; }
48      set { GetVariableInjector().GetVariable("TournamentSize").GetValue<IntData>().Data = value; }
49    }
50
51    public double FullTreeShakingFactor {
52      get { return GetVariableInjector().GetVariable("FullTreeShakingFactor").GetValue<DoubleData>().Data; }
53      set { GetVariableInjector().GetVariable("FullTreeShakingFactor").GetValue<DoubleData>().Data = value; }
54    }
55
56    public double OnePointShakingFactor {
57      get { return GetVariableInjector().GetVariable("OnePointShakingFactor").GetValue<DoubleData>().Data; }
58      set { GetVariableInjector().GetVariable("OnePointShakingFactor").GetValue<DoubleData>().Data = value; }
59    }
60
61    public int MinInitialTreeSize {
62      get { return GetVariableInjector().GetVariable("MinInitialTreeSize").GetValue<IntData>().Data; }
63      set { GetVariableInjector().GetVariable("MinInitialTreeSize").GetValue<IntData>().Data = value; }
64    }
65
66    public override int MaxTreeSize {
67      get {
68        return base.MaxTreeSize;
69      }
70      set {
71        base.MaxTreeSize = value;
72        MinInitialTreeSize = value / 2;
73      }
74    }
75
76    public override int PopulationSize {
77      get {
78        return base.PopulationSize;
79      }
80      set {
81        base.PopulationSize = value;
82        Parents = 2 * value;
83      }
84    }
85
86    public StandardGP()
87      : base() {
88      PopulationSize = 10000;
89      MaxGenerations = 100;
90      TournamentSize = 7;
91      MutationRate = 0.15;
92      Elites = 1;
93      MaxTreeSize = 100;
94      MaxTreeHeight = 10;
95      FullTreeShakingFactor = 0.1;
96      OnePointShakingFactor = 1.0;
97      PunishmentFactor = 10.0;
98      UseEstimatedTargetValue = false;
99      SetSeedRandomly = true;
100    }
101
102    protected internal override IOperator CreateProblemInjector() {
103      return new ProblemInjector();
104    }
105
106    protected internal override IOperator CreateSelector() {
107      TournamentSelector selector = new TournamentSelector();
108      selector.Name = "Selector";
109      selector.GetVariableInfo("Selected").ActualName = "Parents";
110      selector.GetVariableInfo("GroupSize").Local = false;
111      selector.RemoveVariable("GroupSize");
112      selector.GetVariableInfo("GroupSize").ActualName = "TournamentSize";
113      return selector;
114    }
115
116    protected internal override IOperator CreateGlobalInjector() {
117      VariableInjector globalInjector = (VariableInjector)base.CreateGlobalInjector();
118      globalInjector.AddVariable(new HeuristicLab.Core.Variable("TournamentSize", new IntData()));
119      globalInjector.AddVariable(new HeuristicLab.Core.Variable("MaxGenerations", new IntData()));
120      globalInjector.AddVariable(new HeuristicLab.Core.Variable("FullTreeShakingFactor", new DoubleData()));
121      globalInjector.AddVariable(new HeuristicLab.Core.Variable("OnePointShakingFactor", new DoubleData()));
122      globalInjector.AddVariable(new HeuristicLab.Core.Variable("MinInitialTreeSize", new IntData()));
123      return globalInjector;
124    }
125
126    protected internal override IOperator CreateCrossover() {
127      StandardCrossOver crossover = new StandardCrossOver();
128      crossover.Name = "Crossover";
129      crossover.GetVariableInfo("OperatorLibrary").ActualName = "FunctionLibrary";
130      return crossover;
131    }
132
133    protected internal override IOperator CreateTreeCreator() {
134      ProbabilisticTreeCreator treeCreator = new ProbabilisticTreeCreator();
135      treeCreator.Name = "Tree generator";
136      treeCreator.GetVariableInfo("OperatorLibrary").ActualName = "FunctionLibrary";
137      treeCreator.GetVariableInfo("MinTreeSize").ActualName = "MinInitialTreeSize";
138      return treeCreator;
139    }
140
141    protected internal override IOperator CreateFunctionLibraryInjector() {
142      return new FunctionLibraryInjector();
143    }
144
145    protected internal override IOperator CreateManipulator() {
146      CombinedOperator manipulator = new CombinedOperator();
147      manipulator.Name = "Manipulator";
148      StochasticMultiBranch multibranch = new StochasticMultiBranch();
149      FullTreeShaker fullTreeShaker = new FullTreeShaker();
150      fullTreeShaker.GetVariableInfo("OperatorLibrary").ActualName = "FunctionLibrary";
151      fullTreeShaker.GetVariableInfo("ShakingFactor").ActualName = "FullTreeShakingFactor";
152
153      OnePointShaker onepointShaker = new OnePointShaker();
154      onepointShaker.GetVariableInfo("OperatorLibrary").ActualName = "FunctionLibrary";
155      onepointShaker.GetVariableInfo("ShakingFactor").ActualName = "OnePointShakingFactor";
156      ChangeNodeTypeManipulation changeNodeTypeManipulation = new ChangeNodeTypeManipulation();
157      changeNodeTypeManipulation.GetVariableInfo("OperatorLibrary").ActualName = "FunctionLibrary";
158      CutOutNodeManipulation cutOutNodeManipulation = new CutOutNodeManipulation();
159      cutOutNodeManipulation.GetVariableInfo("OperatorLibrary").ActualName = "FunctionLibrary";
160      DeleteSubTreeManipulation deleteSubTreeManipulation = new DeleteSubTreeManipulation();
161      deleteSubTreeManipulation.GetVariableInfo("OperatorLibrary").ActualName = "FunctionLibrary";
162      SubstituteSubTreeManipulation substituteSubTreeManipulation = new SubstituteSubTreeManipulation();
163      substituteSubTreeManipulation.GetVariableInfo("OperatorLibrary").ActualName = "FunctionLibrary";
164
165      IOperator[] manipulators = new IOperator[] {
166        onepointShaker, fullTreeShaker,
167        changeNodeTypeManipulation,
168        cutOutNodeManipulation,
169        deleteSubTreeManipulation,
170        substituteSubTreeManipulation};
171
172      DoubleArrayData probabilities = new DoubleArrayData(new double[manipulators.Length]);
173      for (int i = 0; i < manipulators.Length; i++) {
174        probabilities.Data[i] = 1.0;
175        multibranch.AddSubOperator(manipulators[i]);
176      }
177      multibranch.GetVariableInfo("Probabilities").Local = true;
178      multibranch.AddVariable(new HeuristicLab.Core.Variable("Probabilities", probabilities));
179
180      manipulator.OperatorGraph.AddOperator(multibranch);
181      manipulator.OperatorGraph.InitialOperator = multibranch;
182      return manipulator;
183    }
184
185    protected internal override IOperator CreateBestSolutionProcessor() {
186      SequentialProcessor bestSolutionProcessor = new SequentialProcessor();
187      MeanSquaredErrorEvaluator testMseEvaluator = new MeanSquaredErrorEvaluator();
188      testMseEvaluator.Name = "TestMeanSquaredErrorEvaluator";
189      testMseEvaluator.GetVariableInfo("MSE").ActualName = "TestQuality";
190      testMseEvaluator.GetVariableInfo("SamplesStart").ActualName = "TestSamplesStart";
191      testMseEvaluator.GetVariableInfo("SamplesEnd").ActualName = "TestSamplesEnd";
192      MeanAbsolutePercentageErrorEvaluator trainingMapeEvaluator = new MeanAbsolutePercentageErrorEvaluator();
193      trainingMapeEvaluator.Name = "TrainingMapeEvaluator";
194      trainingMapeEvaluator.GetVariableInfo("MAPE").ActualName = "TrainingMAPE";
195      trainingMapeEvaluator.GetVariableInfo("SamplesStart").ActualName = "TrainingSamplesStart";
196      trainingMapeEvaluator.GetVariableInfo("SamplesEnd").ActualName = "TrainingSamplesEnd";
197      MeanAbsolutePercentageErrorEvaluator validationMapeEvaluator = new MeanAbsolutePercentageErrorEvaluator();
198      validationMapeEvaluator.Name = "ValidationMapeEvaluator";
199      validationMapeEvaluator.GetVariableInfo("MAPE").ActualName = "ValidationMAPE";
200      validationMapeEvaluator.GetVariableInfo("SamplesStart").ActualName = "ValidationSamplesStart";
201      validationMapeEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ValidationSamplesEnd";
202      MeanAbsolutePercentageErrorEvaluator testMapeEvaluator = new MeanAbsolutePercentageErrorEvaluator();
203      testMapeEvaluator.Name = "TestMapeEvaluator";
204      testMapeEvaluator.GetVariableInfo("MAPE").ActualName = "TestMAPE";
205      testMapeEvaluator.GetVariableInfo("SamplesStart").ActualName = "TestSamplesStart";
206      testMapeEvaluator.GetVariableInfo("SamplesEnd").ActualName = "TestSamplesEnd";
207      MeanAbsolutePercentageOfRangeErrorEvaluator trainingMapreEvaluator = new MeanAbsolutePercentageOfRangeErrorEvaluator();
208      trainingMapreEvaluator.Name = "TrainingMapreEvaluator";
209      trainingMapreEvaluator.GetVariableInfo("MAPRE").ActualName = "TrainingMAPRE";
210      trainingMapreEvaluator.GetVariableInfo("SamplesStart").ActualName = "TrainingSamplesStart";
211      trainingMapreEvaluator.GetVariableInfo("SamplesEnd").ActualName = "TrainingSamplesEnd";
212      MeanAbsolutePercentageOfRangeErrorEvaluator validationMapreEvaluator = new MeanAbsolutePercentageOfRangeErrorEvaluator();
213      validationMapreEvaluator.Name = "ValidationMapreEvaluator";
214      validationMapreEvaluator.GetVariableInfo("MAPRE").ActualName = "ValidationMAPRE";
215      validationMapreEvaluator.GetVariableInfo("SamplesStart").ActualName = "ValidationSamplesStart";
216      validationMapreEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ValidationSamplesEnd";
217      MeanAbsolutePercentageOfRangeErrorEvaluator testMapreEvaluator = new MeanAbsolutePercentageOfRangeErrorEvaluator();
218      testMapreEvaluator.Name = "TestMapreEvaluator";
219      testMapreEvaluator.GetVariableInfo("MAPRE").ActualName = "TestMAPRE";
220      testMapreEvaluator.GetVariableInfo("SamplesStart").ActualName = "TestSamplesStart";
221      testMapreEvaluator.GetVariableInfo("SamplesEnd").ActualName = "TestSamplesEnd";
222      CoefficientOfDeterminationEvaluator trainingR2Evaluator = new CoefficientOfDeterminationEvaluator();
223      trainingR2Evaluator.Name = "TrainingR2Evaluator";
224      trainingR2Evaluator.GetVariableInfo("R2").ActualName = "TrainingR2";
225      trainingR2Evaluator.GetVariableInfo("SamplesStart").ActualName = "TrainingSamplesStart";
226      trainingR2Evaluator.GetVariableInfo("SamplesEnd").ActualName = "TrainingSamplesEnd";
227      CoefficientOfDeterminationEvaluator validationR2Evaluator = new CoefficientOfDeterminationEvaluator();
228      validationR2Evaluator.Name = "ValidationR2Evaluator";
229      validationR2Evaluator.GetVariableInfo("R2").ActualName = "ValidationR2";
230      validationR2Evaluator.GetVariableInfo("SamplesStart").ActualName = "ValidationSamplesStart";
231      validationR2Evaluator.GetVariableInfo("SamplesEnd").ActualName = "ValidationSamplesEnd";
232      CoefficientOfDeterminationEvaluator testR2Evaluator = new CoefficientOfDeterminationEvaluator();
233      testR2Evaluator.Name = "TestR2Evaluator";
234      testR2Evaluator.GetVariableInfo("R2").ActualName = "TestR2";
235      testR2Evaluator.GetVariableInfo("SamplesStart").ActualName = "TestSamplesStart";
236      testR2Evaluator.GetVariableInfo("SamplesEnd").ActualName = "TestSamplesEnd";
237      ProgrammableOperator progOperator = new ProgrammableOperator();
238      progOperator.RemoveVariableInfo("Result");
239      progOperator.AddVariableInfo(new HeuristicLab.Core.VariableInfo("EvaluatedSolutions", "", typeof(IntData), VariableKind.In));
240      progOperator.Code = @"
241int evalSolutions = EvaluatedSolutions.Data;
242scope.AddVariable(new Variable(""EvaluatedSolutions"", new IntData(evalSolutions)));
243";
244      bestSolutionProcessor.AddSubOperator(testMseEvaluator);
245      bestSolutionProcessor.AddSubOperator(trainingMapeEvaluator);
246      bestSolutionProcessor.AddSubOperator(validationMapeEvaluator);
247      bestSolutionProcessor.AddSubOperator(testMapeEvaluator);
248      bestSolutionProcessor.AddSubOperator(trainingMapreEvaluator);
249      bestSolutionProcessor.AddSubOperator(validationMapreEvaluator);
250      bestSolutionProcessor.AddSubOperator(testMapreEvaluator);
251      bestSolutionProcessor.AddSubOperator(trainingR2Evaluator);
252      bestSolutionProcessor.AddSubOperator(validationR2Evaluator);
253      bestSolutionProcessor.AddSubOperator(testR2Evaluator);
254      bestSolutionProcessor.AddSubOperator(progOperator);
255      return bestSolutionProcessor;
256    }
257
258    protected internal override IOperator CreateLoggingOperator() {
259      CombinedOperator loggingOperator = new CombinedOperator();
260      loggingOperator.Name = "Logging";
261      SequentialProcessor seq = new SequentialProcessor();
262
263      DataCollector collector = new DataCollector();
264      ItemList<StringData> names = collector.GetVariable("VariableNames").GetValue<ItemList<StringData>>();
265      names.Add(new StringData("BestQuality"));
266      names.Add(new StringData("AverageQuality"));
267      names.Add(new StringData("WorstQuality"));
268      names.Add(new StringData("BestValidationQuality"));
269      names.Add(new StringData("AverageValidationQuality"));
270      names.Add(new StringData("WorstValidationQuality"));
271      LinechartInjector lineChartInjector = new LinechartInjector();
272      lineChartInjector.GetVariableInfo("Linechart").ActualName = "Quality Linechart";
273      lineChartInjector.GetVariable("NumberOfLines").GetValue<IntData>().Data = 6;
274      QualityLogger qualityLogger = new QualityLogger();
275      QualityLogger validationQualityLogger = new QualityLogger();
276      validationQualityLogger.Name = "ValidationQualityLogger";
277      validationQualityLogger.GetVariableInfo("Quality").ActualName = "ValidationQuality";
278      validationQualityLogger.GetVariableInfo("QualityLog").ActualName = "ValidationQualityLog";
279
280      seq.AddSubOperator(collector);
281      seq.AddSubOperator(lineChartInjector);
282      seq.AddSubOperator(qualityLogger);
283      seq.AddSubOperator(validationQualityLogger);
284
285      loggingOperator.OperatorGraph.AddOperator(seq);
286      loggingOperator.OperatorGraph.InitialOperator = seq;
287      return loggingOperator;
288    }
289
290    public virtual IEditor CreateEditor() {
291      return new StandardGpEditor(this);
292    }
293
294    public override IView CreateView() {
295      return new StandardGpEditor(this);
296    }
297  }
298}
Note: See TracBrowser for help on using the repository browser.