Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 17571 was 17571, checked in by mkommend, 4 years ago

#2521: Changed parameters to use readonly only for GUI manipulation.

File size: 10.5 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
73      InitializeOperators();
74      RegisterEventHandlers();
75    }
76
77    public override IDeepCloneable Clone(Cloner cloner) {
78      return new SingleObjectiveTestFunctionProblem(this, cloner);
79    }
80
81    [StorableHook(HookType.AfterDeserialization)]
82    private void AfterDeserialization() {
83      RegisterEventHandlers();
84    }
85
86    private void RegisterEventHandlers() {
87      Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
88      TestFunctionParameter.ValueChanged += TestFunctionParameterOnValueChanged;
89    }
90
91    public override ISingleObjectiveEvaluationResult Evaluate(RealVector individual, IRandom random, CancellationToken cancellationToken) {
92      var quality = TestFunction.Evaluate(individual);
93      return new SingleObjectiveEvaluationResult(quality);
94    }
95
96    public override void Analyze(RealVector[] realVectors, double[] qualities, ResultCollection results, IRandom random) {
97      var best = GetBestSolution(realVectors, qualities);
98
99      DoubleValue bestKnownQuality = BestKnownQualityParameter.Value;
100      RealVector bestKnownSolution = null;
101      var bestKnownUpdate = bestKnownQuality == null || IsBetter(best.Item2, bestKnownQuality.Value);
102      if (bestKnownUpdate) {
103        if (bestKnownQuality != null) bestKnownQuality.Value = best.Item2;
104        else BestKnownQualityParameter.Value = bestKnownQuality = new DoubleValue(best.Item2);
105        BestKnownSolutionParameter.Value = bestKnownSolution = (RealVector)best.Item1.Clone();
106      }
107
108      SingleObjectiveTestFunctionSolution solution = null;
109      if (results.TryGetValue("Best Solution", out var res)) {
110        solution = (SingleObjectiveTestFunctionSolution)res.Value;
111        if (IsBetter(best.Item2, solution.BestQuality.Value)) {
112          solution.BestRealVector = (RealVector)best.Item1.Clone();
113          solution.BestQuality = new DoubleValue(best.Item2);
114        }
115      } else {
116        solution = new SingleObjectiveTestFunctionSolution((RealVector)best.Item1.Clone(),
117                                                           new DoubleValue(best.Item2),
118                                                           TestFunctionParameter.Value) {
119          BestKnownRealVector = bestKnownSolution,
120          Bounds = BoundsParameter.Value
121        };
122        results.Add(new Result("Best Solution", solution));
123      }
124      if (best.Item1.Length == 2) solution.Population = new ItemArray<RealVector>(realVectors.Select(x => (RealVector)x.Clone()));
125      if (bestKnownUpdate) solution.BestKnownRealVector = bestKnownSolution;
126    }
127
128    #region Events
129    protected override void OnEncodingChanged() {
130      base.OnEncodingChanged();
131      Parameterize();
132    }
133    protected override void OnEvaluatorChanged() {
134      base.OnEvaluatorChanged();
135      Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged;
136      Parameterize();
137    }
138    protected override void DimensionOnChanged() {
139      base.DimensionOnChanged();
140      if (Dimension < TestFunction.MinimumProblemSize || Dimension > TestFunction.MaximumProblemSize)
141        Dimension = Math.Min(TestFunction.MaximumProblemSize, Math.Max(TestFunction.MinimumProblemSize, Dimension));
142    }
143    protected override void BoundsOnChanged() {
144      base.BoundsOnChanged();
145      Parameterize();
146    }
147    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
148      Parameterize();
149    }
150    private void TestFunctionParameterOnValueChanged(object sender, EventArgs eventArgs) {
151      var problemSizeChange = Dimension < TestFunction.MinimumProblemSize
152                              || Dimension > TestFunction.MaximumProblemSize;
153      if (problemSizeChange) {
154        Dimension = Math.Max(TestFunction.MinimumProblemSize, Math.Min(Dimension, TestFunction.MaximumProblemSize));
155      }
156      BestKnownQuality = TestFunction.BestKnownQuality;
157      Bounds = (DoubleMatrix)TestFunction.Bounds.Clone();
158      var bestSolution = TestFunction.GetBestKnownSolution(Dimension);
159      BestKnownSolutionParameter.Value = bestSolution;
160      Maximization = TestFunction.Maximization;
161
162      OnReset();
163    }
164    #endregion
165
166    #region Helpers
167    private void InitializeOperators() {
168      Operators.Add(new SingleObjectiveTestFunctionImprovementOperator());
169      Operators.Add(new SingleObjectiveTestFunctionPathRelinker());
170      Operators.Add(new SingleObjectiveTestFunctionSimilarityCalculator());
171      Operators.Add(new EuclideanSimilarityCalculator());
172      Operators.Add(new AdditiveMoveEvaluator());
173
174      Parameterize();
175    }
176
177    private void Parameterize() {
178      var operators = new List<IItem>();
179
180      //TODO correct wiring code, because most of the parameters are wired in the encoding
181      foreach (var op in Operators.OfType<PopulationSimilarityAnalyzer>()) {
182        var calcs = Operators.OfType<ISolutionSimilarityCalculator>().ToArray();
183        op.SimilarityCalculatorParameter.ValidValues.Clear();
184        foreach (var c in calcs) {
185          // TODO: unified encoding parameters
186          c.SolutionVariableName = ((IRealVectorSolutionOperator)Encoding.SolutionCreator).RealVectorParameter.ActualName;
187          c.QualityVariableName = Evaluator.QualityParameter.ActualName;
188          op.SimilarityCalculatorParameter.ValidValues.Add(c);
189        }
190      }
191      foreach (var op in Operators.OfType<ISingleObjectiveTestFunctionAdditiveMoveEvaluator>()) {
192        operators.Add(op);
193        op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
194        op.QualityParameter.Hidden = true;
195        foreach (var movOp in Encoding.Operators.OfType<IRealVectorAdditiveMoveQualityOperator>())
196          movOp.MoveQualityParameter.ActualName = op.MoveQualityParameter.ActualName;
197      }
198      foreach (var op in Operators.OfType<IRealVectorParticleCreator>()) {
199        // TODO: unified encoding parameters
200        op.RealVectorParameter.ActualName = ((IRealVectorSolutionOperator)Encoding.SolutionCreator).RealVectorParameter.ActualName;
201        op.RealVectorParameter.Hidden = true;
202        op.BoundsParameter.ActualName = BoundsParameter.Name;
203        op.BoundsParameter.Hidden = true;
204      }
205      foreach (var op in Operators.OfType<IRealVectorParticleUpdater>()) {
206        // TODO: unified encoding parameters
207        op.RealVectorParameter.ActualName = ((IRealVectorSolutionOperator)Encoding.SolutionCreator).RealVectorParameter.ActualName;
208        op.RealVectorParameter.Hidden = true;
209        op.BoundsParameter.ActualName = BoundsParameter.Name;
210        op.BoundsParameter.Hidden = true;
211      }
212      foreach (var op in Operators.OfType<IRealVectorSwarmUpdater>()) {
213        op.MaximizationParameter.ActualName = MaximizationParameter.Name;
214        op.MaximizationParameter.Hidden = true;
215      }
216      foreach (var op in Operators.OfType<ISingleObjectiveImprovementOperator>()) {
217        operators.Add(op);
218        op.SolutionParameter.ActualName = Encoding.Name;
219        op.SolutionParameter.Hidden = true;
220      }
221      foreach (var op in Operators.OfType<ITestFunctionSolutionSimilarityCalculator>()) {
222        operators.Add(op);
223        op.SolutionVariableName = Encoding.Name;
224        op.QualityVariableName = Evaluator.QualityParameter.ActualName;
225        op.Bounds = Bounds;
226      }
227
228      if (operators.Count > 0) Encoding.ConfigureOperators(operators);
229    }
230    #endregion
231
232    public void Load(SOTFData data) {
233      Name = data.Name;
234      Description = data.Description;
235      TestFunction = data.TestFunction;
236    }
237  }
238}
Note: See TracBrowser for help on using the repository browser.