Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/09/12 12:22:33 (12 years ago)
Author:
jkarder
Message:

#1331:

  • fixed bug in path relinking selection
  • fixed bug in ScatterSearch.Prepare()
  • added custom interface (IImprovementOperator) for Scatter Search specific improvement operators
  • switched from diversity calculation to similarity calculation
  • separated IPathRelinker from ICrossover
  • changed TestFunctionsImprovementOperator to use reflection for evaluating functions
  • changed SolutionPoolUpdateMethod to use similarity calculation for solution comparison
  • improved TravelingSalesmanImprovementOperator
  • improved operator graph
  • removed specific operators used to evaluate TestFunctions problems
  • removed custom crossover operator (NChildCrossover)
  • added parameters and adjusted types
  • adjusted event handling
  • changed access levels
  • minor code improvements
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ScatterSearch/HeuristicLab.Algorithms.ScatterSearch/3.3/SolutionPool2TierUpdateMethod.cs

    r7775 r7786  
    3636  [Item("SolutionPool2TierUpdateMethod", "An operator that updates the solution pool using a 2-tier strategy.")]
    3737  [StorableClass]
    38   public sealed class SolutionPool2TierUpdateMethod : SingleSuccessorOperator, IScatterSearchTargetProcessor {
     38  public sealed class SolutionPool2TierUpdateMethod : SingleSuccessorOperator {
    3939    #region Parameter properties
    4040    public ScopeParameter CurrentScopeParameter {
    4141      get { return (ScopeParameter)Parameters["CurrentScope"]; }
    4242    }
    43     public IValueLookupParameter<DiversityCalculator> DiversityCalculatorParameter {
    44       get { return (IValueLookupParameter<DiversityCalculator>)Parameters["DiversityCalculator"]; }
     43    public IValueLookupParameter<SimilarityCalculator> SimilarityCalculatorParameter {
     44      get { return (IValueLookupParameter<SimilarityCalculator>)Parameters["SimilarityCalculator"]; }
    4545    }
    4646    public IValueLookupParameter<BoolValue> MaximizationParameter {
     
    5353      get { return (IValueLookupParameter<IntValue>)Parameters["NumberOfHighQualitySolutions"]; }
    5454    }
     55    public IValueLookupParameter<IItem> QualityParameter {
     56      get { return (IValueLookupParameter<IItem>)Parameters["Quality"]; }
     57    }
    5558    public IValueLookupParameter<IntValue> ReferenceSetSizeParameter {
    5659      get { return (IValueLookupParameter<IntValue>)Parameters["ReferenceSetSize"]; }
    57     }
    58     public IValueLookupParameter<IItem> QualityParameter {
    59       get { return (IValueLookupParameter<IItem>)Parameters["Quality"]; }
    6060    }
    6161    public IValueLookupParameter<IItem> TargetParameter {
     
    6868      get { return CurrentScopeParameter.ActualValue; }
    6969    }
    70     private DiversityCalculator DiversityCalculator {
    71       get { return DiversityCalculatorParameter.ActualValue; }
     70    private SimilarityCalculator SimilarityCalculator {
     71      get { return SimilarityCalculatorParameter.ActualValue; }
    7272    }
    7373    private BoolValue Maximization {
     
    8181      get { return NumberOfHighQualitySolutionsParameter.ActualValue; }
    8282    }
     83    private IItem Quality {
     84      get { return QualityParameter.ActualValue; }
     85    }
    8386    private IntValue ReferenceSetSize {
    8487      get { return ReferenceSetSizeParameter.ActualValue; }
    8588      set { ReferenceSetSizeParameter.ActualValue = value; }
    86     }
    87     private IItem Quality {
    88       get { return QualityParameter.ActualValue; }
    8989    }
    9090    private IItem Target {
     
    105105      #region Create parameters
    106106      Parameters.Add(new ScopeParameter("CurrentScope"));
    107       Parameters.Add(new ValueLookupParameter<DiversityCalculator>("DiversityCalculator"));
    108107      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization"));
    109108      Parameters.Add(new ValueLookupParameter<BoolValue>("NewSolutions"));
    110109      Parameters.Add(new ValueLookupParameter<IntValue>("NumberOfHighQualitySolutions"));
     110      Parameters.Add(new ValueLookupParameter<IItem>("Quality"));
    111111      Parameters.Add(new ValueLookupParameter<IntValue>("ReferenceSetSize"));
    112       Parameters.Add(new ValueLookupParameter<IItem>("Quality"));
     112      Parameters.Add(new ValueLookupParameter<SimilarityCalculator>("SimilarityCalculator"));
    113113      Parameters.Add(new ValueLookupParameter<IItem>("Target"));
    114114      #endregion
    115       TargetParameter.ActualName = "KnapsackSolution"; // temporary solution for the knapsack problem
    116115    }
    117116
    118117    public override IOperation Apply() {
    119       var parentsScope = new Scope("Parents");
    120       var offspringScope = new Scope("Offspring");
     118      IScope parentsScope = new Scope("Parents");
     119      IScope offspringScope = new Scope("Offspring");
    121120
    122121      // split parents and offspring
     
    132131
    133132      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>>();
    135134      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;
    138136        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);
    141138        }
    142         highDiversityParents.Add(new Tuple<IScope, double>(oScope, diversity));
     139        highSimilarityParents.Add(new Tuple<IScope, double>(oScope, similarity));
    143140      }
    144141
    145       var offspring = new List<Tuple<IScope, double>>();
     142      IList<Tuple<IScope, double>> offspring = new List<Tuple<IScope, double>>();
    146143      foreach (var oScope in orderedOffspring) {
    147         double diversity = 0.0;
    148         var oSol = oScope.Variables[TargetParameter.ActualName].Value;
     144        double similarity = 0.0;
    149145        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);
    152147        }
    153         offspring.Add(new Tuple<IScope, double>(oScope, diversity));
     148        offspring.Add(new Tuple<IScope, double>(oScope, similarity));
    154149      }
    155150
     
    171166
    172167      // 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; });
    174169      if (offspring.Any(hasBetterDiversity)) NewSolutions.Value = true;
    175170      while (offspring.Any(hasBetterDiversity)) { // better offspring available
    176171        // select best offspring
    177         var bestChild = offspring.OrderByDescending(x => x.Item2).First();
     172        var bestChild = offspring.OrderBy(x => x.Item2).First();
    178173        // select worst parent
    179         var worstParent = highDiversityParents.OrderBy(x => x.Item2).First();
    180         highDiversityParents.Remove(worstParent);
    181         highDiversityParents.Add(bestChild);
     174        var worstParent = highSimilarityParents.OrderByDescending(x => x.Item2).First();
     175        highSimilarityParents.Remove(worstParent);
     176        highSimilarityParents.Add(bestChild);
    182177        offspring.Remove(bestChild);
    183178      }
    184179
    185       CurrentScope.SubScopes.Replace(highQualityParents.Concat(highDiversityParents.Select(x => x.Item1)).ToList());
     180      CurrentScope.SubScopes.Replace(highQualityParents.Concat(highSimilarityParents.Select(x => x.Item1)).ToList());
    186181
    187182      return base.Apply();
    188183    }
    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     }
    205184  }
    206185}
Note: See TracChangeset for help on using the changeset viewer.