source: branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithm.cs @ 13206

Last change on this file since 13206 was 13206, checked in by pfleck, 7 years ago

#2269 Fixed typos and renamed some stuff suggested by ascheibe and adapted project for mono.

  • The initialization of layer 0 is done similar to other algorithms where general initialization is done in the algorithm itself and variables used and produced during the main-loop is initialized in the main-loop-operator.
  • The GeneralizedRankSelector is used as default selector because it generally works the best (rank compensates the large quality range of multiple layers and high selection pressure via pressure-parameter). Proportional selection performs very badly because the selection pressure is too low for ALPS.
  • Concerning ReduceToPopulationSize in the EldersEmigrator, the behavior it is not completely clear in the original paper. Reducing the population to the population size seems the more logical way, therefore it is default. An empty layer could happen in extremely rare situations, but it never happens to me so far.
  • Concerning opening a new layer, when taking a closer look at the ages, all individual tends to be as old as possible, in the standard version with AgeInheritance==1. That means they usually get too old in exactly after the generation the AgeLimits for the current last layer states. This way it is not necessary to check if any individual becomes too old for the current last layer. For AgeInheritance<1 it can happen that there would actually be no need to open a new layer; however, it will be opened anyway.
File size: 34.2 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.PluginInfrastructure;
36using HeuristicLab.Random;
37using HeuristicLab.Selection;
38
39namespace HeuristicLab.Algorithms.ALPS {
40  [Item("ALPS Genetic Algorithm", "A genetic algorithm within an age-layered population structure as described in Gregory S. Hornby. 2006. ALPS: the age-layered population structure for reducing the problem of premature convergence. In Proceedings of the 8th annual conference on Genetic and evolutionary computation (GECCO '06). 815-822.")]
41  [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms, Priority = 160)]
42  [StorableClass]
43  public sealed class AlpsGeneticAlgorithm : HeuristicOptimizationEngineAlgorithm, IStorableContent {
44    public string Filename { get; set; }
45
46    #region Problem Properties
47    public override Type ProblemType {
48      get { return typeof(ISingleObjectiveHeuristicOptimizationProblem); }
49    }
50    public new ISingleObjectiveHeuristicOptimizationProblem Problem {
51      get { return (ISingleObjectiveHeuristicOptimizationProblem)base.Problem; }
52      set { base.Problem = value; }
53    }
54    #endregion
55
56    #region Parameter Properties
57    private IValueParameter<IntValue> SeedParameter {
58      get { return (IValueParameter<IntValue>)Parameters["Seed"]; }
59    }
60    private IValueParameter<BoolValue> SetSeedRandomlyParameter {
61      get { return (IValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
62    }
63
64    private IFixedValueParameter<MultiAnalyzer> AnalyzerParameter {
65      get { return (IFixedValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
66    }
67    private IFixedValueParameter<MultiAnalyzer> LayerAnalyzerParameter {
68      get { return (IFixedValueParameter<MultiAnalyzer>)Parameters["LayerAnalyzer"]; }
69    }
70
71    private IValueParameter<IntValue> NumberOfLayersParameter {
72      get { return (IValueParameter<IntValue>)Parameters["NumberOfLayers"]; }
73    }
74    private IValueParameter<IntValue> PopulationSizeParameter {
75      get { return (IValueParameter<IntValue>)Parameters["PopulationSize"]; }
76    }
77
78    public IConstrainedValueParameter<ISelector> SelectorParameter {
79      get { return (IConstrainedValueParameter<ISelector>)Parameters["Selector"]; }
80    }
81    public IConstrainedValueParameter<ICrossover> CrossoverParameter {
82      get { return (IConstrainedValueParameter<ICrossover>)Parameters["Crossover"]; }
83    }
84    public IConstrainedValueParameter<IManipulator> MutatorParameter {
85      get { return (IConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; }
86    }
87    private IValueParameter<PercentValue> MutationProbabilityParameter {
88      get { return (IValueParameter<PercentValue>)Parameters["MutationProbability"]; }
89    }
90    private IValueParameter<IntValue> ElitesParameter {
91      get { return (IValueParameter<IntValue>)Parameters["Elites"]; }
92    }
93    private IFixedValueParameter<BoolValue> ReevaluateElitesParameter {
94      get { return (IFixedValueParameter<BoolValue>)Parameters["ReevaluateElites"]; }
95    }
96    private IValueParameter<BoolValue> PlusSelectionParameter {
97      get { return (IValueParameter<BoolValue>)Parameters["PlusSelection"]; }
98    }
99
100    private IValueParameter<EnumValue<AgingScheme>> AgingSchemeParameter {
101      get { return (IValueParameter<EnumValue<AgingScheme>>)Parameters["AgingScheme"]; }
102    }
103    private IValueParameter<IntValue> AgeGapParameter {
104      get { return (IValueParameter<IntValue>)Parameters["AgeGap"]; }
105    }
106    private IValueParameter<DoubleValue> AgeInheritanceParameter {
107      get { return (IValueParameter<DoubleValue>)Parameters["AgeInheritance"]; }
108    }
109    private IValueParameter<IntArray> AgeLimitsParameter {
110      get { return (IValueParameter<IntArray>)Parameters["AgeLimits"]; }
111    }
112
113    private IValueParameter<IntValue> MatingPoolRangeParameter {
114      get { return (IValueParameter<IntValue>)Parameters["MatingPoolRange"]; }
115    }
116    private IValueParameter<BoolValue> ReduceToPopulationSizeParameter {
117      get { return (IValueParameter<BoolValue>)Parameters["ReduceToPopulationSize"]; }
118    }
119
120    private IValueParameter<MultiTerminator> TerminatorParameter {
121      get { return (IValueParameter<MultiTerminator>)Parameters["Terminator"]; }
122    }
123    #endregion
124
125    #region Properties
126    public IntValue Seed {
127      get { return SeedParameter.Value; }
128      set { SeedParameter.Value = value; }
129    }
130    public BoolValue SetSeedRandomly {
131      get { return SetSeedRandomlyParameter.Value; }
132      set { SetSeedRandomlyParameter.Value = value; }
133    }
134
135    public MultiAnalyzer Analyzer {
136      get { return AnalyzerParameter.Value; }
137    }
138    public MultiAnalyzer LayerAnalyzer {
139      get { return LayerAnalyzerParameter.Value; }
140    }
141
142    public IntValue NumberOfLayers {
143      get { return NumberOfLayersParameter.Value; }
144      set { NumberOfLayersParameter.Value = value; }
145    }
146    public IntValue PopulationSize {
147      get { return PopulationSizeParameter.Value; }
148      set { PopulationSizeParameter.Value = value; }
149    }
150
151    public ISelector Selector {
152      get { return SelectorParameter.Value; }
153      set { SelectorParameter.Value = value; }
154    }
155    public ICrossover Crossover {
156      get { return CrossoverParameter.Value; }
157      set { CrossoverParameter.Value = value; }
158    }
159    public IManipulator Mutator {
160      get { return MutatorParameter.Value; }
161      set { MutatorParameter.Value = value; }
162    }
163    public PercentValue MutationProbability {
164      get { return MutationProbabilityParameter.Value; }
165      set { MutationProbabilityParameter.Value = value; }
166    }
167    public IntValue Elites {
168      get { return ElitesParameter.Value; }
169      set { ElitesParameter.Value = value; }
170    }
171    public bool ReevaluteElites {
172      get { return ReevaluateElitesParameter.Value.Value; }
173      set { ReevaluateElitesParameter.Value.Value = value; }
174    }
175    public bool PlusSelection {
176      get { return PlusSelectionParameter.Value.Value; }
177      set { PlusSelectionParameter.Value.Value = value; }
178    }
179
180    public EnumValue<AgingScheme> AgingScheme {
181      get { return AgingSchemeParameter.Value; }
182      set { AgingSchemeParameter.Value = value; }
183    }
184    public IntValue AgeGap {
185      get { return AgeGapParameter.Value; }
186      set { AgeGapParameter.Value = value; }
187    }
188    public DoubleValue AgeInheritance {
189      get { return AgeInheritanceParameter.Value; }
190      set { AgeInheritanceParameter.Value = value; }
191    }
192    public IntArray AgeLimits {
193      get { return AgeLimitsParameter.Value; }
194      set { AgeLimitsParameter.Value = value; }
195    }
196
197    public IntValue MatingPoolRange {
198      get { return MatingPoolRangeParameter.Value; }
199      set { MatingPoolRangeParameter.Value = value; }
200    }
201
202    public MultiTerminator Terminators {
203      get { return TerminatorParameter.Value; }
204    }
205
206    public int MaximumGenerations {
207      get { return generationsTerminator.Threshold.Value; }
208      set { generationsTerminator.Threshold.Value = value; }
209    }
210    #endregion
211
212    #region Helper Properties
213    private SolutionsCreator SolutionsCreator {
214      get { return OperatorGraph.Iterate().OfType<SolutionsCreator>().First(); }
215    }
216    private AlpsGeneticAlgorithmMainLoop MainLoop {
217      get { return OperatorGraph.Iterate().OfType<AlpsGeneticAlgorithmMainLoop>().First(); }
218    }
219    #endregion
220
221    #region Preconfigured Analyzers
222    [Storable]
223    private BestAverageWorstQualityAnalyzer qualityAnalyzer;
224    [Storable]
225    private BestAverageWorstQualityAnalyzer layerQualityAnalyzer;
226    [Storable]
227    private OldestAverageYoungestAgeAnalyzer ageAnalyzer;
228    [Storable]
229    private OldestAverageYoungestAgeAnalyzer layerAgeAnalyzer;
230    [Storable]
231    private AgeDistributionAnalyzer ageDistributionAnalyzer;
232    [Storable]
233    private AgeDistributionAnalyzer layerAgeDistributionAnalyzer;
234    #endregion
235
236    #region Preconfigured Terminators
237    [Storable]
238    private ComparisonTerminator<IntValue> generationsTerminator;
239    [Storable]
240    private ComparisonTerminator<IntValue> evaluationsTerminator;
241    [Storable]
242    private SingleObjectiveQualityTerminator qualityTerminator;
243    [Storable]
244    private ExecutionTimeTerminator executionTimeTerminator;
245    #endregion
246
247    #region Constructors
248    [StorableConstructor]
249    private AlpsGeneticAlgorithm(bool deserializing)
250      : base(deserializing) { }
251    [StorableHook(HookType.AfterDeserialization)]
252    private void AfterDeserialization() {
253      Initialize();
254    }
255    private AlpsGeneticAlgorithm(AlpsGeneticAlgorithm original, Cloner cloner)
256      : base(original, cloner) {
257      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
258      layerQualityAnalyzer = cloner.Clone(original.layerQualityAnalyzer);
259      ageAnalyzer = cloner.Clone(original.ageAnalyzer);
260      layerAgeAnalyzer = cloner.Clone(original.layerAgeAnalyzer);
261      ageDistributionAnalyzer = cloner.Clone(original.ageDistributionAnalyzer);
262      layerAgeDistributionAnalyzer = cloner.Clone(original.layerAgeDistributionAnalyzer);
263      generationsTerminator = cloner.Clone(original.generationsTerminator);
264      evaluationsTerminator = cloner.Clone(original.evaluationsTerminator);
265      qualityTerminator = cloner.Clone(original.qualityTerminator);
266      executionTimeTerminator = cloner.Clone(original.executionTimeTerminator);
267      Initialize();
268    }
269    public override IDeepCloneable Clone(Cloner cloner) {
270      return new AlpsGeneticAlgorithm(this, cloner);
271    }
272    public AlpsGeneticAlgorithm()
273      : base() {
274      #region Add parameters
275      Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
276      Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
277
278      Parameters.Add(new FixedValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze all individuals from all layers combined.", new MultiAnalyzer()));
279      Parameters.Add(new FixedValueParameter<MultiAnalyzer>("LayerAnalyzer", "The operator used to analyze each layer.", new MultiAnalyzer()));
280
281      Parameters.Add(new ValueParameter<IntValue>("NumberOfLayers", "The number of layers.", new IntValue(10)));
282      Parameters.Add(new ValueParameter<IntValue>("PopulationSize", "The size of the population of solutions in each layer.", new IntValue(100)));
283
284      Parameters.Add(new ConstrainedValueParameter<ISelector>("Selector", "The operator used to select solutions for reproduction."));
285      Parameters.Add(new ConstrainedValueParameter<ICrossover>("Crossover", "The operator used to cross solutions."));
286      Parameters.Add(new OptionalConstrainedValueParameter<IManipulator>("Mutator", "The operator used to mutate solutions."));
287      Parameters.Add(new ValueParameter<PercentValue>("MutationProbability", "The probability that the mutation operator is applied on a solution.", new PercentValue(0.05)));
288      Parameters.Add(new ValueParameter<IntValue>("Elites", "The numer of elite solutions which are kept in each generation.", new IntValue(1)));
289      Parameters.Add(new FixedValueParameter<BoolValue>("ReevaluateElites", "Flag to determine if elite individuals should be reevaluated (i.e., if stochastic fitness functions are used.)", new BoolValue(false)) { Hidden = true });
290      Parameters.Add(new ValueParameter<BoolValue>("PlusSelection", "Include the parents in the selection of the invividuals for the next generation.", new BoolValue(false)));
291
292      Parameters.Add(new ValueParameter<EnumValue<AgingScheme>>("AgingScheme", "The aging scheme for setting the age-limits for the layers.", new EnumValue<AgingScheme>(ALPS.AgingScheme.Polynomial)));
293      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)));
294      Parameters.Add(new ValueParameter<DoubleValue>("AgeInheritance", "A weight that determines the age of a child after crossover based on the older (1.0) and younger (0.0) parent.", new DoubleValue(1.0)) { Hidden = true });
295      Parameters.Add(new ValueParameter<IntArray>("AgeLimits", "The maximum age an individual is allowed to reach in a certain layer.", new IntArray(new int[0])) { Hidden = true });
296
297      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 });
298      Parameters.Add(new ValueParameter<BoolValue>("ReduceToPopulationSize", "Reduce the CurrentPopulationSize after elder migration to PopulationSize", new BoolValue(true)) { Hidden = true });
299
300      Parameters.Add(new ValueParameter<MultiTerminator>("Terminator", "The termination criteria that defines if the algorithm should continue or stop.", new MultiTerminator()));
301      #endregion
302
303      #region Create operators
304      var globalRandomCreator = new RandomCreator();
305      var layer0Creator = new SubScopesCreator() { Name = "Create Layer Zero" };
306      var layer0Processor = new SubScopesProcessor();
307      var localRandomCreator = new LocalRandomCreator();
308      var layerSolutionsCreator = new SolutionsCreator();
309      var initializeAgeProcessor = new UniformSubScopesProcessor();
310      var initializeAge = new VariableCreator() { Name = "Initialize Age" };
311      var initializeCurrentPopulationSize = new SubScopesCounter() { Name = "Initialize CurrentPopulationCounter" };
312      var initializeLocalEvaluatedSolutions = new Assigner() { Name = "Initialize LayerEvaluatedSolutions" };
313      var initializeGlobalEvaluatedSolutions = new DataReducer() { Name = "Initialize EvaluatedSolutions" };
314      var resultsCollector = new ResultsCollector();
315      var mainLoop = new AlpsGeneticAlgorithmMainLoop();
316      #endregion
317
318      #region Create and parameterize operator graph
319      OperatorGraph.InitialOperator = globalRandomCreator;
320
321      globalRandomCreator.RandomParameter.ActualName = "GlobalRandom";
322      globalRandomCreator.SeedParameter.Value = null;
323      globalRandomCreator.SeedParameter.ActualName = SeedParameter.Name;
324      globalRandomCreator.SetSeedRandomlyParameter.Value = null;
325      globalRandomCreator.SetSeedRandomlyParameter.ActualName = SetSeedRandomlyParameter.Name;
326      globalRandomCreator.Successor = layer0Creator;
327
328      layer0Creator.NumberOfSubScopesParameter.Value = new IntValue(1);
329      layer0Creator.Successor = layer0Processor;
330
331      layer0Processor.Operators.Add(localRandomCreator);
332      layer0Processor.Successor = initializeGlobalEvaluatedSolutions;
333
334      localRandomCreator.Successor = layerSolutionsCreator;
335
336      layerSolutionsCreator.NumberOfSolutionsParameter.ActualName = PopulationSizeParameter.Name;
337      layerSolutionsCreator.Successor = initializeAgeProcessor;
338
339      initializeAgeProcessor.Operator = initializeAge;
340      initializeAgeProcessor.Successor = initializeCurrentPopulationSize;
341
342      initializeCurrentPopulationSize.ValueParameter.ActualName = "CurrentPopulationSize";
343      initializeCurrentPopulationSize.Successor = initializeLocalEvaluatedSolutions;
344
345      initializeAge.CollectedValues.Add(new ValueParameter<DoubleValue>("Age", new DoubleValue(0)));
346      initializeAge.Successor = null;
347
348      initializeLocalEvaluatedSolutions.LeftSideParameter.ActualName = "LayerEvaluatedSolutions";
349      initializeLocalEvaluatedSolutions.RightSideParameter.ActualName = "CurrentPopulationSize";
350      initializeLocalEvaluatedSolutions.Successor = null;
351
352      initializeGlobalEvaluatedSolutions.ReductionOperation.Value.Value = ReductionOperations.Sum;
353      initializeGlobalEvaluatedSolutions.TargetOperation.Value.Value = ReductionOperations.Assign;
354      initializeGlobalEvaluatedSolutions.ParameterToReduce.ActualName = "LayerEvaluatedSolutions";
355      initializeGlobalEvaluatedSolutions.TargetParameter.ActualName = "EvaluatedSolutions";
356      initializeGlobalEvaluatedSolutions.Successor = resultsCollector;
357
358      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Evaluated Solutions", null, "EvaluatedSolutions"));
359      resultsCollector.Successor = mainLoop;
360
361      mainLoop.GlobalRandomParameter.ActualName = "GlobalRandom";
362      mainLoop.LocalRandomParameter.ActualName = localRandomCreator.LocalRandomParameter.Name;
363      mainLoop.EvaluatedSolutionsParameter.ActualName = "EvaluatedSolutions";
364      mainLoop.AnalyzerParameter.ActualName = AnalyzerParameter.Name;
365      mainLoop.LayerAnalyzerParameter.ActualName = LayerAnalyzerParameter.Name;
366      mainLoop.NumberOfLayersParameter.ActualName = NumberOfLayersParameter.Name;
367      mainLoop.PopulationSizeParameter.ActualName = PopulationSizeParameter.Name;
368      mainLoop.CurrentPopulationSizeParameter.ActualName = "CurrentPopulationSize";
369      mainLoop.SelectorParameter.ActualName = SelectorParameter.Name;
370      mainLoop.CrossoverParameter.ActualName = CrossoverParameter.Name;
371      mainLoop.MutatorParameter.ActualName = MutatorParameter.Name;
372      mainLoop.MutationProbabilityParameter.ActualName = MutationProbabilityParameter.Name;
373      mainLoop.ElitesParameter.ActualName = ElitesParameter.Name;
374      mainLoop.ReevaluateElitesParameter.ActualName = ReevaluateElitesParameter.Name;
375      mainLoop.PlusSelectionParameter.ActualName = PlusSelectionParameter.Name;
376      mainLoop.AgeParameter.ActualName = "Age";
377      mainLoop.AgeGapParameter.ActualName = AgeGapParameter.Name;
378      mainLoop.AgeInheritanceParameter.ActualName = AgeInheritanceParameter.Name;
379      mainLoop.AgeLimitsParameter.ActualName = AgeLimitsParameter.Name;
380      mainLoop.MatingPoolRangeParameter.ActualName = MatingPoolRangeParameter.Name;
381      mainLoop.ReduceToPopulationSizeParameter.ActualName = ReduceToPopulationSizeParameter.Name;
382      mainLoop.TerminatorParameter.ActualName = TerminatorParameter.Name;
383      #endregion
384
385      #region Set selectors
386      foreach (var selector in ApplicationManager.Manager.GetInstances<ISelector>().Where(s => !(s is IMultiObjectiveSelector)).OrderBy(s => Name))
387        SelectorParameter.ValidValues.Add(selector);
388      var defaultSelector = SelectorParameter.ValidValues.OfType<GeneralizedRankSelector>().FirstOrDefault();
389      if (defaultSelector != null) {
390        defaultSelector.PressureParameter.Value = new DoubleValue(4.0);
391        SelectorParameter.Value = defaultSelector;
392      }
393      #endregion
394
395      #region Create analyzers
396      qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
397      layerQualityAnalyzer = new BestAverageWorstQualityAnalyzer();
398      ageAnalyzer = new OldestAverageYoungestAgeAnalyzer();
399      layerAgeAnalyzer = new OldestAverageYoungestAgeAnalyzer();
400      ageDistributionAnalyzer = new AgeDistributionAnalyzer();
401      layerAgeDistributionAnalyzer = new AgeDistributionAnalyzer();
402      #endregion
403
404      #region Create terminators
405      generationsTerminator = new ComparisonTerminator<IntValue>("Generations", ComparisonType.Less, new IntValue(1000)) { Name = "Generations" };
406      evaluationsTerminator = new ComparisonTerminator<IntValue>("EvaluatedSolutions", ComparisonType.Less, new IntValue(int.MaxValue)) { Name = "Evaluations" };
407      qualityTerminator = new SingleObjectiveQualityTerminator() { Name = "Quality" };
408      executionTimeTerminator = new ExecutionTimeTerminator(this, new TimeSpanValue(TimeSpan.FromMinutes(5)));
409      #endregion
410
411      #region Parameterize
412      UpdateAnalyzers();
413      ParameterizeAnalyzers();
414
415      ParameterizeSelectors();
416
417      UpdateTerminators();
418
419      ParameterizeAgeLimits();
420      #endregion
421
422      Initialize();
423    }
424    #endregion
425
426    #region Events
427    public override void Prepare() {
428      if (Problem != null)
429        base.Prepare();
430    }
431    protected override void OnProblemChanged() {
432      base.OnProblemChanged();
433      ParameterizeStochasticOperator(Problem.SolutionCreator);
434      ParameterizeStochasticOperatorForLayer(Problem.Evaluator);
435      foreach (var @operator in Problem.Operators.OfType<IOperator>())
436        ParameterizeStochasticOperator(@operator);
437
438      ParameterizeIterationBasedOperators();
439
440      ParameterizeSolutionsCreator();
441      ParameterizeMainLoop();
442      ParameterizeAnalyzers();
443      ParameterizeSelectors();
444      ParameterizeTerminators();
445
446      Problem.Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
447
448      UpdateAnalyzers();
449      UpdateCrossovers();
450      UpdateMutators();
451      UpdateTerminators();
452    }
453
454    protected override void RegisterProblemEvents() {
455      base.RegisterProblemEvents();
456      var maximizationParameter = (IValueParameter<BoolValue>)Problem.MaximizationParameter;
457      if (maximizationParameter != null) maximizationParameter.ValueChanged += new EventHandler(MaximizationParameter_ValueChanged);
458    }
459    protected override void DeregisterProblemEvents() {
460      var maximizationParameter = (IValueParameter<BoolValue>)Problem.MaximizationParameter;
461      if (maximizationParameter != null) maximizationParameter.ValueChanged -= new EventHandler(MaximizationParameter_ValueChanged);
462      base.DeregisterProblemEvents();
463    }
464
465    protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) {
466      base.Problem_SolutionCreatorChanged(sender, e);
467      ParameterizeStochasticOperator(Problem.SolutionCreator);
468      ParameterizeStochasticOperatorForLayer(Problem.Evaluator);
469
470      Problem.Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
471
472      ParameterizeSolutionsCreator();
473      ParameterizeAnalyzers();
474    }
475    protected override void Problem_EvaluatorChanged(object sender, EventArgs e) {
476      base.Problem_EvaluatorChanged(sender, e);
477      foreach (var @operator in Problem.Operators.OfType<IOperator>())
478        ParameterizeStochasticOperator(@operator);
479
480      UpdateAnalyzers();
481
482      ParameterizeSolutionsCreator();
483      ParameterizeMainLoop();
484      ParameterizeSelectors();
485    }
486    protected override void Problem_OperatorsChanged(object sender, EventArgs e) {
487      base.Problem_OperatorsChanged(sender, e);
488      ParameterizeIterationBasedOperators();
489      UpdateCrossovers();
490      UpdateMutators();
491      UpdateTerminators();
492    }
493    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
494      ParameterizeMainLoop();
495      ParameterizeAnalyzers();
496      ParameterizeSelectors();
497    }
498    private void MaximizationParameter_ValueChanged(object sender, EventArgs e) {
499      ParameterizeTerminators();
500    }
501    private void QualityAnalyzer_CurrentBestQualityParameter_NameChanged(object sender, EventArgs e) {
502      ParameterizeTerminators();
503    }
504
505    private void AgeGapParameter_ValueChanged(object sender, EventArgs e) {
506      AgeGap.ValueChanged += AgeGap_ValueChanged;
507      ParameterizeAgeLimits();
508    }
509    private void AgeGap_ValueChanged(object sender, EventArgs e) {
510      ParameterizeAgeLimits();
511    }
512    private void AgingSchemeParameter_ValueChanged(object sender, EventArgs e) {
513      AgingScheme.ValueChanged += AgingScheme_ValueChanged;
514      ParameterizeAgeLimits();
515    }
516    private void AgingScheme_ValueChanged(object sender, EventArgs e) {
517      ParameterizeAgeLimits();
518    }
519    private void NumberOfLayersParameter_ValueChanged(object sender, EventArgs e) {
520      NumberOfLayers.ValueChanged += NumberOfLayers_ValueChanged;
521      ParameterizeAgeLimits();
522    }
523    private void NumberOfLayers_ValueChanged(object sender, EventArgs e) {
524      ParameterizeAgeLimits();
525    }
526
527    private void AnalyzerOperators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IAnalyzer>> e) {
528      foreach (var analyzer in e.Items) {
529        foreach (var parameter in analyzer.Value.Parameters.OfType<IScopeTreeLookupParameter>()) {
530          parameter.Depth = 2;
531        }
532      }
533    }
534    private void LayerAnalyzerOperators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IAnalyzer>> e) {
535      foreach (var analyzer in e.Items) {
536        IParameter resultParameter;
537        if (analyzer.Value.Parameters.TryGetValue("Results", out resultParameter)) {
538          var lookupParameter = resultParameter as ILookupParameter;
539          if (lookupParameter != null)
540            lookupParameter.ActualName = "LayerResults";
541        }
542        foreach (var parameter in analyzer.Value.Parameters.OfType<IScopeTreeLookupParameter>()) {
543          parameter.Depth = 1;
544        }
545      }
546    }
547    #endregion
548
549    #region Parameterization
550    private void Initialize() {
551      if (Problem != null)
552        Problem.Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
553
554      NumberOfLayersParameter.ValueChanged += NumberOfLayersParameter_ValueChanged;
555      NumberOfLayers.ValueChanged += NumberOfLayers_ValueChanged;
556
557      Analyzer.Operators.ItemsAdded += AnalyzerOperators_ItemsAdded;
558      LayerAnalyzer.Operators.ItemsAdded += LayerAnalyzerOperators_ItemsAdded;
559
560      AgeGapParameter.ValueChanged += AgeGapParameter_ValueChanged;
561      AgeGap.ValueChanged += AgeGap_ValueChanged;
562      AgingSchemeParameter.ValueChanged += AgingSchemeParameter_ValueChanged;
563      AgingScheme.ValueChanged += AgingScheme_ValueChanged;
564
565      qualityAnalyzer.CurrentBestQualityParameter.NameChanged += new EventHandler(QualityAnalyzer_CurrentBestQualityParameter_NameChanged);
566    }
567    private void ParameterizeSolutionsCreator() {
568      SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
569      SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
570    }
571    private void ParameterizeMainLoop() {
572      MainLoop.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
573      MainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
574      MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
575    }
576    private void ParameterizeAnalyzers() {
577      qualityAnalyzer.ResultsParameter.ActualName = "Results";
578      qualityAnalyzer.ResultsParameter.Hidden = true;
579      qualityAnalyzer.QualityParameter.Depth = 2;
580      layerQualityAnalyzer.ResultsParameter.ActualName = "LayerResults";
581      layerQualityAnalyzer.ResultsParameter.Hidden = true;
582      layerQualityAnalyzer.QualityParameter.Depth = 1;
583      if (Problem != null) {
584        qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
585        qualityAnalyzer.MaximizationParameter.Hidden = true;
586        qualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
587        qualityAnalyzer.QualityParameter.Hidden = true;
588        qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
589        qualityAnalyzer.BestKnownQualityParameter.Hidden = true;
590        layerQualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
591        layerQualityAnalyzer.MaximizationParameter.Hidden = true;
592        layerQualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
593        layerQualityAnalyzer.QualityParameter.Hidden = true;
594        layerQualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
595        layerQualityAnalyzer.BestKnownQualityParameter.Hidden = true;
596      }
597    }
598    private void ParameterizeSelectors() {
599      foreach (var selector in SelectorParameter.ValidValues) {
600        selector.CopySelected = new BoolValue(true);
601        selector.NumberOfSelectedSubScopesParameter.Hidden = true;
602        ParameterizeStochasticOperatorForLayer(selector);
603      }
604      if (Problem != null) {
605        foreach (var selector in SelectorParameter.ValidValues.OfType<ISingleObjectiveSelector>()) {
606          selector.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
607          selector.MaximizationParameter.Hidden = true;
608          selector.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
609          selector.QualityParameter.Hidden = true;
610        }
611      }
612    }
613    private void ParameterizeTerminators() {
614      qualityTerminator.Parameterize(qualityAnalyzer.CurrentBestQualityParameter, Problem);
615    }
616    private void ParameterizeIterationBasedOperators() {
617      if (Problem != null) {
618        foreach (var @operator in Problem.Operators.OfType<IIterationBasedOperator>()) {
619          @operator.IterationsParameter.ActualName = "Generations";
620          @operator.IterationsParameter.Hidden = true;
621          @operator.MaximumIterationsParameter.ActualName = generationsTerminator.ThresholdParameter.Name;
622          @operator.MaximumIterationsParameter.Hidden = true;
623        }
624      }
625    }
626    private void ParameterizeAgeLimits() {
627      var scheme = AgingScheme.Value;
628      int ageGap = AgeGap.Value;
629      int numberOfLayers = NumberOfLayers.Value;
630      AgeLimits = scheme.CalculateAgeLimits(ageGap, numberOfLayers);
631    }
632
633    private void ParameterizeStochasticOperator(IOperator @operator) {
634      var stochasticOperator = @operator as IStochasticOperator;
635      if (stochasticOperator != null) {
636        stochasticOperator.RandomParameter.ActualName = "GlobalRandom";
637        stochasticOperator.RandomParameter.Hidden = true;
638      }
639    }
640
641    private void ParameterizeStochasticOperatorForLayer(IOperator @operator) {
642      var stochasticOperator = @operator as IStochasticOperator;
643      if (stochasticOperator != null) {
644        stochasticOperator.RandomParameter.ActualName = "LocalRandom";
645        stochasticOperator.RandomParameter.Hidden = true;
646      }
647    }
648
649    #endregion
650
651    #region Updates
652    private void UpdateAnalyzers() {
653      Analyzer.Operators.Clear();
654      LayerAnalyzer.Operators.Clear();
655
656      Analyzer.Operators.Add(qualityAnalyzer, qualityAnalyzer.EnabledByDefault);
657      Analyzer.Operators.Add(ageAnalyzer, ageAnalyzer.EnabledByDefault);
658      Analyzer.Operators.Add(ageDistributionAnalyzer, ageDistributionAnalyzer.EnabledByDefault);
659      LayerAnalyzer.Operators.Add(layerQualityAnalyzer, false);
660      LayerAnalyzer.Operators.Add(layerAgeAnalyzer, false);
661      LayerAnalyzer.Operators.Add(layerAgeDistributionAnalyzer, false);
662
663      if (Problem != null) {
664        foreach (var analyzer in Problem.Operators.OfType<IAnalyzer>()) {
665          Analyzer.Operators.Add(analyzer, analyzer.EnabledByDefault);
666          LayerAnalyzer.Operators.Add((IAnalyzer)analyzer.Clone(), false);
667        }
668      }
669    }
670    private void UpdateCrossovers() {
671      var oldCrossover = CrossoverParameter.Value;
672      var defaultCrossover = Problem.Operators.OfType<ICrossover>().FirstOrDefault();
673      CrossoverParameter.ValidValues.Clear();
674      foreach (var crossover in Problem.Operators.OfType<ICrossover>().OrderBy(c => c.Name)) {
675        ParameterizeStochasticOperatorForLayer(crossover);
676        CrossoverParameter.ValidValues.Add(crossover);
677      }
678      if (oldCrossover != null) {
679        var crossover = CrossoverParameter.ValidValues.FirstOrDefault(c => c.GetType() == oldCrossover.GetType());
680        if (crossover != null)
681          CrossoverParameter.Value = crossover;
682        else
683          oldCrossover = null;
684      }
685      if (oldCrossover == null && defaultCrossover != null)
686        CrossoverParameter.Value = defaultCrossover;
687    }
688    private void UpdateMutators() {
689      var oldMutator = MutatorParameter.Value;
690      MutatorParameter.ValidValues.Clear();
691      foreach (var mutator in Problem.Operators.OfType<IManipulator>().OrderBy(m => m.Name)) {
692        ParameterizeStochasticOperatorForLayer(mutator);
693        MutatorParameter.ValidValues.Add(mutator);
694      }
695      if (oldMutator != null) {
696        var mutator = MutatorParameter.ValidValues.FirstOrDefault(m => m.GetType() == oldMutator.GetType());
697        if (mutator != null)
698          MutatorParameter.Value = mutator;
699      }
700    }
701    private void UpdateTerminators() {
702      var newTerminators = new Dictionary<ITerminator, bool> {
703        {generationsTerminator, !Terminators.Operators.Contains(generationsTerminator) || Terminators.Operators.ItemChecked(generationsTerminator)},
704        {evaluationsTerminator, Terminators.Operators.Contains(evaluationsTerminator) && Terminators.Operators.ItemChecked(evaluationsTerminator)},
705        {qualityTerminator, Terminators.Operators.Contains(qualityTerminator) && Terminators.Operators.ItemChecked(qualityTerminator) },
706        {executionTimeTerminator, Terminators.Operators.Contains(executionTimeTerminator) && Terminators.Operators.ItemChecked(executionTimeTerminator)}
707      };
708      if (Problem != null) {
709        foreach (var terminator in Problem.Operators.OfType<ITerminator>())
710          newTerminators.Add(terminator, !Terminators.Operators.Contains(terminator) || Terminators.Operators.ItemChecked(terminator));
711      }
712
713      Terminators.Operators.Clear();
714
715      foreach (var newTerminator in newTerminators)
716        Terminators.Operators.Add(newTerminator.Key, newTerminator.Value);
717    }
718    #endregion
719  }
720}
Note: See TracBrowser for help on using the repository browser.