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/TestFunctions/TestFunctionsImprovementOperator.cs

    r7775 r7786  
    2121
    2222using System;
     23using System.Reflection;
    2324using HeuristicLab.Common;
    2425using HeuristicLab.Core;
     
    2627using HeuristicLab.Encodings.RealVectorEncoding;
    2728using HeuristicLab.Operators;
    28 using HeuristicLab.Optimization;
    2929using HeuristicLab.Parameters;
    3030using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    31 using HeuristicLab.Problems.Knapsack;
    3231using HeuristicLab.Problems.TestFunctions;
    3332
     
    3837  [Item("TestFunctionsImprovementOperator", "An operator that improves test functions solutions.")]
    3938  [StorableClass]
    40   public abstract class TestFunctionsImprovementOperator : SingleSuccessorOperator, ILocalImprovementOperator, IScatterSearchTargetProcessor {
    41     #region Problem properties
    42     public Type ProblemType {
    43       get { return typeof(KnapsackProblem); }
    44     }
    45     [Storable]
    46     private KnapsackProblem problem;
    47     public IProblem Problem {
    48       get { return problem; }
    49       set { problem = (KnapsackProblem)value; }
    50     }
    51     #endregion
    52 
     39  public sealed class TestFunctionsImprovementOperator : SingleSuccessorOperator, IImprovementOperator {
    5340    #region Parameter properties
     41    public IValueParameter<DoubleValue> AlphaParameter {
     42      get { return (IValueParameter<DoubleValue>)Parameters["Alpha"]; }
     43    }
     44    public IValueParameter<DoubleValue> BetaParameter {
     45      get { return (IValueParameter<DoubleValue>)Parameters["Beta"]; }
     46    }
    5447    public ScopeParameter CurrentScopeParameter {
    5548      get { return (ScopeParameter)Parameters["CurrentScope"]; }
    5649    }
    57     public IValueLookupParameter<DoubleMatrix> CoordinatesParameter {
    58       get { return (IValueLookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
     50    public IValueParameter<DoubleValue> DeltaParameter {
     51      get { return (IValueParameter<DoubleValue>)Parameters["Delta"]; }
    5952    }
    6053    public IValueLookupParameter<ISingleObjectiveTestFunctionProblemEvaluator> EvaluatorParameter {
    6154      get { return (IValueLookupParameter<ISingleObjectiveTestFunctionProblemEvaluator>)Parameters["Evaluator"]; }
    6255    }
     56    public IValueParameter<DoubleValue> GammaParameter {
     57      get { return (IValueParameter<DoubleValue>)Parameters["Gamma"]; }
     58    }
    6359    public IValueLookupParameter<IntValue> ImprovementAttemptsParameter {
    6460      get { return (IValueLookupParameter<IntValue>)Parameters["ImprovementAttempts"]; }
     
    7066      get { return (IValueLookupParameter<IItem>)Parameters["Target"]; }
    7167    }
    72     public IValueParameter<DoubleValue> AlphaParameter {
    73       get { return (IValueParameter<DoubleValue>)Parameters["Alpha"]; }
    74     }
    75     public IValueParameter<DoubleValue> BetaParameter {
    76       get { return (IValueParameter<DoubleValue>)Parameters["Beta"]; }
    77     }
    78     public IValueParameter<DoubleValue> GammaParameter {
    79       get { return (IValueParameter<DoubleValue>)Parameters["Gamma"]; }
    80     }
    81     public IValueParameter<DoubleValue> DeltaParameter {
    82       get { return (IValueParameter<DoubleValue>)Parameters["Delta"]; }
    83     }
    84     #region ILocalImprovementOperator Parameters
    85     public IValueLookupParameter<IntValue> MaximumIterationsParameter {
    86       get { return (IValueLookupParameter<IntValue>)Parameters["MaximumIterations"]; }
    87     }
    88     public ILookupParameter<IntValue> EvaluatedSolutionsParameter {
    89       get { return (ILookupParameter<IntValue>)Parameters["EvaluatedSolutions"]; }
    90     }
    91     public ILookupParameter<ResultCollection> ResultsParameter {
    92       get { return (ILookupParameter<ResultCollection>)Parameters["Results"]; }
    93     }
    9468    #endregion
    95     #endregion
    9669
    9770    #region Properties
    98     private IItem Target {
    99       get { return TargetParameter.ActualValue; }
    100     }
    10171    private DoubleValue Alpha {
    10272      get { return AlphaParameter.Value; }
     
    10575      get { return BetaParameter.Value; }
    10676    }
    107     private DoubleValue Gamma {
    108       get { return GammaParameter.Value; }
     77    public IScope CurrentScope {
     78      get { return CurrentScopeParameter.ActualValue; }
    10979    }
    11080    private DoubleValue Delta {
    11181      get { return DeltaParameter.Value; }
    112     }
    113     protected Func<RealVector, double> FunctionEvaluator { get; set; }
    114     public IScope CurrentScope {
    115       get { return CurrentScopeParameter.ActualValue; }
    116     }
    117     public DoubleMatrix Coordinates {
    118       get { return CoordinatesParameter.ActualValue; }
    119       set { CoordinatesParameter.ActualValue = value; }
    12082    }
    12183    public ISingleObjectiveTestFunctionProblemEvaluator Evaluator {
     
    12385      set { EvaluatorParameter.ActualValue = value; }
    12486    }
     87    private DoubleValue Gamma {
     88      get { return GammaParameter.Value; }
     89    }
    12590    public IntValue ImprovementAttempts {
    12691      get { return ImprovementAttemptsParameter.ActualValue; }
     
    13196      set { RandomParameter.ActualValue = value; }
    13297    }
     98    private IItem Target {
     99      get { return TargetParameter.ActualValue; }
     100    }
    133101    #endregion
    134102
    135103    [StorableConstructor]
    136     protected TestFunctionsImprovementOperator(bool deserializing) : base(deserializing) { }
    137     protected TestFunctionsImprovementOperator(TestFunctionsImprovementOperator original, Cloner cloner)
    138       : base(original, cloner) {
    139       this.problem = cloner.Clone(original.problem);
    140     }
     104    private TestFunctionsImprovementOperator(bool deserializing) : base(deserializing) { }
     105    private TestFunctionsImprovementOperator(TestFunctionsImprovementOperator original, Cloner cloner) : base(original, cloner) { }
    141106    public TestFunctionsImprovementOperator()
    142107      : base() {
    143108      #region Create parameters
    144       Parameters.Add(new ScopeParameter("CurrentScope"));
    145       Parameters.Add(new ValueLookupParameter<DoubleMatrix>("Coordinates"));
    146       Parameters.Add(new ValueLookupParameter<ISingleObjectiveTestFunctionProblemEvaluator>("Evaluator"));
    147       Parameters.Add(new ValueLookupParameter<IntValue>("ImprovementAttempts", new IntValue(100)));
    148       Parameters.Add(new ValueLookupParameter<IRandom>("Random"));
    149       Parameters.Add(new ValueLookupParameter<IItem>("Target"));
    150109      Parameters.Add(new ValueParameter<DoubleValue>("Alpha", new DoubleValue(1.0)));
    151110      Parameters.Add(new ValueParameter<DoubleValue>("Beta", new DoubleValue(2.0)));
     111      Parameters.Add(new ScopeParameter("CurrentScope"));
     112      Parameters.Add(new ValueParameter<DoubleValue>("Delta", new DoubleValue(0.5)));
     113      Parameters.Add(new ValueLookupParameter<ISingleObjectiveTestFunctionProblemEvaluator>("Evaluator"));
    152114      Parameters.Add(new ValueParameter<DoubleValue>("Gamma", new DoubleValue(0.5)));
    153       Parameters.Add(new ValueParameter<DoubleValue>("Delta", new DoubleValue(0.5)));
     115      Parameters.Add(new ValueLookupParameter<IntValue>("ImprovementAttempts", new IntValue(100)));
     116      Parameters.Add(new ValueLookupParameter<IItem>("Target"));
     117      Parameters.Add(new ValueLookupParameter<IRandom>("Random"));
    154118      #endregion
    155119      TargetParameter.ActualName = "Point"; // temporary solution for the test functions problem
    156120    }
    157121
     122    public override IDeepCloneable Clone(Cloner cloner) {
     123      return new TestFunctionsImprovementOperator(this, cloner);
     124    }
     125
    158126    public override IOperation Apply() {
    159       var bestSol = CurrentScope.Variables[TargetParameter.ActualName].Value as RealVector;
    160       var bestSolQuality = FunctionEvaluator(bestSol);
     127      RealVector bestSol = CurrentScope.Variables[TargetParameter.ActualName].Value as RealVector;
     128      MethodInfo evaluationMethod = Evaluator.GetType().GetMethod("Apply",
     129                                                                  BindingFlags.Public | BindingFlags.Static,
     130                                                                  null,
     131                                                                  new Type[] { typeof(RealVector) }, null);
     132      Func<RealVector, double> functionEvaluator = x => (double)evaluationMethod.Invoke(Evaluator, new object[] { x });
     133      double bestSolQuality = functionEvaluator(bestSol);
    161134
    162135      // create perturbed solutions
    163       var simplex = new RealVector[bestSol.Length];
     136      RealVector[] simplex = new RealVector[bestSol.Length];
    164137      for (int i = 0; i < simplex.Length; i++) {
    165138        simplex[i] = bestSol.Clone() as RealVector;
     
    172145      for (int i = 0; i < ImprovementAttempts.Value; i++) {
    173146        // order according to their objective function value
    174         Array.Sort(simplex, (x, y) => FunctionEvaluator(x).CompareTo(FunctionEvaluator(y)));
     147        Array.Sort(simplex, (x, y) => functionEvaluator(x).CompareTo(functionEvaluator(y)));
    175148
    176149        // calculate centroid
    177         var centroid = new RealVector(bestSol.Length);
     150        RealVector centroid = new RealVector(bestSol.Length);
    178151        foreach (var vector in simplex)
    179152          for (int j = 0; j < centroid.Length; j++)
     
    183156
    184157        // reflection
    185         var reflectionPoint = new RealVector(bestSol.Length);
     158        RealVector reflectionPoint = new RealVector(bestSol.Length);
    186159        for (int j = 0; j < reflectionPoint.Length; j++)
    187160          reflectionPoint[j] = centroid[j] + Alpha.Value * (centroid[j] - simplex[simplex.Length - 1][j]);
    188         double reflectionPointQuality = FunctionEvaluator(reflectionPoint);
    189         if (FunctionEvaluator(simplex[0]) <= reflectionPointQuality
    190             && reflectionPointQuality < FunctionEvaluator(simplex[simplex.Length - 2]))
     161        double reflectionPointQuality = functionEvaluator(reflectionPoint);
     162        if (functionEvaluator(simplex[0]) <= reflectionPointQuality
     163            && reflectionPointQuality < functionEvaluator(simplex[simplex.Length - 2]))
    191164          simplex[simplex.Length - 1] = reflectionPoint;
    192165
    193166        // expansion
    194         if (reflectionPointQuality < FunctionEvaluator(simplex[0])) {
    195           var expansionPoint = new RealVector(bestSol.Length);
     167        if (reflectionPointQuality < functionEvaluator(simplex[0])) {
     168          RealVector expansionPoint = new RealVector(bestSol.Length);
    196169          for (int j = 0; j < expansionPoint.Length; j++)
    197170            expansionPoint[j] = centroid[j] + Beta.Value * (reflectionPoint[j] - centroid[j]);
    198           simplex[simplex.Length - 1] = FunctionEvaluator(expansionPoint) < reflectionPointQuality ? expansionPoint : reflectionPoint;
     171          simplex[simplex.Length - 1] = functionEvaluator(expansionPoint) < reflectionPointQuality ? expansionPoint : reflectionPoint;
    199172        }
    200173
    201174        // contraction
    202         if (FunctionEvaluator(simplex[simplex.Length - 2]) <= reflectionPointQuality
    203             && reflectionPointQuality < FunctionEvaluator(simplex[simplex.Length - 1])) {
    204           var outsideContractionPoint = new RealVector(bestSol.Length);
     175        if (functionEvaluator(simplex[simplex.Length - 2]) <= reflectionPointQuality
     176            && reflectionPointQuality < functionEvaluator(simplex[simplex.Length - 1])) {
     177          RealVector outsideContractionPoint = new RealVector(bestSol.Length);
    205178          for (int j = 0; j < outsideContractionPoint.Length; j++)
    206179            outsideContractionPoint[j] = centroid[j] + Gamma.Value * (reflectionPoint[j] - centroid[j]);
    207           if (FunctionEvaluator(outsideContractionPoint) <= reflectionPointQuality) {
     180          if (functionEvaluator(outsideContractionPoint) <= reflectionPointQuality) {
    208181            simplex[simplex.Length - 1] = outsideContractionPoint;
    209             if (FunctionEvaluator(reflectionPoint) >= FunctionEvaluator(simplex[simplex.Length - 1])) {
    210               var insideContractionPoint = new RealVector(bestSol.Length);
     182            if (functionEvaluator(reflectionPoint) >= functionEvaluator(simplex[simplex.Length - 1])) {
     183              RealVector insideContractionPoint = new RealVector(bestSol.Length);
    211184              for (int j = 0; j < insideContractionPoint.Length; j++)
    212185                insideContractionPoint[j] = centroid[j] - Gamma.Value * (reflectionPoint[j] - centroid[j]);
    213               if (FunctionEvaluator(insideContractionPoint) < FunctionEvaluator(simplex[simplex.Length - 1])) simplex[simplex.Length - 1] = insideContractionPoint;
     186              if (functionEvaluator(insideContractionPoint) < functionEvaluator(simplex[simplex.Length - 1])) simplex[simplex.Length - 1] = insideContractionPoint;
    214187            }
    215188          }
Note: See TracChangeset for help on using the changeset viewer.