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/ScatterSearch.cs

    r7775 r7786  
    3131using HeuristicLab.Parameters;
    3232using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     33using HeuristicLab.PluginInfrastructure;
    3334using HeuristicLab.Random;
    3435using HeuristicLab.Selection;
     
    6162      get { return (ConstrainedValueParameter<ICrossover>)Parameters["Crossover"]; }
    6263    }
    63     public ConstrainedValueParameter<ILocalImprovementOperator> ImproverParameter {
    64       get { return (ConstrainedValueParameter<ILocalImprovementOperator>)Parameters["Improver"]; }
    65     }
    66     public ConstrainedValueParameter<DiversityCalculator> DiversityCalculatorParameter {
    67       get { return (ConstrainedValueParameter<DiversityCalculator>)Parameters["DiversityCalculator"]; }
     64    public IValueParameter<BoolValue> ExecutePathRelinkingParameter {
     65      get { return (IValueLookupParameter<BoolValue>)Parameters["ExecutePathRelinking"]; }
     66    }
     67    public ConstrainedValueParameter<IImprovementOperator> ImproverParameter {
     68      get { return (ConstrainedValueParameter<IImprovementOperator>)Parameters["Improver"]; }
    6869    }
    6970    public IValueParameter<IntValue> MaximumIterationsParameter {
     
    7374      get { return (IValueParameter<IntValue>)Parameters["NumberOfHighQualitySolutions"]; }
    7475    }
     76    public ConstrainedValueParameter<IPathRelinker> PathRelinkerParameter {
     77      get { return (ConstrainedValueParameter<IPathRelinker>)Parameters["PathRelinker"]; }
     78    }
    7579    public IValueParameter<IntValue> PopulationSizeParameter {
    7680      get { return (IValueParameter<IntValue>)Parameters["PopulationSize"]; }
     
    8488    public IValueParameter<BoolValue> SetSeedRandomlyParameter {
    8589      get { return (IValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
     90    }
     91    public ConstrainedValueParameter<SimilarityCalculator> SimilarityCalculatorParameter {
     92      get { return (ConstrainedValueParameter<SimilarityCalculator>)Parameters["SimilarityCalculator"]; }
    8693    }
    8794    #endregion
     
    96103      set { CrossoverParameter.Value = value; }
    97104    }
    98     private ILocalImprovementOperator Improver {
     105    private BoolValue ExecutePathRelinking {
     106      get { return ExecutePathRelinkingParameter.Value; }
     107      set { ExecutePathRelinkingParameter.Value = value; }
     108    }
     109    private IImprovementOperator Improver {
    99110      get { return ImproverParameter.Value; }
    100111      set { ImproverParameter.Value = value; }
    101     }
    102     private DiversityCalculator DiversityCalculator {
    103       get { return DiversityCalculatorParameter.Value; }
    104       set { DiversityCalculatorParameter.Value = value; }
    105112    }
    106113    private IntValue MaximumIterations {
     
    112119      set { NumberOfHighQualitySolutionsParameter.Value = value; }
    113120    }
     121    private IPathRelinker PathRelinker {
     122      get { return PathRelinkerParameter.Value; }
     123      set { PathRelinkerParameter.Value = value; }
     124    }
    114125    private IntValue PopulationSize {
    115126      get { return PopulationSizeParameter.Value; }
     
    128139      set { SetSeedRandomlyParameter.Value = value; }
    129140    }
    130     public RandomCreator RandomCreator {
     141    private SimilarityCalculator SimilarityCalculator {
     142      get { return SimilarityCalculatorParameter.Value; }
     143      set { SimilarityCalculatorParameter.Value = value; }
     144    }
     145    private RandomCreator RandomCreator {
    131146      get { return (RandomCreator)OperatorGraph.InitialOperator; }
    132147    }
    133     public SolutionsCreator SolutionsCreator {
     148    private SolutionsCreator SolutionsCreator {
    134149      get { return (SolutionsCreator)RandomCreator.Successor; }
    135150    }
    136     public ScatterSearchMainLoop MainLoop {
     151    private ScatterSearchMainLoop MainLoop {
    137152      get { return FindMainLoop(SolutionsCreator.Successor); }
    138153    }
     
    159174      : base() {
    160175      #region Create parameters
    161       Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze the solution and moves.", new MultiAnalyzer()));
    162       Parameters.Add(new ConstrainedValueParameter<ICrossover>("Crossover", "The operator used to combine solutions."));
    163       Parameters.Add(new ConstrainedValueParameter<ILocalImprovementOperator>("Improver", "The operator used to improve solutions."));
    164       Parameters.Add(new ConstrainedValueParameter<DiversityCalculator>("DiversityCalculator", "The operator used to calculate the diversity of two solutions."));
    165       Parameters.Add(new ValueParameter<IntValue>("MaximumIterations", "The maximum number of generations which should be processed.", new IntValue(100)));
    166       Parameters.Add(new ValueParameter<IntValue>("NumberOfHighQualitySolutions", "The number of high quality solutions that should be added to the reference set.", new IntValue(10)));
    167       Parameters.Add(new ValueParameter<IntValue>("PopulationSize", "The size of the population.", new IntValue(300)));
    168       Parameters.Add(new ValueParameter<IntValue>("ReferenceSetSize", "The size of the reference set.", new IntValue(100)));
    169       Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
    170       Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
     176      Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", new MultiAnalyzer()));
     177      Parameters.Add(new ConstrainedValueParameter<ICrossover>("Crossover"));
     178      Parameters.Add(new ValueParameter<BoolValue>("ExecutePathRelinking", new BoolValue(true)));
     179      Parameters.Add(new ConstrainedValueParameter<IImprovementOperator>("Improver"));
     180      Parameters.Add(new ValueParameter<IntValue>("MaximumIterations", new IntValue(100)));
     181      Parameters.Add(new ValueParameter<IntValue>("NumberOfHighQualitySolutions", new IntValue(10)));
     182      Parameters.Add(new ConstrainedValueParameter<IPathRelinker>("PathRelinker"));
     183      Parameters.Add(new ValueParameter<IntValue>("PopulationSize", new IntValue(300)));
     184      Parameters.Add(new ValueParameter<IntValue>("ReferenceSetSize", new IntValue(100)));
     185      Parameters.Add(new ValueParameter<IntValue>("Seed", new IntValue(0)));
     186      Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", new BoolValue(true)));
     187      Parameters.Add(new ConstrainedValueParameter<SimilarityCalculator>("SimilarityCalculator"));
    171188      #endregion
    172189
     
    178195      Placeholder solutionImprover = new Placeholder();
    179196      BestSelector bestSelector = new BestSelector();
    180       VariableCreator variableCreator = new VariableCreator();
    181       ResultsCollector resultsCollector = new ResultsCollector();
    182197      ScatterSearchMainLoop mainLoop = new ScatterSearchMainLoop();
    183198      #endregion
     
    207222      bestSelector.NumberOfSelectedSubScopesParameter.ActualName = NumberOfHighQualitySolutionsParameter.Name;
    208223      bestSelector.CopySelected = new BoolValue(false);
    209       bestSelector.Successor = variableCreator;
    210 
    211       variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Iterations", new IntValue(0)));
    212       variableCreator.CollectedValues.Add(new ValueParameter<BoolValue>("NewSolutions", new BoolValue(false)));
    213       variableCreator.Successor = resultsCollector;
    214 
    215       resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Iterations"));
    216       resultsCollector.ResultsParameter.ActualName = "Results";
    217       resultsCollector.Successor = mainLoop;
     224      bestSelector.Successor = mainLoop;
    218225
    219226      mainLoop.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name;
     
    236243
    237244    public override void Prepare() {
    238       base.Prepare();
     245      if (Problem != null) base.Prepare();
    239246    }
    240247
     
    249256      UpdateAnalyzers();
    250257      UpdateCrossovers();
    251       UpdateDiversityCalculators();
     258      UpdatePathRelinkers();
     259      UpdateSimilarityCalculators();
    252260      UpdateImprovers();
    253       UpdateDiversityCalculators();
     261      UpdateSimilarityCalculators();
    254262      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
    255263      base.OnProblemChanged();
     
    272280      UpdateAnalyzers();
    273281      UpdateCrossovers();
    274       UpdateDiversityCalculators();
     282      UpdatePathRelinkers();
     283      UpdateSimilarityCalculators();
    275284      UpdateImprovers();
    276285      ParameterizeMainLoop();
     
    306315      ICrossover defaultCrossover = Problem.Operators.OfType<ICrossover>().FirstOrDefault();
    307316
    308       CrossoverParameter.ValidValues.Add(new Knapsack.KnapsackPathRelinker());
    309       CrossoverParameter.ValidValues.Add(new Knapsack.KnapsackSimultaneousPathRelinker());
    310       CrossoverParameter.ValidValues.Add(new TestFunctions.TestFunctionsPathRelinker());
    311       CrossoverParameter.ValidValues.Add(new TravelingSalesman.TravelingSalesmanPathRelinker());
    312       CrossoverParameter.ValidValues.Add(new TravelingSalesman.TravelingSalesmanSimultaneousPathRelinker());
    313       CrossoverParameter.ValidValues.Add(new TravelingSalesman.TravelingSalesmanMultipleGuidesPathRelinker());
    314 
    315317      foreach (ICrossover crossover in Problem.Operators.OfType<ICrossover>().OrderBy(x => x.Name))
    316318        CrossoverParameter.ValidValues.Add(crossover);
    317 
    318       foreach (var crossover in CrossoverParameter.ValidValues.OfType<Knapsack.INBinaryVectorCrossover>())
    319         crossover.ParentsParameter.ActualName = "KnapsackSolution"; // temporary solution for the knapsack problem
    320319
    321320      if (oldCrossover != null) {
     
    327326        CrossoverParameter.Value = defaultCrossover;
    328327    }
    329     private void UpdateDiversityCalculators() {
    330       DiversityCalculator oldDiversityCalculator = DiversityCalculatorParameter.Value;
    331       DiversityCalculatorParameter.ValidValues.Clear();
    332       DiversityCalculator defaultDiversityCalculator = Problem.Operators.OfType<DiversityCalculator>().FirstOrDefault();
    333 
    334       DiversityCalculatorParameter.ValidValues.Add(new Knapsack.BinaryVectorDiversityCalculator());
    335       DiversityCalculatorParameter.ValidValues.Add(new TestFunctions.RealVectorDiversityCalculator());
    336       DiversityCalculatorParameter.ValidValues.Add(new TravelingSalesman.PermutationDiversityCalculator());
    337 
    338       foreach (DiversityCalculator diversityCalculator in Problem.Operators.OfType<DiversityCalculator>().OrderBy(x => x.Name))
    339         DiversityCalculatorParameter.ValidValues.Add(diversityCalculator);
    340 
    341       if (oldDiversityCalculator != null) {
    342         DiversityCalculator diversityCalculator = DiversityCalculatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldDiversityCalculator.GetType());
    343         if (diversityCalculator != null) DiversityCalculatorParameter.Value = diversityCalculator;
    344         else oldDiversityCalculator = null;
    345       }
    346       if (oldDiversityCalculator == null && defaultDiversityCalculator != null)
    347         DiversityCalculatorParameter.Value = defaultDiversityCalculator;
    348     }
    349328    private void UpdateImprovers() {
    350       ILocalImprovementOperator oldImprover = ImproverParameter.Value;
     329      IImprovementOperator oldImprover = ImproverParameter.Value;
    351330      ImproverParameter.ValidValues.Clear();
    352       ILocalImprovementOperator defaultImprover = Problem.Operators.OfType<ILocalImprovementOperator>().FirstOrDefault();
    353 
    354       ImproverParameter.ValidValues.Add(new Knapsack.KnapsackImprovementOperator());
    355       ImproverParameter.ValidValues.Add(new TestFunctions.TestFunctionsAckleyImprovementOperator());
    356       ImproverParameter.ValidValues.Add(new TestFunctions.TestFunctionsBealeImprovementOperator());
    357       ImproverParameter.ValidValues.Add(new TestFunctions.TestFunctionsBoothImprovementOperator());
    358       ImproverParameter.ValidValues.Add(new TestFunctions.TestFunctionsGriewankImprovementOperator());
    359       ImproverParameter.ValidValues.Add(new TestFunctions.TestFunctionsLevyImprovementOperator());
    360       ImproverParameter.ValidValues.Add(new TestFunctions.TestFunctionsMatyasImprovementOperator());
    361       ImproverParameter.ValidValues.Add(new TestFunctions.TestFunctionsRosenbrockImprovementOperator());
    362       ImproverParameter.ValidValues.Add(new TestFunctions.TestFunctionsSchwefelImprovementOperator());
    363       ImproverParameter.ValidValues.Add(new TestFunctions.TestFunctionsSumSquaresImprovementOperator());
    364       ImproverParameter.ValidValues.Add(new TestFunctions.TestFunctionsZakharovImprovementOperator());
    365       ImproverParameter.ValidValues.Add(new TravelingSalesman.TravelingSalesmanImprovementOperator());
    366 
    367       foreach (ILocalImprovementOperator improver in Problem.Operators.OfType<ILocalImprovementOperator>().OrderBy(x => x.Name))
     331      IImprovementOperator defaultImprover = Problem.Operators.OfType<IImprovementOperator>().FirstOrDefault();
     332
     333      foreach (IImprovementOperator improver in ApplicationManager.Manager.GetInstances<IImprovementOperator>().OrderBy(x => x.Name))
    368334        ImproverParameter.ValidValues.Add(improver);
    369335
    370       foreach (var improver in ImproverParameter.ValidValues.OfType<IScatterSearchTargetProcessor>())
    371         improver.TargetParameter.ActualName = "KnapsackSolution"; // temporary solution for the knapsack problem
     336      foreach (IImprovementOperator improver in Problem.Operators.OfType<IImprovementOperator>().OrderBy(x => x.Name))
     337        ImproverParameter.ValidValues.Add(improver);
    372338
    373339      if (oldImprover != null) {
    374         ILocalImprovementOperator improver = ImproverParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldImprover.GetType());
     340        IImprovementOperator improver = ImproverParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldImprover.GetType());
    375341        if (improver != null) ImproverParameter.Value = improver;
    376342        else oldImprover = null;
     
    378344      if (oldImprover == null && defaultImprover != null)
    379345        ImproverParameter.Value = defaultImprover;
     346    }
     347    private void UpdatePathRelinkers() {
     348      IPathRelinker oldPathRelinker = PathRelinkerParameter.Value;
     349      PathRelinkerParameter.ValidValues.Clear();
     350      IPathRelinker defaultPathRelinker = Problem.Operators.OfType<IPathRelinker>().FirstOrDefault();
     351
     352      foreach (IPathRelinker pathRelinker in ApplicationManager.Manager.GetInstances<IPathRelinker>().OrderBy(x => x.Name))
     353        PathRelinkerParameter.ValidValues.Add(pathRelinker);
     354
     355      foreach (IPathRelinker pathRelinker in Problem.Operators.OfType<IPathRelinker>().OrderBy(x => x.Name))
     356        PathRelinkerParameter.ValidValues.Add(pathRelinker);
     357
     358      if (oldPathRelinker != null) {
     359        IPathRelinker pathRelinker = PathRelinkerParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldPathRelinker.GetType());
     360        if (pathRelinker != null) PathRelinkerParameter.Value = pathRelinker;
     361        else oldPathRelinker = null;
     362      }
     363      if (oldPathRelinker == null && defaultPathRelinker != null)
     364        PathRelinkerParameter.Value = defaultPathRelinker;
     365    }
     366    private void UpdateSimilarityCalculators() {
     367      SimilarityCalculator oldDiversityCalculator = SimilarityCalculatorParameter.Value;
     368      SimilarityCalculatorParameter.ValidValues.Clear();
     369      SimilarityCalculator defaultDiversityCalculator = Problem.Operators.OfType<SimilarityCalculator>().FirstOrDefault();
     370
     371      foreach (SimilarityCalculator diversityCalculator in ApplicationManager.Manager.GetInstances<SimilarityCalculator>().OrderBy(x => x.Name))
     372        SimilarityCalculatorParameter.ValidValues.Add(diversityCalculator);
     373
     374      foreach (SimilarityCalculator diversityCalculator in Problem.Operators.OfType<SimilarityCalculator>().OrderBy(x => x.Name))
     375        SimilarityCalculatorParameter.ValidValues.Add(diversityCalculator);
     376
     377      if (oldDiversityCalculator != null) {
     378        SimilarityCalculator diversityCalculator = SimilarityCalculatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldDiversityCalculator.GetType());
     379        if (diversityCalculator != null) SimilarityCalculatorParameter.Value = diversityCalculator;
     380        else oldDiversityCalculator = null;
     381      }
     382      if (oldDiversityCalculator == null && defaultDiversityCalculator != null)
     383        SimilarityCalculatorParameter.Value = defaultDiversityCalculator;
    380384    }
    381385    private void ParameterizeSolutionsCreator() {
     
    397401      }
    398402    }
    399     //private void ParameterizeScatterSearchTargetProcessor(IOperator op) {
    400     //  if (op is IScatterSearchTargetProcessor) {
    401     //    IScatterSearchTargetProcessor ssOp = (IScatterSearchTargetProcessor)op;
    402     //    ssOp.TargetParameter.ActualName = "KnapsackSolution"; // temporary solution for the knapsack problem
    403     //    ssOp.TargetParameter.Hidden = true;
    404     //  }
    405     //}
    406403    private void ParameterizeAnalyzers() {
    407404      qualityAnalyzer.ResultsParameter.ActualName = "Results";
     
    422419      while (mainLoop != null && !(mainLoop is ScatterSearchMainLoop))
    423420        mainLoop = ((SingleSuccessorOperator)mainLoop).Successor;
    424       if (mainLoop == null) return null;
    425       else return (ScatterSearchMainLoop)mainLoop;
     421      return mainLoop as ScatterSearchMainLoop;
    426422    }
    427423    #endregion
Note: See TracChangeset for help on using the changeset viewer.