Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Problems.LawnMower/3.3/Problem.cs @ 8059

Last change on this file since 8059 was 8059, checked in by gkronber, 12 years ago

#1876: initial import of the lawn mower demo problem for GP.

File size: 8.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2012 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.Linq;
24using HeuristicLab.Common;
25using HeuristicLab.Core;
26using HeuristicLab.Data;
27using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
28using HeuristicLab.Optimization;
29using HeuristicLab.Parameters;
30using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
31using HeuristicLab.PluginInfrastructure;
32
33namespace HeuristicLab.Problems.LawnMower {
34  [StorableClass]
35  [Creatable("Problems")]
36  [Item("Lawn Mower Problem", "The lawn mower demo problem for genetic programming.")]
37  public class Problem : SingleObjectiveHeuristicOptimizationProblem<Evaluator, ISymbolicExpressionTreeCreator> {
38    private const string LawnWidthParameterName = "LawnWidth";
39    private const string LawnLengthParameterName = "LawnLength";
40    private const string LawnMowerProgramParameterName = "Program";
41    private const string MaxLawnMowerProgramLengthParameterName = "MaxProgramLength";
42    private const string MaxLawnMowerProgramDepthParameterName = "MaxProgramDepth";
43    private const string LawnMowerGrammarParameterName = "Grammar";
44
45    public IFixedValueParameter<IntValue> LawnWidthParameter {
46      get { return (IFixedValueParameter<IntValue>)Parameters[LawnWidthParameterName]; }
47    }
48    public IFixedValueParameter<IntValue> LawnLengthParameter {
49      get { return (IFixedValueParameter<IntValue>)Parameters[LawnLengthParameterName]; }
50    }
51    public IFixedValueParameter<IntValue> MaxLawnMowerProgramLengthParameter {
52      get { return (IFixedValueParameter<IntValue>)Parameters[MaxLawnMowerProgramLengthParameterName]; }
53    }
54    public IFixedValueParameter<IntValue> MaxLawnMowerProgramDepthParameter {
55      get { return (IFixedValueParameter<IntValue>)Parameters[MaxLawnMowerProgramDepthParameterName]; }
56    }
57    public IValueParameter<Grammar> GrammarParameter {
58      get { return (IValueParameter<Grammar>)Parameters[LawnMowerGrammarParameterName]; }
59    }
60
61    [StorableConstructor]
62    protected Problem(bool deserializing)
63      : base(deserializing) {
64    }
65    protected Problem(Problem original, Cloner cloner)
66      : base(original, cloner) {
67      RegisterEventHandlers();
68    }
69    public Problem()
70      : base(new Evaluator(), new RampedHalfAndHalfTreeCreator()) {
71      Parameters.Add(new FixedValueParameter<IntValue>(LawnWidthParameterName, "Width of the lawn.", new IntValue(8)));
72      Parameters.Add(new FixedValueParameter<IntValue>(LawnLengthParameterName, "Length of the lawn.", new IntValue(8)));
73      Parameters.Add(new FixedValueParameter<IntValue>(MaxLawnMowerProgramDepthParameterName, "Maximal depth of the lawn mower program.", new IntValue(13)));
74      Parameters.Add(new FixedValueParameter<IntValue>(MaxLawnMowerProgramLengthParameterName, "Maximal length of the lawn mower program.", new IntValue(1000)));
75      Parameters.Add(new ValueParameter<Grammar>(LawnMowerGrammarParameterName, "Grammar for the lawn mower program.",
76                     new Grammar()));
77      Maximization.Value = true;
78      InitializeOperators();
79
80      RegisterEventHandlers();
81    }
82
83
84    [StorableHook(HookType.AfterDeserialization)]
85    private void AfterDeserialization() {
86      RegisterEventHandlers();
87    }
88
89    public override IDeepCloneable Clone(Cloner cloner) {
90      return new Problem(this, cloner);
91    }
92
93    private void InitializeOperators() {
94      Operators.AddRange(ApplicationManager.Manager.GetInstances<ISymbolicExpressionTreeOperator>());
95      Operators.Add(new MinAverageMaxSymbolicExpressionTreeLengthAnalyzer());
96      Operators.Add(new SymbolicExpressionSymbolFrequencyAnalyzer());
97      Operators.Add(new BestSolutionAnalyzer());
98      ParameterizeOperators();
99      ParameterizeAnalyzers();
100    }
101
102
103    private void RegisterEventHandlers() {
104      Evaluator.QualityParameter.ActualNameChanged += QualityParameterOnActualNameChanged;
105      SolutionCreator.SymbolicExpressionTreeParameter.ActualNameChanged +=
106        SymbolicExpressionTreeParameterOnActualNameChanged;
107    }
108
109
110
111    protected override void OnEvaluatorChanged() {
112      base.OnEvaluatorChanged();
113      Evaluator.LawnMowerProgramParameter.ActualName = LawnMowerProgramParameterName;
114      Evaluator.LawnLengthParameter.ActualName = LawnLengthParameterName;
115      Evaluator.LawnWidthParameter.ActualName = LawnWidthParameterName;
116      Evaluator.QualityParameter.ActualNameChanged += QualityParameterOnActualNameChanged;
117      ParameterizeAnalyzers();
118      ParameterizeOperators();
119    }
120
121    protected override void OnSolutionCreatorChanged() {
122      base.OnSolutionCreatorChanged();
123      SolutionCreator.SymbolicExpressionTreeParameter.ActualName = LawnMowerProgramParameterName;
124      SolutionCreator.SymbolicExpressionTreeParameter.ActualNameChanged += SymbolicExpressionTreeParameterOnActualNameChanged;
125      ParameterizeAnalyzers();
126      ParameterizeOperators();
127    }
128
129    private void SymbolicExpressionTreeParameterOnActualNameChanged(object sender, EventArgs eventArgs) {
130      ParameterizeAnalyzers();
131      ParameterizeOperators();
132    }
133
134    private void QualityParameterOnActualNameChanged(object sender, EventArgs eventArgs) {
135      ParameterizeAnalyzers();
136      ParameterizeOperators();
137    }
138
139    private void ParameterizeAnalyzers() {
140      var analyzers = Operators.OfType<IAnalyzer>();
141      foreach (var o in analyzers.OfType<ISymbolicExpressionTreeAnalyzer>()) {
142        o.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
143      }
144      foreach (var o in analyzers.OfType<BestSolutionAnalyzer>()) {
145        o.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
146      }
147    }
148
149    private void ParameterizeOperators() {
150      var operators = Parameters
151        .OfType<IValueParameter>()
152        .Select(p => p.Value)
153        .OfType<IOperator>()
154        .Union(Operators);
155      foreach (var o in operators.OfType<ISymbolicExpressionTreeGrammarBasedOperator>()) {
156        o.SymbolicExpressionTreeGrammarParameter.ActualName = LawnMowerGrammarParameterName;
157      }
158      foreach (var o in operators.OfType<ISymbolicExpressionTreeSizeConstraintOperator>()) {
159        o.MaximumSymbolicExpressionTreeDepthParameter.ActualName = MaxLawnMowerProgramDepthParameterName;
160        o.MaximumSymbolicExpressionTreeLengthParameter.ActualName = MaxLawnMowerProgramLengthParameterName;
161      }
162      foreach (var op in operators.OfType<Evaluator>()) {
163        op.LawnMowerProgramParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
164        op.LawnLengthParameter.ActualName = LawnLengthParameterName;
165        op.LawnWidthParameter.ActualName = LawnWidthParameterName;
166      }
167      foreach (var op in operators.OfType<ISymbolicExpressionTreeCrossover>()) {
168        op.ParentsParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
169        op.ChildParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
170      }
171      foreach (var op in operators.OfType<ISymbolicExpressionTreeManipulator>()) {
172        op.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
173      }
174      foreach (var op in operators.OfType<ISymbolicExpressionTreeCreator>()) {
175        op.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
176      }
177    }
178  }
179}
Note: See TracBrowser for help on using the repository browser.