Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/16/19 05:27:50 (5 years ago)
Author:
swagner
Message:

#2989: Worked on Moving Peaks Benchmark

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/MovingPeaksBenchmarkProblemEvaluator.cs

    r16608 r16609  
    2020#endregion
    2121
     22using System;
     23using System.Linq;
    2224using HeuristicLab.Common;
    2325using HeuristicLab.Core;
     
    2527using HeuristicLab.Encodings.RealVectorEncoding;
    2628using HeuristicLab.Operators;
     29using HeuristicLab.Optimization;
    2730using HeuristicLab.Parameters;
    2831using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     32using HeuristicLab.Random;
    2933
    3034namespace HeuristicLab.Problems.MovingPeaksBenchmark {
     
    3236  [StorableClass]
    3337  public class MovingPeaksBenchmarkProblemEvaluator : InstrumentedOperator, IMovingPeaksBenchmarkProblemEvaluator {
    34     public ILookupParameter<DoubleMatrix> PeakLocationsParameter {
    35       get { return (ILookupParameter<DoubleMatrix>)Parameters["PeakLocations"]; }
    36     }
    37     public ILookupParameter<DoubleArray> PeakWidthsParameter {
    38       get { return (ILookupParameter<DoubleArray>)Parameters["PeakWidths"]; }
    39     }
    40     public ILookupParameter<DoubleArray> PeakHeightsParameter {
    41       get { return (ILookupParameter<DoubleArray>)Parameters["PeakHeights"]; }
     38    [Storable]
     39    IRandom uniformRandom;
     40    [Storable]
     41    long executions;
     42
     43    public IValueLookupParameter<DoubleMatrix> PeakLocationsParameter {
     44      get { return (IValueLookupParameter<DoubleMatrix>)Parameters["PeakLocations"]; }
     45    }
     46    public IValueLookupParameter<DoubleArray> PeakWidthsParameter {
     47      get { return (IValueLookupParameter<DoubleArray>)Parameters["PeakWidths"]; }
     48    }
     49    public IValueLookupParameter<DoubleArray> PeakHeightsParameter {
     50      get { return (IValueLookupParameter<DoubleArray>)Parameters["PeakHeights"]; }
     51    }
     52    public ILookupParameter<IntValue> MovingPeaksRandomSeedParameter {
     53      get { return (ILookupParameter<IntValue>)Parameters["MovingPeaksRandomSeed"]; }
     54    }
     55    public ILookupParameter<IntValue> PeakMovementIntervalParameter {
     56      get { return (ILookupParameter<IntValue>)Parameters["PeakMovementInterval"]; }
     57    }
     58    public ILookupParameter<DoubleValue> PeakMovementStrengthParameter {
     59      get { return (ILookupParameter<DoubleValue>)Parameters["PeakMovementStrength"]; }
    4260    }
    4361    public ILookupParameter<RealVector> PointParameter {
     
    4664    public ILookupParameter<DoubleValue> QualityParameter {
    4765      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
     66    }
     67    public ILookupParameter<DoubleValue> BestKnownQualityParameter {
     68      get { return (ILookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
     69    }
     70    public ILookupParameter<RealVector> BestKnownSolutionParameter {
     71      get { return (ILookupParameter<RealVector>)Parameters["BestKnownSolution"]; }
     72    }
     73    public IValueLookupParameter<ResultCollection> ResultsParameter {
     74      get { return (IValueLookupParameter<ResultCollection>)Parameters["Results"]; }
    4875    }
    4976
     
    5279    protected MovingPeaksBenchmarkProblemEvaluator(MovingPeaksBenchmarkProblemEvaluator original, Cloner cloner) : base(original, cloner) { }
    5380    public MovingPeaksBenchmarkProblemEvaluator() : base() {
    54       Parameters.Add(new LookupParameter<DoubleMatrix>("PeakLocations", "Current position of the peaks."));
    55       Parameters.Add(new LookupParameter<DoubleArray>("PeakWidths", "Current width of the peaks."));
    56       Parameters.Add(new LookupParameter<DoubleArray>("PeakHeights", "Current height of the peaks."));
     81      Parameters.Add(new ValueLookupParameter<DoubleMatrix>("PeakLocations", "Current position of the peaks."));
     82      PeakLocationsParameter.ActualName = "InitialPeakLocations";
     83      Parameters.Add(new ValueLookupParameter<DoubleArray>("PeakWidths", "Current width of the peaks."));
     84      PeakWidthsParameter.ActualName = "InitialPeakWidths";
     85      Parameters.Add(new ValueLookupParameter<DoubleArray>("PeakHeights", "Current height of the peaks."));
     86      PeakHeightsParameter.ActualName = "InitialPeakHeights";
     87      Parameters.Add(new LookupParameter<IntValue>("MovingPeaksRandomSeed", "The random seed for initializing the PRNG for changing the peaks."));
     88      Parameters.Add(new LookupParameter<IntValue>("PeakMovementInterval", "The interval in evaluated solutions in which peaks are moved."));
     89      Parameters.Add(new LookupParameter<DoubleValue>("PeakMovementStrength", "The length of the random vector used for changing peak locations."));
    5790      Parameters.Add(new LookupParameter<RealVector>("Point", "The point which should be evaluated."));
    5891      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "Quality value of the evaluated point."));
     92      Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "Quality value of the highest peak."));
     93      Parameters.Add(new LookupParameter<RealVector>("BestKnownSolution", "The location of the highest peak."));
     94      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection for storing result values."));
     95
     96      PeakLocationsParameter.Hidden = true;
     97      PeakWidthsParameter.Hidden = true;
     98      PeakHeightsParameter.Hidden = true;
     99      BestKnownQualityParameter.Hidden = true;
     100      BestKnownSolutionParameter.Hidden = true;
     101      ResultsParameter.Hidden = true;
    59102    }
    60103
     
    67110      DoubleArray widths = PeakWidthsParameter.ActualValue;
    68111      DoubleArray heights = PeakHeightsParameter.ActualValue;
     112
     113      if (PeakLocationsParameter.Value == null) {
     114        peaks = peaks.Clone() as DoubleMatrix;
     115        widths = widths.Clone() as DoubleArray;
     116        heights = heights.Clone() as DoubleArray;
     117        PeakLocationsParameter.Value = peaks;
     118        PeakWidthsParameter.Value = widths;
     119        PeakHeightsParameter.Value = heights;
     120
     121        ResultCollection results = ResultsParameter.ActualValue;
     122        results.Add(new Result("Current Peak Locations", peaks));
     123        results.Add(new Result("Current Peak Widths", widths));
     124        results.Add(new Result("Current Peak Heights", heights));
     125      }
     126      if (uniformRandom == null) {
     127        uniformRandom = new MersenneTwister();
     128        uniformRandom.Reset(MovingPeaksRandomSeedParameter.ActualValue.Value);
     129      }
     130
     131      // move peaks if peaks movement interval is reached
     132      lock (this) {
     133        if ((executions % PeakMovementIntervalParameter.ActualValue.Value) == 0) {
     134          MovePeaks(uniformRandom, peaks, widths, heights, PeakMovementStrengthParameter.ActualValue.Value);
     135
     136          // update best known solution & quality according to highest peak
     137          double maxHeight = heights.Max();
     138          int peakIndex = Array.IndexOf(heights.CloneAsArray(), maxHeight);
     139          double[] peak = new double[peaks.Columns];
     140          for (int i = 0; i < peak.Length; i++) {
     141            peak[i] = peaks[peakIndex, i];
     142          }
     143          BestKnownSolutionParameter.ActualValue = new RealVector(peak);
     144          BestKnownQualityParameter.ActualValue.Value = heights.Max();
     145        }
     146        executions++;
     147      }
     148
    69149      RealVector point = PointParameter.ActualValue;
    70150      double quality = Apply(peaks, widths, heights, point);
     
    73153    }
    74154
     155    public override void InitializeState() {
     156      base.InitializeState();
     157      executions = 0;
     158    }
     159
     160    public override void ClearState() {
     161      base.ClearState();
     162      uniformRandom = null;
     163      PeakLocationsParameter.Value = null;
     164      PeakWidthsParameter.Value = null;
     165      PeakHeightsParameter.Value = null;
     166    }
     167
    75168    public double Apply(DoubleMatrix peaks, DoubleArray widths, DoubleArray heights, RealVector point) {
    76       heights[0] *= 1.01;
    77 
    78169      double max = 0;
    79170      double val = 0;
     
    89180      return max;
    90181    }
     182
     183    private void MovePeaks(IRandom uniformRandom, DoubleMatrix peaks, DoubleArray widths, DoubleArray heights, double strength) {
     184      IRandom normalRandom = new NormalDistributedRandom(uniformRandom, 0, 1);
     185      for (int i = 0; i < peaks.Rows; i++) {
     186        double[] v = RandomVector(uniformRandom, peaks.Columns, strength);
     187        for (int j = 0; j < v.Length; j++) {
     188          peaks[i, j] += v[j];
     189        }
     190        widths[i] = widths[i] + 0.01 * normalRandom.NextDouble();
     191        heights[i] = heights[i] + 7 * normalRandom.NextDouble();
     192      }
     193    }
     194
     195    private double[] RandomVector(IRandom uniformRandom, int dimensions, double length) {
     196      double[] vector = new double[dimensions];
     197
     198      for (int i = 0; i < vector.Length; i++) {
     199        vector[i] = uniformRandom.NextDouble() - 0.5;
     200      }
     201      double factor = length / Math.Sqrt(vector.Select(x => x * x).Sum());
     202      for (int i = 0; i < vector.Length; i++) {
     203        vector[i] *= factor;
     204      }
     205      return vector;
     206    }
    91207  }
    92208}
Note: See TracChangeset for help on using the changeset viewer.