Changeset 5735 for branches/VNS/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchImprovementOperator.cs
- Timestamp:
- 03/17/11 14:35:58 (13 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/VNS/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchImprovementOperator.cs
r5725 r5735 33 33 using HeuristicLab.Optimization; 34 34 using HeuristicLab.Optimization.Operators; 35 using HeuristicLab.Analysis; 35 36 36 37 namespace HeuristicLab.Algorithms.LocalSearch { … … 38 39 /// A local search improvement operator. 39 40 /// </summary> 40 [Item("LocalSearchImprovement ", "A local search improvement operator.")]41 [Item("LocalSearchImprovementOperator", "A local search improvement operator.")] 41 42 [StorableClass] 42 public class LocalSearchImprovement : SingleSuccessorOperator, ILocalImprovement{43 public class LocalSearchImprovementOperator: SingleSuccessorOperator, ILocalImprovementOperator { 43 44 [Storable] 44 45 private LocalSearchMainLoop loop; 46 47 [Storable] 48 private BestAverageWorstQualityAnalyzer qualityAnalyzer; 45 49 46 50 private ConstrainedValueParameter<IMoveGenerator> MoveGeneratorParameter { … … 62 66 get { return (LookupParameter<IntValue>)Parameters["EvaluatedSolutions"]; } 63 67 } 64 public LookupParameter<IOperator> AnalyzerParameter {65 get { return ( LookupParameter<IOperator>)Parameters["Analyzer"]; }68 public ValueParameter<MultiAnalyzer> AnalyzerParameter { 69 get { return (ValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; } 66 70 } 67 71 … … 78 82 set { MoveEvaluatorParameter.Value = value; } 79 83 } 84 public MultiAnalyzer Analyzer { 85 get { return AnalyzerParameter.Value; } 86 set { AnalyzerParameter.Value = value; } 87 } 80 88 81 89 [StorableConstructor] 82 protected LocalSearchImprovement (bool deserializing) : base(deserializing) {}90 protected LocalSearchImprovementOperator(bool deserializing) : base(deserializing) {} 83 91 [StorableHook(HookType.AfterDeserialization)] 84 92 private void AfterDeserialization() { 85 93 Initialize(); 86 94 } 87 protected LocalSearchImprovement (LocalSearchImprovementoriginal, Cloner cloner)95 protected LocalSearchImprovementOperator(LocalSearchImprovementOperator original, Cloner cloner) 88 96 : base(original, cloner) { 89 97 this.loop = cloner.Clone(original.loop); 98 this.qualityAnalyzer = cloner.Clone(original.qualityAnalyzer); 90 99 Initialize(); 91 100 } 92 101 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() 96 105 : 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(); 98 113 99 114 Parameters.Add(new ConstrainedValueParameter<IMoveGenerator>("MoveGenerator", "The operator used to generate moves to the neighborhood of the current solution.")); 100 115 Parameters.Add(new ConstrainedValueParameter<IMoveMaker>("MoveMaker", "The operator used to perform a move.")); 101 116 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(1 000)));103 Parameters.Add(new ValueParameter<IntValue>("SampleSize", "Number of moves that MultiMoveGenerators should create. This is ignored for Exhaustive- and SingleMoveGenerators.", new IntValue(1 00)));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))); 104 119 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())); 106 121 107 122 Initialize(); … … 112 127 } 113 128 114 public void Parameterize(IProblem problem) {129 public void OnProblemChanged(IProblem problem) { 115 130 UpdateMoveOperators(problem); 116 131 ChooseMoveOperators(); … … 119 134 ParameterizeMoveEvaluators(problem as ISingleObjectiveProblem); 120 135 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); 121 162 } 122 163 … … 245 286 } 246 287 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;256 288 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 273 290 processor.Operators.Add(loop); 274 291 processor.Successor = remover; … … 279 296 } 280 297 281 return ExecutionContext.Create Operation(processor);298 return ExecutionContext.CreateChildOperation(processor); 282 299 } 283 300 }
Note: See TracChangeset
for help on using the changeset viewer.