Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/26/11 18:39:49 (14 years ago)
Author:
abeham
Message:

#1395

  • Allowed to select the bounds checker to use in all RealVectorManipulator and RealVectorCrossover operators
  • Added a second bounds checker, the ReflectiveBoundsChecker which does not cut at the bounds, but mirrors the vector at the bounds
  • Use a repeating strategy in the move generators
  • Removed obsolete IRealVectorPSODecoder and IRealVectorPSOEncoder interfaces
  • Marked RealVectorToRealVectorEncoder as obsolete, internal and removed all meaningful code from it (it slipped into the release and should be thrown out as soon as possible)
  • Use a repeating strategy to stick within the bounds in the StdDevStrategyVectorManipulator when manipulating the mutation strengths
  • By default use smaller initial bounds in the StdDevStrategyVectorCreator (parameterized by the problem)
Location:
trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/BoundsChecker.cs

    r4722 r5381  
    3333  /// If not, the elements are corrected.
    3434  /// </summary>
    35   [Item("BoundsChecker", "Checks if all elements of a real vector are inside the bounds. If not, elements are corrected.")]
     35  [Item("BoundsChecker", "Checks if all elements of a real vector are inside the bounds. If not, elements are set to the respective values of the bounds.")]
    3636  [StorableClass]
    3737  public class BoundsChecker : SingleSuccessorOperator, IRealVectorBoundsChecker {
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj

    r5163 r5381  
    1212    <AssemblyName>HeuristicLab.Encodings.RealVectorEncoding-3.3</AssemblyName>
    1313    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    14     <TargetFrameworkProfile></TargetFrameworkProfile>
     14    <TargetFrameworkProfile>
     15    </TargetFrameworkProfile>
    1516    <FileAlignment>512</FileAlignment>
    1617    <SignAssembly>true</SignAssembly>
     
    157158    <Compile Include="Manipulators\PolynomialOnePositionManipulator.cs" />
    158159    <Compile Include="Manipulators\UniformOnePositionManipulator.cs" />
     160    <Compile Include="ReflectiveBoundsChecker.cs" />
    159161    <Compile Include="StrategyParameters\StdDevStrategyVectorCreator.cs" />
    160162    <Compile Include="StrategyParameters\StdDevStrategyVectorCrossover.cs" />
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Moves/AdditiveMoveGenerator.cs

    r4722 r5381  
    6565    public override IOperation Apply() {
    6666      RealVector vector = RealVectorParameter.ActualValue;
    67       AdditiveMove[] moves = GenerateMoves(RandomParameter.ActualValue, vector);
    6867      DoubleMatrix bounds = BoundsParameter.ActualValue;
    69       if (bounds != null) {
    70         for (int i = 0; i < moves.Length; i++) {
    71           AdditiveMove move = moves[i];
    72           if (vector[move.Dimension] + move.MoveDistance < bounds[move.Dimension % bounds.Rows, 0])
    73             vector[move.Dimension] = bounds[move.Dimension % bounds.Rows, 0];
    74           else if (vector[move.Dimension] + move.MoveDistance > bounds[move.Dimension % bounds.Rows, 1])
    75             vector[move.Dimension] = bounds[move.Dimension % bounds.Rows, 1];
    76         }
    77       }
     68      AdditiveMove[] moves = GenerateMoves(RandomParameter.ActualValue, vector, bounds);
    7869      Scope[] moveScopes = new Scope[moves.Length];
    7970      for (int i = 0; i < moveScopes.Length; i++) {
     
    8576    }
    8677
    87     protected abstract AdditiveMove[] GenerateMoves(IRandom random, RealVector realVector);
     78    protected abstract AdditiveMove[] GenerateMoves(IRandom random, RealVector realVector, DoubleMatrix bounds);
    8879  }
    8980}
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Moves/StochasticNormalMultiMoveGenerator.cs

    r4722 r5381  
    5252    }
    5353
    54     public static AdditiveMove[] Apply(IRandom random, RealVector realVector, double sigma, int sampleSize) {
     54    public static AdditiveMove[] Apply(IRandom random, RealVector vector, double sigma, int sampleSize, DoubleMatrix bounds) {
    5555      AdditiveMove[] moves = new AdditiveMove[sampleSize];
    5656      NormalDistributedRandom N = new NormalDistributedRandom(random, 0, sigma);
    5757      for (int i = 0; i < sampleSize; i++) {
    58         int index = random.Next(realVector.Length);
    59         moves[i] = new AdditiveMove(index, N.NextDouble());
     58        int index = random.Next(vector.Length);
     59        double strength = 0, min = bounds[index % bounds.Rows, 0], max = bounds[index % bounds.Rows, 1];
     60        do {
     61          strength = N.NextDouble();
     62        } while (vector[index] + strength < min || vector[index] + strength > max);
     63        moves[i] = new AdditiveMove(index, strength);
    6064      }
    6165      return moves;
    6266    }
    6367
    64     protected override AdditiveMove[] GenerateMoves(IRandom random, RealVector realVector) {
    65       return Apply(random, realVector, SigmaParameter.ActualValue.Value, SampleSizeParameter.ActualValue.Value);
     68    protected override AdditiveMove[] GenerateMoves(IRandom random, RealVector realVector, DoubleMatrix bounds) {
     69      return Apply(random, realVector, SigmaParameter.ActualValue.Value, SampleSizeParameter.ActualValue.Value, bounds);
    6670    }
    6771  }
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Moves/StochasticPolynomialMultiMoveGenerator.cs

    r4722 r5381  
    6262    }
    6363
    64     public static AdditiveMove[] Apply(IRandom random, RealVector realVector, double contiguity, int sampleSize, double maxManipulation) {
     64    public static AdditiveMove[] Apply(IRandom random, RealVector vector, double contiguity, int sampleSize, double maxManipulation, DoubleMatrix bounds) {
    6565      AdditiveMove[] moves = new AdditiveMove[sampleSize];
    6666      for (int i = 0; i < sampleSize; i++) {
    67         int index = random.Next(realVector.Length);
    68         moves[i] = new AdditiveMove(index, PolynomialOnePositionManipulator.Apply(random, contiguity) * maxManipulation);
     67        int index = random.Next(vector.Length);
     68        double strength = 0, min = bounds[index % bounds.Rows, 0], max = bounds[index % bounds.Rows, 1];
     69        do {
     70          strength = PolynomialOnePositionManipulator.Apply(random, contiguity) * maxManipulation;
     71        } while (vector[index] + strength < min || vector[index] + strength > max);
     72        moves[i] = new AdditiveMove(index, strength);
    6973      }
    7074      return moves;
    7175    }
    7276
    73     protected override AdditiveMove[] GenerateMoves(IRandom random, RealVector realVector) {
    74       return Apply(random, realVector, ContiguityParameter.ActualValue.Value, SampleSizeParameter.ActualValue.Value, MaximumManipulationParameter.ActualValue.Value);
     77    protected override AdditiveMove[] GenerateMoves(IRandom random, RealVector realVector, DoubleMatrix bounds) {
     78      return Apply(random, realVector, ContiguityParameter.ActualValue.Value, SampleSizeParameter.ActualValue.Value, MaximumManipulationParameter.ActualValue.Value, bounds);
    7579    }
    7680  }
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorCrossover.cs

    r4722 r5381  
    5151      get { return (IValueLookupParameter<DoubleMatrix>)Parameters["Bounds"]; }
    5252    }
     53    public OptionalValueParameter<IRealVectorBoundsChecker> BoundsCheckerParameter {
     54      get { return (OptionalValueParameter<IRealVectorBoundsChecker>)Parameters["BoundsChecker"]; }
     55    }
    5356
    5457    [StorableConstructor]
     
    6366      ChildParameter.ActualName = "RealVector";
    6467      Parameters.Add(new ValueLookupParameter<DoubleMatrix>("Bounds", "The lower and upper bounds of the real vector."));
     68      Parameters.Add(new OptionalValueParameter<IRealVectorBoundsChecker>("BoundsChecker", "The bounds checker that ensures that the values stay within the bounds.", new BoundsChecker()));
    6569    }
     70
     71    // BackwardsCompatibility3.3
     72    #region Backwards compatible code (remove with 3.4)
     73    [StorableHook(HookType.AfterDeserialization)]
     74    private void AfterDeserialization() {
     75      if (!Parameters.ContainsKey("BoundsChecker"))
     76        Parameters.Add(new OptionalValueParameter<IRealVectorBoundsChecker>("BoundsChecker", "The bounds checker that ensures that the values stay within the bounds.", new BoundsChecker()));
     77    }
     78    #endregion
    6679
    6780    public sealed override IOperation Apply() {
    6881      RealVector result = Cross(RandomParameter.ActualValue, ParentsParameter.ActualValue);
    69       DoubleMatrix bounds = BoundsParameter.ActualValue;
    70       if (bounds != null) BoundsChecker.Apply(result, bounds);
    71       ChildParameter.ActualValue = result;
    72       return base.Apply();
     82
     83      IRealVectorBoundsChecker checker = BoundsCheckerParameter.Value;
     84      IOperation successor = base.Apply();
     85      if (checker != null) {
     86        IOperation checkerOperation = ExecutionContext.CreateChildOperation(checker);
     87        if (successor == null) return checkerOperation;
     88        else return new OperationCollection(checkerOperation, successor);
     89      } else return successor;
    7390    }
    7491
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorManipulator.cs

    r4722 r5381  
    4848      get { return (IValueLookupParameter<DoubleMatrix>)Parameters["Bounds"]; }
    4949    }
     50    public OptionalValueParameter<IRealVectorBoundsChecker> BoundsCheckerParameter {
     51      get { return (OptionalValueParameter<IRealVectorBoundsChecker>)Parameters["BoundsChecker"]; }
     52    }
    5053
    5154    [StorableConstructor]
     
    5760      Parameters.Add(new LookupParameter<RealVector>("RealVector", "The vector which should be manipulated."));
    5861      Parameters.Add(new ValueLookupParameter<DoubleMatrix>("Bounds", "The lower and upper bounds of the real vector."));
     62      Parameters.Add(new OptionalValueParameter<IRealVectorBoundsChecker>("BoundsChecker", "The bounds checker that ensures that the values stay within the bounds.", new BoundsChecker()));
    5963    }
     64
     65    // BackwardsCompatibility3.3
     66    #region Backwards compatible code (remove with 3.4)
     67    [StorableHook(HookType.AfterDeserialization)]
     68    private void AfterDeserialization() {
     69      if (!Parameters.ContainsKey("BoundsChecker"))
     70        Parameters.Add(new OptionalValueParameter<IRealVectorBoundsChecker>("BoundsChecker", "The bounds checker that ensures that the values stay within the bounds.", new BoundsChecker()));
     71    }
     72    #endregion
    6073
    6174    public sealed override IOperation Apply() {
    6275      RealVector vector = RealVectorParameter.ActualValue;
    6376      Manipulate(RandomParameter.ActualValue, vector);
    64       DoubleMatrix bounds = BoundsParameter.ActualValue;
    65       if (bounds != null) BoundsChecker.Apply(vector, bounds);
    66       return base.Apply();
     77
     78      IRealVectorBoundsChecker checker = BoundsCheckerParameter.Value;
     79      IOperation successor = base.Apply();
     80      if (checker != null) {
     81        IOperation checkerOperation = ExecutionContext.CreateChildOperation(checker);
     82        if (successor == null) return checkerOperation;
     83        else return new OperationCollection(checkerOperation, successor);
     84      } else return successor;
    6785    }
    6886
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/StrategyParameters/StdDevStrategyVectorManipulator.cs

    r4722 r5381  
    8989      double generalMultiplier = Math.Exp(generalLearningRate * N.NextDouble());
    9090      for (int i = 0; i < vector.Length; i++) {
    91         vector[i] *= generalMultiplier * Math.Exp(learningRate * N.NextDouble());
     91        double change = vector[i] * generalMultiplier * Math.Exp(learningRate * N.NextDouble());
    9292        if (bounds != null) {
    9393          double min = bounds[i % bounds.Rows, 0], max = bounds[i % bounds.Rows, 1];
    94           if (vector[i] < min) vector[i] = min;
    95           if (vector[i] > max) vector[i] = max;
     94          if (min == max) vector[i] = min;
     95          else {
     96            while (change < min || change > max)
     97              change = vector[i] * generalMultiplier * Math.Exp(learningRate * N.NextDouble());
     98            vector[i] = change;
     99          }
    96100        }
    97101      }
Note: See TracChangeset for help on using the changeset viewer.