Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Algorithms.EvolutionStrategy/3.3/EvolutionStrategyMainLoop.cs @ 3336

Last change on this file since 3336 was 3336, checked in by abeham, 14 years ago

updated Evolution Stratgy #932
StrategyParameters moved completely out of the ES into the encoding and problem, because they are inherently problem specific
The ProblemDimension and a few other parameters of ES were removed
Fixed a few bugs also and added some documentation

File size: 43.0 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 HeuristicLab.Analysis;
23using HeuristicLab.Core;
24using HeuristicLab.Data;
25using HeuristicLab.Operators;
26using HeuristicLab.Optimization.Operators;
27using HeuristicLab.Parameters;
28using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
29using HeuristicLab.Selection;
30
31namespace HeuristicLab.Algorithms.EvolutionStrategy {
32  /// <summary>
33  /// An operator which represents the main loop of an evolution strategy (EvolutionStrategy).
34  /// </summary>
35  [Item("EvolutionStrategyMainLoop", "An operator which represents the main loop of an evolution strategy (EvolutionStrategy).")]
36  [StorableClass]
37  public sealed class EvolutionStrategyMainLoop : AlgorithmOperator {
38    #region Parameter properties
39    public ValueLookupParameter<IRandom> RandomParameter {
40      get { return (ValueLookupParameter<IRandom>)Parameters["Random"]; }
41    }
42    public ValueLookupParameter<BoolValue> MaximizationParameter {
43      get { return (ValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
44    }
45    public SubScopesLookupParameter<DoubleValue> QualityParameter {
46      get { return (SubScopesLookupParameter<DoubleValue>)Parameters["Quality"]; }
47    }
48    public ValueLookupParameter<DoubleValue> BestKnownQualityParameter {
49      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
50    }
51    public ValueLookupParameter<IntValue> PopulationSizeParameter {
52      get { return (ValueLookupParameter<IntValue>)Parameters["PopulationSize"]; }
53    }
54    public ValueLookupParameter<IntValue> ParentsPerChildParameter {
55      get { return (ValueLookupParameter<IntValue>)Parameters["ParentsPerChild"]; }
56    }
57    public ValueLookupParameter<IntValue> ChildrenParameter {
58      get { return (ValueLookupParameter<IntValue>)Parameters["Children"]; }
59    }
60    public ValueLookupParameter<BoolValue> PlusSelectionParameter {
61      get { return (ValueLookupParameter<BoolValue>)Parameters["PlusSelection"]; }
62    }
63    public ValueLookupParameter<IntValue> MaximumGenerationsParameter {
64      get { return (ValueLookupParameter<IntValue>)Parameters["MaximumGenerations"]; }
65    }
66    public ValueLookupParameter<IOperator> MutatorParameter {
67      get { return (ValueLookupParameter<IOperator>)Parameters["Mutator"]; }
68    }
69    public ValueLookupParameter<IOperator> RecombinatorParameter {
70      get { return (ValueLookupParameter<IOperator>)Parameters["Recombinator"]; }
71    }
72    public ValueLookupParameter<IOperator> EvaluatorParameter {
73      get { return (ValueLookupParameter<IOperator>)Parameters["Evaluator"]; }
74    }
75    public ValueLookupParameter<VariableCollection> ResultsParameter {
76      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
77    }
78    public ValueLookupParameter<IOperator> VisualizerParameter {
79      get { return (ValueLookupParameter<IOperator>)Parameters["Visualizer"]; }
80    }
81    public LookupParameter<IItem> VisualizationParameter {
82      get { return (LookupParameter<IItem>)Parameters["Visualization"]; }
83    }
84    private ScopeParameter CurrentScopeParameter {
85      get { return (ScopeParameter)Parameters["CurrentScope"]; }
86    }
87    private ValueLookupParameter<IOperator> StrategyParameterManipulatorParameter {
88      get { return (ValueLookupParameter<IOperator>)Parameters["StrategyParameterManipulator"]; }
89    }
90    private ValueLookupParameter<IOperator> StrategyParameterCrossoverParameter {
91      get { return (ValueLookupParameter<IOperator>)Parameters["StrategyParameterCrossover"]; }
92    }
93
94    public IScope CurrentScope {
95      get { return CurrentScopeParameter.ActualValue; }
96    }
97    #endregion
98
99    [StorableConstructor]
100    private EvolutionStrategyMainLoop(bool deserializing) : base() { }
101    public EvolutionStrategyMainLoop()
102      : base() {
103      Initialize();
104    }
105
106    private void Initialize() {
107      #region Create parameters
108      Parameters.Add(new ValueLookupParameter<IRandom>("Random", "A pseudo random number generator."));
109      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, otherwise false."));
110      Parameters.Add(new SubScopesLookupParameter<DoubleValue>("Quality", "The value which represents the quality of a solution."));
111      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestKnownQuality", "The best known quality value found so far."));
112      Parameters.Add(new ValueLookupParameter<IntValue>("PopulationSize", "µ (mu) - the size of the population."));
113      Parameters.Add(new ValueLookupParameter<IntValue>("ParentsPerChild", "ρ (rho) - how many parents should be recombined."));
114      Parameters.Add(new ValueLookupParameter<IntValue>("Children", "λ (lambda) - the size of the offspring population."));
115      Parameters.Add(new ValueLookupParameter<IntValue>("MaximumGenerations", "The maximum number of generations which should be processed."));
116      Parameters.Add(new ValueLookupParameter<BoolValue>("PlusSelection", "True for plus selection (elitist population), false for comma selection (non-elitist population)."));
117      Parameters.Add(new ValueLookupParameter<IOperator>("Mutator", "The operator used to mutate solutions."));
118      Parameters.Add(new ValueLookupParameter<IOperator>("Recombinator", "The operator used to cross solutions."));
119      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions."));
120      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The variable collection where results should be stored."));
121      Parameters.Add(new ValueLookupParameter<IOperator>("Visualizer", "The operator used to visualize solutions."));
122      Parameters.Add(new LookupParameter<IItem>("Visualization", "The item which represents the visualization of solutions."));
123      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope which represents a population of solutions on which the EvolutionStrategy should be applied."));
124      Parameters.Add(new ValueLookupParameter<IOperator>("StrategyParameterManipulator", "The operator to mutate the endogeneous strategy parameters."));
125      Parameters.Add(new ValueLookupParameter<IOperator>("StrategyParameterCrossover", "The operator to cross the endogeneous strategy parameters."));
126      #endregion
127
128      #region Create operators
129      VariableCreator variableCreator = new VariableCreator();
130      BestQualityMemorizer bestQualityMemorizer1 = new BestQualityMemorizer();
131      BestQualityMemorizer bestQualityMemorizer2 = new BestQualityMemorizer();
132      BestAverageWorstQualityCalculator bestAverageWorstQualityCalculator1 = new BestAverageWorstQualityCalculator();
133      DataTableValuesCollector dataTableValuesCollector1 = new DataTableValuesCollector();
134      QualityDifferenceCalculator qualityDifferenceCalculator1 = new QualityDifferenceCalculator();
135      Placeholder visualizer1 = new Placeholder();
136      ResultsCollector resultsCollector = new ResultsCollector();
137      WithoutRepeatingBatchedRandomSelector selector = new WithoutRepeatingBatchedRandomSelector();
138      SubScopesProcessor subScopesProcessor1 = new SubScopesProcessor();
139      Comparator useRecombinationComparator = new Comparator();
140      ConditionalBranch useRecombinationBranch = new ConditionalBranch();
141      ChildrenCreator childrenCreator = new ChildrenCreator();
142      UniformSubScopesProcessor uniformSubScopesProcessor1 = new UniformSubScopesProcessor();
143      Placeholder recombinator = new Placeholder();
144      Placeholder strategyRecombinator = new Placeholder();
145      Placeholder strategyMutator1 = new Placeholder();
146      Placeholder mutator1 = new Placeholder();
147      Placeholder evaluator1 = new Placeholder();
148      SubScopesRemover subScopesRemover = new SubScopesRemover();
149      UniformSubScopesProcessor uniformSubScopesProcessor2 = new UniformSubScopesProcessor();
150      Placeholder strategyMutator2 = new Placeholder();
151      Placeholder mutator2 = new Placeholder();
152      Placeholder evaluator2 = new Placeholder();
153      ConditionalBranch plusOrCommaReplacementBranch = new ConditionalBranch();
154      MergingReducer plusReplacement = new MergingReducer();
155      RightReducer commaReplacement = new RightReducer();
156      BestSelector bestSelector = new BestSelector();
157      RightReducer rightReducer = new RightReducer();
158      IntCounter intCounter = new IntCounter();
159      Comparator comparator = new Comparator();
160      BestQualityMemorizer bestQualityMemorizer3 = new BestQualityMemorizer();
161      BestQualityMemorizer bestQualityMemorizer4 = new BestQualityMemorizer();
162      BestAverageWorstQualityCalculator bestAverageWorstQualityCalculator2 = new BestAverageWorstQualityCalculator();
163      DataTableValuesCollector dataTableValuesCollector2 = new DataTableValuesCollector();
164      QualityDifferenceCalculator qualityDifferenceCalculator2 = new QualityDifferenceCalculator();
165      Placeholder visualizer2 = new Placeholder();
166      ConditionalBranch conditionalBranch = new ConditionalBranch();
167
168      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Generations", new IntValue(0)));
169
170      bestQualityMemorizer1.BestQualityParameter.ActualName = "BestQuality";
171      bestQualityMemorizer1.MaximizationParameter.ActualName = MaximizationParameter.Name;
172      bestQualityMemorizer1.QualityParameter.ActualName = QualityParameter.Name;
173
174      bestQualityMemorizer2.BestQualityParameter.ActualName = BestKnownQualityParameter.Name;
175      bestQualityMemorizer2.MaximizationParameter.ActualName = MaximizationParameter.Name;
176      bestQualityMemorizer2.QualityParameter.ActualName = QualityParameter.Name;
177
178      bestAverageWorstQualityCalculator1.AverageQualityParameter.ActualName = "CurrentAverageQuality";
179      bestAverageWorstQualityCalculator1.BestQualityParameter.ActualName = "CurrentBestQuality";
180      bestAverageWorstQualityCalculator1.MaximizationParameter.ActualName = MaximizationParameter.Name;
181      bestAverageWorstQualityCalculator1.QualityParameter.ActualName = QualityParameter.Name;
182      bestAverageWorstQualityCalculator1.WorstQualityParameter.ActualName = "CurrentWorstQuality";
183
184      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best Quality", null, "CurrentBestQuality"));
185      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Average Quality", null, "CurrentAverageQuality"));
186      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Worst Quality", null, "CurrentWorstQuality"));
187      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
188      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Known Quality", null, BestKnownQualityParameter.Name));
189      dataTableValuesCollector1.DataTableParameter.ActualName = "Qualities";
190
191      qualityDifferenceCalculator1.AbsoluteDifferenceParameter.ActualName = "AbsoluteDifferenceBestKnownToBest";
192      qualityDifferenceCalculator1.FirstQualityParameter.ActualName = BestKnownQualityParameter.Name;
193      qualityDifferenceCalculator1.RelativeDifferenceParameter.ActualName = "RelativeDifferenceBestKnownToBest";
194      qualityDifferenceCalculator1.SecondQualityParameter.ActualName = "BestQuality";
195
196      visualizer1.Name = "Visualizer (placeholder)";
197      visualizer1.OperatorParameter.ActualName = VisualizerParameter.Name;
198
199      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Generations"));
200      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best Quality", null, "CurrentBestQuality"));
201      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Average Quality", null, "CurrentAverageQuality"));
202      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Worst Quality", null, "CurrentWorstQuality"));
203      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
204      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Known Quality", null, BestKnownQualityParameter.Name));
205      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Absolute Difference of Best Known Quality to Best Quality", null, "AbsoluteDifferenceBestKnownToBest"));
206      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Relative Difference of Best Known Quality to Best Quality", null, "RelativeDifferenceBestKnownToBest"));
207      resultsCollector.CollectedValues.Add(new LookupParameter<IItem>("Solution Visualization", null, VisualizationParameter.Name));
208      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>("Qualities"));
209      resultsCollector.ResultsParameter.ActualName = ResultsParameter.Name;
210
211      selector.Name = "ES Random Selector";
212      selector.ParentsPerChildParameter.ActualName = ParentsPerChildParameter.Name;
213      selector.ChildrenParameter.ActualName = ChildrenParameter.Name;
214
215      useRecombinationComparator.Name = "ParentsPerChild > 1";
216      useRecombinationComparator.LeftSideParameter.ActualName = ParentsPerChildParameter.Name;
217      useRecombinationComparator.RightSideParameter.Value = new IntValue(1);
218      useRecombinationComparator.Comparison = new Comparison(ComparisonType.Greater);
219      useRecombinationComparator.ResultParameter.ActualName = "UseRecombination";
220
221      useRecombinationBranch.Name = "Use Recombination?";
222      useRecombinationBranch.ConditionParameter.ActualName = "UseRecombination";
223
224      childrenCreator.ParentsPerChild = null;
225      childrenCreator.ParentsPerChildParameter.ActualName = ParentsPerChildParameter.Name;
226
227      recombinator.Name = "Recombinator (placeholder)";
228      recombinator.OperatorParameter.ActualName = RecombinatorParameter.Name;
229
230      strategyRecombinator.Name = "Strategy Parameter Recombinator (placeholder)";
231      strategyRecombinator.OperatorParameter.ActualName = StrategyParameterCrossoverParameter.Name;
232
233      strategyMutator1.Name = "Strategy Parameter Manipulator (placeholder)";
234      strategyMutator1.OperatorParameter.ActualName = StrategyParameterManipulatorParameter.Name;
235
236      mutator1.Name = "Mutator (placeholder)";
237      mutator1.OperatorParameter.ActualName = MutatorParameter.Name;
238
239      evaluator1.Name = "Evaluator (placeholder)";
240      evaluator1.OperatorParameter.ActualName = EvaluatorParameter.Name;
241
242      subScopesRemover.RemoveAllSubScopes = true;
243
244      strategyMutator2.Name = "Strategy Parameter Manipulator (placeholder)";
245      strategyMutator2.OperatorParameter.ActualName = StrategyParameterManipulatorParameter.Name;
246
247      mutator2.Name = "Mutator (placeholder)";
248      mutator2.OperatorParameter.ActualName = MutatorParameter.Name;
249
250      evaluator2.Name = "Evaluator (placeholder)";
251      evaluator2.OperatorParameter.ActualName = EvaluatorParameter.Name;
252
253      plusOrCommaReplacementBranch.ConditionParameter.ActualName = PlusSelectionParameter.Name;
254
255      bestSelector.CopySelected = new BoolValue(false);
256      bestSelector.MaximizationParameter.ActualName = MaximizationParameter.Name;
257      bestSelector.NumberOfSelectedSubScopesParameter.ActualName = PopulationSizeParameter.Name;
258      bestSelector.QualityParameter.ActualName = QualityParameter.Name;
259
260      intCounter.Increment = new IntValue(1);
261      intCounter.ValueParameter.ActualName = "Generations";
262
263      comparator.Comparison = new Comparison(ComparisonType.GreaterOrEqual);
264      comparator.LeftSideParameter.ActualName = "Generations";
265      comparator.ResultParameter.ActualName = "Terminate";
266      comparator.RightSideParameter.ActualName = MaximumGenerationsParameter.Name;
267
268      bestQualityMemorizer3.BestQualityParameter.ActualName = "BestQuality";
269      bestQualityMemorizer3.MaximizationParameter.ActualName = MaximizationParameter.Name;
270      bestQualityMemorizer3.QualityParameter.ActualName = QualityParameter.Name;
271
272      bestQualityMemorizer4.BestQualityParameter.ActualName = BestKnownQualityParameter.Name;
273      bestQualityMemorizer4.MaximizationParameter.ActualName = MaximizationParameter.Name;
274      bestQualityMemorizer4.QualityParameter.ActualName = QualityParameter.Name;
275
276      bestAverageWorstQualityCalculator2.AverageQualityParameter.ActualName = "CurrentAverageQuality";
277      bestAverageWorstQualityCalculator2.BestQualityParameter.ActualName = "CurrentBestQuality";
278      bestAverageWorstQualityCalculator2.MaximizationParameter.ActualName = MaximizationParameter.Name;
279      bestAverageWorstQualityCalculator2.QualityParameter.ActualName = QualityParameter.Name;
280      bestAverageWorstQualityCalculator2.WorstQualityParameter.ActualName = "CurrentWorstQuality";
281
282      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best Quality", null, "CurrentBestQuality"));
283      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Average Quality", null, "CurrentAverageQuality"));
284      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Worst Quality", null, "CurrentWorstQuality"));
285      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
286      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Known Quality", null, BestKnownQualityParameter.Name));
287      dataTableValuesCollector2.DataTableParameter.ActualName = "Qualities";
288
289      qualityDifferenceCalculator2.AbsoluteDifferenceParameter.ActualName = "AbsoluteDifferenceBestKnownToBest";
290      qualityDifferenceCalculator2.FirstQualityParameter.ActualName = BestKnownQualityParameter.Name;
291      qualityDifferenceCalculator2.RelativeDifferenceParameter.ActualName = "RelativeDifferenceBestKnownToBest";
292      qualityDifferenceCalculator2.SecondQualityParameter.ActualName = "BestQuality";
293
294      visualizer2.Name = "Visualizer (placeholder)";
295      visualizer2.OperatorParameter.ActualName = VisualizerParameter.Name;
296
297      conditionalBranch.ConditionParameter.ActualName = "Terminate";
298      #endregion
299
300      #region Create operator graph
301      OperatorGraph.InitialOperator = variableCreator;
302      variableCreator.Successor = bestQualityMemorizer1;
303      bestQualityMemorizer1.Successor = bestQualityMemorizer2;
304      bestQualityMemorizer2.Successor = bestAverageWorstQualityCalculator1;
305      bestAverageWorstQualityCalculator1.Successor = dataTableValuesCollector1;
306      dataTableValuesCollector1.Successor = qualityDifferenceCalculator1;
307      qualityDifferenceCalculator1.Successor = visualizer1;
308      visualizer1.Successor = resultsCollector;
309      resultsCollector.Successor = selector;
310      selector.Successor = subScopesProcessor1;
311      subScopesProcessor1.Operators.Add(new EmptyOperator());
312      subScopesProcessor1.Operators.Add(useRecombinationComparator);
313      subScopesProcessor1.Successor = plusOrCommaReplacementBranch;
314      useRecombinationComparator.Successor = useRecombinationBranch;
315      useRecombinationBranch.TrueBranch = childrenCreator;
316      useRecombinationBranch.FalseBranch = uniformSubScopesProcessor2;
317      useRecombinationBranch.Successor = null;
318      childrenCreator.Successor = uniformSubScopesProcessor1;
319      uniformSubScopesProcessor1.Operator = recombinator;
320      uniformSubScopesProcessor1.Successor = null;
321      recombinator.Successor = strategyRecombinator;
322      strategyRecombinator.Successor = strategyMutator1;
323      strategyMutator1.Successor = mutator1;
324      mutator1.Successor = evaluator1;
325      evaluator1.Successor = subScopesRemover;
326      subScopesRemover.Successor = null;
327      uniformSubScopesProcessor2.Operator = strategyMutator2;
328      uniformSubScopesProcessor2.Successor = null;
329      strategyMutator2.Successor = mutator2;
330      mutator2.Successor = evaluator2;
331      plusOrCommaReplacementBranch.TrueBranch = plusReplacement;
332      plusOrCommaReplacementBranch.FalseBranch = commaReplacement;
333      plusOrCommaReplacementBranch.Successor = bestSelector;
334      bestSelector.Successor = rightReducer;
335      rightReducer.Successor = intCounter;
336      intCounter.Successor = comparator;
337      comparator.Successor = bestQualityMemorizer3;
338      bestQualityMemorizer3.Successor = bestQualityMemorizer4;
339      bestQualityMemorizer4.Successor = bestAverageWorstQualityCalculator2;
340      bestAverageWorstQualityCalculator2.Successor = dataTableValuesCollector2;
341      dataTableValuesCollector2.Successor = qualityDifferenceCalculator2;
342      qualityDifferenceCalculator2.Successor = visualizer2;
343      visualizer2.Successor = conditionalBranch;
344      conditionalBranch.FalseBranch = selector;
345      conditionalBranch.TrueBranch = null;
346      conditionalBranch.Successor = null;
347      #endregion
348    }
349  }
350}
Note: See TracBrowser for help on using the repository browser.