using HeuristicLab.BioBoost.ProblemDescription; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Encodings.IntegerVectorEncoding; using HeuristicLab.Encodings.RealVectorEncoding; using HeuristicLab.Parameters; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; using System; using System.Linq; namespace HeuristicLab.BioBoost.Operators.Mutation { [StorableClass] public class BoundaryToggleRealVectorMutator : RealVectorManipulator { #region Construction & Cloning [StorableConstructor] protected BoundaryToggleRealVectorMutator(bool isDeserializing) : base(isDeserializing) { } protected BoundaryToggleRealVectorMutator(BoundaryToggleRealVectorMutator orig, Cloner cloner) : base(orig, cloner) { } public BoundaryToggleRealVectorMutator() { } public override IDeepCloneable Clone(Cloner cloner) { return new BoundaryToggleRealVectorMutator(this, cloner); } #endregion protected override void Manipulate(IRandom random, RealVector realVector) { var bounds = BoundsParameter.ActualValue; var idx = random.Next(realVector.Length); var value = realVector[idx]; var lowerBound = bounds[idx % bounds.Rows, 0]; var upperBound = bounds[idx % bounds.Rows, 1]; if (value <= lowerBound || value >= upperBound) { value = random.Next()*Math.Abs(upperBound - lowerBound) + Math.Min(lowerBound, upperBound); } else { value = random.NextDouble() <= 0.5 ? lowerBound : upperBound; } realVector[idx] = value; } } }