Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PersistenceSpeedUp/HeuristicLab.Selection/3.3/CrowdedTournamentSelector.cs @ 6500

Last change on this file since 6500 was 6051, checked in by swagner, 14 years ago

Changed some more parameters to be hidden per default and corrected wrong layout in some parameter views (#1377)

File size: 5.6 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2011 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.Optimization;
28using HeuristicLab.Parameters;
29using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
30
31namespace HeuristicLab.Selection {
32  [Item("CrowdedTournamentSelector", "Selects solutions using tournament selection by using the partial order defined in Deb et al. 2002. A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II. IEEE Transactions on Evolutionary Computation, 6(2), pp. 182-197.")]
33  [StorableClass]
34  public class CrowdedTournamentSelector : Selector, IMultiObjectiveSelector, IStochasticOperator {
35    public ILookupParameter<BoolArray> MaximizationParameter {
36      get { return (ILookupParameter<BoolArray>)Parameters["Maximization"]; }
37    }
38    public IValueLookupParameter<IntValue> NumberOfSelectedSubScopesParameter {
39      get { return (IValueLookupParameter<IntValue>)Parameters["NumberOfSelectedSubScopes"]; }
40    }
41    protected IValueParameter<BoolValue> CopySelectedParameter {
42      get { return (IValueParameter<BoolValue>)Parameters["CopySelected"]; }
43    }
44    public ILookupParameter<IRandom> RandomParameter {
45      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
46    }
47    public ILookupParameter<ItemArray<DoubleArray>> QualitiesParameter {
48      get { return (ILookupParameter<ItemArray<DoubleArray>>)Parameters["Qualities"]; }
49    }
50    public IScopeTreeLookupParameter<IntValue> RankParameter {
51      get { return (IScopeTreeLookupParameter<IntValue>)Parameters["Rank"]; }
52    }
53    public IScopeTreeLookupParameter<DoubleValue> CrowdingDistanceParameter {
54      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["CrowdingDistance"]; }
55    }
56    public IValueLookupParameter<IntValue> GroupSizeParameter {
57      get { return (IValueLookupParameter<IntValue>)Parameters["GroupSize"]; }
58    }
59
60    public BoolValue CopySelected {
61      get { return CopySelectedParameter.Value; }
62      set { CopySelectedParameter.Value = value; }
63    }
64
65    [StorableConstructor]
66    protected CrowdedTournamentSelector(bool deserializing) : base(deserializing) { }
67    protected CrowdedTournamentSelector(CrowdedTournamentSelector original, Cloner cloner) : base(original, cloner) { }
68    public CrowdedTournamentSelector()
69      : base() {
70      Parameters.Add(new LookupParameter<BoolArray>("Maximization", "For each objective determines whether it should be maximized or minimized."));
71      Parameters.Add(new ValueLookupParameter<IntValue>("NumberOfSelectedSubScopes", "The number of sub-scopes that should be selected."));
72      Parameters.Add(new ValueParameter<BoolValue>("CopySelected", "True if the selected scopes are to be copied (cloned) otherwise they're moved."));
73      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
74      Parameters.Add(new ScopeTreeLookupParameter<DoubleArray>("Qualities", "The solutions' qualities vector."));
75      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("Rank", "The solutions' domination rank."));
76      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("CrowdingDistance", "The solutions' crowding distance values."));
77      Parameters.Add(new ValueLookupParameter<IntValue>("GroupSize", "The size of the group from which the best will be chosen.", new IntValue(2)));
78      CopySelectedParameter.Hidden = true;
79    }
80
81    protected override IScope[] Select(List<IScope> scopes) {
82      IRandom random = RandomParameter.ActualValue;
83      List<int> ranks = RankParameter.ActualValue.Select(x => x.Value).ToList();
84      List<double> crowdingDistance = CrowdingDistanceParameter.ActualValue.Select(x => x.Value).ToList();
85      int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
86      int groupSize = GroupSizeParameter.ActualValue.Value;
87      bool copy = CopySelected.Value;
88      IScope[] selected = new IScope[count];
89
90      for (int i = 0; i < count; i++) {
91        int best = random.Next(scopes.Count);
92        int index;
93        for (int j = 1; j < groupSize; j++) {
94          index = random.Next(scopes.Count);
95          if (ranks[best] > ranks[index]
96            || ranks[best] == ranks[index]
97              && crowdingDistance[best] < crowdingDistance[index]) {
98            best = index;
99          }
100        }
101
102        if (copy)
103          selected[i] = (IScope)scopes[best].Clone();
104        else {
105          selected[i] = scopes[best];
106          scopes.RemoveAt(best);
107          ranks.RemoveAt(best);
108          crowdingDistance.RemoveAt(best);
109        }
110      }
111
112      return selected;
113    }
114
115    public override IDeepCloneable Clone(Cloner cloner) {
116      return new CrowdedTournamentSelector(this, cloner);
117    }
118  }
119}
Note: See TracBrowser for help on using the repository browser.