Free cookie consent management tool by TermsFeed Policy Generator

source: branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/Alps.cs @ 12484

Last change on this file since 12484 was 12271, checked in by pfleck, 10 years ago

#2269 Added AgeInheritance as own type and value for consistent configuration.

File size: 16.8 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2015 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.Analysis;
25using HeuristicLab.Collections;
26using HeuristicLab.Common;
27using HeuristicLab.Core;
28using HeuristicLab.Data;
29using HeuristicLab.Operators;
30using HeuristicLab.Optimization;
31using HeuristicLab.Optimization.Operators;
32using HeuristicLab.Parameters;
33using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
34using HeuristicLab.Random;
35
36namespace HeuristicLab.Algorithms.ALPS {
37  [Item("ALPS", "Base class for all ALPS-based algorithms.")]
38  [StorableClass]
39  public abstract class Alps : HeuristicOptimizationEngineAlgorithm, IStorableContent {
40    public string Filename { get; set; }
41
42    #region Problem Properties
43    public override Type ProblemType {
44      get { return typeof(ISingleObjectiveHeuristicOptimizationProblem); }
45    }
46    public new ISingleObjectiveHeuristicOptimizationProblem Problem {
47      get { return (ISingleObjectiveHeuristicOptimizationProblem)base.Problem; }
48      set { base.Problem = value; }
49    }
50    #endregion
51
52    #region Parameter Properties
53    private IValueParameter<IntValue> SeedParameter {
54      get { return (IValueParameter<IntValue>)Parameters["Seed"]; }
55    }
56    private IValueParameter<BoolValue> SetSeedRandomlyParameter {
57      get { return (IValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
58    }
59    private IFixedValueParameter<MultiAnalyzer> AnalyzerParameter {
60      get { return (IFixedValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
61    }
62    private IFixedValueParameter<MultiAnalyzer> LayerAnalyzerParameter {
63      get { return (IFixedValueParameter<MultiAnalyzer>)Parameters["LayerAnalyzer"]; }
64    }
65    private IValueParameter<IntValue> NumberOfLayersParameter {
66      get { return (IValueParameter<IntValue>)Parameters["NumberOfLayers"]; }
67    }
68    private IValueParameter<EnumValue<AgingScheme>> AgingSchemeParameter {
69      get { return (IValueParameter<EnumValue<AgingScheme>>)Parameters["AgingScheme"]; }
70    }
71    private IValueParameter<IntValue> AgeGapParameter {
72      get { return (IValueParameter<IntValue>)Parameters["AgeGap"]; }
73    }
74    private IValueParameter<IntArray> AgeLimitsParameter {
75      get { return (IValueParameter<IntArray>)Parameters["AgeLimits"]; }
76    }
77    private IValueParameter<EnumValue<AgeInheritance>> AgeInheritanceParameter {
78      get { return (IValueParameter<EnumValue<AgeInheritance>>)Parameters["AgeInheritance"]; }
79    }
80    private IValueParameter<ReductionOperation> AgeInheritanceReductionParameter {
81      get { return (IValueParameter<ReductionOperation>)Parameters["AgeInheritanceReduction"]; }
82    }
83    private IValueParameter<IntValue> MatingPoolRangeParameter {
84      get { return (IValueParameter<IntValue>)Parameters["MatingPoolRange"]; }
85    }
86    private IValueParameter<PercentValue> MatingPoolSelectionPercentageParameter {
87      get { return (IValueLookupParameter<PercentValue>)Parameters["MatingPoolSelectionPercentage"]; }
88    }
89    #endregion
90
91    #region Properties
92    public IntValue Seed {
93      get { return SeedParameter.Value; }
94      set { SeedParameter.Value = value; }
95    }
96    public BoolValue SetSeedRandomly {
97      get { return SetSeedRandomlyParameter.Value; }
98      set { SetSeedRandomlyParameter.Value = value; }
99    }
100    public MultiAnalyzer Analyzer {
101      get { return AnalyzerParameter.Value; }
102    }
103    public MultiAnalyzer LayerAnalyzer {
104      get { return LayerAnalyzerParameter.Value; }
105    }
106    public IntValue NumberOfLayers {
107      get { return NumberOfLayersParameter.Value; }
108      set { NumberOfLayersParameter.Value = value; }
109    }
110    public EnumValue<AgingScheme> AgingScheme {
111      get { return AgingSchemeParameter.Value; }
112      set { AgingSchemeParameter.Value = value; }
113    }
114    public IntValue AgeGap {
115      get { return AgeGapParameter.Value; }
116      set { AgeGapParameter.Value = value; }
117    }
118    public IntArray AgeLimits {
119      get { return AgeLimitsParameter.Value; }
120      set { AgeLimitsParameter.Value = value; }
121    }
122    public EnumValue<AgeInheritance> AgeInheritance {
123      get { return AgeInheritanceParameter.Value; }
124      set { AgeInheritanceParameter.Value = value; }
125    }
126    private ReductionOperation AgeInheritanceReduction {
127      get { return AgeInheritanceReductionParameter.Value; }
128      set { AgeInheritanceReductionParameter.Value = value; }
129    }
130    public IntValue MatingPoolRange {
131      get { return MatingPoolRangeParameter.Value; }
132      set { MatingPoolRangeParameter.Value = value; }
133    }
134    public PercentValue MatingPoolSelectionPercentage {
135      get { return MatingPoolSelectionPercentageParameter.Value; }
136      set { MatingPoolSelectionPercentageParameter.Value = value; }
137    }
138    #endregion
139
140    #region Helper Properties
141    protected RandomCreator GlobalRandomCreator {
142      get { return (RandomCreator)OperatorGraph.InitialOperator; }
143    }
144    protected SolutionsCreator SolutionsCreator {
145      get { return OperatorGraph.Iterate().OfType<SolutionsCreator>().First(); }
146    }
147    #endregion
148
149    #region Preconfigured Analyzers
150    [Storable]
151    private BestAverageWorstQualityAnalyzer qualityAnalyzer;
152    [Storable]
153    private BestAverageWorstQualityAnalyzer layerQualityAnalyzer;
154    #endregion
155
156    [StorableConstructor]
157    protected Alps(bool deserializing)
158      : base(deserializing) { }
159    protected Alps(Alps original, Cloner cloner)
160      : base(original, cloner) {
161      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
162      layerQualityAnalyzer = cloner.Clone(original.layerQualityAnalyzer);
163      Initialize();
164    }
165
166    protected Alps()
167      : base() {
168      Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
169      Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
170      Parameters.Add(new FixedValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze the islands.", new MultiAnalyzer()));
171      Parameters.Add(new FixedValueParameter<MultiAnalyzer>("LayerAnalyzer", "The operator used to analyze each layer.", new MultiAnalyzer()));
172      Parameters.Add(new ValueParameter<IntValue>("NumberOfLayers", "The number of layers.", new IntValue(10)));
173      Parameters.Add(new ValueParameter<EnumValue<AgingScheme>>("AgingScheme", "The aging scheme for setting the age-limits for the layers.", new EnumValue<AgingScheme>(ALPS.AgingScheme.Polynomial)));
174      Parameters.Add(new ValueParameter<IntValue>("AgeGap", "The frequency of reseeding the lowest layer and scaling factor for the age-limits for the layers", new IntValue(20)));
175      Parameters.Add(new ValueParameter<IntArray>("AgeLimits", new IntArray(new int[0])) { Hidden = true });
176      Parameters.Add(new ValueParameter<EnumValue<AgeInheritance>>("AgeInheritance", "The operator for determining the age of an offspring based the parents' age.", new EnumValue<AgeInheritance>(ALPS.AgeInheritance.Older)));
177      Parameters.Add(new ValueParameter<ReductionOperation>("AgeInheritanceReduction") { Hidden = true });
178      Parameters.Add(new ValueParameter<IntValue>("MatingPoolRange", "The range of layers used for creating a mating pool. (1 = current + previous layer)", new IntValue(1)) { Hidden = true });
179      Parameters.Add(new ValueParameter<PercentValue>("MatingPoolSelectionPercentage", "Percentage of the previous layers used for creating a mating pool.", new PercentValue(1.0, restrictToUnitInterval: true)) { Hidden = true });
180
181      qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
182      layerQualityAnalyzer = new BestAverageWorstQualityAnalyzer();
183
184      ParameterizeAgeLimits();
185      ParameterizeAgeInheritanceReduction();
186
187      ParameterizeAnalyzers();
188      UpdateAnalyzers();
189
190      Initialize();
191    }
192
193
194    #region Events
195    public override void Prepare() {
196      if (Problem != null)
197        base.Prepare();
198    }
199
200    protected override void OnProblemChanged() {
201      base.OnProblemChanged();
202      ParameterizeStochasticOperator(Problem.SolutionCreator);
203      ParameterizeStochasticOperatorForLayer(Problem.Evaluator);
204      foreach (var @operator in Problem.Operators.OfType<IOperator>())
205        ParameterizeStochasticOperator(@operator);
206      ParameterizeSolutionsCreator();
207      ParameterizeAnalyzers();
208      UpdateAnalyzers();
209      Problem.Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
210    }
211    protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) {
212      base.Problem_SolutionCreatorChanged(sender, e);
213      ParameterizeStochasticOperator(Problem.SolutionCreator);
214      ParameterizeSolutionsCreator();
215    }
216    protected override void Problem_EvaluatorChanged(object sender, EventArgs e) {
217      base.Problem_EvaluatorChanged(sender, e);
218      ParameterizeStochasticOperatorForLayer(Problem.Evaluator);
219      ParameterizeSolutionsCreator();
220      ParameterizeAnalyzers();
221      Problem.Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
222    }
223
224    protected override void Problem_OperatorsChanged(object sender, EventArgs e) {
225      foreach (var @operator in Problem.Operators.OfType<IOperator>())
226        ParameterizeStochasticOperator(@operator);
227      UpdateAnalyzers();
228      base.Problem_OperatorsChanged(sender, e);
229    }
230    protected virtual void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
231      ParameterizeAnalyzers();
232    }
233
234    private void AgeGapParameter_ValueChanged(object sender, EventArgs e) {
235      AgeGap.ValueChanged += AgeGap_ValueChanged;
236      ParameterizeAgeLimits();
237    }
238    private void AgeGap_ValueChanged(object sender, EventArgs e) {
239      ParameterizeAgeLimits();
240    }
241    private void AgingSchemeParameter_ValueChanged(object sender, EventArgs e) {
242      AgingScheme.ValueChanged += AgingScheme_ValueChanged;
243      ParameterizeAgeLimits();
244    }
245    private void AgingScheme_ValueChanged(object sender, EventArgs e) {
246      ParameterizeAgeLimits();
247    }
248    private void NumberOfLayersParameter_ValueChanged(object sender, EventArgs e) {
249      NumberOfLayers.ValueChanged += NumberOfLayers_ValueChanged;
250      ParameterizeAgeLimits();
251    }
252    private void NumberOfLayers_ValueChanged(object sender, EventArgs e) {
253      ParameterizeAgeLimits();
254    }
255    private void AgeInheritanceParameter_ValueChanged(object sender, EventArgs e) {
256      AgeInheritance.ValueChanged += AgeInheritance_ValueChanged;
257      ParameterizeAgeInheritanceReduction();
258    }
259    private void AgeInheritance_ValueChanged(object sender, EventArgs e) {
260      ParameterizeAgeInheritanceReduction();
261    }
262    private void AnalyzerOperators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IAnalyzer>> e) {
263      foreach (var analyzer in e.Items) {
264        foreach (var parameter in analyzer.Value.Parameters.OfType<IScopeTreeLookupParameter>()) {
265          parameter.Depth = 2;
266        }
267      }
268    }
269    private void LayerAnalyzerOperators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IAnalyzer>> e) {
270      foreach (var analyzer in e.Items) {
271        IParameter resultParameter;
272        if (analyzer.Value.Parameters.TryGetValue("Results", out resultParameter)) {
273          var lookupParameter = resultParameter as ILookupParameter;
274          if (lookupParameter != null)
275            lookupParameter.ActualName = "LayerResults";
276        }
277        foreach (var parameter in analyzer.Value.Parameters.OfType<IScopeTreeLookupParameter>()) {
278          parameter.Depth = 1;
279        }
280      }
281    }
282    #endregion
283
284    #region Parameterization
285    private void Initialize() {
286      if (Problem != null)
287        Problem.Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
288      AgeGapParameter.ValueChanged += AgeGapParameter_ValueChanged;
289      AgeGap.ValueChanged += AgeGap_ValueChanged;
290      AgingSchemeParameter.ValueChanged += AgingSchemeParameter_ValueChanged;
291      AgingScheme.ValueChanged += AgingScheme_ValueChanged;
292      NumberOfLayersParameter.ValueChanged += NumberOfLayersParameter_ValueChanged;
293      NumberOfLayers.ValueChanged += NumberOfLayers_ValueChanged;
294      AgeInheritanceParameter.ValueChanged += AgeInheritanceParameter_ValueChanged;
295      AgeInheritance.ValueChanged += AgeInheritance_ValueChanged;
296      Analyzer.Operators.ItemsAdded += AnalyzerOperators_ItemsAdded;
297      LayerAnalyzer.Operators.ItemsAdded += LayerAnalyzerOperators_ItemsAdded;
298    }
299    private void ParameterizeSolutionsCreator() {
300      SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
301      SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
302    }
303    private void ParameterizeAnalyzers() {
304      qualityAnalyzer.ResultsParameter.ActualName = "Results";
305      qualityAnalyzer.ResultsParameter.Hidden = true;
306      qualityAnalyzer.QualityParameter.Depth = 2;
307      layerQualityAnalyzer.ResultsParameter.ActualName = "Results";
308      layerQualityAnalyzer.ResultsParameter.Hidden = true;
309      layerQualityAnalyzer.QualityParameter.Depth = 1;
310      if (Problem != null) {
311        qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
312        qualityAnalyzer.MaximizationParameter.Hidden = true;
313        qualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
314        qualityAnalyzer.QualityParameter.Hidden = true;
315        qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
316        qualityAnalyzer.BestKnownQualityParameter.Hidden = true;
317        layerQualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
318        layerQualityAnalyzer.MaximizationParameter.Hidden = true;
319        layerQualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
320        layerQualityAnalyzer.QualityParameter.Hidden = true;
321        layerQualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
322        layerQualityAnalyzer.BestKnownQualityParameter.Hidden = true;
323      }
324    }
325
326    private void ParameterizeAgeInheritanceReduction() {
327      AgeInheritanceReduction.Value = GetAgeInheritanceReduction(AgeInheritance.Value);
328    }
329    protected abstract ReductionOperations GetAgeInheritanceReduction(AgeInheritance ageInheritance);
330    private void ParameterizeAgeLimits() {
331      var scheme = AgingScheme.Value;
332      int ageGap = AgeGap.Value;
333      int numberOfLayers = NumberOfLayers.Value;
334      AgeLimits = scheme.CalculateAgeLimits(ageGap, numberOfLayers);
335    }
336    protected virtual void ParameterizeStochasticOperator(IOperator @operator) {
337      var stochasticOperator = @operator as IStochasticOperator;
338      if (stochasticOperator != null) {
339        stochasticOperator.RandomParameter.ActualName = "GlobalRandom";
340        stochasticOperator.RandomParameter.Hidden = true;
341      }
342    }
343    protected virtual void ParameterizeStochasticOperatorForLayer(IOperator @operator) {
344      var stochasticOperator = @operator as IStochasticOperator;
345      if (stochasticOperator != null) {
346        stochasticOperator.RandomParameter.ActualName = "LocalRandom";
347        stochasticOperator.RandomParameter.Hidden = true;
348      }
349    }
350    #endregion
351
352    #region Updates
353    private void UpdateAnalyzers() {
354      Analyzer.Operators.Clear();
355      LayerAnalyzer.Operators.Clear();
356
357      Analyzer.Operators.Add(qualityAnalyzer, qualityAnalyzer.EnabledByDefault);
358      LayerAnalyzer.Operators.Add(layerQualityAnalyzer, layerQualityAnalyzer.EnabledByDefault);
359
360      if (Problem != null) {
361        foreach (var analyzer in Problem.Operators.OfType<IAnalyzer>()) {
362          Analyzer.Operators.Add(analyzer, analyzer.EnabledByDefault);
363        }
364      }
365    }
366    #endregion
367  }
368}
Note: See TracBrowser for help on using the repository browser.