Free cookie consent management tool by TermsFeed Policy Generator

source: branches/ProblemRefactoring/HeuristicLab.Algorithms.ALPS/3.3/EldersSelector.cs @ 13611

Last change on this file since 13611 was 13206, checked in by pfleck, 9 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: 3.5 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.Collections.Generic;
23using System.Linq;
24using HeuristicLab.Common;
25using HeuristicLab.Core;
26using HeuristicLab.Data;
27using HeuristicLab.Parameters;
28using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
29using HeuristicLab.Selection;
30
31namespace HeuristicLab.Algorithms.ALPS {
32
33  [Item("EldersSelector", "Select all individuals which are too old for their current layer.")]
34  [StorableClass]
35  public sealed class EldersSelector : Selector {
36    public IScopeTreeLookupParameter<DoubleValue> AgeParameter {
37      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["Age"]; }
38    }
39    public ILookupParameter<IntArray> AgeLimitsParameter {
40      get { return (ILookupParameter<IntArray>)Parameters["AgeLimits"]; }
41    }
42    public ILookupParameter<IntValue> NumberOfLayersParameter {
43      get { return (ILookupParameter<IntValue>)Parameters["NumberOfLayers"]; }
44    }
45    public ILookupParameter<IntValue> LayerParameter {
46      get { return (ILookupParameter<IntValue>)Parameters["Layer"]; }
47    }
48
49    [StorableConstructor]
50    private EldersSelector(bool deserializing)
51      : base(deserializing) { }
52    private EldersSelector(EldersSelector original, Cloner cloner)
53      : base(original, cloner) { }
54    public override IDeepCloneable Clone(Cloner cloner) {
55      return new EldersSelector(this, cloner);
56    }
57    public EldersSelector()
58      : base() {
59      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Age", "The age of individuals."));
60      Parameters.Add(new LookupParameter<IntArray>("AgeLimits", "The maximum age an individual is allowed to reach in a certain layer."));
61      Parameters.Add(new LookupParameter<IntValue>("NumberOfLayers", "The number of layers."));
62      Parameters.Add(new LookupParameter<IntValue>("Layer", "The number of the current layer."));
63    }
64
65    protected override IScope[] Select(List<IScope> scopes) {
66      var ages = AgeParameter.ActualValue;
67      var ageLimits = AgeLimitsParameter.ActualValue;
68      int numberOfLayers = NumberOfLayersParameter.ActualValue.Value;
69      int layer = LayerParameter.ActualValue.Value;
70
71      if (layer >= numberOfLayers - 1) // is max layer?
72        return new IScope[0];
73
74      int limit = ageLimits[layer];
75      var elders = ages
76        .Select((x, index) => new { index, age = x.Value })
77        .Where(x => x.age > limit)
78        .ToList();
79
80      IScope[] selected = new IScope[elders.Count];
81      for (int i = 0; i < elders.Count; i++) {
82        selected[i] = scopes[elders[i].index];
83        scopes[elders[i].index] = null;
84      }
85      scopes.RemoveAll(x => x == null);
86      return selected;
87    }
88  }
89}
Note: See TracBrowser for help on using the repository browser.