Changeset 7786 for branches/ScatterSearch/HeuristicLab.Algorithms.ScatterSearch/3.3/SolutionPool2TierUpdateMethod.cs
- Timestamp:
- 05/09/12 12:22:33 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ScatterSearch/HeuristicLab.Algorithms.ScatterSearch/3.3/SolutionPool2TierUpdateMethod.cs
r7775 r7786 36 36 [Item("SolutionPool2TierUpdateMethod", "An operator that updates the solution pool using a 2-tier strategy.")] 37 37 [StorableClass] 38 public sealed class SolutionPool2TierUpdateMethod : SingleSuccessorOperator , IScatterSearchTargetProcessor{38 public sealed class SolutionPool2TierUpdateMethod : SingleSuccessorOperator { 39 39 #region Parameter properties 40 40 public ScopeParameter CurrentScopeParameter { 41 41 get { return (ScopeParameter)Parameters["CurrentScope"]; } 42 42 } 43 public IValueLookupParameter< DiversityCalculator> DiversityCalculatorParameter {44 get { return (IValueLookupParameter< DiversityCalculator>)Parameters["DiversityCalculator"]; }43 public IValueLookupParameter<SimilarityCalculator> SimilarityCalculatorParameter { 44 get { return (IValueLookupParameter<SimilarityCalculator>)Parameters["SimilarityCalculator"]; } 45 45 } 46 46 public IValueLookupParameter<BoolValue> MaximizationParameter { … … 53 53 get { return (IValueLookupParameter<IntValue>)Parameters["NumberOfHighQualitySolutions"]; } 54 54 } 55 public IValueLookupParameter<IItem> QualityParameter { 56 get { return (IValueLookupParameter<IItem>)Parameters["Quality"]; } 57 } 55 58 public IValueLookupParameter<IntValue> ReferenceSetSizeParameter { 56 59 get { return (IValueLookupParameter<IntValue>)Parameters["ReferenceSetSize"]; } 57 }58 public IValueLookupParameter<IItem> QualityParameter {59 get { return (IValueLookupParameter<IItem>)Parameters["Quality"]; }60 60 } 61 61 public IValueLookupParameter<IItem> TargetParameter { … … 68 68 get { return CurrentScopeParameter.ActualValue; } 69 69 } 70 private DiversityCalculator DiversityCalculator {71 get { return DiversityCalculatorParameter.ActualValue; }70 private SimilarityCalculator SimilarityCalculator { 71 get { return SimilarityCalculatorParameter.ActualValue; } 72 72 } 73 73 private BoolValue Maximization { … … 81 81 get { return NumberOfHighQualitySolutionsParameter.ActualValue; } 82 82 } 83 private IItem Quality { 84 get { return QualityParameter.ActualValue; } 85 } 83 86 private IntValue ReferenceSetSize { 84 87 get { return ReferenceSetSizeParameter.ActualValue; } 85 88 set { ReferenceSetSizeParameter.ActualValue = value; } 86 }87 private IItem Quality {88 get { return QualityParameter.ActualValue; }89 89 } 90 90 private IItem Target { … … 105 105 #region Create parameters 106 106 Parameters.Add(new ScopeParameter("CurrentScope")); 107 Parameters.Add(new ValueLookupParameter<DiversityCalculator>("DiversityCalculator"));108 107 Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization")); 109 108 Parameters.Add(new ValueLookupParameter<BoolValue>("NewSolutions")); 110 109 Parameters.Add(new ValueLookupParameter<IntValue>("NumberOfHighQualitySolutions")); 110 Parameters.Add(new ValueLookupParameter<IItem>("Quality")); 111 111 Parameters.Add(new ValueLookupParameter<IntValue>("ReferenceSetSize")); 112 Parameters.Add(new ValueLookupParameter< IItem>("Quality"));112 Parameters.Add(new ValueLookupParameter<SimilarityCalculator>("SimilarityCalculator")); 113 113 Parameters.Add(new ValueLookupParameter<IItem>("Target")); 114 114 #endregion 115 TargetParameter.ActualName = "KnapsackSolution"; // temporary solution for the knapsack problem116 115 } 117 116 118 117 public override IOperation Apply() { 119 varparentsScope = new Scope("Parents");120 varoffspringScope = new Scope("Offspring");118 IScope parentsScope = new Scope("Parents"); 119 IScope offspringScope = new Scope("Offspring"); 121 120 122 121 // split parents and offspring … … 132 131 133 132 var highQualityParents = orderedParents.Take(NumberOfHighQualitySolutions.Value).ToList(); 134 var highDiversityParents = new List<Tuple<IScope, double>>();133 IList<Tuple<IScope, double>> highSimilarityParents = new List<Tuple<IScope, double>>(); 135 134 foreach (var oScope in orderedParents.Skip(NumberOfHighQualitySolutions.Value)) { 136 double diversity = 0.0; 137 var oSol = oScope.Variables[TargetParameter.ActualName].Value; 135 double similarity = 0.0; 138 136 foreach (var hScope in highQualityParents) { 139 var hSol = hScope.Variables[TargetParameter.ActualName].Value; 140 diversity += DiversityCalculator.ExecuteCalculation(oSol, hSol); 137 similarity += SimilarityCalculator.ExecuteCalculation(oScope, hScope); 141 138 } 142 high DiversityParents.Add(new Tuple<IScope, double>(oScope, diversity));139 highSimilarityParents.Add(new Tuple<IScope, double>(oScope, similarity)); 143 140 } 144 141 145 varoffspring = new List<Tuple<IScope, double>>();142 IList<Tuple<IScope, double>> offspring = new List<Tuple<IScope, double>>(); 146 143 foreach (var oScope in orderedOffspring) { 147 double diversity = 0.0; 148 var oSol = oScope.Variables[TargetParameter.ActualName].Value; 144 double similarity = 0.0; 149 145 foreach (var hScope in highQualityParents) { 150 var hSol = hScope.Variables[TargetParameter.ActualName].Value; 151 diversity += DiversityCalculator.ExecuteCalculation(oSol, hSol); 146 similarity += SimilarityCalculator.ExecuteCalculation(oScope, hScope); 152 147 } 153 offspring.Add(new Tuple<IScope, double>(oScope, diversity));148 offspring.Add(new Tuple<IScope, double>(oScope, similarity)); 154 149 } 155 150 … … 171 166 172 167 // update diversity part of the reference set 173 var hasBetterDiversity = (Func<Tuple<IScope, double>, bool>)(x => { return x.Item2 > highDiversityParents.OrderBy(y => y.Item2).First().Item2; });168 var hasBetterDiversity = (Func<Tuple<IScope, double>, bool>)(x => { return x.Item2 < highSimilarityParents.OrderByDescending(y => y.Item2).First().Item2; }); 174 169 if (offspring.Any(hasBetterDiversity)) NewSolutions.Value = true; 175 170 while (offspring.Any(hasBetterDiversity)) { // better offspring available 176 171 // select best offspring 177 var bestChild = offspring.OrderBy Descending(x => x.Item2).First();172 var bestChild = offspring.OrderBy(x => x.Item2).First(); 178 173 // select worst parent 179 var worstParent = high DiversityParents.OrderBy(x => x.Item2).First();180 high DiversityParents.Remove(worstParent);181 high DiversityParents.Add(bestChild);174 var worstParent = highSimilarityParents.OrderByDescending(x => x.Item2).First(); 175 highSimilarityParents.Remove(worstParent); 176 highSimilarityParents.Add(bestChild); 182 177 offspring.Remove(bestChild); 183 178 } 184 179 185 CurrentScope.SubScopes.Replace(highQualityParents.Concat(high DiversityParents.Select(x => x.Item1)).ToList());180 CurrentScope.SubScopes.Replace(highQualityParents.Concat(highSimilarityParents.Select(x => x.Item1)).ToList()); 186 181 187 182 return base.Apply(); 188 183 } 189 190 private class KeyEqualityComparer<T> : IEqualityComparer<T> {191 private readonly Func<T, object> keyExtractor;192 193 public KeyEqualityComparer(Func<T, object> keyExtractor) {194 this.keyExtractor = keyExtractor;195 }196 197 public bool Equals(T x, T y) {198 return keyExtractor(x).Equals(keyExtractor(y));199 }200 201 public int GetHashCode(T obj) {202 return keyExtractor(obj).GetHashCode();203 }204 }205 184 } 206 185 }
Note: See TracChangeset
for help on using the changeset viewer.