Free cookie consent management tool by TermsFeed Policy Generator

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

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

#2269

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