using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data.MoveVectorData; using HeuristicLab.Encodings.MoveVectorEncoding.Interfaces; using HeuristicLab.Optimization; using HeuristicLab.Parameters; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; namespace HeuristicLab.Encodings.MoveVectorEncoding { [Item("MoveVectorCrossover", "A base class for operators that perform a crossover of int-valued vectors.")] [StorableClass] public abstract class MoveVectorCrossover : MoveVectorOperator, IMoveVectorCrossover, IStochasticOperator { public override bool CanChangeName { get { return false; } } public ILookupParameter RandomParameter { get { return (LookupParameter)Parameters["Random"]; } } public ILookupParameter> ParentsParameter { get { return (ScopeTreeLookupParameter)Parameters["Parents"]; } } public ILookupParameter ChildParameter { get { return (ILookupParameter)Parameters["Child"]; } } [StorableConstructor] protected MoveVectorCrossover(bool deserializing) : base(deserializing) { } protected MoveVectorCrossover(MoveVectorCrossover original, Cloner cloner) : base(original, cloner) { } protected MoveVectorCrossover() : base() { Parameters.Add(new LookupParameter("Random", "The pseudo random number generator which should be used for stochastic crossover operators.")); Parameters.Add(new ScopeTreeLookupParameter("Parents", "The parent vectors which should be crossed.")); ParentsParameter.ActualName = "IntegerVector"; Parameters.Add(new LookupParameter("Child", "The child vector resulting from the crossover.")); ChildParameter.ActualName = "IntegerVector"; } public sealed override IOperation InstrumentedApply() { ChildParameter.ActualValue = Cross(RandomParameter.ActualValue, ParentsParameter.ActualValue); return base.InstrumentedApply(); } protected abstract MoveVector Cross(IRandom random, ItemArray parents); } }