Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 14419 was 14185, checked in by swagner, 8 years ago

#2526: Updated year of copyrights in license headers

File size: 6.1 KB
RevLine 
[10072]1#region License Information
2/* HeuristicLab
[14185]3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
[10072]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/>.
[10968]19 *
20 * Author: Sabine Winkler
[10072]21 */
[10968]22
[10072]23#endregion
24
25using System.Linq;
26using HeuristicLab.Common;
27using HeuristicLab.Core;
[10073]28using HeuristicLab.Encodings.IntegerVectorEncoding;
[10072]29using HeuristicLab.Parameters;
30using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
[10073]31using HeuristicLab.Problems.DataAnalysis;
32using HeuristicLab.Problems.DataAnalysis.Symbolic;
33using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
[10072]34
[10073]35namespace HeuristicLab.Problems.GrammaticalEvolution {
[13239]36  [Item("Grammatical Evolution Symbolic Regression Problem (GE)",
[10974]37        "Represents grammatical evolution for single objective symbolic regression problems.")]
[10072]38  [StorableClass]
[12504]39  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 180)]
[10075]40  public class GESymbolicRegressionSingleObjectiveProblem : GESymbolicDataAnalysisSingleObjectiveProblem<IRegressionProblemData, IGESymbolicRegressionSingleObjectiveEvaluator, IIntegerVectorCreator>,
41                                                            IRegressionProblem {
[10072]42    private const double PunishmentFactor = 10;
[10328]43    private const int InitialMaximumTreeLength = 30;
[10072]44    private const string EstimationLimitsParameterName = "EstimationLimits";
[10276]45    private const string EstimationLimitsParameterDescription
46      = "The limits for the estimated value that can be returned by the symbolic regression model.";
[10072]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]
[10073]59    protected GESymbolicRegressionSingleObjectiveProblem(bool deserializing) : base(deserializing) { }
60    protected GESymbolicRegressionSingleObjectiveProblem(GESymbolicRegressionSingleObjectiveProblem original, Cloner cloner)
[10072]61      : base(original, cloner) {
62      RegisterEventHandlers();
63    }
[10073]64    public override IDeepCloneable Clone(Cloner cloner) { return new GESymbolicRegressionSingleObjectiveProblem(this, cloner); }
[10072]65
[10073]66    public GESymbolicRegressionSingleObjectiveProblem()
[10263]67      : base(new RegressionProblemData(), new GESymbolicRegressionSingleObjectiveEvaluator(), new UniformRandomIntegerVectorCreator()) {
[10072]68      Parameters.Add(new FixedValueParameter<DoubleLimit>(EstimationLimitsParameterName, EstimationLimitsParameterDescription));
69
70      EstimationLimitsParameter.Hidden = true;
71
72
73      ApplyLinearScalingParameter.Value.Value = true;
[10974]74      Maximization.Value = Evaluator.Maximization;
[10072]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() {
[10974]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;
[10072]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.