Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/28/08 14:28:10 (17 years ago)
Author:
abeham
Message:

Renamed Recombination operators to MultCrossover operators and added the necessary base classes (ticket #89)
Created a static Apply method that encapsulates the functionality of the operators (ticket #88)

File:
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.RealVector/SelfAdaptiveDiscreteMultiCrossover.cs

    r110 r111  
    2727
    2828namespace HeuristicLab.RealVector {
    29   public class SelfAdaptiveDiscreteRecombination : DiscreteRecombination {
     29  public class SelfAdaptiveDiscreteMultiCrossover : RealVectorSelfAdaptiveMultiCrossoverBase {
    3030    public override string Description {
    3131      get {
    32         return @"Self adaptive Discrete/dominant recombination creates a new offspring by combining the alleles in the parents such that each allele is randomly selected from one parent. It will also use the same strategy to combine the endogenous strategy parameter vector.";
     32        return @"This creates a new offspring by combining the alleles in the parents such that each allele is randomly selected from one parent. It will also use the same strategy to combine the endogenous strategy parameter vector.";
    3333      }
    3434    }
    3535
    36     public SelfAdaptiveDiscreteRecombination()
    37       : base() {
    38       AddVariableInfo(new VariableInfo("StrategyVector", "Vector containing the endogenous strategy parameters", typeof(DoubleArrayData), VariableKind.In));
     36    public static void Apply(IRandom random, IList<double[]> parents, IList<double[]> strategyParametersList, out double[] childIndividual, out double[] strategyParameters) {
     37      childIndividual = new double[parents[0].Length];
     38      strategyParameters = new double[strategyParametersList[0].Length];
     39      try {
     40        for (int i = 0; i < childIndividual.Length; i++) {
     41          int nextParent = random.Next(parents.Count);
     42          childIndividual[i] = parents[nextParent][i];
     43          strategyParameters[i] = strategyParametersList[nextParent][i];
     44        }
     45      } catch (IndexOutOfRangeException) {
     46        throw new InvalidOperationException("Cannot apply self adaptive multicrossover to real vectors of different length.");
     47      }
    3948    }
    4049
    41     public override IOperation Apply(IScope scope) {
    42       int rho = GetVariableValue<IntData>("Rho", scope, true).Data;
    43       // with just 1 parent no recombination is necessary/possible
    44       if (rho == 1) return null;
    45       IRandom random = GetVariableValue<IRandom>("Random", scope, true);
    46 
    47       if (scope.SubScopes.Count % rho != 0)
    48         throw new InvalidOperationException("Number of parents is not a multiple of rho");
    49       int lambda = scope.SubScopes.Count / rho;
    50       IList<double[]> parents = new List<double[]>(rho);
    51       IList<double[]> parentsStrategy = new List<double[]>(rho);
    52 
    53       for (int i = 0; i < lambda; i++) {
    54         IScope childScope = new Scope(i.ToString());
    55         double[] childGene = (double[])scope.SubScopes[0].GetVariableValue<DoubleArrayData>("RealVector", false).Data.Clone();
    56         double[] strategyParams = (double[])scope.SubScopes[0].GetVariableValue<DoubleArrayData>("StrategyVector", false).Data.Clone();
    57         parents.Clear();
    58         for (int j = 0; j < rho; j++) {
    59           IScope parent = scope.SubScopes[0];
    60           parents.Add(parent.GetVariableValue<DoubleArrayData>("RealVector", false).Data);
    61           parentsStrategy.Add(parent.GetVariableValue<DoubleArrayData>("StrategyVector", false).Data);
    62           scope.RemoveSubScope(parent);
    63         }
    64         // actual discrete recombination
    65         if (childGene.Length != strategyParams.Length)
    66           throw new InvalidOperationException("ERROR: strategy vector must be as long as there are dimensions");
    67 
    68         for (int x = 0; x < childGene.Length; x++) {
    69           int nextParent = random.Next(rho);
    70           childGene[x] = parents[nextParent][x];
    71           strategyParams[x] = parentsStrategy[nextParent][x];
    72         }
    73         childScope.AddVariable(new Variable(scope.SubScopes[0].TranslateName("RealVector"), new DoubleArrayData(childGene)));
    74         childScope.AddVariable(new Variable(scope.SubScopes[0].TranslateName("StrategyVector"), new DoubleArrayData(strategyParams)));
    75         scope.AddSubScope(childScope);
    76       }
    77       return null;
     50    protected override void Cross(IScope scope, IRandom random, IList<double[]> parents, IList<double[]> strategyParametersList, out double[] childIndividual, out double[] strategyParameters) {
     51      Apply(random, parents, strategyParametersList, out childIndividual, out strategyParameters);
    7852    }
    7953  }
Note: See TracChangeset for help on using the changeset viewer.