Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs @ 5328

Last change on this file since 5328 was 5328, checked in by cneumuel, 14 years ago

#1215

  • minor fixes
File size: 13.6 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 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.Optimization;
28using HeuristicLab.Parameters;
29using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
30using HeuristicLab.PluginInfrastructure;
31using HeuristicLab.Algorithms.GeneticAlgorithm;
32using HeuristicLab.Problems.TestFunctions;
33
34namespace HeuristicLab.Problems.MetaOptimization {
35  [Item("Meta Optimization Problem", "Represents a Meta Optimization Problem.")]
36  [Creatable("Problems")]
37  [StorableClass]
38  public sealed class MetaOptimizationProblem : SingleObjectiveProblem<IParameterConfigurationEvaluator, IParameterConfigurationCreator> {
39    public const string AlgorithmTypeParameterName = "AlgorithmType";
40    public const string ProblemTypeParameterName = "ProblemType";
41    public const string ProblemsParameterName = "Problems";
42    public const string ParameterConfigurationTreeParameterName = "ParameterConfiguration";
43    public const string RepetitionsParameterName = "Repetitions";
44
45    public const string IntValueManipulatorParameterName = "IntValueManipulator";
46    public const string DoubleValueManipulatorParameterName = "DoubleValueManipulator";
47    public const string IntValueCrossoverParameterName = "IntValueCrossover";
48    public const string DoubleValueCrossoverParameterName = "DoubleValueCrossover";
49
50    #region Parameter Properties
51    public IValueParameter<ConstrainedTypeValue<EngineAlgorithm>> AlgorithmTypeParameter {
52      get { return (ValueParameter<ConstrainedTypeValue<EngineAlgorithm>>)Parameters[AlgorithmTypeParameterName]; }
53    }
54    public IValueParameter<ConstrainedTypeValue<ISingleObjectiveProblem>> ProblemTypeParameter {
55      get { return (ValueParameter<ConstrainedTypeValue<ISingleObjectiveProblem>>)Parameters[ProblemTypeParameterName]; }
56    }
57    public IValueParameter<ConstrainedItemList<ISingleObjectiveProblem>> ProblemsParameter {
58      get { return (ValueParameter<ConstrainedItemList<ISingleObjectiveProblem>>)Parameters[ProblemsParameterName]; }
59    }
60    public IValueParameter<ParameterConfigurationTree> ParameterConfigurationTreeParameter {
61      get { return (ValueParameter<ParameterConfigurationTree>)Parameters[ParameterConfigurationTreeParameterName]; }
62    }
63    public IValueParameter<IntValue> RepetitionsParameter {
64      get { return (ValueParameter<IntValue>)Parameters[RepetitionsParameterName]; }
65    }
66
67    public IValueParameter<IIntValueManipulator> IntValueManipulatorParameter {
68      get { return (ValueParameter<IIntValueManipulator>)Parameters[IntValueManipulatorParameterName]; }
69    }
70
71    public IValueParameter<IDoubleValueManipulator> DoubleValueManipulatorParameter {
72      get { return (ValueParameter<IDoubleValueManipulator>)Parameters[DoubleValueManipulatorParameterName]; }
73    }
74    #endregion
75
76    #region Properties
77    public EngineAlgorithm Algorithm {
78      get { return CreateAlgorithm(AlgorithmType.Value, ProblemType.Value); }
79    }
80    public ConstrainedTypeValue<EngineAlgorithm> AlgorithmType {
81      get { return AlgorithmTypeParameter.Value; }
82      set { AlgorithmTypeParameter.Value = value; }
83    }
84    public ConstrainedTypeValue<ISingleObjectiveProblem> ProblemType {
85      get { return ProblemTypeParameter.Value; }
86      set { ProblemTypeParameter.Value = value; }
87    }
88    public ConstrainedItemList<ISingleObjectiveProblem> Problems {
89      get { return ProblemsParameter.Value; }
90      set { ProblemsParameter.Value = value; }
91    }
92    public ParameterConfigurationTree ParameterConfigurationTree {
93      get { return ParameterConfigurationTreeParameter.Value; }
94      set { ParameterConfigurationTreeParameter.Value = value; }
95    }
96    public IntValue Repetitions {
97      get { return RepetitionsParameter.Value; }
98      set { RepetitionsParameter.Value = value; }
99    }
100    private BestParameterConfigurationAnalyzer BestParameterConfigurationAnalyzer {
101      get { return Operators.OfType<BestParameterConfigurationAnalyzer>().FirstOrDefault(); }
102    }
103    private ReferenceQualityAnalyzer ReferenceQualityAnalyzer {
104      get { return Operators.OfType<ReferenceQualityAnalyzer>().FirstOrDefault(); }
105    }
106    private RunsAnalyzer RunsAnalyzer {
107      get { return Operators.OfType<RunsAnalyzer>().FirstOrDefault(); }
108    }
109    #endregion
110
111    public MetaOptimizationProblem()
112      : base() {
113      Parameters.Add(new ValueParameter<ConstrainedTypeValue<EngineAlgorithm>>(AlgorithmTypeParameterName, "The algorithm which's parameters should be optimized.", new ConstrainedTypeValue<EngineAlgorithm>(typeof(GeneticAlgorithm))));
114      Parameters.Add(new ValueParameter<ConstrainedTypeValue<ISingleObjectiveProblem>>(ProblemTypeParameterName, "The problem type.", new ConstrainedTypeValue<ISingleObjectiveProblem>(typeof(SingleObjectiveTestFunctionProblem))));
115      Parameters.Add(new ValueParameter<ConstrainedItemList<ISingleObjectiveProblem>>(ProblemsParameterName, "The problems that should be evaluated.", new ConstrainedItemList<ISingleObjectiveProblem>()));
116      Parameters.Add(new ValueParameter<ParameterConfigurationTree>(ParameterConfigurationTreeParameterName, "Tree of algorithm parameters that should be optimized."));
117      Parameters.Add(new ValueParameter<IntValue>(RepetitionsParameterName, "The number of evaluations for each problem.", new IntValue(3)));
118
119      var validIntManipulators = new ItemSet<IIntValueManipulator>(ApplicationManager.Manager.GetInstances<IIntValueManipulator>());
120      var validDoubleManipulators = new ItemSet<IDoubleValueManipulator>(ApplicationManager.Manager.GetInstances<IDoubleValueManipulator>());
121      var validIntCrossovers = new ItemSet<IIntValueCrossover>(ApplicationManager.Manager.GetInstances<IIntValueCrossover>());
122      var validDoubleCrossovers = new ItemSet<IDoubleValueCrossover>(ApplicationManager.Manager.GetInstances<IDoubleValueCrossover>());
123      Parameters.Add(new ConstrainedValueParameter<IIntValueManipulator>(IntValueManipulatorParameterName, "", validIntManipulators, validIntManipulators.Where(x => x.GetType() == typeof(NormalIntValueManipulator)).SingleOrDefault()));
124      Parameters.Add(new ConstrainedValueParameter<IDoubleValueManipulator>(DoubleValueManipulatorParameterName, "", validDoubleManipulators, validDoubleManipulators.Where(x => x.GetType() == typeof(NormalDoubleValueManipulator)).SingleOrDefault()));
125      Parameters.Add(new ConstrainedValueParameter<IIntValueCrossover>(IntValueCrossoverParameterName, "", validIntCrossovers, validIntCrossovers.Where(x => x.GetType() == typeof(NormalIntValueCrossover)).SingleOrDefault()));
126      Parameters.Add(new ConstrainedValueParameter<IDoubleValueCrossover>(DoubleValueCrossoverParameterName, "", validDoubleCrossovers, validDoubleCrossovers.Where(x => x.GetType() == typeof(NormalDoubleValueCrossover)).SingleOrDefault()));
127
128      Maximization = new BoolValue(false);
129      SolutionCreator = new RandomParameterConfigurationCreator();
130      Evaluator = new ParameterConfigurationEvaluator();
131
132      InitializeOperators();
133      RegisterParameterEvents();
134      ParameterizeAnalyzer();
135      ParameterizeSolutionCreator();
136      ParameterizeEvaluator();
137      ParameterizeOperators();
138
139      ProblemTypeParameter_ValueChanged(this, EventArgs.Empty);
140    }
141
142    [StorableConstructor]
143    private MetaOptimizationProblem(bool deserializing) : base(deserializing) { }
144    private MetaOptimizationProblem(MetaOptimizationProblem original, Cloner cloner)
145      : base(original, cloner) {
146      this.RegisterParameterEvents();
147    }
148    public override IDeepCloneable Clone(Cloner cloner) {
149      return new MetaOptimizationProblem(this, cloner);
150    }
151
152    #region Helpers
153    [StorableHook(HookType.AfterDeserialization)]
154    private void AfterDeserializationHook() {
155      RegisterParameterEvents();
156    }
157    private void RegisterParameterEvents() {
158      SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
159      EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
160      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
161      AlgorithmTypeParameter.ValueChanged += new EventHandler(AlgorithmTypeParameter_ValueChanged);
162      AlgorithmType.ValueChanged += new EventHandler(AlgorithmType_ValueChanged);
163      ProblemTypeParameter.ValueChanged += new EventHandler(ProblemTypeParameter_ValueChanged);
164      ProblemType.ValueChanged += new EventHandler(ProblemType_ValueChanged);
165    }
166
167    private void InitializeOperators() {
168      Operators.AddRange(ApplicationManager.Manager.GetInstances<IParameterConfigurationOperator>().Cast<IOperator>());
169      Operators.Add(new BestParameterConfigurationAnalyzer());
170      Operators.Add(new ReferenceQualityAnalyzer());
171      Operators.Add(new RunsAnalyzer());
172    }
173    private void ParameterizeSolutionCreator() {
174    }
175    private void ParameterizeEvaluator() {
176      ((ParameterConfigurationEvaluator)Evaluator).ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
177    }
178    private void ParameterizeAnalyzer() {
179      if (BestParameterConfigurationAnalyzer != null) {
180        BestParameterConfigurationAnalyzer.ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
181      }
182      if (ReferenceQualityAnalyzer != null) {
183        ReferenceQualityAnalyzer.ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
184      }
185      if (RunsAnalyzer != null) {
186        RunsAnalyzer.ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
187      }
188    }
189    private void ParameterizeOperators() {
190      foreach (IParameterConfigurationCrossover op in Operators.OfType<IParameterConfigurationCrossover>()) {
191        op.ParentsParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
192        op.ChildParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
193      }
194      foreach (IParameterConfigurationManipulator op in Operators.OfType<IParameterConfigurationManipulator>()) {
195        op.ParameterConfigurationTreeParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
196      }
197    }
198
199    #endregion
200
201    #region Events
202
203    private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
204      ParameterizeSolutionCreator();
205      ParameterizeEvaluator();
206      ParameterizeAnalyzer();
207      ParameterizeOperators();
208      OnSolutionCreatorChanged();
209    }
210    private void EvaluatorParameter_ValueChanged(object sender, EventArgs e) {
211      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
212      ParameterizeEvaluator();
213      ParameterizeAnalyzer();
214      OnEvaluatorChanged();
215    }
216    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
217      ParameterizeAnalyzer();
218    }
219    private void AlgorithmTypeParameter_ValueChanged(object sender, EventArgs e) {
220      AlgorithmType_ValueChanged(sender, e);
221    }
222
223    private void AlgorithmType_ValueChanged(object sender, EventArgs e) {
224      ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(CreateAlgorithm(AlgorithmType.Value, ProblemType.Value));
225    }
226
227    private void ProblemTypeParameter_ValueChanged(object sender, EventArgs e) {
228      ProblemType_ValueChanged(sender, e);
229    }
230
231    private void ProblemType_ValueChanged(object sender, EventArgs e) {
232      Problems.Clear();
233      Problems.Type = ProblemType.Value;
234      ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(CreateAlgorithm(AlgorithmType.Value, ProblemType.Value));
235    }
236    #endregion
237
238    private EngineAlgorithm CreateAlgorithm(Type algorithmType, Type problemType) {
239      EngineAlgorithm algorithm = (EngineAlgorithm)Activator.CreateInstance(algorithmType);
240      algorithm.Problem = (IProblem)Activator.CreateInstance(problemType);
241      return algorithm;
242    }
243
244    public void ImportAlgorithm(EngineAlgorithm algorithm) {
245      AlgorithmType.Value = algorithm.GetType();
246      if(algorithm.Problem != null) ProblemType.Value = algorithm.Problem.GetType();
247      ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(algorithm);
248      if(algorithm.Problem != null) Problems.Add((ISingleObjectiveProblem)algorithm.Problem);
249    }
250  }
251}
Note: See TracBrowser for help on using the repository browser.