Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/17/11 14:35:58 (13 years ago)
Author:
svonolfe
Message:

Implemented review comments of swagner (#1425)

File:
1 moved

Legend:

Unmodified
Added
Removed
  • branches/VNS/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchImprovementOperator.cs

    r5725 r5735  
    3333using HeuristicLab.Optimization;
    3434using HeuristicLab.Optimization.Operators;
     35using HeuristicLab.Analysis;
    3536
    3637namespace HeuristicLab.Algorithms.LocalSearch {
     
    3839  /// A local search improvement operator.
    3940  /// </summary>
    40   [Item("LocalSearchImprovement", "A local search improvement operator.")]
     41  [Item("LocalSearchImprovementOperator", "A local search improvement operator.")]
    4142  [StorableClass]
    42   public class LocalSearchImprovement: SingleSuccessorOperator, ILocalImprovement {
     43  public class LocalSearchImprovementOperator: SingleSuccessorOperator, ILocalImprovementOperator {
    4344    [Storable]
    4445    private LocalSearchMainLoop loop;
     46
     47    [Storable]
     48    private BestAverageWorstQualityAnalyzer qualityAnalyzer;
    4549   
    4650    private ConstrainedValueParameter<IMoveGenerator> MoveGeneratorParameter {
     
    6266      get { return (LookupParameter<IntValue>)Parameters["EvaluatedSolutions"]; }
    6367    }
    64     public LookupParameter<IOperator> AnalyzerParameter {
    65       get { return (LookupParameter<IOperator>)Parameters["Analyzer"]; }
     68    public ValueParameter<MultiAnalyzer> AnalyzerParameter {
     69      get { return (ValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
    6670    }
    6771
     
    7882      set { MoveEvaluatorParameter.Value = value; }
    7983    }
     84    public MultiAnalyzer Analyzer {
     85      get { return AnalyzerParameter.Value; }
     86      set { AnalyzerParameter.Value = value; }
     87    }
    8088
    8189    [StorableConstructor]
    82     protected LocalSearchImprovement(bool deserializing) : base(deserializing) {}
     90    protected LocalSearchImprovementOperator(bool deserializing) : base(deserializing) {}
    8391    [StorableHook(HookType.AfterDeserialization)]
    8492    private void AfterDeserialization() {
    8593      Initialize();
    8694    }
    87     protected LocalSearchImprovement(LocalSearchImprovement original, Cloner cloner)
     95    protected LocalSearchImprovementOperator(LocalSearchImprovementOperator original, Cloner cloner)
    8896      : base(original, cloner) {
    8997        this.loop = cloner.Clone(original.loop);
     98        this.qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
    9099        Initialize();
    91100    }
    92101    public override IDeepCloneable Clone(Cloner cloner) {
    93       return new LocalSearchImprovement(this, cloner);
    94     }
    95     public LocalSearchImprovement()
     102      return new LocalSearchImprovementOperator(this, cloner);
     103    }
     104    public LocalSearchImprovementOperator()
    96105      : base() {
    97         loop = new LocalSearchMainLoop(new BoolValue(true));
     106        loop = new LocalSearchMainLoop("LocalIterations", "BestLocalQuality");
     107
     108        ResultsCollector rc = ((loop.OperatorGraph.InitialOperator as SingleSuccessorOperator).Successor
     109          as SingleSuccessorOperator).Successor as ResultsCollector;
     110        rc.CollectedValues.Remove("BestLocalQuality");
     111
     112        qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
    98113
    99114        Parameters.Add(new ConstrainedValueParameter<IMoveGenerator>("MoveGenerator", "The operator used to generate moves to the neighborhood of the current solution."));
    100115        Parameters.Add(new ConstrainedValueParameter<IMoveMaker>("MoveMaker", "The operator used to perform a move."));
    101116        Parameters.Add(new ConstrainedValueParameter<ISingleObjectiveMoveEvaluator>("MoveEvaluator", "The operator used to evaluate a move."));
    102         Parameters.Add(new ValueParameter<IntValue>("MaximumIterations", "The maximum number of generations which should be processed.", new IntValue(1000)));
    103         Parameters.Add(new ValueParameter<IntValue>("SampleSize", "Number of moves that MultiMoveGenerators should create. This is ignored for Exhaustive- and SingleMoveGenerators.", new IntValue(100)));
     117        Parameters.Add(new ValueParameter<IntValue>("MaximumIterations", "The maximum number of generations which should be processed.", new IntValue(150)));
     118        Parameters.Add(new ValueParameter<IntValue>("SampleSize", "Number of moves that MultiMoveGenerators should create. This is ignored for Exhaustive- and SingleMoveGenerators.", new IntValue(1500)));
    104119        Parameters.Add(new LookupParameter<IntValue>("EvaluatedSolutions", "The number of evaluated moves."));
    105         Parameters.Add(new LookupParameter<IOperator>("Analyzer", "The operator used to analyze the solution."));
     120        Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze the solution.", new MultiAnalyzer()));
    106121
    107122        Initialize();
     
    112127    }
    113128
    114     public void Parameterize(IProblem problem) {
     129    public void OnProblemChanged(IProblem problem) {
    115130      UpdateMoveOperators(problem);
    116131      ChooseMoveOperators();
     
    119134      ParameterizeMoveEvaluators(problem as ISingleObjectiveProblem);
    120135      ParameterizeMoveMakers(problem as ISingleObjectiveProblem);
     136
     137      ParameterizeAnalyzers(problem as ISingleObjectiveProblem);
     138      UpdateAnalyzers(problem as ISingleObjectiveProblem);
     139    }
     140
     141    void ParameterizeAnalyzers(ISingleObjectiveProblem problem) {
     142      qualityAnalyzer.ResultsParameter.ActualName = "Results";
     143      if (problem != null) {
     144        qualityAnalyzer.MaximizationParameter.ActualName = problem.MaximizationParameter.Name;
     145        if (MoveEvaluator != null)
     146          qualityAnalyzer.QualityParameter.ActualName = MoveEvaluator.MoveQualityParameter.ActualName;
     147        qualityAnalyzer.BestKnownQualityParameter.ActualName = problem.BestKnownQualityParameter.Name;
     148      }
     149    }
     150
     151    void UpdateAnalyzers(ISingleObjectiveProblem problem) {
     152      Analyzer.Operators.Clear();
     153      if (problem != null) {
     154        foreach (IAnalyzer analyzer in problem.Operators.OfType<IAnalyzer>()) {
     155          IAnalyzer clone = analyzer.Clone() as IAnalyzer;
     156          foreach (IScopeTreeLookupParameter param in clone.Parameters.OfType<IScopeTreeLookupParameter>())
     157            param.Depth = 0;
     158          Analyzer.Operators.Add(clone);
     159        }
     160      }
     161      Analyzer.Operators.Add(qualityAnalyzer);
    121162    }
    122163
     
    245286      }
    246287
    247       loop.MoveGeneratorParameter.Value = MoveGeneratorParameter.Value;
    248       if (loop.MoveGeneratorParameter.Value != null && loop.MoveGeneratorParameter.Value.Parameters.ContainsKey("SampleSize")) {
    249         IParameter parameter = loop.MoveGeneratorParameter.Value.Parameters["SampleSize"];
    250         if(parameter is IValueParameter)
    251           (parameter as IValueParameter).Value = SampleSizeParameter.Value;
    252       }
    253       loop.MoveEvaluatorParameter.Value = MoveEvaluatorParameter.Value;
    254       loop.MoveMakerParameter.Value = MoveMakerParameter.Value;
    255       loop.MaximumIterationsParameter.Value = MaximumIterationsParameter.Value;
    256288      loop.EvaluatedMovesParameter.ActualName = EvaluatedSolutionsParameter.ActualName;
    257       if (AnalyzerParameter.ActualValue != null) {
    258         loop.AnalyzerParameter.Value = AnalyzerParameter.ActualValue.Clone() as IAnalyzer;
    259 
    260         foreach (IScopeTreeLookupParameter param in loop.AnalyzerParameter.Value.Parameters.OfType<IScopeTreeLookupParameter>())
    261           param.Depth = 0;
    262 
    263         if (loop.AnalyzerParameter.Value is IMultiAnalyzer) {
    264           foreach (IAnalyzer analyzer in (loop.AnalyzerParameter.Value as IMultiAnalyzer).Operators) {
    265             foreach (IScopeTreeLookupParameter param in analyzer.Parameters.OfType<IScopeTreeLookupParameter>())
    266               param.Depth = 0;
    267           }
    268         }
    269       } else {
    270         loop.AnalyzerParameter.Value = null;
    271       }
    272            
     289
    273290      processor.Operators.Add(loop);
    274291      processor.Successor = remover;
     
    279296      }
    280297
    281       return ExecutionContext.CreateOperation(processor);
     298      return ExecutionContext.CreateChildOperation(processor);
    282299    }
    283300  }
Note: See TracChangeset for help on using the changeset viewer.