Changeset 9605 for branches/LearningClassifierSystems/HeuristicLab.Optimization.Operators.LCS/3.3/Selection
- Timestamp:
- 06/11/13 13:32:32 (12 years ago)
- 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 33 33 [Item("NichingTournamentSelector", "Description missing")] 34 34 [StorableClass] 35 public class NichingTournamentSelector : StochasticSingleObjectiveSelector, INichingSingleObjectiveSelector {35 public class NichingTournamentSelector : StochasticSingleObjectiveSelector, INichingSingleObjectiveSelector, IHierarchicalSingleObjectiveSelector { 36 36 37 37 #region Parameter Properties … … 50 50 public ILookupParameter<ItemArray<IGAssistIndividual>> IndividualParameter { 51 51 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"]; } 52 68 } 53 69 #endregion … … 65 81 Parameters.Add(new ValueLookupParameter<IntValue>("ParentsPerChild", "")); 66 82 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", "")); 67 88 } 68 89 public override IDeepCloneable Clone(Cloner cloner) { … … 76 97 bool maximization = MaximizationParameter.ActualValue.Value; 77 98 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; 78 102 List<IGAssistIndividual> individuals = IndividualParameter.ActualValue.ToList(); 79 103 int groupSize = GroupSizeParameter.ActualValue.Value; … … 83 107 //check if list with indexes is as long as the original scope list 84 108 //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)) { 86 110 throw new ArgumentException("The scopes contain invalid quality values (either infinity or double.NaN) on which the selector cannot operate."); 87 111 } 88 112 89 113 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); 116 125 int index; 117 if (doNiching) {118 best = nicheScope[niche][random.Next(nicheScope[niche].Count)];119 }120 126 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)) { 128 129 best = index; 129 130 } 130 131 } 131 132 132 niche = individuals[best].Niche;133 134 133 if (copy) 135 selected[ curCount] = (IScope)scopes[best].Clone();134 selected[i] = (IScope)scopes[best].Clone(); 136 135 else { 137 selected[ curCount] = scopes[best];136 selected[i] = scopes[best]; 138 137 scopes.RemoveAt(best); 139 138 qualities.RemoveAt(best); 140 139 } 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 } 143 195 } 144 196 } 145 197 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])); 146 212 } 147 213
Note: See TracChangeset
for help on using the changeset viewer.