Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/11/13 13:32:32 (11 years ago)
Author:
sforsten
Message:

#1980:

  • set plugin dependencies
  • added smart initialization
  • added hierarchical selection
  • fixed major and minor default rule
  • fixed several smaller bugs
  • some refactoring has been done
Location:
branches/LearningClassifierSystems/HeuristicLab.Optimization.Operators.LCS/3.3/Selection
Files:
2 added
1 edited

Legend:

Unmodified
Added
Removed
  • branches/LearningClassifierSystems/HeuristicLab.Optimization.Operators.LCS/3.3/Selection/NichingTournamentSelector.cs

    r9475 r9605  
    3333  [Item("NichingTournamentSelector", "Description missing")]
    3434  [StorableClass]
    35   public class NichingTournamentSelector : StochasticSingleObjectiveSelector, INichingSingleObjectiveSelector {
     35  public class NichingTournamentSelector : StochasticSingleObjectiveSelector, INichingSingleObjectiveSelector, IHierarchicalSingleObjectiveSelector {
    3636
    3737    #region Parameter Properties
     
    5050    public ILookupParameter<ItemArray<IGAssistIndividual>> IndividualParameter {
    5151      get { return (ILookupParameter<ItemArray<IGAssistIndividual>>)Parameters["Individual"]; }
     52    }
     53    public ILookupParameter<ItemArray<DoubleValue>> LengthParameter {
     54      get { return (ILookupParameter<ItemArray<DoubleValue>>)Parameters["Length"]; }
     55    }
     56    public IValueLookupParameter<DoubleValue> LengthThresholdParameter {
     57      get { return (IValueLookupParameter<DoubleValue>)Parameters["LengthThreshold"]; }
     58    }
     59    public IValueLookupParameter<IntValue> IterationHirachicalSelectionParameter {
     60      get { return (IValueLookupParameter<IntValue>)Parameters["IterationHirachicalSelection"]; }
     61    }
     62
     63    public ILookupParameter<IntValue> IterationsParameter {
     64      get { return (ILookupParameter<IntValue>)Parameters["Iterations"]; }
     65    }
     66    public IValueLookupParameter<IntValue> MaximumIterationsParameter {
     67      get { return (IValueLookupParameter<IntValue>)Parameters["MaximumIterations"]; }
    5268    }
    5369    #endregion
     
    6581      Parameters.Add(new ValueLookupParameter<IntValue>("ParentsPerChild", ""));
    6682      Parameters.Add(new ScopeTreeLookupParameter<IGAssistIndividual>("Individual", ""));
     83      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Length", "The length value contained in each sub-scope which is used for selection."));
     84      Parameters.Add(new ValueLookupParameter<DoubleValue>("LengthThreshold", "", new DoubleValue(0.000001)));
     85      Parameters.Add(new ValueLookupParameter<IntValue>("IterationHirachicalSelection", "", new IntValue(24)));
     86      Parameters.Add(new LookupParameter<IntValue>("Iterations", ""));
     87      Parameters.Add(new ValueLookupParameter<IntValue>("MaximumIterations", ""));
    6788    }
    6889    public override IDeepCloneable Clone(Cloner cloner) {
     
    7697      bool maximization = MaximizationParameter.ActualValue.Value;
    7798      List<double> qualities = QualityParameter.ActualValue.Where(x => IsValidQuality(x.Value)).Select(x => x.Value).ToList();
     99      List<double> lengths = LengthParameter.ActualValue.Select(x => x.Value).ToList();
     100      bool useLength = lengths.Count > 0;
     101      double lengtThreshold = LengthThresholdParameter.ActualValue.Value;
    78102      List<IGAssistIndividual> individuals = IndividualParameter.ActualValue.ToList();
    79103      int groupSize = GroupSizeParameter.ActualValue.Value;
     
    83107      //check if list with indexes is as long as the original scope list
    84108      //otherwise invalid quality values were filtered
    85       if (qualities.Count != scopes.Count || individuals.Count != scopes.Count) {
     109      if (qualities.Count != scopes.Count || individuals.Count != scopes.Count || (useLength && lengths.Count != scopes.Count)) {
    86110        throw new ArgumentException("The scopes contain invalid quality values (either infinity or double.NaN) on which the selector cannot operate.");
    87111      }
    88112
    89113      int parentsPerChild = ParentsPerChildParameter.ActualValue.Value;
    90       var nicheComparer = GAssistNichesProblemDataParameter.ActualValue.GetPossibleNiches().First().Comparer;
    91       var selectPerNiche = new Dictionary<IGAssistNiche, int>(nicheComparer);
    92       var nicheScope = new Dictionary<IGAssistNiche, List<int>>(nicheComparer);
    93 
    94       for (int i = 0; i < individuals.Count; i++) {
    95         if (!nicheScope.ContainsKey(individuals[i].Niche)) {
    96           nicheScope.Add(individuals[i].Niche, new List<int>());
    97         }
    98         nicheScope[individuals[i].Niche].Add(i);
    99       }
    100 
    101       var possibleNiches = nicheScope.Keys.ToList();
    102       foreach (var niche in possibleNiches) {
    103         selectPerNiche.Add(niche, count / possibleNiches.Count);
    104       }
    105 
    106       int curCount = 0;
    107       while (curCount < count) {
    108         IGAssistNiche niche = null;
    109         int best = -1;
    110         if (doNiching) {
    111           niche = GetNiche(random, selectPerNiche, possibleNiches);
    112         } else {
    113           best = random.Next(scopes.Count);
    114         }
    115         for (int i = 0; i < parentsPerChild; i++) {
     114
     115      if (individuals.Any(x => x.Niche == null) && individuals.Any(x => x.Niche != null)) {
     116        throw new ArgumentException("Either all individuals have a default action or none.");
     117      }
     118
     119      //null cannot be a key in a dictionary (nicheScope), therefore torunament selection has to be done differently
     120      //to keep it a little maintainable, the case that no default rule is used has been separated
     121      if (individuals.Any(x => x.Niche == null)) {
     122        //normal tournament selection
     123        for (int i = 0; i < count; i++) {
     124          int best = random.Next(scopes.Count);
    116125          int index;
    117           if (doNiching) {
    118             best = nicheScope[niche][random.Next(nicheScope[niche].Count)];
    119           }
    120126          for (int j = 1; j < groupSize; j++) {
    121             if (niche != null) {
    122               index = nicheScope[niche][random.Next(nicheScope[niche].Count)];
    123             } else {
    124               index = random.Next(scopes.Count);
    125             }
    126             if (((maximization) && (qualities[index] > qualities[best])) ||
    127                 ((!maximization) && (qualities[index] < qualities[best]))) {
     127            index = random.Next(scopes.Count);
     128            if (IsBetterHirachical(index, best, qualities, lengths, lengtThreshold, useLength, maximization)) {
    128129              best = index;
    129130            }
    130131          }
    131132
    132           niche = individuals[best].Niche;
    133 
    134133          if (copy)
    135             selected[curCount] = (IScope)scopes[best].Clone();
     134            selected[i] = (IScope)scopes[best].Clone();
    136135          else {
    137             selected[curCount] = scopes[best];
     136            selected[i] = scopes[best];
    138137            scopes.RemoveAt(best);
    139138            qualities.RemoveAt(best);
    140139          }
    141           selectPerNiche[niche]--;
    142           curCount++;
     140        }
     141      } else {
     142        var nicheComparer = GAssistNichesProblemDataParameter.ActualValue.GetPossibleNiches().First().Comparer;
     143        var selectPerNiche = new Dictionary<IGAssistNiche, int>(nicheComparer);
     144        var nicheScope = new Dictionary<IGAssistNiche, List<int>>(nicheComparer);
     145        //niching tournament selection
     146        for (int i = 0; i < individuals.Count; i++) {
     147          if (!nicheScope.ContainsKey(individuals[i].Niche)) {
     148            nicheScope.Add(individuals[i].Niche, new List<int>());
     149          }
     150          nicheScope[individuals[i].Niche].Add(i);
     151        }
     152
     153        var possibleNiches = nicheScope.Keys.ToList();
     154        foreach (var niche in possibleNiches) {
     155          selectPerNiche.Add(niche, count / possibleNiches.Count);
     156        }
     157
     158        int curCount = 0;
     159        while (curCount < count) {
     160          IGAssistNiche niche = null;
     161          int best = -1;
     162          if (doNiching) {
     163            niche = GetNiche(random, selectPerNiche, possibleNiches);
     164          } else {
     165            best = random.Next(scopes.Count);
     166          }
     167          for (int i = 0; i < parentsPerChild; i++) {
     168            int index;
     169            if (doNiching) {
     170              best = nicheScope[niche][random.Next(nicheScope[niche].Count)];
     171            }
     172            for (int j = 1; j < groupSize; j++) {
     173              if (niche != null) {
     174                index = nicheScope[niche][random.Next(nicheScope[niche].Count)];
     175              } else {
     176                index = random.Next(scopes.Count);
     177              }
     178              if (IsBetterHirachical(index, best, qualities, lengths, lengtThreshold, useLength, maximization)) {
     179                best = index;
     180              }
     181            }
     182
     183            niche = individuals[best].Niche;
     184
     185            if (copy)
     186              selected[curCount] = (IScope)scopes[best].Clone();
     187            else {
     188              selected[curCount] = scopes[best];
     189              scopes.RemoveAt(best);
     190              qualities.RemoveAt(best);
     191            }
     192            selectPerNiche[niche]--;
     193            curCount++;
     194          }
    143195        }
    144196      }
    145197      return selected;
     198    }
     199
     200    private bool IsBetterHirachical(int indexTrue, int indexFalse, IList<double> qualities, IList<double> length, double hierarchicalThreshold, bool useLength, bool maximization) {
     201      if (useLength && IterationsParameter.ActualValue.Value >= IterationHirachicalSelectionParameter.ActualValue.Value
     202        && Math.Abs(qualities[indexTrue] - qualities[indexFalse]) <= hierarchicalThreshold
     203        && length[indexTrue] != length[indexFalse]) {
     204        return length[indexTrue] < length[indexFalse];
     205      }
     206      return IsBetter(indexTrue, indexFalse, qualities, maximization);
     207    }
     208
     209    private bool IsBetter(int indexTrue, int indexFalse, IList<double> qualities, bool maximization) {
     210      return ((maximization) && (qualities[indexTrue] > qualities[indexFalse])) ||
     211             ((!maximization) && (qualities[indexTrue] < qualities[indexFalse]));
    146212    }
    147213
Note: See TracChangeset for help on using the changeset viewer.