Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs @ 17587

Last change on this file since 17587 was 17587, checked in by abeham, 4 years ago

#2521: refactoring in progress

File size: 10.7 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 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 System.Threading;
26using HEAL.Attic;
27using HeuristicLab.Analysis;
28using HeuristicLab.Common;
29using HeuristicLab.Core;
30using HeuristicLab.Data;
31using HeuristicLab.Encodings.RealVectorEncoding;
32using HeuristicLab.Optimization;
33using HeuristicLab.Parameters;
34using HeuristicLab.Problems.Instances;
35
36namespace HeuristicLab.Problems.TestFunctions {
37  [Item("Test Function (single-objective)", "Test function with real valued inputs and a single objective.")]
38  [StorableType("F0AB7236-2C9B-49DC-9D4F-A3558FD9E992")]
39  [Creatable(CreatableAttribute.Categories.Problems, Priority = 90)]
40  public sealed class SingleObjectiveTestFunctionProblem : RealVectorProblem,
41    IProblemInstanceConsumer<SOTFData> {
42
43    #region Parameter Properties
44    public OptionalValueParameter<RealVector> BestKnownSolutionParameter {
45      get { return (OptionalValueParameter<RealVector>)Parameters["BestKnownSolution"]; }
46    }
47    public IValueParameter<ISingleObjectiveTestFunction> TestFunctionParameter {
48      get { return (IValueParameter<ISingleObjectiveTestFunction>)Parameters["TestFunction"]; }
49    }
50    #endregion
51
52    #region Properties
53    public ISingleObjectiveTestFunction TestFunction {
54      get { return TestFunctionParameter.Value; }
55      set { TestFunctionParameter.Value = value; }
56    }
57    #endregion
58
59    [StorableConstructor]
60    private SingleObjectiveTestFunctionProblem(StorableConstructorFlag _) : base(_) { }
61    private SingleObjectiveTestFunctionProblem(SingleObjectiveTestFunctionProblem original, Cloner cloner)
62      : base(original, cloner) {
63      RegisterEventHandlers();
64    }
65    public SingleObjectiveTestFunctionProblem()
66      : base(new RealVectorEncoding("Point")) {
67      Parameters.Add(new OptionalValueParameter<RealVector>("BestKnownSolution", "The best known solution for this test function instance."));
68      Parameters.Add(new ValueParameter<ISingleObjectiveTestFunction>("TestFunction", "The function that is to be optimized.", new Ackley()));
69      Maximization = TestFunction.Maximization;
70
71      BestKnownQuality = TestFunction.BestKnownQuality;
72      Bounds = (DoubleMatrix)TestFunction.Bounds.Clone();
73      Dimension = TestFunction.MinimumProblemSize;
74      BestKnownSolutionParameter.Value = TestFunction.GetBestKnownSolution(Dimension);
75      InitializeOperators();
76      RegisterEventHandlers();
77    }
78
79    public override IDeepCloneable Clone(Cloner cloner) {
80      return new SingleObjectiveTestFunctionProblem(this, cloner);
81    }
82
83    [StorableHook(HookType.AfterDeserialization)]
84    private void AfterDeserialization() {
85      RegisterEventHandlers();
86    }
87
88    private void RegisterEventHandlers() {
89      Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
90      TestFunctionParameter.ValueChanged += TestFunctionParameterOnValueChanged;
91    }
92
93    public override ISingleObjectiveEvaluationResult Evaluate(RealVector individual, IRandom random, CancellationToken cancellationToken) {
94      var quality = TestFunction.Evaluate(individual);
95      return new SingleObjectiveEvaluationResult(quality);
96    }
97
98    public override void Analyze(RealVector[] realVectors, double[] qualities, ResultCollection results, IRandom random) {
99      var best = GetBestSolution(realVectors, qualities);
100
101      DoubleValue bestKnownQuality = BestKnownQualityParameter.Value;
102      RealVector bestKnownSolution = null;
103      var bestKnownUpdate = bestKnownQuality == null || IsBetter(best.Item2, bestKnownQuality.Value);
104      if (bestKnownUpdate) {
105        if (bestKnownQuality != null) bestKnownQuality.Value = best.Item2;
106        else BestKnownQualityParameter.Value = bestKnownQuality = new DoubleValue(best.Item2);
107        BestKnownSolutionParameter.Value = bestKnownSolution = (RealVector)best.Item1.Clone();
108      }
109
110      SingleObjectiveTestFunctionSolution solution = null;
111      if (results.TryGetValue("Best Solution", out var res)) {
112        solution = (SingleObjectiveTestFunctionSolution)res.Value;
113        if (IsBetter(best.Item2, solution.BestQuality.Value)) {
114          solution.BestRealVector = (RealVector)best.Item1.Clone();
115          solution.BestQuality = new DoubleValue(best.Item2);
116        }
117      } else {
118        solution = new SingleObjectiveTestFunctionSolution((RealVector)best.Item1.Clone(),
119                                                           new DoubleValue(best.Item2),
120                                                           TestFunctionParameter.Value) {
121          BestKnownRealVector = bestKnownSolution,
122          Bounds = BoundsRefParameter.Value
123        };
124        results.Add(new Result("Best Solution", solution));
125      }
126      if (best.Item1.Length == 2) solution.Population = new ItemArray<RealVector>(realVectors.Select(x => (RealVector)x.Clone()));
127      if (bestKnownUpdate) solution.BestKnownRealVector = bestKnownSolution;
128    }
129
130    #region Events
131    protected override void OnEncodingChanged() {
132      base.OnEncodingChanged();
133      Parameterize();
134    }
135    protected override void OnEvaluatorChanged() {
136      base.OnEvaluatorChanged();
137      Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
138      Parameterize();
139    }
140    protected override void DimensionOnChanged() {
141      base.DimensionOnChanged();
142      if (Dimension < TestFunction.MinimumProblemSize || Dimension > TestFunction.MaximumProblemSize)
143        Dimension = Math.Min(TestFunction.MaximumProblemSize, Math.Max(TestFunction.MinimumProblemSize, Dimension));
144    }
145    protected override void BoundsOnChanged() {
146      base.BoundsOnChanged();
147      Parameterize();
148    }
149    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
150      Parameterize();
151    }
152    private void TestFunctionParameterOnValueChanged(object sender, EventArgs eventArgs) {
153      var problemSizeChange = Dimension < TestFunction.MinimumProblemSize
154                              || Dimension > TestFunction.MaximumProblemSize;
155      if (problemSizeChange) {
156        Dimension = Math.Max(TestFunction.MinimumProblemSize, Math.Min(Dimension, TestFunction.MaximumProblemSize));
157      }
158      BestKnownQuality = TestFunction.BestKnownQuality;
159      Bounds = (DoubleMatrix)TestFunction.Bounds.Clone();
160      var bestSolution = TestFunction.GetBestKnownSolution(Dimension);
161      BestKnownSolutionParameter.Value = bestSolution;
162      Maximization = TestFunction.Maximization;
163
164      OnReset();
165    }
166    #endregion
167
168    #region Helpers
169    private void InitializeOperators() {
170      Operators.Add(new SingleObjectiveTestFunctionImprovementOperator());
171      Operators.Add(new SingleObjectiveTestFunctionPathRelinker());
172      Operators.Add(new SingleObjectiveTestFunctionSimilarityCalculator());
173      Operators.Add(new EuclideanSimilarityCalculator());
174      Operators.Add(new AdditiveMoveEvaluator());
175
176      Parameterize();
177    }
178
179    private void Parameterize() {
180      var operators = new List<IItem>();
181
182      //TODO correct wiring code, because most of the parameters are wired in the encoding
183      foreach (var op in Operators.OfType<PopulationSimilarityAnalyzer>()) {
184        var calcs = Operators.OfType<ISolutionSimilarityCalculator>().ToArray();
185        op.SimilarityCalculatorParameter.ValidValues.Clear();
186        foreach (var c in calcs) {
187          // TODO: unified encoding parameters
188          c.SolutionVariableName = ((IRealVectorSolutionOperator)Encoding.SolutionCreator).RealVectorParameter.ActualName;
189          c.QualityVariableName = Evaluator.QualityParameter.ActualName;
190          op.SimilarityCalculatorParameter.ValidValues.Add(c);
191        }
192      }
193      foreach (var op in Operators.OfType<ISingleObjectiveTestFunctionAdditiveMoveEvaluator>()) {
194        operators.Add(op);
195        op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
196        op.QualityParameter.Hidden = true;
197        foreach (var movOp in Encoding.Operators.OfType<IRealVectorAdditiveMoveQualityOperator>())
198          movOp.MoveQualityParameter.ActualName = op.MoveQualityParameter.ActualName;
199      }
200      foreach (var op in Operators.OfType<IRealVectorParticleCreator>()) {
201        // TODO: unified encoding parameters
202        op.RealVectorParameter.ActualName = ((IRealVectorSolutionOperator)Encoding.SolutionCreator).RealVectorParameter.ActualName;
203        op.RealVectorParameter.Hidden = true;
204        op.BoundsParameter.ActualName = BoundsRefParameter.Name;
205        op.BoundsParameter.Hidden = true;
206      }
207      foreach (var op in Operators.OfType<IRealVectorParticleUpdater>()) {
208        // TODO: unified encoding parameters
209        op.RealVectorParameter.ActualName = ((IRealVectorSolutionOperator)Encoding.SolutionCreator).RealVectorParameter.ActualName;
210        op.RealVectorParameter.Hidden = true;
211        op.BoundsParameter.ActualName = BoundsRefParameter.Name;
212        op.BoundsParameter.Hidden = true;
213      }
214      foreach (var op in Operators.OfType<IRealVectorSwarmUpdater>()) {
215        op.MaximizationParameter.ActualName = MaximizationParameter.Name;
216        op.MaximizationParameter.Hidden = true;
217      }
218      foreach (var op in Operators.OfType<ISingleObjectiveImprovementOperator>()) {
219        operators.Add(op);
220        op.SolutionParameter.ActualName = Encoding.Name;
221        op.SolutionParameter.Hidden = true;
222      }
223      foreach (var op in Operators.OfType<ITestFunctionSolutionSimilarityCalculator>()) {
224        operators.Add(op);
225        op.SolutionVariableName = Encoding.Name;
226        op.QualityVariableName = Evaluator.QualityParameter.ActualName;
227        op.Bounds = Bounds;
228      }
229
230      if (operators.Count > 0) Encoding.ConfigureOperators(operators);
231    }
232    #endregion
233
234    public void Load(SOTFData data) {
235      Name = data.Name;
236      Description = data.Description;
237      TestFunction = data.TestFunction;
238    }
239  }
240}
Note: See TracBrowser for help on using the repository browser.