Free cookie consent management tool by TermsFeed Policy Generator

source: branches/ScatterSearch/HeuristicLab.Algorithms.ScatterSearch/3.3/ScatterSearch.cs @ 7722

Last change on this file since 7722 was 7722, checked in by jkarder, 12 years ago

#1331: Scatter Search initial commit

File size: 23.1 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using HeuristicLab.Algorithms.LocalSearch;
26using HeuristicLab.Analysis;
27using HeuristicLab.Common;
28using HeuristicLab.Core;
29using HeuristicLab.Data;
30using HeuristicLab.Operators;
31using HeuristicLab.Optimization;
32using HeuristicLab.Optimization.Operators;
33using HeuristicLab.Parameters;
34using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
35using HeuristicLab.Random;
36using HeuristicLab.Selection;
37
38namespace HeuristicLab.Algorithms.ScatterSearch {
39  [Item("Scatter Search", "A scatter search algorithm.")]
40  [Creatable("Algorithms")]
41  [StorableClass]
42  public sealed class ScatterSearch : HeuristicOptimizationEngineAlgorithm, IStorableContent {
43    public string Filename { get; set; }
44
45    #region Problem Properties
46    public override Type ProblemType {
47      get { return typeof(ISingleObjectiveHeuristicOptimizationProblem); }
48    }
49    public new ISingleObjectiveHeuristicOptimizationProblem Problem {
50      get { return (ISingleObjectiveHeuristicOptimizationProblem)base.Problem; }
51      set { base.Problem = value; }
52    }
53    #endregion
54
55    #region Parameter Properties
56    private ValueParameter<MultiAnalyzer> AnalyzerParameter {
57      get { return (ValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
58    }
59    private ValueParameter<IntValue> MaximumIterationsParameter {
60      get { return (ValueParameter<IntValue>)Parameters["MaximumIterations"]; }
61    }
62    public ConstrainedValueParameter<ISingleObjectiveMoveEvaluator> MoveEvaluatorParameter {
63      get { return (ConstrainedValueParameter<ISingleObjectiveMoveEvaluator>)Parameters["MoveEvaluator"]; }
64    }
65    public ConstrainedValueParameter<IMoveGenerator> MoveGeneratorParameter {
66      get { return (ConstrainedValueParameter<IMoveGenerator>)Parameters["MoveGenerator"]; }
67    }
68    public ConstrainedValueParameter<IMoveMaker> MoveMakerParameter {
69      get { return (ConstrainedValueParameter<IMoveMaker>)Parameters["MoveMaker"]; }
70    }
71    private ValueParameter<IntValue> NumberOfHighQualitySolutionsParameter {
72      get { return (ValueParameter<IntValue>)Parameters["NumberOfHighQualitySolutions"]; }
73    }
74    private ValueParameter<IntValue> PopulationSizeParameter {
75      get { return (ValueParameter<IntValue>)Parameters["PopulationSize"]; }
76    }
77    private ValueParameter<IntValue> ReferenceSetSizeParameter {
78      get { return (ValueParameter<IntValue>)Parameters["ReferenceSetSize"]; }
79    }
80    private ValueParameter<IntValue> SampleSizeParameter {
81      get { return (ValueParameter<IntValue>)Parameters["SampleSize"]; }
82    }
83    private ValueParameter<IntValue> SeedParameter {
84      get { return (ValueParameter<IntValue>)Parameters["Seed"]; }
85    }
86    private ValueParameter<BoolValue> SetSeedRandomlyParameter {
87      get { return (ValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
88    }
89    private RandomCreator RandomCreator {
90      get { return (RandomCreator)OperatorGraph.InitialOperator; }
91    }
92    private SolutionsCreator SolutionsCreator {
93      get { return (SolutionsCreator)RandomCreator.Successor; }
94    }
95    private ScatterSearchMainLoop MainLoop {
96      get { return FindMainLoop(SolutionsCreator.Successor); }
97    }
98    #endregion
99
100    #region Properties
101    public MultiAnalyzer Analyzer {
102      get { return AnalyzerParameter.Value; }
103      set { AnalyzerParameter.Value = value; }
104    }
105    public IntValue MaximumIterations {
106      get { return MaximumIterationsParameter.Value; }
107      set { MaximumIterationsParameter.Value = value; }
108    }
109    public ISingleObjectiveMoveEvaluator MoveEvaluator {
110      get { return MoveEvaluatorParameter.Value; }
111      set { MoveEvaluatorParameter.Value = value; }
112    }
113    public IMoveGenerator MoveGenerator {
114      get { return MoveGeneratorParameter.Value; }
115      set { MoveGeneratorParameter.Value = value; }
116    }
117    public IMoveMaker MoveMaker {
118      get { return MoveMakerParameter.Value; }
119      set { MoveMakerParameter.Value = value; }
120    }
121    public IntValue NumberOfHighQualitySolutions {
122      get { return NumberOfHighQualitySolutionsParameter.Value; }
123      set { NumberOfHighQualitySolutionsParameter.Value = value; }
124    }
125    public IntValue PopulationSize {
126      get { return PopulationSizeParameter.Value; }
127      set { PopulationSizeParameter.Value = value; }
128    }
129    public IntValue ReferenceSetSize {
130      get { return ReferenceSetSizeParameter.Value; }
131      set { ReferenceSetSizeParameter.Value = value; }
132    }
133    public IntValue SampleSize {
134      get { return SampleSizeParameter.Value; }
135      set { SampleSizeParameter.Value = value; }
136    }
137    public IntValue Seed {
138      get { return SeedParameter.Value; }
139      set { SeedParameter.Value = value; }
140    }
141    public BoolValue SetSeedRandomly {
142      get { return SetSeedRandomlyParameter.Value; }
143      set { SetSeedRandomlyParameter.Value = value; }
144    }
145
146    [Storable]
147    private BestAverageWorstQualityAnalyzer moveQualityAnalyzer;
148    #endregion
149
150    [StorableConstructor]
151    private ScatterSearch(bool deserializing) : base(deserializing) { }
152    [StorableHook(HookType.AfterDeserialization)]
153    private void AfterDeserialization() {
154      Initialize();
155    }
156    private ScatterSearch(ScatterSearch original, Cloner cloner)
157      : base(original, cloner) {
158      moveQualityAnalyzer = cloner.Clone(original.moveQualityAnalyzer);
159      Initialize();
160    }
161    public override IDeepCloneable Clone(Cloner cloner) {
162      return new ScatterSearch(this, cloner);
163    }
164    public ScatterSearch()
165      : base() {
166      #region Create parameters
167      Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze the solution and moves.", new MultiAnalyzer()));
168      Parameters.Add(new ValueParameter<IntValue>("MaximumIterations", "The maximum number of generations which should be processed.", new IntValue(5)));
169      Parameters.Add(new ConstrainedValueParameter<ISingleObjectiveMoveEvaluator>("MoveEvaluator", "The operator used to evaluate a move."));
170      Parameters.Add(new ConstrainedValueParameter<IMoveGenerator>("MoveGenerator", "The operator used to generate moves to the neighborhood of the current solution."));
171      Parameters.Add(new ConstrainedValueParameter<IMoveMaker>("MoveMaker", "The operator used to perform a move."));
172      Parameters.Add(new ValueParameter<IntValue>("NumberOfHighQualitySolutions", "The number of high quality solutions that should be added to the reference set.", new IntValue(6)));
173      Parameters.Add(new ValueParameter<IntValue>("PopulationSize", "The size of the population.", new IntValue(30)));
174      Parameters.Add(new ValueParameter<IntValue>("ReferenceSetSize", "The size of the reference set.", new IntValue(10)));
175      Parameters.Add(new ValueParameter<IntValue>("SampleSize", "Number of moves that MultiMoveGenerators should create. This is ignored for Exhaustive- and SingleMoveGenerators.", new IntValue(100)));
176      Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
177      Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
178      #endregion
179
180      #region Create operators
181      RandomCreator randomCreator = new RandomCreator();
182      SolutionsCreator solutionsCreator = new SolutionsCreator();
183      UniformSubScopesProcessor uniformSubScopesProcessor = new UniformSubScopesProcessor();
184      LocalSearchImprovementOperator localImprovementOperator = new LocalSearchImprovementOperator();
185      BestSelector bestSelector = new BestSelector();
186      VariableCreator variableCreator = new VariableCreator();
187      ResultsCollector resultsCollector = new ResultsCollector();
188      ScatterSearchMainLoop mainLoop = new ScatterSearchMainLoop();
189      #endregion
190
191      #region Create operator graph
192      OperatorGraph.InitialOperator = randomCreator;
193      randomCreator.RandomParameter.ActualName = "Random";
194      randomCreator.SeedParameter.ActualName = SeedParameter.Name;
195      randomCreator.SetSeedRandomlyParameter.ActualName = SetSeedRandomlyParameter.Name;
196      randomCreator.Successor = solutionsCreator;
197
198      solutionsCreator.Name = "DiversificationGenerationMethod";
199      solutionsCreator.NumberOfSolutionsParameter.ActualName = "PopulationSize";
200      solutionsCreator.Successor = uniformSubScopesProcessor;
201
202      uniformSubScopesProcessor.Operator = localImprovementOperator;
203      uniformSubScopesProcessor.Successor = bestSelector;
204
205      localImprovementOperator.Name = "ImprovementMethod";
206      localImprovementOperator.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name;
207      localImprovementOperator.SampleSizeParameter.ActualName = SampleSizeParameter.Name;
208      localImprovementOperator.Successor = null;
209
210      bestSelector.NumberOfSelectedSubScopesParameter.ActualName = NumberOfHighQualitySolutionsParameter.Name;
211      bestSelector.CopySelected = new BoolValue(false);
212      bestSelector.Successor = variableCreator;
213
214      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Iterations", new IntValue(0)));
215      variableCreator.CollectedValues.Add(new ValueParameter<BoolValue>("NewSolutions", new BoolValue(false)));
216      variableCreator.Successor = resultsCollector;
217
218      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Iterations"));
219      resultsCollector.ResultsParameter.ActualName = "Results";
220      resultsCollector.Successor = mainLoop;
221
222      mainLoop.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name;
223      mainLoop.RandomParameter.ActualName = randomCreator.RandomParameter.ActualName;
224      mainLoop.ResultsParameter.ActualName = "Results";
225      mainLoop.AnalyzerParameter.ActualName = AnalyzerParameter.Name;
226      mainLoop.IterationsParameter.ActualName = "Iterations";
227      mainLoop.PopulationSizeParameter.ActualName = PopulationSizeParameter.Name;
228      mainLoop.NumberOfHighQualitySolutionsParameter.ActualName = NumberOfHighQualitySolutionsParameter.Name;
229      mainLoop.Successor = null;
230      #endregion
231
232      moveQualityAnalyzer = new BestAverageWorstQualityAnalyzer();
233      ParameterizeAnalyzers();
234      UpdateAnalyzers();
235
236      Initialize();
237    }
238
239    public override void Prepare() {
240      if (Problem != null && MoveGenerator != null && MoveMaker != null && MoveEvaluator != null)
241        base.Prepare();
242    }
243
244    #region Events
245    protected override void OnProblemChanged() {
246      ParameterizeStochasticOperator(Problem.SolutionCreator);
247      ParameterizeStochasticOperator(Problem.Evaluator);
248      foreach (IOperator op in Problem.Operators) ParameterizeStochasticOperator(op);
249      foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) {
250        op.MoveQualityParameter.ActualNameChanged += new EventHandler(MoveEvaluator_MoveQualityParameter_ActualNameChanged);
251      }
252      ParameterizeSolutionsCreator();
253      ParameterizeMainLoop();
254      UpdateMoveGenerator();
255      UpdateMoveParameters();
256      UpdateAnalyzers();
257      ParameterizeMoveGenerators();
258      ParameterizeMoveEvaluators();
259      ParameterizeMoveMakers();
260      ParameterizeAnalyzers();
261      ParameterizeIterationBasedOperators();
262      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
263      base.OnProblemChanged();
264    }
265
266    protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) {
267      ParameterizeStochasticOperator(Problem.SolutionCreator);
268      ParameterizeSolutionsCreator();
269      base.Problem_SolutionCreatorChanged(sender, e);
270    }
271
272    protected override void Problem_EvaluatorChanged(object sender, EventArgs e) {
273      ParameterizeStochasticOperator(Problem.Evaluator);
274      ParameterizeSolutionsCreator();
275      ParameterizeMainLoop();
276      ParameterizeMoveEvaluators();
277      ParameterizeMoveMakers();
278      ParameterizeAnalyzers();
279      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
280      base.Problem_EvaluatorChanged(sender, e);
281    }
282
283    protected override void Problem_OperatorsChanged(object sender, EventArgs e) {
284      foreach (IOperator op in Problem.Operators) ParameterizeStochasticOperator(op);
285      // This may seem pointless, but some operators already have the eventhandler registered, others don't
286      // FIXME: Is there another way to solve this problem?
287      foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) {
288        op.MoveQualityParameter.ActualNameChanged -= new EventHandler(MoveEvaluator_MoveQualityParameter_ActualNameChanged);
289        op.MoveQualityParameter.ActualNameChanged += new EventHandler(MoveEvaluator_MoveQualityParameter_ActualNameChanged);
290      }
291      UpdateMoveGenerator();
292      UpdateMoveParameters();
293      UpdateAnalyzers();
294      ParameterizeMainLoop();
295      ParameterizeMoveGenerators();
296      ParameterizeMoveEvaluators();
297      ParameterizeMoveMakers();
298      ParameterizeAnalyzers();
299      ParameterizeIterationBasedOperators();
300      base.Problem_OperatorsChanged(sender, e);
301    }
302    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
303      ParameterizeMainLoop();
304      ParameterizeMoveEvaluators();
305      ParameterizeMoveMakers();
306    }
307    private void MoveGeneratorParameter_ValueChanged(object sender, EventArgs e) {
308      UpdateMoveParameters();
309    }
310    private void MoveEvaluatorParameter_ValueChanged(object sender, EventArgs e) {
311      ParameterizeMainLoop();
312      ParameterizeMoveEvaluators();
313      ParameterizeMoveMakers();
314      ParameterizeAnalyzers();
315    }
316    private void MoveEvaluator_MoveQualityParameter_ActualNameChanged(object sender, EventArgs e) {
317      ParameterizeMainLoop();
318      ParameterizeMoveEvaluators();
319      ParameterizeMoveMakers();
320      ParameterizeAnalyzers();
321    }
322    #endregion
323
324    #region Helpers
325    private void Initialize() {
326      if (Problem != null) {
327        Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
328        foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) {
329          op.MoveQualityParameter.ActualNameChanged += new EventHandler(MoveEvaluator_MoveQualityParameter_ActualNameChanged);
330        }
331      }
332      MoveGeneratorParameter.ValueChanged += new EventHandler(MoveGeneratorParameter_ValueChanged);
333      MoveEvaluatorParameter.ValueChanged += new EventHandler(MoveEvaluatorParameter_ValueChanged);
334    }
335    private void UpdateMoveGenerator() {
336      IMoveGenerator oldMoveGenerator = MoveGenerator;
337      IMoveGenerator defaultMoveGenerator = Problem.Operators.OfType<IMoveGenerator>().FirstOrDefault();
338      MoveGeneratorParameter.ValidValues.Clear();
339      if (Problem != null) {
340        foreach (IMoveGenerator generator in Problem.Operators.OfType<IMoveGenerator>().OrderBy(x => x.Name))
341          MoveGeneratorParameter.ValidValues.Add(generator);
342      }
343      if (oldMoveGenerator != null) {
344        IMoveGenerator newMoveGenerator = MoveGeneratorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveGenerator.GetType());
345        if (newMoveGenerator != null) MoveGenerator = newMoveGenerator;
346        else oldMoveGenerator = null;
347      }
348      if (oldMoveGenerator == null && defaultMoveGenerator != null)
349        MoveGenerator = defaultMoveGenerator;
350      if (MoveGenerator == null) {
351        ClearMoveParameters();
352      }
353    }
354    private void UpdateMoveParameters() {
355      IMoveMaker oldMoveMaker = MoveMaker;
356      ISingleObjectiveMoveEvaluator oldMoveEvaluator = MoveEvaluator;
357      ClearMoveParameters();
358      if (MoveGenerator != null) {
359        List<Type> moveTypes = MoveGenerator.GetType().GetInterfaces().Where(x => typeof(IMoveOperator).IsAssignableFrom(x)).ToList();
360        foreach (Type type in moveTypes.ToList()) {
361          if (moveTypes.Any(t => t != type && type.IsAssignableFrom(t)))
362            moveTypes.Remove(type);
363        }
364
365        var operators = Problem.Operators.Where(op => moveTypes.Any(m => m.IsInstanceOfType(op))).ToList();
366        IMoveMaker defaultMoveMaker = operators.OfType<IMoveMaker>().FirstOrDefault();
367        ISingleObjectiveMoveEvaluator defaultMoveEvaluator = operators.OfType<ISingleObjectiveMoveEvaluator>().FirstOrDefault();
368        foreach (IMoveMaker moveMaker in operators.OfType<IMoveMaker>().OrderBy(op => op.Name))
369          MoveMakerParameter.ValidValues.Add(moveMaker);
370        foreach (ISingleObjectiveMoveEvaluator moveEvaluator in operators.OfType<ISingleObjectiveMoveEvaluator>().OrderBy(op => op.Name))
371          MoveEvaluatorParameter.ValidValues.Add(moveEvaluator);
372
373        if (oldMoveMaker != null) {
374          IMoveMaker mm = MoveMakerParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveMaker.GetType());
375          if (mm != null) MoveMaker = mm;
376          else oldMoveMaker = null;
377        }
378        if (oldMoveMaker == null && defaultMoveMaker != null)
379          MoveMaker = defaultMoveMaker;
380
381        if (oldMoveEvaluator != null) {
382          ISingleObjectiveMoveEvaluator me = MoveEvaluatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveEvaluator.GetType());
383          if (me != null) MoveEvaluator = me;
384          else oldMoveEvaluator = null;
385        }
386        if (oldMoveEvaluator == null && defaultMoveEvaluator != null)
387          MoveEvaluator = defaultMoveEvaluator;
388      }
389    }
390    private void UpdateAnalyzers() {
391      Analyzer.Operators.Clear();
392      if (Problem != null) {
393        foreach (IAnalyzer analyzer in Problem.Operators.OfType<IAnalyzer>()) {
394          foreach (IScopeTreeLookupParameter param in analyzer.Parameters.OfType<IScopeTreeLookupParameter>())
395            param.Depth = 0;
396          Analyzer.Operators.Add(analyzer, analyzer.EnabledByDefault);
397        }
398      }
399      Analyzer.Operators.Add(moveQualityAnalyzer, moveQualityAnalyzer.EnabledByDefault);
400    }
401    private void ClearMoveParameters() {
402      MoveMakerParameter.ValidValues.Clear();
403      MoveEvaluatorParameter.ValidValues.Clear();
404    }
405    private void ParameterizeSolutionsCreator() {
406      SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
407      SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
408    }
409    private void ParameterizeMainLoop() {
410      if (Problem != null) {
411        //MainLoop.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
412        //MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
413        //MainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
414      }
415      if (MoveEvaluator != null) ;
416      //MainLoop.MoveQualityParameter.ActualName = MoveEvaluator.MoveQualityParameter.ActualName;
417    }
418    private void ParameterizeStochasticOperator(IOperator op) {
419      if (op is IStochasticOperator) {
420        IStochasticOperator stOp = (IStochasticOperator)op;
421        stOp.RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName;
422        stOp.RandomParameter.Hidden = true;
423      }
424    }
425    private void ParameterizeMoveGenerators() {
426      if (Problem != null) {
427        foreach (IMultiMoveGenerator generator in Problem.Operators.OfType<IMultiMoveGenerator>()) {
428          generator.SampleSizeParameter.ActualName = SampleSizeParameter.Name;
429          generator.SampleSizeParameter.Hidden = true;
430        }
431      }
432    }
433    private void ParameterizeMoveEvaluators() {
434      foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) {
435        op.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
436        op.QualityParameter.Hidden = true;
437      }
438    }
439    private void ParameterizeMoveMakers() {
440      foreach (IMoveMaker op in Problem.Operators.OfType<IMoveMaker>()) {
441        op.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
442        op.QualityParameter.Hidden = true;
443        if (MoveEvaluator != null) {
444          op.MoveQualityParameter.ActualName = MoveEvaluator.MoveQualityParameter.ActualName;
445          op.MoveQualityParameter.Hidden = true;
446        } else {
447          op.MoveQualityParameter.Hidden = false;
448        }
449      }
450    }
451    private void ParameterizeAnalyzers() {
452      moveQualityAnalyzer.ResultsParameter.ActualName = "Results";
453      moveQualityAnalyzer.ResultsParameter.Hidden = true;
454      if (Problem != null) {
455        moveQualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
456        moveQualityAnalyzer.MaximizationParameter.Hidden = true;
457        if (MoveEvaluator != null) {
458          moveQualityAnalyzer.QualityParameter.ActualName = MoveEvaluator.MoveQualityParameter.ActualName;
459          moveQualityAnalyzer.QualityParameter.Hidden = true;
460        } else moveQualityAnalyzer.QualityParameter.Hidden = false;
461        moveQualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
462        moveQualityAnalyzer.BestKnownQualityParameter.Hidden = true;
463      } else {
464        moveQualityAnalyzer.MaximizationParameter.Hidden = false;
465        moveQualityAnalyzer.BestKnownQualityParameter.Hidden = false;
466      }
467    }
468    private void ParameterizeIterationBasedOperators() {
469      if (Problem != null) {
470        foreach (IIterationBasedOperator op in Problem.Operators.OfType<IIterationBasedOperator>()) {
471          op.IterationsParameter.ActualName = "Iterations";
472          op.IterationsParameter.Hidden = true;
473          op.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name;
474          op.MaximumIterationsParameter.Hidden = true;
475        }
476      }
477    }
478
479    private ScatterSearchMainLoop FindMainLoop(IOperator start) {
480      IOperator mainLoop = start;
481      while (mainLoop != null && !(mainLoop is ScatterSearchMainLoop))
482        mainLoop = ((SingleSuccessorOperator)mainLoop).Successor;
483      if (mainLoop == null) return null;
484      else return (ScatterSearchMainLoop)mainLoop;
485    }
486    #endregion
487  }
488}
Note: See TracBrowser for help on using the repository browser.