Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Encodings.RealVector/3.3/Crossovers/SimulatedBinaryCrossover.cs @ 2996

Last change on this file since 2996 was 2994, checked in by epitzer, 15 years ago

Make StorableClass attribute compulsory for StorableSerializer to work, add named property StorableClassType to choose between Empty and MarkedOnly, later other options will be added. (#548)

File size: 6.4 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 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.Core;
24using HeuristicLab.Data;
25using HeuristicLab.Parameters;
26using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
27
28namespace HeuristicLab.Encodings.RealVector {
29  /// <summary>
30  /// Performs the simulated binary crossover (SBX) on a vector of real values such that each position is either crossed contracted or expanded with a certain probability.
31  /// The probability distribution is designed such that the children will lie closer to their parents as is the case with the single point binary crossover.
32  /// </summary>
33  /// <remarks>
34  /// It is implemented as described in Deb, K. and Agrawal, R. B. 1995. Simulated binary crossover for continuous search space. Complex Systems, 9, pp. 115-148.
35  /// </remarks>
36  [Item("SimulatedBinaryCrossover", "The simulated binary crossover (SBX) is implemented as described in Deb, K. and Agrawal, R. B. 1995. Simulated binary crossover for continuous search space. Complex Systems, 9, pp. 115-148.")]
37  [StorableClass(StorableClassType.Empty)]
38  public class SimulatedBinaryCrossover : RealVectorCrossover {
39    /// <summary>
40    /// The parameter must be greater or equal than 0. Common values are in the range [0;5] and more often just [2;5].
41    /// </summary>
42    public ValueLookupParameter<DoubleData> ContiguityParameter {
43      get { return (ValueLookupParameter<DoubleData>)Parameters["Contiguity"]; }
44    }
45
46    /// <summary>
47    /// Initializes a new instance of <see cref="SimulatedBinaryCrossover"/> with one
48    /// parameter (<c>Contiguity</c>).
49    /// </summary>
50    public SimulatedBinaryCrossover()
51      : base() {
52      Parameters.Add(new ValueLookupParameter<DoubleData>("Contiguity", "Specifies whether the crossover should produce very different (small value) or very similar (large value) children. Valid values must be greater or equal to 0.", new DoubleData(2)));
53    }
54
55    /// <summary>
56    /// Performs the simulated binary crossover on a real vector. Each position is crossed with a probability of 50% and if crossed either a contracting crossover or an expanding crossover is performed, again with equal probability.
57    /// For more details refer to the paper by Deb and Agrawal.
58    /// </summary>
59    /// <exception cref="ArgumentException">Thrown when the parents' vectors are of unequal length or when <paramref name="contiguity"/> is smaller than 0.</exception>
60    /// <remarks>
61    /// The manipulated value is not restricted by the (possibly) specified lower and upper bounds. Use the <see cref="BoundsChecker"/> to correct the values after performing the crossover.
62    /// </remarks>
63    /// <param name="random">The random number generator to use.</param>
64    /// <param name="parent1">The first parent vector.</param>
65    /// <param name="parent2">The second parent vector.</param>
66    /// <param name="contiguity">The contiguity value that specifies how close a child should be to its parents (larger value means closer). The value must be greater or equal than 0. Typical values are in the range [2;5].</param>
67    /// <returns>The vector resulting from the crossover.</returns>
68    public static DoubleArrayData Apply(IRandom random, DoubleArrayData parent1, DoubleArrayData parent2, DoubleData contiguity) {
69      if (parent1.Length != parent2.Length) throw new ArgumentException("SimulatedBinaryCrossover: Parents are of unequal length");
70      if (contiguity.Value < 0) throw new ArgumentException("SimulatedBinaryCrossover: Contiguity value is smaller than 0", "contiguity");
71      int length = parent1.Length;
72      DoubleArrayData result = new DoubleArrayData(length);
73      for (int i = 0; i < length; i++) {
74        if (length == 1 || random.NextDouble() < 0.5) { // cross this variable
75          double u = random.NextDouble();
76          double beta = 0;
77          if (u < 0.5) { // if u is smaller than 0.5 perform a contracting crossover
78            beta = Math.Pow(2 * u, 1.0 / (contiguity.Value + 1));
79          } else if (u > 0.5) { // otherwise perform an expanding crossover
80            beta = Math.Pow(1.0 / (2 - 2 * u), (contiguity.Value + 1));
81          } else if (u == 0.5)
82            beta = 1;
83
84          if (random.NextDouble() < 0.5)
85            result[i] = ((parent1[i] + parent2[i]) / 2.0) - beta * 0.5 * Math.Abs(parent1[i] - parent2[i]);
86          else
87            result[i] = ((parent1[i] + parent2[i]) / 2.0) + beta * 0.5 * Math.Abs(parent1[i] - parent2[i]);
88        } else result[i] = parent1[i];
89      }
90      return result;
91    }
92
93    /// <summary>
94    /// Checks number of parents, availability of the parameters and forwards the call to <see cref="Apply(IRandom, DoubleArrayData, DoubleArrayData, DoubleData)"/>.
95    /// </summary>
96    /// <exception cref="ArgumentException">Thrown when there are not exactly 2 parents or when the contiguity parameter could not be found.</exception>
97    /// <param name="random">The random number generator.</param>
98    /// <param name="parents">The collection of parents (must be of size 2).</param>
99    /// <returns>The real vector resulting from the crossover.</returns>
100    protected override DoubleArrayData Cross(IRandom random, ItemArray<DoubleArrayData> parents) {
101      if (parents.Length != 2) throw new ArgumentException("SimulatedBinaryCrossover: The number of parents is not equal to 2");
102      if (ContiguityParameter.ActualValue == null) throw new InvalidOperationException("SimulatedBinaryCrossover: Parameter " + ContiguityParameter.ActualName + " could not be found.");
103      return Apply(random, parents[0], parents[1], ContiguityParameter.ActualValue);
104    }
105  }
106}
Note: See TracBrowser for help on using the repository browser.