1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022015 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 


22  using System;


23  using HeuristicLab.Common;


24  using HeuristicLab.Core;


25  using HeuristicLab.Data;


26  using HeuristicLab.Encodings.RealVectorEncoding;


27  using HeuristicLab.Parameters;


28  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;


29 


30  namespace HeuristicLab.Problems.TestFunctions {


31  /// <summary>


32  /// The generalized Rastrigin function y = Sum((x_i)^2 + A * (1  Cos(2pi*x_i))) is a highly multimodal function that has its optimal value 0 at the origin.


33  /// It is implemented as described in Eiben, A.E. and Smith, J.E. 2003. Introduction to Evolutionary Computation. Natural Computing Series, SpringerVerlag Berlin Heidelberg.


34  /// </summary


35  [Item("RastriginEvaluator", "Evaluates the generalized Rastrigin function y = Sum((x_i)^2 + A * (1  Cos(2pi*x_i))) on a given point. The optimum of this function is 0 at the origin. It is implemented as described in Eiben, A.E. and Smith, J.E. 2003. Introduction to Evolutionary Computation. Natural Computing Series, SpringerVerlag Berlin Heidelberg.")]


36  [StorableClass]


37  public class RastriginEvaluator : SingleObjectiveTestFunctionProblemEvaluator {


38  public override string FunctionName { get { return "Rastrigin"; } }


39  /// <summary>


40  /// Returns false as the Rastrigin function is a minimization problem.


41  /// </summary>


42  public override bool Maximization {


43  get { return false; }


44  }


45  /// <summary>


46  /// Gets the optimum function value (0).


47  /// </summary>


48  public override double BestKnownQuality {


49  get { return 0; }


50  }


51  /// <summary>


52  /// Gets the lower and upper bound of the function.


53  /// </summary>


54  public override DoubleMatrix Bounds {


55  get { return new DoubleMatrix(new double[,] { { 5.12, 5.12 } }); }


56  }


57  /// <summary>


58  /// Gets the minimum problem size (1).


59  /// </summary>


60  public override int MinimumProblemSize {


61  get { return 1; }


62  }


63  /// <summary>


64  /// Gets the (theoretical) maximum problem size (2^31  1).


65  /// </summary>


66  public override int MaximumProblemSize {


67  get { return int.MaxValue; }


68  }


69  /// <summary>


70  /// The parameter A is a parameter of the objective function y = Sum((x_i)^2 + A * (1  Cos(2pi*x_i))). Default is A = 10.


71  /// </summary>


72  public ValueParameter<DoubleValue> AParameter {


73  get { return (ValueParameter<DoubleValue>)Parameters["A"]; }


74  }


75  /// <summary>


76  /// The parameter A is a parameter of the objective function y = Sum((x_i)^2 + A * (1  Cos(2pi*x_i))). Default is A = 10.


77  /// </summary>


78  public DoubleValue A {


79  get { return AParameter.Value; }


80  set { if (value != null) AParameter.Value = value; }


81  }


82 


83  public override RealVector GetBestKnownSolution(int dimension) {


84  return new RealVector(dimension);


85  }


86 


87  [StorableConstructor]


88  protected RastriginEvaluator(bool deserializing) : base(deserializing) { }


89  protected RastriginEvaluator(RastriginEvaluator original, Cloner cloner) : base(original, cloner) { }


90  /// <summary>


91  /// Initializes a new instance of the RastriginEvaluator with one parameter (<c>A</c>).


92  /// </summary>


93  public RastriginEvaluator()


94  : base() {


95  Parameters.Add(new ValueParameter<DoubleValue>("A", "The parameter A is a parameter of the objective function y = Sum((x_i)^2 + A * (1  Cos(2pi*x_i))). Default is A = 10.", new DoubleValue(10)));


96  }


97 


98  public override IDeepCloneable Clone(Cloner cloner) {


99  return new RastriginEvaluator(this, cloner);


100  }


101 


102  /// <summary>


103  /// Evaluates the test function for a specific <paramref name="point"/>.


104  /// </summary>


105  /// <param name="point">Ndimensional point for which the test function should be evaluated.</param>


106  /// <returns>The result value of the Rastrigin function at the given point.</returns>


107  public static double Apply(RealVector point, double a) {


108  double result = a * point.Length;


109  for (int i = 0; i < point.Length; i++) {


110  result += point[i] * point[i];


111  result = a * Math.Cos(2 * Math.PI * point[i]);


112  }


113  return (result);


114  }


115 


116  /// <summary>


117  /// Evaluates the test function for a specific <paramref name="point"/>.


118  /// </summary>


119  /// <remarks>Calls <see cref="Apply"/>.</remarks>


120  /// <param name="point">Ndimensional point for which the test function should be evaluated.</param>


121  /// <returns>The result value of the Rastrigin function at the given point.</returns>


122  public override double Evaluate(RealVector point) {


123  return Apply(point, A.Value);


124  }


125  }


126  }

