Free cookie consent management tool by TermsFeed Policy Generator

Changeset 75


Ignore:
Timestamp:
03/18/08 12:15:06 (16 years ago)
Author:
swagner
Message:

Fixed ticket #65

  • added operator BoundsChecker
Location:
trunk/sources/HeuristicLab.RealVector
Files:
1 edited
1 copied

Legend:

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

    r74 r75  
    44using HeuristicLab.Core;
    55using HeuristicLab.Data;
    6 using HeuristicLab.Evolutionary;
    76
    87namespace HeuristicLab.RealVector {
    9   class HeuristicCrossover : CrossoverBase {
    10     public HeuristicCrossover()
    11       : base() {
    12       AddVariableInfo(new VariableInfo("Maximization", "Maximization problem", typeof(BoolData), VariableKind.In));
    13       AddVariableInfo(new VariableInfo("Quality", "Quality value", typeof(DoubleData), VariableKind.In));
    14       AddVariableInfo(new VariableInfo("RealVector", "Parent and child real vector", typeof(DoubleArrayData), VariableKind.In | VariableKind.New));
     8  class BoundsChecker : OperatorBase {
     9    public override string Description {
     10      get { return "Checks if all elements of a real vector are inside a given minimum and maximum value. If not, elements are corrected."; }
    1511    }
    1612
    17     public override string Description {
    18       get { return "Heuristic crossover for real vectors."; }
     13    public BoundsChecker()
     14      : base() {
     15      AddVariableInfo(new VariableInfo("RealVector", "Real vector to check", typeof(DoubleArrayData), VariableKind.In | VariableKind.Out));
     16      AddVariableInfo(new VariableInfo("Minimum", "Minimum value of each vector element (included).", typeof(DoubleData), VariableKind.In));
     17      AddVariableInfo(new VariableInfo("Maximum", "Maximum value of each vector element (included).", typeof(DoubleData), VariableKind.In));
    1918    }
    2019
    21     public static double[] Apply(IRandom random, bool maximization, double[] parent1, double quality1, double[] parent2, double quality2) {
    22       int length = parent1.Length;
    23       double[] result = new double[length];
    24       double factor = random.NextDouble();
     20    public static double[] Apply(double min, double max, double[] vector) {
     21      int length = vector.Length;
     22      double[] result = (double[])vector.Clone();
    2523
    2624      for (int i = 0; i < length; i++) {
    27         if ((maximization && (quality1 > quality2)) || ((!maximization) && (quality1 < quality2)))
    28           result[i] = parent1[i] + factor * (parent1[i] - parent2[i]);
    29         else
    30           result[i] = parent2[i] + factor * (parent2[i] - parent1[i]);
     25        if (result[i] < min) result[i] = min;
     26        if (result[i] > max) result[i] = max;
    3127      }
    3228      return result;
    3329    }
    3430
    35     protected sealed override void Cross(IScope scope, IRandom random, IScope parent1, IScope parent2, IScope child) {
    36       bool maximization = GetVariableValue<BoolData>("Maximization", scope, true).Data;
    37       IVariableInfo realVectorInfo = GetVariableInfo("RealVector");
    38       IVariableInfo qualityInfo = GetVariableInfo("Quality");
    39       DoubleArrayData vector1 = parent1.GetVariableValue<DoubleArrayData>(realVectorInfo.ActualName, false);
    40       DoubleData quality1 = parent1.GetVariableValue<DoubleData>(qualityInfo.ActualName, false);
    41       DoubleArrayData vector2 = parent2.GetVariableValue<DoubleArrayData>(realVectorInfo.ActualName, false);
    42       DoubleData quality2 = parent2.GetVariableValue<DoubleData>(qualityInfo.ActualName, false);
    43 
    44       if (vector1.Data.Length != vector2.Data.Length) throw new InvalidOperationException("Cannot apply crossover to real vectors of different length.");
    45 
    46       double[] result = Apply(random, maximization, vector1.Data, quality1.Data, vector2.Data, quality2.Data);
    47       child.AddVariable(new Variable(realVectorInfo.ActualName, new DoubleArrayData(result)));
     31    public override IOperation Apply(IScope scope) {
     32      DoubleArrayData vector = GetVariableValue<DoubleArrayData>("RealVector", scope, false);
     33      double min = GetVariableValue<DoubleData>("Minimum", scope, true).Data;
     34      double max = GetVariableValue<DoubleData>("Maximum", scope, true).Data;
     35      vector.Data = Apply(min, max, vector.Data);
     36      return null;
    4837    }
    4938  }
  • trunk/sources/HeuristicLab.RealVector/HeuristicLab.RealVector.csproj

    r74 r75  
    4242    <Compile Include="ContinuousCrossover.cs" />
    4343    <Compile Include="CompleteContinuousCrossover.cs" />
     44    <Compile Include="BoundsChecker.cs" />
    4445    <Compile Include="DiscreteCrossover.cs" />
    4546    <Compile Include="HeuristicCrossover.cs" />
Note: See TracChangeset for help on using the changeset viewer.