Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/13/19 16:20:11 (5 years ago)
Author:
abeham
Message:

#2521: Adapted test function problems to new real vector problem

  • Made encoding readonly in symbolic expression tree problem
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs

    r16723 r16949  
    2323using System.Collections.Generic;
    2424using System.Linq;
     25using HEAL.Attic;
    2526using HeuristicLab.Analysis;
    2627using HeuristicLab.Common;
     
    2930using HeuristicLab.Encodings.RealVectorEncoding;
    3031using HeuristicLab.Optimization;
    31 using HeuristicLab.Optimization.Operators;
    3232using HeuristicLab.Parameters;
    33 using HEAL.Attic;
    3433using HeuristicLab.Problems.Instances;
    3534
     
    3837  [StorableType("F0AB7236-2C9B-49DC-9D4F-A3558FD9E992")]
    3938  [Creatable(CreatableAttribute.Categories.Problems, Priority = 90)]
    40   public sealed class SingleObjectiveTestFunctionProblem :
    41     SingleObjectiveProblem<RealVectorEncoding, RealVector>,
     39  public sealed class SingleObjectiveTestFunctionProblem : RealVectorProblem,
    4240    IProblemInstanceConsumer<SOTFData> {
    4341
     
    7371      get { return TestFunctionParameter.Value; }
    7472      set { TestFunctionParameter.Value = value; }
    75     }
    76 
    77     private BestSingleObjectiveTestFunctionSolutionAnalyzer BestSingleObjectiveTestFunctionSolutionAnalyzer {
    78       get { return Operators.OfType<BestSingleObjectiveTestFunctionSolutionAnalyzer>().FirstOrDefault(); }
    7973    }
    8074    #endregion
     
    121115    }
    122116
     117    public override void Analyze(RealVector[] realVectors, double[] qualities, ResultCollection results, IRandom random) {
     118
     119      bool max = Maximization;
     120      DoubleValue bestKnownQuality = BestKnownQualityParameter.Value;
     121      SingleObjectiveTestFunctionSolution solution = null;
     122      if (results.TryGetValue("Best Solution", out var res)) {
     123        solution = (SingleObjectiveTestFunctionSolution)res.Value;
     124      }
     125
     126      int i = -1;
     127      if (!max) i = qualities.Select((x, index) => new { index, quality = x }).OrderBy(x => x.quality).First().index;
     128      else i = qualities.Select((x, index) => new { index, quality = x }).OrderByDescending(x => x.quality).First().index;
     129
     130      if (bestKnownQuality == null ||
     131          max && qualities[i] > bestKnownQuality.Value
     132          || !max && qualities[i] < bestKnownQuality.Value) {
     133        BestKnownQualityParameter.Value = new DoubleValue(qualities[i]);
     134        BestKnownSolutionParameter.Value = (RealVector)realVectors[i].Clone();
     135        if (solution != null)
     136          solution.BestKnownRealVector = BestKnownSolutionParameter.Value;
     137      }
     138
     139      if (solution == null) {
     140        solution = new SingleObjectiveTestFunctionSolution((RealVector)realVectors[i].Clone(),
     141                                                           new DoubleValue(qualities[i]),
     142                                                           TestFunctionParameter.Value);
     143        solution.Population = realVectors[i].Length == 2
     144          ? new ItemArray<RealVector>(realVectors.Select(x => x.Clone()).Cast<RealVector>())
     145          : null;
     146        solution.BestKnownRealVector = BestKnownSolutionParameter.Value;
     147        solution.Bounds = BoundsParameter.Value;
     148        results.Add(new Result("Best Solution", solution));
     149      } else {
     150        if (max && qualities[i] > solution.BestQuality.Value
     151          || !max && qualities[i] < solution.BestQuality.Value) {
     152          solution.BestRealVector = (RealVector)realVectors[i].Clone();
     153          solution.BestQuality = new DoubleValue(qualities[i]);
     154        }
     155        solution.Population = realVectors[i].Length == 2
     156          ? new ItemArray<RealVector>(realVectors.Select(x => x.Clone()).Cast<RealVector>())
     157          : null;
     158      }
     159    }
     160
    123161    #region Events
    124162    protected override void OnEncodingChanged() {
     
    162200      Operators.Add(new SingleObjectiveTestFunctionPathRelinker());
    163201      Operators.Add(new SingleObjectiveTestFunctionSimilarityCalculator());
    164       Operators.Add(new HammingSimilarityCalculator());
    165202      Operators.Add(new EuclideanSimilarityCalculator());
    166       Operators.Add(new QualitySimilarityCalculator());
    167203      Operators.Add(new AdditiveMoveEvaluator());
    168204
    169       Operators.Add(new BestSingleObjectiveTestFunctionSolutionAnalyzer());
    170       Operators.Add(new PopulationSimilarityAnalyzer(Operators.OfType<ISolutionSimilarityCalculator>()));
    171205      Parameterize();
    172206    }
     
    174208    private void Parameterize() {
    175209      var operators = new List<IItem>();
    176       if (BestSingleObjectiveTestFunctionSolutionAnalyzer != null) {
    177         operators.Add(BestSingleObjectiveTestFunctionSolutionAnalyzer);
    178         BestSingleObjectiveTestFunctionSolutionAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
    179         BestSingleObjectiveTestFunctionSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
    180         BestSingleObjectiveTestFunctionSolutionAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
    181         BestSingleObjectiveTestFunctionSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
    182         BestSingleObjectiveTestFunctionSolutionAnalyzer.TestFunctionParameter.ActualName = TestFunctionParameter.Name;
     210      foreach (var op in Operators.OfType<PopulationSimilarityAnalyzer>()) {
     211        var calcs = Operators.OfType<ISolutionSimilarityCalculator>().ToArray();
     212        op.SimilarityCalculatorParameter.ValidValues.Clear();
     213        foreach (var c in calcs) {
     214          // TODO: unified encoding parameters
     215          c.SolutionVariableName = ((IRealVectorSolutionOperator)Encoding.SolutionCreator).RealVectorParameter.ActualName;
     216          c.QualityVariableName = Evaluator.QualityParameter.ActualName;
     217          op.SimilarityCalculatorParameter.ValidValues.Add(c);
     218        }
    183219      }
    184220      foreach (var op in Operators.OfType<ISingleObjectiveTestFunctionAdditiveMoveEvaluator>()) {
Note: See TracChangeset for help on using the changeset viewer.