source: branches/2839_HiveProjectManagement/HeuristicLab.Encodings.RealVectorEncoding/3.3/Crossovers/RandomConvexCrossover.cs @ 16057

Last change on this file since 16057 was 16057, checked in by jkarder, 15 months ago

#2839:

File size: 4.0 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2018 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
22using System;
23using HeuristicLab.Common;
24using HeuristicLab.Core;
25using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
26
27namespace 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}
Note: See TracBrowser for help on using the repository browser.