Changeset 16609 for branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/MovingPeaksBenchmarkProblemEvaluator.cs
- Timestamp:
- 02/16/19 05:27:50 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/MovingPeaksBenchmarkProblemEvaluator.cs
r16608 r16609 20 20 #endregion 21 21 22 using System; 23 using System.Linq; 22 24 using HeuristicLab.Common; 23 25 using HeuristicLab.Core; … … 25 27 using HeuristicLab.Encodings.RealVectorEncoding; 26 28 using HeuristicLab.Operators; 29 using HeuristicLab.Optimization; 27 30 using HeuristicLab.Parameters; 28 31 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 32 using HeuristicLab.Random; 29 33 30 34 namespace HeuristicLab.Problems.MovingPeaksBenchmark { … … 32 36 [StorableClass] 33 37 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"]; } 42 60 } 43 61 public ILookupParameter<RealVector> PointParameter { … … 46 64 public ILookupParameter<DoubleValue> QualityParameter { 47 65 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"]; } 48 75 } 49 76 … … 52 79 protected MovingPeaksBenchmarkProblemEvaluator(MovingPeaksBenchmarkProblemEvaluator original, Cloner cloner) : base(original, cloner) { } 53 80 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.")); 57 90 Parameters.Add(new LookupParameter<RealVector>("Point", "The point which should be evaluated.")); 58 91 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; 59 102 } 60 103 … … 67 110 DoubleArray widths = PeakWidthsParameter.ActualValue; 68 111 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 69 149 RealVector point = PointParameter.ActualValue; 70 150 double quality = Apply(peaks, widths, heights, point); … … 73 153 } 74 154 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 75 168 public double Apply(DoubleMatrix peaks, DoubleArray widths, DoubleArray heights, RealVector point) { 76 heights[0] *= 1.01;77 78 169 double max = 0; 79 170 double val = 0; … … 89 180 return max; 90 181 } 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 } 91 207 } 92 208 }
Note: See TracChangeset
for help on using the changeset viewer.