Free cookie consent management tool by TermsFeed Policy Generator

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

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

#2269

  • Removed AgeInheritance enum and used a double [0-1] instead.
  • Added a WeightingReducer that uses the new double-weight for weighting between the lower and higher value.
File size: 33.7 KB
RevLine 
[11567]1#region License Information
2/* HeuristicLab
[12018]3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
[11567]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;
[12531]23using System.Collections.Generic;
[11578]24using System.Linq;
[12993]25using HeuristicLab.Analysis;
26using HeuristicLab.Collections;
[11567]27using HeuristicLab.Common;
28using HeuristicLab.Core;
[11568]29using HeuristicLab.Data;
30using HeuristicLab.Operators;
[11567]31using HeuristicLab.Optimization;
[11578]32using HeuristicLab.Optimization.Operators;
[11568]33using HeuristicLab.Parameters;
[11567]34using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
[11578]35using HeuristicLab.PluginInfrastructure;
36using HeuristicLab.Random;
37using HeuristicLab.Selection;
[11567]38
39namespace HeuristicLab.Algorithms.ALPS {
[12994]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)]
[11567]42  [StorableClass]
[12993]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
[11567]56    #region Parameter Properties
[12993]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    }
[12992]74    private IValueParameter<IntValue> PopulationSizeParameter {
75      get { return (IValueParameter<IntValue>)Parameters["PopulationSize"]; }
[11568]76    }
[12993]77
[11568]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    }
[12993]84    public IConstrainedValueParameter<IManipulator> MutatorParameter {
85      get { return (IConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; }
86    }
[11568]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    }
[12186]96    private IValueParameter<BoolValue> PlusSelectionParameter {
97      get { return (IValueParameter<BoolValue>)Parameters["PlusSelection"]; }
98    }
[12993]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    }
[12997]106    private IValueParameter<DoubleValue> AgeInheritanceParameter {
107      get { return (IValueParameter<DoubleValue>)Parameters["AgeInheritance"]; }
[12993]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<PercentValue> MatingPoolSelectionPercentageParameter {
117      get { return (IValueLookupParameter<PercentValue>)Parameters["MatingPoolSelectionPercentage"]; }
118    }
119
120    private IValueParameter<MultiTerminator> TerminatorParameter {
121      get { return (IValueParameter<MultiTerminator>)Parameters["Terminator"]; }
122    }
[11567]123    #endregion
124
125    #region Properties
[12993]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    }
[12992]146    public IntValue PopulationSize {
[11568]147      get { return PopulationSizeParameter.Value; }
148      set { PopulationSizeParameter.Value = value; }
149    }
[12993]150
[11568]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    }
[12993]159    public IManipulator Mutator {
160      get { return MutatorParameter.Value; }
161      set { MutatorParameter.Value = value; }
162    }
[11568]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    }
[12186]175    public bool PlusSelection {
176      get { return PlusSelectionParameter.Value.Value; }
177      set { PlusSelectionParameter.Value.Value = value; }
178    }
[11578]179
[12993]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    }
[12997]188    public DoubleValue AgeInheritance {
[12993]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    public PercentValue MatingPoolSelectionPercentage {
202      get { return MatingPoolSelectionPercentageParameter.Value; }
203      set { MatingPoolSelectionPercentageParameter.Value = value; }
204    }
205
206    public MultiTerminator Terminators {
207      get { return TerminatorParameter.Value; }
208    }
209
210    public int MaximumGenerations {
211      get { return generationsTerminator.Threshold.Value; }
212      set { generationsTerminator.Threshold.Value = value; }
213    }
214    #endregion
215
216    #region Helper Properties
217    private RandomCreator GlobalRandomCreator {
218      get { return (RandomCreator)OperatorGraph.InitialOperator; }
219    }
220    private SolutionsCreator SolutionsCreator {
221      get { return OperatorGraph.Iterate().OfType<SolutionsCreator>().First(); }
222    }
[11580]223    private AlpsGeneticAlgorithmMainLoop MainLoop {
224      get { return OperatorGraph.Iterate().OfType<AlpsGeneticAlgorithmMainLoop>().First(); }
225    }
[11676]226    #endregion
227
[12993]228    #region Preconfigured Analyzers
[12531]229    [Storable]
[12993]230    private BestAverageWorstQualityAnalyzer qualityAnalyzer;
231    [Storable]
232    private BestAverageWorstQualityAnalyzer layerQualityAnalyzer;
[12996]233    [Storable]
234    private OldestAverageYoungestAgeAnalyzer ageAnalyzer;
235    [Storable]
236    private OldestAverageYoungestAgeAnalyzer layerAgeAnalyzer;
237    [Storable]
238    private AgeDistributionAnalyzer ageDistributionAnalyzer;
239    [Storable]
240    private AgeDistributionAnalyzer layerAgeDistributionAnalyzer;
[12993]241    #endregion
242
243    #region Preconfigured Terminators
244    [Storable]
[12531]245    private ComparisonTerminator<IntValue> generationsTerminator;
[12993]246    [Storable]
247    private ComparisonTerminator<IntValue> evaluationsTerminator;
248    [Storable]
249    private SingleObjectiveQualityTerminator qualityTerminator;
250    [Storable]
251    private ExecutionTimeTerminator executionTimeTerminator;
252    #endregion
[12531]253
[12996]254    #region Constructors
[11567]255    [StorableConstructor]
256    private AlpsGeneticAlgorithm(bool deserializing)
257      : base(deserializing) { }
[12570]258    [StorableHook(HookType.AfterDeserialization)]
259    private void AfterDeserialization() {
260      Initialize();
261    }
[11567]262    private AlpsGeneticAlgorithm(AlpsGeneticAlgorithm original, Cloner cloner)
263      : base(original, cloner) {
[12993]264      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
265      layerQualityAnalyzer = cloner.Clone(original.layerQualityAnalyzer);
[12996]266      ageAnalyzer = cloner.Clone(original.ageAnalyzer);
267      layerAgeAnalyzer = cloner.Clone(original.layerAgeAnalyzer);
268      ageDistributionAnalyzer = cloner.Clone(original.ageDistributionAnalyzer);
269      layerAgeDistributionAnalyzer = cloner.Clone(original.layerAgeDistributionAnalyzer);
[12531]270      generationsTerminator = cloner.Clone(original.generationsTerminator);
[12993]271      evaluationsTerminator = cloner.Clone(original.evaluationsTerminator);
272      qualityTerminator = cloner.Clone(original.qualityTerminator);
273      executionTimeTerminator = cloner.Clone(original.executionTimeTerminator);
[11578]274      Initialize();
[11567]275    }
276    public override IDeepCloneable Clone(Cloner cloner) {
277      return new AlpsGeneticAlgorithm(this, cloner);
278    }
279    public AlpsGeneticAlgorithm()
280      : base() {
[12993]281      #region Add parameters
282      Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
283      Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
284
285      Parameters.Add(new FixedValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze the islands.", new MultiAnalyzer()));
286      Parameters.Add(new FixedValueParameter<MultiAnalyzer>("LayerAnalyzer", "The operator used to analyze each layer.", new MultiAnalyzer()));
287
288      Parameters.Add(new ValueParameter<IntValue>("NumberOfLayers", "The number of layers.", new IntValue(10)));
[12992]289      Parameters.Add(new ValueParameter<IntValue>("PopulationSize", "The size of the population of solutions each layer.", new IntValue(100)));
[12993]290
[11568]291      Parameters.Add(new ConstrainedValueParameter<ISelector>("Selector", "The operator used to select solutions for reproduction."));
292      Parameters.Add(new ConstrainedValueParameter<ICrossover>("Crossover", "The operator used to cross solutions."));
[12993]293      Parameters.Add(new OptionalConstrainedValueParameter<IManipulator>("Mutator", "The operator used to mutate solutions."));
[11568]294      Parameters.Add(new ValueParameter<PercentValue>("MutationProbability", "The probability that the mutation operator is applied on a solution.", new PercentValue(0.05)));
295      Parameters.Add(new ValueParameter<IntValue>("Elites", "The numer of elite solutions which are kept in each generation.", new IntValue(1)));
296      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 });
[12186]297      Parameters.Add(new ValueParameter<BoolValue>("PlusSelection", "Include the parents in the selection of the invividuals for the next generation.", new BoolValue(false)) { Hidden = true });
[11578]298
[12993]299      Parameters.Add(new ValueParameter<EnumValue<AgingScheme>>("AgingScheme", "The aging scheme for setting the age-limits for the layers.", new EnumValue<AgingScheme>(ALPS.AgingScheme.Polynomial)));
300      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)));
[12997]301      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 });
[12993]302      Parameters.Add(new ValueParameter<IntArray>("AgeLimits", new IntArray(new int[0])) { Hidden = true });
303
304      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 });
305      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 });
306
307      Parameters.Add(new ValueParameter<MultiTerminator>("Terminator", "The termination criteria which sould be checked.", new MultiTerminator()));
308      #endregion
309
310      #region Create operators
[11578]311      var globalRandomCreator = new RandomCreator();
312      var layer0Creator = new SubScopesCreator() { Name = "Create Layer Zero" };
[12992]313      var layer0Processor = new UniformSubScopesProcessor();
[11578]314      var localRandomCreator = new LocalRandomCreator();
[11585]315      var layerVariableCreator = new VariableCreator();
[11578]316      var layerSolutionsCreator = new SolutionsCreator();
317      var initializeAgeProcessor = new UniformSubScopesProcessor();
318      var initializeAge = new VariableCreator() { Name = "Initialize Age" };
[11676]319      var initializeLayerPopulationSize = new SubScopesCounter() { Name = "Init LayerPopulationCounter" };
320      var initializeLocalEvaluatedSolutions = new Assigner() { Name = "Initialize LayerEvaluatedSolutions" };
[11578]321      var initializeGlobalEvaluatedSolutions = new DataReducer() { Name = "Initialize EvaluatedSolutions" };
322      var resultsCollector = new ResultsCollector();
[11580]323      var mainLoop = new AlpsGeneticAlgorithmMainLoop();
[12993]324      #endregion
[11580]325
[12993]326      #region Create and parameterize operator graph
[11578]327      OperatorGraph.InitialOperator = globalRandomCreator;
328
329      globalRandomCreator.RandomParameter.ActualName = "GlobalRandom";
330      globalRandomCreator.SeedParameter.Value = null;
331      globalRandomCreator.SetSeedRandomlyParameter.Value = null;
332      globalRandomCreator.Successor = layer0Creator;
333
334      layer0Creator.NumberOfSubScopesParameter.Value = new IntValue(1);
335      layer0Creator.Successor = layer0Processor;
336
[12035]337      layer0Processor.Operator = localRandomCreator;
[11578]338      layer0Processor.Successor = initializeGlobalEvaluatedSolutions;
339
[11585]340      localRandomCreator.Successor = layerVariableCreator;
[11578]341
[11585]342      layerVariableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Layer", new IntValue(0)));
343      layerVariableCreator.Successor = layerSolutionsCreator;
344
[11578]345      layerSolutionsCreator.NumberOfSolutionsParameter.ActualName = PopulationSizeParameter.Name;
346      layerSolutionsCreator.Successor = initializeAgeProcessor;
347
348      initializeAgeProcessor.Operator = initializeAge;
[11676]349      initializeAgeProcessor.Successor = initializeLayerPopulationSize;
[11578]350
[11676]351      initializeLayerPopulationSize.ValueParameter.ActualName = "LayerPopulationSize";
352      initializeLayerPopulationSize.Successor = initializeLocalEvaluatedSolutions;
353
[11578]354      initializeAge.CollectedValues.Add(new ValueParameter<IntValue>("Age", new IntValue(0)));
355      initializeAge.Successor = null;
356
[11676]357      initializeLocalEvaluatedSolutions.LeftSideParameter.ActualName = "LayerEvaluatedSolutions";
358      initializeLocalEvaluatedSolutions.RightSideParameter.ActualName = "LayerPopulationSize";
[11578]359      initializeLocalEvaluatedSolutions.Successor = null;
360
361      initializeGlobalEvaluatedSolutions.ReductionOperation.Value.Value = ReductionOperations.Sum;
362      initializeGlobalEvaluatedSolutions.TargetOperation.Value.Value = ReductionOperations.Assign;
[11590]363      initializeGlobalEvaluatedSolutions.ParameterToReduce.ActualName = "LayerEvaluatedSolutions";
[11578]364      initializeGlobalEvaluatedSolutions.TargetParameter.ActualName = "EvaluatedSolutions";
365      initializeGlobalEvaluatedSolutions.Successor = resultsCollector;
366
[11609]367      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Evaluated Solutions", null, "EvaluatedSolutions"));
[11578]368      resultsCollector.Successor = mainLoop;
[12993]369      #endregion
[11578]370
[12993]371      #region Set selectors
[11578]372      foreach (var selector in ApplicationManager.Manager.GetInstances<ISelector>().Where(s => !(s is IMultiObjectiveSelector)).OrderBy(s => Name))
373        SelectorParameter.ValidValues.Add(selector);
[12993]374      var defaultSelector = SelectorParameter.ValidValues.OfType<GeneralizedRankSelector>().FirstOrDefault();
375      if (defaultSelector != null) {
376        defaultSelector.PressureParameter.Value = new DoubleValue(4);
377        SelectorParameter.Value = defaultSelector;
[12119]378      }
[12993]379      #endregion
[11578]380
[12993]381      #region Create analyzers
382      qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
383      layerQualityAnalyzer = new BestAverageWorstQualityAnalyzer();
[12996]384      ageAnalyzer = new OldestAverageYoungestAgeAnalyzer();
385      layerAgeAnalyzer = new OldestAverageYoungestAgeAnalyzer();
386      ageDistributionAnalyzer = new AgeDistributionAnalyzer();
387      layerAgeDistributionAnalyzer = new AgeDistributionAnalyzer();
[12993]388      #endregion
389
390      #region Create terminators
[12548]391      generationsTerminator = new ComparisonTerminator<IntValue>("Generations", ComparisonType.Less, new IntValue(1000)) { Name = "Generations" };
[12993]392      evaluationsTerminator = new ComparisonTerminator<IntValue>("EvaluatedSolutions", ComparisonType.Less, new IntValue(int.MaxValue)) { Name = "Evaluations" };
393      qualityTerminator = new SingleObjectiveQualityTerminator() { Name = "Quality" };
394      executionTimeTerminator = new ExecutionTimeTerminator(this, new TimeSpanValue(TimeSpan.FromMinutes(5)));
395      #endregion
[12548]396
[12993]397      #region Parameterize
[12997]398      UpdateAnalyzers();
[12993]399      ParameterizeAnalyzers();
400
[11578]401      ParameterizeSelectors();
[12548]402
403      UpdateTerminators();
404
[12993]405      ParameterizeAgeLimits();
406      #endregion
407
[11578]408      Initialize();
[11567]409    }
[12996]410    #endregion
[11578]411
412    #region Events
[12993]413    public override void Prepare() {
414      if (Problem != null)
415        base.Prepare();
416    }
[11578]417    protected override void OnProblemChanged() {
[12119]418      base.OnProblemChanged();
[12993]419      ParameterizeStochasticOperator(Problem.SolutionCreator);
420      ParameterizeStochasticOperatorForLayer(Problem.Evaluator);
421      foreach (var @operator in Problem.Operators.OfType<IOperator>())
422        ParameterizeStochasticOperator(@operator);
423
424      ParameterizeIterationBasedOperators();
425
[11578]426      ParameterizeSolutionsCreator();
427      ParameterizeMainLoop();
[12993]428      ParameterizeAnalyzers();
[11578]429      ParameterizeSelectors();
[12993]430      ParameterizeTerminators();
431
432      Problem.Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
433
434      UpdateAnalyzers();
[11578]435      UpdateCrossovers();
436      UpdateMutators();
[12548]437      UpdateTerminators();
[11578]438    }
[12993]439
440    protected override void RegisterProblemEvents() {
441      base.RegisterProblemEvents();
442      var maximizationParameter = (IValueParameter<BoolValue>)Problem.MaximizationParameter;
443      if (maximizationParameter != null) maximizationParameter.ValueChanged += new EventHandler(MaximizationParameter_ValueChanged);
444    }
445    protected override void DeregisterProblemEvents() {
446      var maximizationParameter = (IValueParameter<BoolValue>)Problem.MaximizationParameter;
447      if (maximizationParameter != null) maximizationParameter.ValueChanged -= new EventHandler(MaximizationParameter_ValueChanged);
448      base.DeregisterProblemEvents();
449    }
450
[11578]451    protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) {
[12119]452      base.Problem_SolutionCreatorChanged(sender, e);
[12993]453      ParameterizeStochasticOperator(Problem.SolutionCreator);
454      ParameterizeStochasticOperatorForLayer(Problem.Evaluator);
455
456      Problem.Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
457
[11578]458      ParameterizeSolutionsCreator();
[12993]459      ParameterizeAnalyzers();
[11578]460    }
461    protected override void Problem_EvaluatorChanged(object sender, EventArgs e) {
[12119]462      base.Problem_EvaluatorChanged(sender, e);
[12993]463      foreach (var @operator in Problem.Operators.OfType<IOperator>())
464        ParameterizeStochasticOperator(@operator);
465
466      UpdateAnalyzers();
467
[11578]468      ParameterizeSolutionsCreator();
469      ParameterizeMainLoop();
470      ParameterizeSelectors();
471    }
472    protected override void Problem_OperatorsChanged(object sender, EventArgs e) {
[12119]473      base.Problem_OperatorsChanged(sender, e);
[12120]474      ParameterizeIterationBasedOperators();
[11578]475      UpdateCrossovers();
476      UpdateMutators();
[12548]477      UpdateTerminators();
[11578]478    }
[12993]479    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
[11578]480      ParameterizeMainLoop();
[12993]481      ParameterizeAnalyzers();
[11578]482      ParameterizeSelectors();
483    }
[12993]484    private void MaximizationParameter_ValueChanged(object sender, EventArgs e) {
485      ParameterizeTerminators();
486    }
487    private void QualityAnalyzer_CurrentBestQualityParameter_NameChanged(object sender, EventArgs e) {
488      ParameterizeTerminators();
489    }
490
491    private void AgeGapParameter_ValueChanged(object sender, EventArgs e) {
492      AgeGap.ValueChanged += AgeGap_ValueChanged;
493      ParameterizeAgeLimits();
494    }
495    private void AgeGap_ValueChanged(object sender, EventArgs e) {
496      ParameterizeAgeLimits();
497    }
498    private void AgingSchemeParameter_ValueChanged(object sender, EventArgs e) {
499      AgingScheme.ValueChanged += AgingScheme_ValueChanged;
500      ParameterizeAgeLimits();
501    }
502    private void AgingScheme_ValueChanged(object sender, EventArgs e) {
503      ParameterizeAgeLimits();
504    }
505    private void NumberOfLayersParameter_ValueChanged(object sender, EventArgs e) {
506      NumberOfLayers.ValueChanged += NumberOfLayers_ValueChanged;
507      ParameterizeAgeLimits();
508    }
509    private void NumberOfLayers_ValueChanged(object sender, EventArgs e) {
510      ParameterizeAgeLimits();
511    }
512
513    private void AnalyzerOperators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IAnalyzer>> e) {
514      foreach (var analyzer in e.Items) {
515        foreach (var parameter in analyzer.Value.Parameters.OfType<IScopeTreeLookupParameter>()) {
516          parameter.Depth = 2;
517        }
518      }
519    }
520    private void LayerAnalyzerOperators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IAnalyzer>> e) {
521      foreach (var analyzer in e.Items) {
522        IParameter resultParameter;
523        if (analyzer.Value.Parameters.TryGetValue("Results", out resultParameter)) {
524          var lookupParameter = resultParameter as ILookupParameter;
525          if (lookupParameter != null)
526            lookupParameter.ActualName = "LayerResults";
527        }
528        foreach (var parameter in analyzer.Value.Parameters.OfType<IScopeTreeLookupParameter>()) {
529          parameter.Depth = 1;
530        }
531      }
532    }
[11578]533    #endregion
534
535    #region Parameterization
536    private void Initialize() {
[12993]537      if (Problem != null)
538        Problem.Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
539
540      NumberOfLayersParameter.ValueChanged += NumberOfLayersParameter_ValueChanged;
541      NumberOfLayers.ValueChanged += NumberOfLayers_ValueChanged;
542
543      Analyzer.Operators.ItemsAdded += AnalyzerOperators_ItemsAdded;
544      LayerAnalyzer.Operators.ItemsAdded += LayerAnalyzerOperators_ItemsAdded;
545
546      AgeGapParameter.ValueChanged += AgeGapParameter_ValueChanged;
547      AgeGap.ValueChanged += AgeGap_ValueChanged;
548      AgingSchemeParameter.ValueChanged += AgingSchemeParameter_ValueChanged;
549      AgingScheme.ValueChanged += AgingScheme_ValueChanged;
550
551      qualityAnalyzer.CurrentBestQualityParameter.NameChanged += new EventHandler(QualityAnalyzer_CurrentBestQualityParameter_NameChanged);
[11578]552    }
553    private void ParameterizeSolutionsCreator() {
[12993]554      SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
555      SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
[11590]556      MainLoop.LayerUpdator.SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
557      MainLoop.LayerUpdator.SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
[11578]558    }
559    private void ParameterizeMainLoop() {
[12045]560      MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
561      MainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
[11583]562      MainLoop.MainOperator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
563      MainLoop.MainOperator.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
564      MainLoop.MainOperator.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
[11609]565      MainLoop.LayerUpdator.SolutionsCreator.NumberOfSolutionsParameter.ActualName = PopulationSizeParameter.Name;
[11578]566    }
[12993]567    private void ParameterizeAnalyzers() {
568      qualityAnalyzer.ResultsParameter.ActualName = "Results";
569      qualityAnalyzer.ResultsParameter.Hidden = true;
570      qualityAnalyzer.QualityParameter.Depth = 2;
[12996]571      layerQualityAnalyzer.ResultsParameter.ActualName = "LayerResults";
[12993]572      layerQualityAnalyzer.ResultsParameter.Hidden = true;
573      layerQualityAnalyzer.QualityParameter.Depth = 1;
574      if (Problem != null) {
575        qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
576        qualityAnalyzer.MaximizationParameter.Hidden = true;
577        qualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
578        qualityAnalyzer.QualityParameter.Hidden = true;
579        qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
580        qualityAnalyzer.BestKnownQualityParameter.Hidden = true;
581        layerQualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
582        layerQualityAnalyzer.MaximizationParameter.Hidden = true;
583        layerQualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
584        layerQualityAnalyzer.QualityParameter.Hidden = true;
585        layerQualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
586        layerQualityAnalyzer.BestKnownQualityParameter.Hidden = true;
587      }
588    }
[11578]589    private void ParameterizeSelectors() {
590      foreach (var selector in SelectorParameter.ValidValues) {
591        selector.CopySelected = new BoolValue(true);
[12035]592        // Explicit setting of NumberOfSelectedSubScopesParameter is not required anymore because the NumberOfSelectedSubScopesCalculator calculates it itself
593        //selector.NumberOfSelectedSubScopesParameter.Value = new IntValue(2 * (PopulationSize - Elites.Value));
[11578]594        selector.NumberOfSelectedSubScopesParameter.Hidden = true;
595        ParameterizeStochasticOperatorForLayer(selector);
596      }
597      if (Problem != null) {
598        foreach (var selector in SelectorParameter.ValidValues.OfType<ISingleObjectiveSelector>()) {
599          selector.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
600          selector.MaximizationParameter.Hidden = true;
601          selector.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
602          selector.QualityParameter.Hidden = true;
603        }
604      }
605    }
[12993]606    private void ParameterizeTerminators() {
607      qualityTerminator.Parameterize(qualityAnalyzer.CurrentBestQualityParameter, Problem);
608    }
[12120]609    private void ParameterizeIterationBasedOperators() {
610      if (Problem != null) {
611        foreach (var @operator in Problem.Operators.OfType<IIterationBasedOperator>()) {
612          @operator.IterationsParameter.ActualName = "Generations";
613          @operator.IterationsParameter.Hidden = true;
[12531]614          @operator.MaximumIterationsParameter.ActualName = generationsTerminator.ThresholdParameter.Name;
[12120]615          @operator.MaximumIterationsParameter.Hidden = true;
616        }
617      }
618    }
[12993]619    private void ParameterizeAgeLimits() {
620      var scheme = AgingScheme.Value;
621      int ageGap = AgeGap.Value;
622      int numberOfLayers = NumberOfLayers.Value;
623      AgeLimits = scheme.CalculateAgeLimits(ageGap, numberOfLayers);
624    }
[12271]625
[12993]626    private void ParameterizeStochasticOperator(IOperator @operator) {
627      var stochasticOperator = @operator as IStochasticOperator;
628      if (stochasticOperator != null) {
629        stochasticOperator.RandomParameter.ActualName = "GlobalRandom";
630        stochasticOperator.RandomParameter.Hidden = true;
631      }
632    }
633
634    private void ParameterizeStochasticOperatorForLayer(IOperator @operator) {
635      var stochasticOperator = @operator as IStochasticOperator;
636      if (stochasticOperator != null) {
637        stochasticOperator.RandomParameter.ActualName = "LocalRandom";
638        stochasticOperator.RandomParameter.Hidden = true;
639      }
640    }
641
[11578]642    #endregion
643
644    #region Updates
[12993]645    private void UpdateAnalyzers() {
646      Analyzer.Operators.Clear();
647      LayerAnalyzer.Operators.Clear();
648
649      Analyzer.Operators.Add(qualityAnalyzer, qualityAnalyzer.EnabledByDefault);
[12996]650      Analyzer.Operators.Add(ageAnalyzer, ageAnalyzer.EnabledByDefault);
651      Analyzer.Operators.Add(ageDistributionAnalyzer, ageDistributionAnalyzer.EnabledByDefault);
652      LayerAnalyzer.Operators.Add(layerQualityAnalyzer, false);
653      LayerAnalyzer.Operators.Add(layerAgeAnalyzer, false);
654      LayerAnalyzer.Operators.Add(layerAgeDistributionAnalyzer, false);
[12993]655
[12548]656      if (Problem != null) {
[12993]657        foreach (var analyzer in Problem.Operators.OfType<IAnalyzer>()) {
658          Analyzer.Operators.Add(analyzer, analyzer.EnabledByDefault);
[12996]659          LayerAnalyzer.Operators.Add((IAnalyzer)analyzer.Clone(), false);
[12993]660        }
[12548]661      }
[12531]662    }
[11578]663    private void UpdateCrossovers() {
664      var oldCrossover = CrossoverParameter.Value;
665      var defaultCrossover = Problem.Operators.OfType<ICrossover>().FirstOrDefault();
666      CrossoverParameter.ValidValues.Clear();
667      foreach (var crossover in Problem.Operators.OfType<ICrossover>().OrderBy(c => c.Name)) {
668        ParameterizeStochasticOperatorForLayer(crossover);
669        CrossoverParameter.ValidValues.Add(crossover);
670      }
671      if (oldCrossover != null) {
672        var crossover = CrossoverParameter.ValidValues.FirstOrDefault(c => c.GetType() == oldCrossover.GetType());
[11678]673        if (crossover != null)
674          CrossoverParameter.Value = crossover;
675        else
676          oldCrossover = null;
[11578]677      }
678      if (oldCrossover == null && defaultCrossover != null)
679        CrossoverParameter.Value = defaultCrossover;
680    }
681    private void UpdateMutators() {
682      var oldMutator = MutatorParameter.Value;
683      MutatorParameter.ValidValues.Clear();
684      foreach (var mutator in Problem.Operators.OfType<IManipulator>().OrderBy(m => m.Name)) {
685        ParameterizeStochasticOperatorForLayer(mutator);
686        MutatorParameter.ValidValues.Add(mutator);
687      }
688      if (oldMutator != null) {
689        var mutator = MutatorParameter.ValidValues.FirstOrDefault(m => m.GetType() == oldMutator.GetType());
[11678]690        if (mutator != null)
691          MutatorParameter.Value = mutator;
[11578]692      }
693    }
[12993]694    private void UpdateTerminators() {
695      var newTerminators = new Dictionary<ITerminator, bool> {
696        {generationsTerminator, !Terminators.Operators.Contains(generationsTerminator) || Terminators.Operators.ItemChecked(generationsTerminator)},
697        {evaluationsTerminator, Terminators.Operators.Contains(evaluationsTerminator) && Terminators.Operators.ItemChecked(evaluationsTerminator)},
698        {qualityTerminator, Terminators.Operators.Contains(qualityTerminator) && Terminators.Operators.ItemChecked(qualityTerminator) },
699        {executionTimeTerminator, Terminators.Operators.Contains(executionTimeTerminator) && Terminators.Operators.ItemChecked(executionTimeTerminator)}
700      };
701      if (Problem != null) {
702        foreach (var terminator in Problem.Operators.OfType<ITerminator>())
703          newTerminators.Add(terminator, !Terminators.Operators.Contains(terminator) || Terminators.Operators.ItemChecked(terminator));
704      }
705
706      Terminators.Operators.Clear();
707
708      foreach (var newTerminator in newTerminators)
709        Terminators.Operators.Add(newTerminator.Key, newTerminator.Value);
710    }
[11578]711    #endregion
[11567]712  }
713}
Note: See TracBrowser for help on using the repository browser.