Changeset 13336 for branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveImprover.cs
- Timestamp:
- 11/23/15 15:15:27 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveImprover.cs
r12012 r13336 33 33 [Item("Single-objective Improver", "Improves a solution by calling GetNeighbors and Evaluate of the corresponding problem definition.")] 34 34 [StorableClass] 35 public sealed class SingleObjectiveImprover : SingleSuccessorOperator, INeighborBasedOperator, IImprovementOperator, ISingleObjectiveEvaluationOperator, IStochasticOperator { 35 public sealed class SingleObjectiveImprover<TSolution> : SingleSuccessorOperator, INeighborBasedOperator<TSolution>, IImprovementOperator, ISingleObjectiveEvaluationOperator<TSolution>, IStochasticOperator 36 where TSolution : class, ISolution { 36 37 public ILookupParameter<IRandom> RandomParameter { 37 38 get { return (ILookupParameter<IRandom>)Parameters["Random"]; } 38 39 } 39 40 40 public ILookupParameter<IEncoding > EncodingParameter {41 get { return (ILookupParameter<IEncoding >)Parameters["Encoding"]; }41 public ILookupParameter<IEncoding<TSolution>> EncodingParameter { 42 get { return (ILookupParameter<IEncoding<TSolution>>)Parameters["Encoding"]; } 42 43 } 43 44 … … 62 63 } 63 64 64 public Func< Individual, IRandom, double> EvaluateFunc { get; set; }65 public Func< Individual, IRandom, IEnumerable<Individual>> GetNeighborsFunc { get; set; }65 public Func<TSolution, IRandom, double> EvaluateFunc { get; set; } 66 public Func<TSolution, IRandom, IEnumerable<TSolution>> GetNeighborsFunc { get; set; } 66 67 67 68 [StorableConstructor] 68 69 private SingleObjectiveImprover(bool deserializing) : base(deserializing) { } 69 private SingleObjectiveImprover(SingleObjectiveImprover original, Cloner cloner) : base(original, cloner) { }70 private SingleObjectiveImprover(SingleObjectiveImprover<TSolution> original, Cloner cloner) : base(original, cloner) { } 70 71 public SingleObjectiveImprover() { 71 72 Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use.")); 72 Parameters.Add(new LookupParameter<IEncoding >("Encoding", "An item that holds the problem's encoding."));73 Parameters.Add(new LookupParameter<IEncoding<TSolution>>("Encoding", "An item that holds the problem's encoding.")); 73 74 Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the parameter vector.")); 74 75 Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Whether the problem should be minimized or maximized.")); … … 79 80 80 81 public override IDeepCloneable Clone(Cloner cloner) { 81 return new SingleObjectiveImprover (this, cloner);82 return new SingleObjectiveImprover<TSolution>(this, cloner); 82 83 } 83 84 … … 88 89 var maxAttempts = ImprovementAttemptsParameter.ActualValue.Value; 89 90 var sampleSize = SampleSizeParameter.ActualValue.Value; 90 var individual = encoding.GetIndividual(ExecutionContext.Scope);91 var quality = QualityParameter.ActualValue == null ? EvaluateFunc( individual, random) : QualityParameter.ActualValue.Value;91 var solution = ScopeUtil.GetSolution(ExecutionContext.Scope, encoding); 92 var quality = QualityParameter.ActualValue == null ? EvaluateFunc(solution, random) : QualityParameter.ActualValue.Value; 92 93 93 94 var count = 0; 94 95 for (var i = 0; i < maxAttempts; i++) { 95 Individual best = null;96 TSolution best = default(TSolution); 96 97 var bestQuality = quality; 97 foreach (var neighbor in GetNeighborsFunc( individual, random).Take(sampleSize)) {98 foreach (var neighbor in GetNeighborsFunc(solution, random).Take(sampleSize)) { 98 99 var q = EvaluateFunc(neighbor, random); 99 100 count++; … … 103 104 } 104 105 if (best == null) break; 105 individual= best;106 solution = best; 106 107 quality = bestQuality; 107 108 } … … 109 110 LocalEvaluatedSolutionsParameter.ActualValue = new IntValue(count); 110 111 QualityParameter.ActualValue = new DoubleValue(quality); 111 individual.CopyToScope(ExecutionContext.Scope); 112 113 ScopeUtil.CopySolutionToScope(ExecutionContext.Scope, encoding, solution); 112 114 return base.Apply(); 113 115 }
Note: See TracChangeset
for help on using the changeset viewer.