1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022018 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.Persistence.Default.CompositeSerializers.Storable;


26 


27  namespace HeuristicLab.Encodings.RealVectorEncoding {


28  /// <summary>


29  /// The random convex crossover is similar to the <see cref="LocalCrossover"/>, but chooses just one random alpha for all positions.


30  /// </summary>


31  /// <remarks>


32  /// It is implemented as described in Dumitrescu, D. et al. (2000), Evolutionary computation, CRC Press, Boca Raton, FL, pp. 193  194.


33  /// </remarks>


34  [Item("RandomConvexCrossover", "The random convex crossover acts like the local crossover, but with just one randomly chosen alpha for all crossed positions. It is implementes as described in Dumitrescu, D. et al. (2000), Evolutionary computation, CRC Press, Boca Raton, FL, pp. 193  194.")]


35  [StorableClass]


36  public class RandomConvexCrossover : RealVectorCrossover {


37  [StorableConstructor]


38  protected RandomConvexCrossover(bool deserializing) : base(deserializing) { }


39  protected RandomConvexCrossover(RandomConvexCrossover original, Cloner cloner) : base(original, cloner) { }


40  public RandomConvexCrossover() : base() { }


41 


42  public override IDeepCloneable Clone(Cloner cloner) {


43  return new RandomConvexCrossover(this, cloner);


44  }


45 


46  /// <summary>


47  /// Performs a random convex crossover on the two given parents.


48  /// </summary>


49  /// <exception cref="ArgumentException">Thrown when two parents are not of the same length.</exception>


50  /// <param name="random">The random number generator.</param>


51  /// <param name="parent1">The first parent vector for the crossover.</param>


52  /// <param name="parent2">The second parent vector for the crossover.</param>


53  /// <returns>The newly created real vector, resulting from the random convex crossover.</returns>


54  public static RealVector Apply(IRandom random, RealVector parent1, RealVector parent2) {


55  if (parent1.Length != parent2.Length)


56  throw new ArgumentException("ERROR in RandomConvexCrossover: the two parents are not of the same length");


57 


58  int length = parent1.Length;


59  double[] result = new double[length];


60  double factor = random.NextDouble();


61 


62  for (int i = 0; i < length; i++)


63  result[i] = (factor * parent1[i]) + ((1  factor) * parent2[i]);


64  return new RealVector(result);


65  }


66 


67  /// <summary>


68  /// Performs a random convex crossover operation for two given parent real vectors.


69  /// </summary>


70  /// <exception cref="ArgumentException">Thrown if there are not exactly two parents.</exception>


71  /// <param name="random">A random number generator.</param>


72  /// <param name="parents">An array containing the two real vectors that should be crossed.</param>


73  /// <returns>The newly created real vector, resulting from the crossover operation.</returns>


74  protected override RealVector Cross(IRandom random, ItemArray<RealVector> parents) {


75  if (parents.Length != 2) throw new ArgumentException("ERROR in RandomConvexCrossover: The number of parents is not equal to 2");


76  return Apply(random, parents[0], parents[1]);


77  }


78  }


79  }

