Ignore:
Timestamp:
11/29/16 15:46:48 (4 years ago)
Author:
abeham
Message:

#2701, #2708: Made a new branch from ProblemRefactoring and removed ScopedBasicAlgorithm branch (which becomes MemPR branch)

Location:
branches/ScopedAlgorithms
Files:
1 edited
1 copied

Legend:

Unmodified
Added
Removed
  • branches/ScopedAlgorithms/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/Crossovers/NPointCrossover.cs

    r12012 r14429  
    2525using HeuristicLab.Core;
    2626using HeuristicLab.Data;
     27using HeuristicLab.Optimization;
    2728using HeuristicLab.Parameters;
    2829using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     
    7071    /// <param name="n">Number of crossover points.</param>
    7172    /// <returns>The newly created binary vector, resulting from the N point crossover.</returns>
    72     public static BinaryVector Apply(IRandom random, BinaryVector parent1, BinaryVector parent2, IntValue n) {
     73    public static BinaryVector Apply(IRandom random, BinaryVector parent1, BinaryVector parent2, int n) {
    7374      if (parent1.Length != parent2.Length)
    7475        throw new ArgumentException("NPointCrossover: The parents are of different length.");
    7576
    76       if (n.Value > parent1.Length)
     77      if (n > parent1.Length)
    7778        throw new ArgumentException("NPointCrossover: There cannot be more breakpoints than the size of the parents.");
    7879
    79       if (n.Value < 1)
     80      if (n < 1)
    8081        throw new ArgumentException("NPointCrossover: N cannot be < 1.");
    8182
    8283      int length = parent1.Length;
    8384      bool[] result = new bool[length];
    84       int[] breakpoints = new int[n.Value];
     85      int[] breakpoints = new int[n];
    8586
    8687      //choose break points
     
    9091        breakpointPool.Add(i);
    9192
    92       for (int i = 0; i < n.Value; i++) {
     93      for (int i = 0; i < n; i++) {
    9394        int index = random.Next(breakpointPool.Count);
    9495        breakpoints[i] = breakpointPool[index];
     
    137138      if (NParameter.ActualValue == null) throw new InvalidOperationException("NPointCrossover: Parameter " + NParameter.ActualName + " could not be found.");
    138139
    139       return Apply(random, parents[0], parents[1], NParameter.ActualValue);
     140      return Apply(random, parents[0], parents[1], NParameter.ActualValue.Value);
     141    }
     142  }
     143
     144  [Item("N-point Crossover", "", ExcludeGenericTypeInfo = true)]
     145  [StorableClass]
     146  public sealed class NPointCrossover<TContext> : ParameterizedNamedItem, IBinaryCrossover<TContext>
     147    where TContext : IMatingContext<BinaryVector>, IStochasticContext {
     148
     149    [Storable]
     150    private IValueParameter<IntValue> nparameter;
     151    public int N {
     152      get { return nparameter.Value.Value; }
     153      set {
     154        if (value < 1) throw new ArgumentException("Cannot set N to less than 1.");
     155        nparameter.Value.Value = value;
     156      }
     157    }
     158
     159    [StorableConstructor]
     160    private NPointCrossover(bool deserializing) : base(deserializing) { }
     161    private NPointCrossover(NPointCrossover<TContext> original, Cloner cloner)
     162      : base(original, cloner) {
     163      nparameter = cloner.Clone(original.nparameter);
     164    }
     165    public NPointCrossover() {
     166      Parameters.Add(nparameter = new ValueParameter<IntValue>("N", "The number of crossover points.", new IntValue(1)));
     167    }
     168
     169
     170    public override IDeepCloneable Clone(Cloner cloner) {
     171      return new NPointCrossover<TContext>(this, cloner);
     172    }
     173
     174    public void Cross(TContext context) {
     175      context.Child.Solution = NPointCrossover.Apply(context.Random, context.Parents.Item1.Solution, context.Parents.Item2.Solution, N);
    140176    }
    141177  }
Note: See TracChangeset for help on using the changeset viewer.