Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 12138 was 12138, checked in by pfleck, 9 years ago

#2350

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