Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicRegressionSingleObjectiveProblem.cs @ 16724

Last change on this file since 16724 was 16565, checked in by gkronber, 6 years ago

#2520: merged changes from PersistenceOverhaul branch (r16451:16564) into trunk

File size: 6.1 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2019 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 * Author: Sabine Winkler
21 */
22
23#endregion
24
25using System.Linq;
26using HeuristicLab.Common;
27using HeuristicLab.Core;
28using HeuristicLab.Encodings.IntegerVectorEncoding;
29using HeuristicLab.Parameters;
30using HEAL.Attic;
31using HeuristicLab.Problems.DataAnalysis;
32using HeuristicLab.Problems.DataAnalysis.Symbolic;
33using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
34
35namespace HeuristicLab.Problems.GrammaticalEvolution {
36  [Item("Grammatical Evolution Symbolic Regression Problem (GE)",
37        "Represents grammatical evolution for single objective symbolic regression problems.")]
38  [StorableType("65208F51-3181-4765-BA04-33CADBCE0826")]
39  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 180)]
40  public class GESymbolicRegressionSingleObjectiveProblem : GESymbolicDataAnalysisSingleObjectiveProblem<IRegressionProblemData, IGESymbolicRegressionSingleObjectiveEvaluator, IIntegerVectorCreator>,
41                                                            IRegressionProblem {
42    private const double PunishmentFactor = 10;
43    private const int InitialMaximumTreeLength = 30;
44    private const string EstimationLimitsParameterName = "EstimationLimits";
45    private const string EstimationLimitsParameterDescription
46      = "The limits for the estimated value that can be returned by the symbolic regression model.";
47
48    #region parameter properties
49    public IFixedValueParameter<DoubleLimit> EstimationLimitsParameter {
50      get { return (IFixedValueParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; }
51    }
52    #endregion
53    #region properties
54    public DoubleLimit EstimationLimits {
55      get { return EstimationLimitsParameter.Value; }
56    }
57    #endregion
58    [StorableConstructor]
59    protected GESymbolicRegressionSingleObjectiveProblem(StorableConstructorFlag _) : base(_) { }
60    protected GESymbolicRegressionSingleObjectiveProblem(GESymbolicRegressionSingleObjectiveProblem original, Cloner cloner)
61      : base(original, cloner) {
62      RegisterEventHandlers();
63    }
64    public override IDeepCloneable Clone(Cloner cloner) { return new GESymbolicRegressionSingleObjectiveProblem(this, cloner); }
65
66    public GESymbolicRegressionSingleObjectiveProblem()
67      : base(new RegressionProblemData(), new GESymbolicRegressionSingleObjectiveEvaluator(), new UniformRandomIntegerVectorCreator()) {
68      Parameters.Add(new FixedValueParameter<DoubleLimit>(EstimationLimitsParameterName, EstimationLimitsParameterDescription));
69
70      EstimationLimitsParameter.Hidden = true;
71
72
73      ApplyLinearScalingParameter.Value.Value = true;
74      Maximization.Value = Evaluator.Maximization;
75      MaximumSymbolicExpressionTreeLength.Value = InitialMaximumTreeLength;
76
77      RegisterEventHandlers();
78      InitializeOperators();
79      UpdateEstimationLimits();
80    }
81
82    [StorableHook(HookType.AfterDeserialization)]
83    private void AfterDeserialization() {
84      RegisterEventHandlers();
85    }
86
87    private void RegisterEventHandlers() {
88      // when the ge evaluator itself changes
89      EvaluatorParameter.ValueChanged += (sender, args) => {
90        // register a new hander for the symbreg evaluator in the ge evaluator
91        // hacky because we the evaluator does not have an event for changes of the maximization property
92        EvaluatorParameter.Value.EvaluatorParameter.ValueChanged +=
93          (_, __) => Maximization.Value = Evaluator.Maximization;
94      };
95      EvaluatorParameter.Value.EvaluatorParameter.ValueChanged +=
96        (sender, args) => Maximization.Value = Evaluator.Maximization;
97    }
98
99
100    private void InitializeOperators() {
101      Operators.Add(new SymbolicRegressionSingleObjectiveTrainingBestSolutionAnalyzer());
102      Operators.Add(new SymbolicRegressionSingleObjectiveValidationBestSolutionAnalyzer());
103      Operators.Add(new SymbolicRegressionSingleObjectiveOverfittingAnalyzer());
104      Operators.Add(new SymbolicRegressionSingleObjectiveTrainingParetoBestSolutionAnalyzer());
105      Operators.Add(new SymbolicRegressionSingleObjectiveValidationParetoBestSolutionAnalyzer());
106
107      ParameterizeOperators();
108    }
109
110    private void UpdateEstimationLimits() {
111      if (ProblemData.TrainingIndices.Any()) {
112        var targetValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices).ToList();
113        var mean = targetValues.Average();
114        var range = targetValues.Max() - targetValues.Min();
115        EstimationLimits.Upper = mean + PunishmentFactor * range;
116        EstimationLimits.Lower = mean - PunishmentFactor * range;
117      } else {
118        EstimationLimits.Upper = double.MaxValue;
119        EstimationLimits.Lower = double.MinValue;
120      }
121    }
122
123    protected override void OnProblemDataChanged() {
124      base.OnProblemDataChanged();
125      UpdateEstimationLimits();
126    }
127
128    protected override void ParameterizeOperators() {
129      base.ParameterizeOperators();
130      if (Parameters.ContainsKey(EstimationLimitsParameterName)) {
131        var operators = Parameters.OfType<IValueParameter>().Select(p => p.Value).OfType<IOperator>().Union(Operators);
132        foreach (var op in operators.OfType<ISymbolicDataAnalysisBoundedOperator>()) {
133          op.EstimationLimitsParameter.ActualName = EstimationLimitsParameter.Name;
134        }
135      }
136    }
137  }
138}
Note: See TracBrowser for help on using the repository browser.