Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/21/14 18:49:05 (10 years ago)
Author:
abeham
Message:

#2174: Major refactoring

  • Removed ProblemDefinitionHosts
  • Renamed ParameterVector to Individual
  • Renamed Configuration to Encoding
  • Changed handling of existing operators that they will not be removed and recreated, but only rewired
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs

    r11400 r11484  
    5454    }
    5555
    56     public IValueParameter<IMultiObjectiveProblemDefinitionHost> ProblemDefinitionParameter {
    57       get { return (IValueParameter<IMultiObjectiveProblemDefinitionHost>)Parameters["ProblemDefinition"]; }
    58     }
    59 
    60     protected IValueParameter<Configuration> ConfigurationParameter {
    61       get { return (IValueParameter<Configuration>)Parameters["Configuration"]; }
    62     }
    63 
    64     public IMultiObjectiveProblemDefinitionHost ProblemDefinition {
     56    public IValueParameter<IMultiObjectiveProblemDefinition> ProblemDefinitionParameter {
     57      get { return (IValueParameter<IMultiObjectiveProblemDefinition>)Parameters["ProblemDefinition"]; }
     58    }
     59
     60    protected IValueParameter<Encoding> EncodingParameter {
     61      get { return (IValueParameter<Encoding>)Parameters["Encoding"]; }
     62    }
     63
     64    public IMultiObjectiveProblemDefinition ProblemDefinition {
    6565      get { return ProblemDefinitionParameter.Value; }
    6666      set { ProblemDefinitionParameter.Value = value; }
     
    6868
    6969    [Storable]
    70     protected List<IParameter> DynamicConfigurationParameters;
     70    protected List<IParameter> DynamicEncodingParameters;
    7171
    7272    [StorableConstructor]
     
    7474    protected MultiObjectiveProgrammableProblem(MultiObjectiveProgrammableProblem original, Cloner cloner)
    7575      : base(original, cloner) {
    76       DynamicConfigurationParameters = original.DynamicConfigurationParameters.Select(cloner.Clone).ToList();
     76      DynamicEncodingParameters = original.DynamicEncodingParameters.Select(cloner.Clone).ToList();
    7777      RegisterEventHandlers();
    7878    }
    7979    public MultiObjectiveProgrammableProblem()
    80       : base(new MultiObjectiveEvaluator(), new ParameterVectorCreater()) {
    81       Parameters.Add(new ValueParameter<IMultiObjectiveProblemDefinitionHost>("ProblemDefinition", "Defines the problem.", new MultiObjectiveProblemDefinitionScript() { Name = Name }));
    82       Parameters.Add(new ValueParameter<Configuration>("Configuration", "Describes which parameters exist, what they're called, what type they are and their bounds if any."));
    83 
    84       DynamicConfigurationParameters = new List<IParameter>();
     80      : base(new MultiObjectiveEvaluator(), new MultiEncodingCreator()) {
     81      Parameters.Add(new ValueParameter<IMultiObjectiveProblemDefinition>("ProblemDefinition", "Defines the problem.", new MultiObjectiveProblemScript() { Name = Name }));
     82      Parameters.Add(new ValueParameter<Encoding>("Encoding", "Describes which parameters exist, what they're called, what type they are and their bounds if any."));
     83
     84      DynamicEncodingParameters = new List<IParameter>();
    8585
    8686      Operators.Add(new MultiObjectiveAnalyzer());
     
    113113
    114114    private void RegisterHostInstanceChanges() {
    115       ProblemDefinitionParameter.Value.InstanceChanged += ProblemDefinitionHostOnInstanceChanged;
     115      ProblemDefinitionParameter.Value.ProblemDefinitionChanged += ProblemDefinitionChanged;
    116116      ProblemDefinitionParameter.Value.NameChanged += ProblemDefinitionHostOnNameChanged;
    117117    }
     
    132132    }
    133133
    134     protected virtual void ProblemDefinitionHostOnInstanceChanged(object sender, EventArgs eventArgs) {
     134    protected virtual void ProblemDefinitionChanged(object sender, EventArgs eventArgs) {
    135135      Parameterize();
    136136    }
    137137
    138138    protected virtual void Parameterize() {
    139       var instance = ProblemDefinitionParameter.Value.Instance;
    140       if (instance == null) return;
    141 
    142       Configuration configuration;
     139      var definition = ProblemDefinitionParameter.Value;
     140      if (definition == null) return;
     141
     142      Encoding encoding;
    143143      try {
    144         configuration = instance.GetConfiguration();
     144        encoding = definition.Encoding;
    145145      } catch { return; }
    146       ConfigurationParameter.Value = configuration;
    147       Maximization = new BoolArray(instance.Maximization);
    148 
    149       Evaluator.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
     146      EncodingParameter.Value = encoding;
     147      Maximization = new BoolArray(definition.Maximization);
     148
     149      Evaluator.EncodingParameter.ActualName = EncodingParameter.Name;
    150150      Evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
    151151      foreach (var evalOp in Operators.OfType<IMultiObjectiveProgrammableProblemEvaluator>()) {
    152         evalOp.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
     152        evalOp.EncodingParameter.ActualName = EncodingParameter.Name;
    153153        evalOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
    154154      }
    155155      foreach (var analyzeOp in Operators.OfType<IMultiObjectiveProgrammableProblemAnalyzer>()) {
    156         analyzeOp.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
     156        analyzeOp.EncodingParameter.ActualName = EncodingParameter.Name;
    157157        analyzeOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
    158158        analyzeOp.QualitiesParameter.ActualName = Evaluator.QualitiesParameter.ActualName;
    159159      }
    160160
    161       var solutionCreators = UpdateDynamicConfigurationParameters(configuration);
    162 
    163       if (solutionCreators.Count == 1) {
    164         Operators.RemoveAll(x => x is ParameterVectorCrossover
    165                               || x is ParameterVectorManipulator);
    166         UpdateSingleVectorEncodingOperators(solutionCreators, configuration);
    167       } else {
    168         UpdateMultiVectorEncodingOperators(solutionCreators, configuration);
    169       }
    170       UpdateMoveOperators();
    171     }
    172 
    173     protected virtual List<ISolutionCreator> UpdateDynamicConfigurationParameters(Configuration configuration) {
    174       foreach (var param in DynamicConfigurationParameters)
     161      foreach (var param in DynamicEncodingParameters)
    175162        if (Parameters.Contains(param)) Parameters.Remove(param);
    176       DynamicConfigurationParameters.Clear();
    177 
    178       var solutionCreators = new List<ISolutionCreator>();
    179       foreach (var param in configuration.Parameters) {
    180         #region Configure BinaryVector Creator
    181         var binConfig = param.Value as BinaryParameterConfiguration;
    182         if (binConfig != null) {
    183           var p = new ValueParameter<IntValue>(param.Key + "Length", binConfig.Length);
    184           DynamicConfigurationParameters.Add(p);
    185 
    186           var creator = new RandomBinaryVectorCreator();
    187           creator.BinaryVectorParameter.ActualName = param.Key;
    188           creator.LengthParameter.ActualName = p.Name;
    189           solutionCreators.Add(creator);
    190         }
    191         #endregion
    192         #region Configure IntegerVector Creator
    193         var intConfig = param.Value as IntegerParameterConfiguration;
    194         if (intConfig != null) {
    195           var l = new ValueParameter<IntValue>(param.Key + "Length", intConfig.Length);
    196           var b = new ValueParameter<IntMatrix>(param.Key + "Bounds", intConfig.Bounds);
    197           DynamicConfigurationParameters.Add(l);
    198           DynamicConfigurationParameters.Add(b);
    199 
    200           var creator = new UniformRandomIntegerVectorCreator();
    201           creator.IntegerVectorParameter.ActualName = param.Key;
    202           creator.LengthParameter.ActualName = l.Name;
    203           creator.BoundsParameter.ActualName = b.Name;
    204           solutionCreators.Add(creator);
    205         }
    206         #endregion
    207         #region Configure RealVector Creator
    208         var realConfig = param.Value as RealParameterConfiguration;
    209         if (realConfig != null) {
    210           var l = new ValueParameter<IntValue>(param.Key + "Length", realConfig.Length);
    211           var b = new ValueParameter<DoubleMatrix>(param.Key + "Bounds", realConfig.Bounds);
    212           DynamicConfigurationParameters.Add(l);
    213           DynamicConfigurationParameters.Add(b);
    214 
    215           var creator = new UniformRandomRealVectorCreator();
    216           creator.RealVectorParameter.ActualName = param.Key;
    217           creator.LengthParameter.ActualName = l.Name;
    218           creator.BoundsParameter.ActualName = b.Name;
    219           solutionCreators.Add(creator);
    220         }
    221         #endregion
    222         #region Configure Permutation Creator
    223         var permConfig = param.Value as PermutationParameterConfiguration;
    224         if (permConfig != null) {
    225           var l = new ValueParameter<IntValue>(param.Key + "Length", permConfig.Length);
    226           DynamicConfigurationParameters.Add(l);
    227 
    228           var creator = new RandomPermutationCreator();
    229           creator.PermutationParameter.ActualName = param.Key;
    230           creator.LengthParameter.ActualName = l.Name;
    231           creator.PermutationTypeParameter.Value = permConfig.Type;
    232           solutionCreators.Add(creator);
    233         }
    234         #endregion
    235       }
    236 
    237       foreach (var param in DynamicConfigurationParameters) {
     163      DynamicEncodingParameters.Clear();
     164
     165      var creator = ConfigureCreator(encoding);
     166
     167      foreach (var param in DynamicEncodingParameters) {
    238168        param.Hidden = true;
    239169        Parameters.Add(param);
    240170      }
    241       return solutionCreators;
    242     }
    243 
    244     protected virtual void UpdateSingleVectorEncodingOperators(List<ISolutionCreator> solutionCreators, Configuration configuration) {
    245       var newCreator = solutionCreators.Single();
     171
     172      var multiEncoding = encoding as MultiEncoding;
     173      if (multiEncoding != null) {
     174        ConfigureMultiVectorEncodingOperators((MultiEncodingCreator)creator, multiEncoding);
     175      } else {
     176        ConfigureSingleEncodingOperators(creator, encoding);
     177      }
     178    }
     179
     180    protected virtual ISolutionCreator ConfigureCreator(Encoding encoding) {
     181      #region Configure MultiEncoding Creator
     182      var multiEncoding = encoding as MultiEncoding;
     183      if (multiEncoding != null) {
     184        var creator = new MultiEncodingCreator();
     185        foreach (var enc in multiEncoding.Encodings) {
     186          if (enc is MultiEncoding) throw new InvalidOperationException("MultiEncoding within a MultiEncoding is not supported.");
     187          creator.Operators.Add(ConfigureCreator(enc));
     188        }
     189        return creator;
     190      }
     191      #endregion
     192      #region Configure BinaryVector Creator
     193      var binEnc = encoding as BinaryEncoding;
     194      if (binEnc != null) {
     195        var p = new ValueParameter<IntValue>(binEnc.Name + "Length", binEnc.Length);
     196        DynamicEncodingParameters.Add(p);
     197
     198        var creator = new RandomBinaryVectorCreator();
     199        creator.BinaryVectorParameter.ActualName = binEnc.Name;
     200        creator.LengthParameter.ActualName = p.Name;
     201        return creator;
     202      }
     203      #endregion
     204      #region Configure IntegerVector Creator
     205      var intEnc = encoding as IntegerEncoding;
     206      if (intEnc != null) {
     207        var l = new ValueParameter<IntValue>(intEnc.Name + "Length", intEnc.Length);
     208        var b = new ValueParameter<IntMatrix>(intEnc.Name + "Bounds", intEnc.Bounds);
     209        DynamicEncodingParameters.Add(l);
     210        DynamicEncodingParameters.Add(b);
     211
     212        var creator = new UniformRandomIntegerVectorCreator();
     213        creator.IntegerVectorParameter.ActualName = intEnc.Name;
     214        creator.LengthParameter.ActualName = l.Name;
     215        creator.BoundsParameter.ActualName = b.Name;
     216        return creator;
     217      }
     218      #endregion
     219      #region Configure RealVector Creator
     220      var realEnc = encoding as RealEncoding;
     221      if (realEnc != null) {
     222        var l = new ValueParameter<IntValue>(realEnc.Name + "Length", realEnc.Length);
     223        var b = new ValueParameter<DoubleMatrix>(realEnc.Name + "Bounds", realEnc.Bounds);
     224        DynamicEncodingParameters.Add(l);
     225        DynamicEncodingParameters.Add(b);
     226
     227        var creator = new UniformRandomRealVectorCreator();
     228        creator.RealVectorParameter.ActualName = realEnc.Name;
     229        creator.LengthParameter.ActualName = l.Name;
     230        creator.BoundsParameter.ActualName = b.Name;
     231        return creator;
     232      }
     233      #endregion
     234      #region Configure Permutation Creator
     235      var permEnc = encoding as PermutationEncoding;
     236      if (permEnc != null) {
     237        var l = new ValueParameter<IntValue>(permEnc.Name + "Length", permEnc.Length);
     238        DynamicEncodingParameters.Add(l);
     239
     240        var creator = new RandomPermutationCreator();
     241        creator.PermutationParameter.ActualName = permEnc.Name;
     242        creator.LengthParameter.ActualName = l.Name;
     243        creator.PermutationTypeParameter.Value = permEnc.Type;
     244        return creator;
     245      }
     246      #endregion
     247      throw new ArgumentException(string.Format("Encoding {0} is unknown.", encoding != null ? encoding.GetType().FullName : "(null)"));
     248    }
     249
     250    protected virtual void ConfigureSingleEncodingOperators(ISolutionCreator newCreator, Encoding encoding) {
     251      // remove all multiencoding operators
     252      Operators.RemoveAll(x => x is MultiEncodingCrossover
     253                            || x is MultiEncodingManipulator
     254                            || x is MultiEncodingCreator);
     255
    246256      #region Configure Operators for BinaryVectorEncoding
    247257      var binCreator = newCreator as IBinaryVectorCreator;
     
    256266
    257267        #region Wire BinaryVector Crossovers
    258         Operators.RemoveAll(x => x is IBinaryVectorCrossover && ((IBinaryVectorCrossover)x).ChildParameter.ActualName != paramName);
    259         var crossovers = ApplicationManager.Manager.GetInstances<IBinaryVectorCrossover>().ToList();
     268        var crossovers = Operators.OfType<IBinaryVectorCrossover>()
     269          .Union(ApplicationManager.Manager.GetInstances<IBinaryVectorCrossover>(), new TypeEqualityComparer<IBinaryVectorCrossover>())
     270          .ToList();
    260271        foreach (var xo in crossovers) {
    261272          xo.ChildParameter.ActualName = binCreator.BinaryVectorParameter.ActualName;
     
    264275          xo.ParentsParameter.Hidden = true;
    265276        }
    266         Operators.AddRange(crossovers.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     277        Operators.AddRange(crossovers.Except(Operators.OfType<IBinaryVectorCrossover>()));
    267278        #endregion
    268279        #region Wire BinaryVector Manipulators
    269         Operators.RemoveAll(x => x is IBinaryVectorManipulator && ((IBinaryVectorManipulator)x).BinaryVectorParameter.ActualName != paramName);
    270         var manipulators = ApplicationManager.Manager.GetInstances<IBinaryVectorManipulator>().ToList();
     280        var manipulators = Operators.OfType<IBinaryVectorManipulator>()
     281          .Union(ApplicationManager.Manager.GetInstances<IBinaryVectorManipulator>(), new TypeEqualityComparer<IBinaryVectorManipulator>())
     282          .ToList();
    271283        foreach (var m in manipulators) {
    272284          m.BinaryVectorParameter.ActualName = binCreator.BinaryVectorParameter.ActualName;
    273285          m.BinaryVectorParameter.Hidden = true;
    274286        }
    275         Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     287        Operators.AddRange(manipulators.Except(Operators.OfType<IBinaryVectorManipulator>()));
    276288        #endregion
    277289        #region Wire BinaryVector ShakingOperators
    278         Operators.RemoveAll(x => x is IBinaryVectorMultiNeighborhoodShakingOperator && ((IBinaryVectorManipulator)x).BinaryVectorParameter.ActualName != paramName);
    279         var shakingOperators = ApplicationManager.Manager.GetInstances<IBinaryVectorMultiNeighborhoodShakingOperator>().ToList();
     290        var shakingOperators = Operators.OfType<IBinaryVectorMultiNeighborhoodShakingOperator>()
     291          .Union(ApplicationManager.Manager.GetInstances<IBinaryVectorMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IBinaryVectorMultiNeighborhoodShakingOperator>())
     292          .ToList();
    280293        foreach (var so in shakingOperators) {
    281294          so.BinaryVectorParameter.ActualName = paramName;
    282295          so.BinaryVectorParameter.Hidden = true;
    283296        }
    284         Operators.AddRange(shakingOperators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     297        Operators.AddRange(shakingOperators.Except(Operators.OfType<IBinaryVectorMultiNeighborhoodShakingOperator>()));
    285298        #endregion
    286299      } else {
     
    303316
    304317        #region Wire IntegerVector Crossovers
    305         Operators.RemoveAll(x => x is IIntegerVectorCrossover && ((IIntegerVectorCrossover)x).ChildParameter.ActualName != paramName);
    306         var crossovers = ApplicationManager.Manager.GetInstances<IIntegerVectorCrossover>().ToList();
     318        var crossovers = Operators.OfType<IIntegerVectorCrossover>()
     319          .Union(ApplicationManager.Manager.GetInstances<IIntegerVectorCrossover>(), new TypeEqualityComparer<IIntegerVectorCrossover>())
     320          .ToList();
    307321        foreach (var xo in crossovers) {
    308322          xo.ChildParameter.ActualName = intCreator.IntegerVectorParameter.ActualName;
     
    316330          }
    317331        }
    318         Operators.AddRange(crossovers.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     332        Operators.AddRange(crossovers.Except(Operators.OfType<IIntegerVectorCrossover>()));
    319333        #endregion
    320334        #region Wire IntegerVector Manipulators
    321         Operators.RemoveAll(x => x is IIntegerVectorManipulator && ((IIntegerVectorManipulator)x).IntegerVectorParameter.ActualName != paramName);
    322         var manipulators = ApplicationManager.Manager.GetInstances<IIntegerVectorManipulator>().ToList();
     335        var manipulators = Operators.OfType<IIntegerVectorManipulator>()
     336          .Union(ApplicationManager.Manager.GetInstances<IIntegerVectorManipulator>(), new TypeEqualityComparer<IIntegerVectorManipulator>())
     337          .ToList();
    323338        foreach (var m in manipulators) {
    324339          m.IntegerVectorParameter.ActualName = intCreator.IntegerVectorParameter.ActualName;
     
    338353          }
    339354        }
    340         Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     355        Operators.AddRange(manipulators.Except(Operators.OfType<IIntegerVectorManipulator>()));
    341356        #region Wire IntegerVector StrategyParameters for SelfAdaptiveManipulators
    342         Operators.RemoveAll(x => x is IStrategyParameterCreator && !(x is IIntegerVectorStdDevStrategyParameterCreator) || x is IIntegerVectorStdDevStrategyParameterCreator && ((IIntegerVectorStdDevStrategyParameterCreator)x).StrategyParameterParameter.ActualName != paramName + "Strategy");
    343         Operators.RemoveAll(x => x is IStrategyParameterManipulator && !(x is IIntegerVectorStdDevStrategyParameterManipulator) || x is IIntegerVectorStdDevStrategyParameterManipulator && ((IIntegerVectorStdDevStrategyParameterManipulator)x).StrategyParameterParameter.ActualName != paramName + "Strategy");
    344         Operators.RemoveAll(x => x is IStrategyParameterCrossover && !(x is IIntegerVectorStdDevStrategyParameterCrossover) || x is IIntegerVectorStdDevStrategyParameterCrossover && ((IIntegerVectorStdDevStrategyParameterCrossover)x).StrategyParameterParameter.ActualName != paramName + "Strategy");
    345         var strategyOperators = ApplicationManager.Manager.GetInstances<IIntegerVectorStdDevStrategyParameterOperator>().ToList();
    346         if (!(configuration.Parameters.First().Value is IntegerParameterConfiguration)) throw new InvalidOperationException("Single-encoded problem with integervector creator that is not an integer-coded problem.");
    347         var problemSize = ((IntegerParameterConfiguration)configuration.Parameters.First().Value).Length.Value;
    348         var b = ((IntegerParameterConfiguration)configuration.Parameters.First().Value).Bounds;
     357        var strategyOperators = Operators.OfType<IIntegerVectorStdDevStrategyParameterOperator>()
     358          .Union(ApplicationManager.Manager.GetInstances<IIntegerVectorStdDevStrategyParameterOperator>(), new TypeEqualityComparer<IIntegerVectorStdDevStrategyParameterOperator>())
     359          .ToList();
     360        var problemSize = ((IntegerEncoding)encoding).Length.Value;
     361        var b = ((IntegerEncoding)encoding).Bounds;
    349362        var bounds = new DoubleMatrix(b.Rows, b.Columns);
    350363        for (var i = 0; i < bounds.Rows; i++) {
     
    376389          }
    377390        }
    378         Operators.AddRange(strategyOperators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     391        Operators.AddRange(strategyOperators.Except(Operators.OfType<IIntegerVectorStdDevStrategyParameterOperator>()));
    379392        #endregion
    380393        #endregion
    381394        #region Wire IntegerVector ShakingOperators
    382         Operators.RemoveAll(x => x is IIntegerVectorMultiNeighborhoodShakingOperator && ((IIntegerVectorMultiNeighborhoodShakingOperator)x).IntegerVectorParameter.ActualName != paramName);
    383         var shakingOperators = ApplicationManager.Manager.GetInstances<IIntegerVectorMultiNeighborhoodShakingOperator>().ToList();
     395        var shakingOperators = Operators.OfType<IIntegerVectorMultiNeighborhoodShakingOperator>()
     396          .Union(ApplicationManager.Manager.GetInstances<IIntegerVectorMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IIntegerVectorMultiNeighborhoodShakingOperator>())
     397          .ToList();
    384398        foreach (var so in shakingOperators) {
    385399          so.IntegerVectorParameter.ActualName = paramName;
    386400          so.IntegerVectorParameter.Hidden = true;
    387401        }
    388         Operators.AddRange(shakingOperators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     402        Operators.AddRange(shakingOperators.Except(Operators.OfType<IIntegerVectorMultiNeighborhoodShakingOperator>()));
    389403        #endregion
    390404      } else {
     
    408422
    409423        #region Wire RealVector Crossovers
    410         Operators.RemoveAll(x => x is IRealVectorCrossover && ((IRealVectorCrossover)x).ChildParameter.ActualName != paramName);
    411         var crossovers = ApplicationManager.Manager.GetInstances<IRealVectorCrossover>().ToList();
     424        var crossovers = Operators.OfType<IRealVectorCrossover>()
     425          .Union(ApplicationManager.Manager.GetInstances<IRealVectorCrossover>(), new TypeEqualityComparer<IRealVectorCrossover>())
     426          .ToList();
    412427        foreach (var xo in crossovers) {
    413428          xo.ChildParameter.ActualName = paramName;
     
    418433          xo.BoundsParameter.Hidden = true;
    419434        }
    420         Operators.AddRange(crossovers.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     435        Operators.AddRange(crossovers.Except(Operators.OfType<IRealVectorCrossover>()));
    421436        #endregion
    422437        #region Wire RealVector Manipulators
    423         Operators.RemoveAll(x => x is IRealVectorManipulator && ((IRealVectorManipulator)x).RealVectorParameter.ActualName != paramName);
    424         var manipulators = ApplicationManager.Manager.GetInstances<IRealVectorManipulator>().ToList();
     438        var manipulators = Operators.OfType<IRealVectorManipulator>()
     439          .Union(ApplicationManager.Manager.GetInstances<IRealVectorManipulator>(), new TypeEqualityComparer<IRealVectorManipulator>())
     440          .ToList();
    425441        foreach (var m in manipulators) {
    426442          m.RealVectorParameter.ActualName = paramName;
     
    437453          }
    438454        }
    439         Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     455        Operators.AddRange(manipulators.Except(Operators.OfType<IRealVectorManipulator>()));
    440456        #region Wire RealVector Strategy Parameters for SelfAdaptiveManipulators
    441 
    442         Operators.RemoveAll(x => x is IStrategyParameterCreator && !(x is IRealVectorStdDevStrategyParameterCreator) || x is IRealVectorStdDevStrategyParameterCreator && ((IRealVectorStdDevStrategyParameterCreator)x).StrategyParameterParameter.ActualName != paramName + "Strategy");
    443         Operators.RemoveAll(x => x is IStrategyParameterManipulator && !(x is IRealVectorStdDevStrategyParameterManipulator) || x is IRealVectorStdDevStrategyParameterManipulator && ((IRealVectorStdDevStrategyParameterManipulator)x).StrategyParameterParameter.ActualName != paramName + "Strategy");
    444         Operators.RemoveAll(x => x is IStrategyParameterCrossover && !(x is IRealVectorStdDevStrategyParameterCrossover) || x is IRealVectorStdDevStrategyParameterCrossover && ((IRealVectorStdDevStrategyParameterCrossover)x).StrategyParameterParameter.ActualName != paramName + "Strategy");
    445         var strategyOperators = ApplicationManager.Manager.GetInstances<IRealVectorStdDevStrategyParameterOperator>().ToList();
    446         if (!(configuration.Parameters.First().Value is RealParameterConfiguration)) throw new InvalidOperationException("Single-encoded problem with realvector creator that is not a real-coded problem.");
    447         var problemSize = ((RealParameterConfiguration)configuration.Parameters.First().Value).Length.Value;
    448         var bounds = (DoubleMatrix)((RealParameterConfiguration)configuration.Parameters.First().Value).Bounds.Clone();
     457        var strategyOperators = Operators.OfType<IRealVectorStdDevStrategyParameterOperator>()
     458          .Union(ApplicationManager.Manager.GetInstances<IRealVectorStdDevStrategyParameterOperator>(), new TypeEqualityComparer<IRealVectorStdDevStrategyParameterOperator>())
     459          .ToList();
     460        var problemSize = ((RealEncoding)encoding).Length.Value;
     461        var bounds = (DoubleMatrix)((RealEncoding)encoding).Bounds.Clone();
    449462        for (var i = 0; i < bounds.Rows; i++) {
    450463          bounds[i, 1] = 0.1 * (bounds[i, 1] - bounds[i, 0]);
     
    474487          }
    475488        }
    476         Operators.AddRange(strategyOperators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     489        Operators.AddRange(strategyOperators.Except(Operators.OfType<IRealVectorStdDevStrategyParameterOperator>()));
    477490        #endregion
    478491        #endregion
    479492        #region Wire RealVector ParticleCreators
    480         Operators.RemoveAll(x => x is IRealVectorParticleCreator && ((IRealVectorParticleCreator)x).RealVectorParameter.ActualName != paramName);
    481         var particleCreators = ApplicationManager.Manager.GetInstances<IRealVectorParticleCreator>().ToList();
     493        var particleCreators = Operators.OfType<IRealVectorParticleCreator>()
     494          .Union(ApplicationManager.Manager.GetInstances<IRealVectorParticleCreator>(), new TypeEqualityComparer<IRealVectorParticleCreator>())
     495          .ToList();
    482496        foreach (var pc in particleCreators) {
    483497          pc.RealVectorParameter.ActualName = paramName;
     
    488502          pc.ProblemSizeParameter.Hidden = true;
    489503        }
    490         Operators.AddRange(particleCreators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     504        Operators.AddRange(particleCreators.Except(Operators.OfType<IRealVectorParticleCreator>()));
    491505        #endregion
    492506        #region Wire RealVector ParticleUpdaters
    493         Operators.RemoveAll(x => x is IRealVectorParticleUpdater && ((IRealVectorParticleUpdater)x).RealVectorParameter.ActualName != paramName);
    494         var particleUpdaters = ApplicationManager.Manager.GetInstances<IRealVectorParticleUpdater>().ToList();
     507        var particleUpdaters = Operators.OfType<IRealVectorParticleUpdater>()
     508          .Union(ApplicationManager.Manager.GetInstances<IRealVectorParticleUpdater>(), new TypeEqualityComparer<IRealVectorParticleUpdater>())
     509          .ToList();
    495510        foreach (var pu in particleUpdaters) {
    496511          pu.RealVectorParameter.ActualName = paramName;
     
    499514          pu.BoundsParameter.Hidden = true;
    500515        }
    501         Operators.AddRange(particleUpdaters.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     516        Operators.AddRange(particleUpdaters.Except(Operators.OfType<IRealVectorParticleUpdater>()));
    502517        #endregion
    503518        #region Wire RealVector SwarmUpdaters
    504         Operators.RemoveAll(x => x is IRealVectorSwarmUpdater && ((IRealVectorSwarmUpdater)x).RealVectorParameter.ActualName != paramName);
    505         var swarmUpdaters = ApplicationManager.Manager.GetInstances<IRealVectorSwarmUpdater>().ToList();
     519        var swarmUpdaters = Operators.OfType<IRealVectorSwarmUpdater>()
     520          .Union(ApplicationManager.Manager.GetInstances<IRealVectorSwarmUpdater>(), new TypeEqualityComparer<IRealVectorSwarmUpdater>())
     521          .ToList();
    506522        foreach (var su in swarmUpdaters) {
    507523          su.RealVectorParameter.ActualName = paramName;
     
    510526          su.MaximizationParameter.Hidden = true;
    511527        }
    512         Operators.AddRange(swarmUpdaters.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     528        Operators.AddRange(swarmUpdaters.Except(Operators.OfType<IRealVectorSwarmUpdater>()));
    513529        #endregion
    514530        #region Wire RealVector ShakingOperators
    515         Operators.RemoveAll(x => x is IRealVectorMultiNeighborhoodShakingOperator && ((IRealVectorMultiNeighborhoodShakingOperator)x).RealVectorParameter.ActualName != paramName);
    516         var shakingOperators = ApplicationManager.Manager.GetInstances<IRealVectorMultiNeighborhoodShakingOperator>().ToList();
     531        var shakingOperators = Operators.OfType<IRealVectorMultiNeighborhoodShakingOperator>()
     532          .Union(ApplicationManager.Manager.GetInstances<IRealVectorMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IRealVectorMultiNeighborhoodShakingOperator>())
     533          .ToList();
    517534        foreach (var so in shakingOperators) {
    518535          so.RealVectorParameter.ActualName = paramName;
    519536          so.RealVectorParameter.Hidden = true;
    520537        }
    521         Operators.AddRange(shakingOperators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     538        Operators.AddRange(shakingOperators.Except(Operators.OfType<IRealVectorMultiNeighborhoodShakingOperator>()));
    522539        #endregion
    523540      } else {
     
    544561
    545562        #region Wire Permutation Crossovers
    546         Operators.RemoveAll(x => x is IPermutationCrossover && ((IPermutationCrossover)x).ChildParameter.ActualName != paramName);
    547         var crossovers = ApplicationManager.Manager.GetInstances<IPermutationCrossover>().ToList();
     563        var crossovers = Operators.OfType<IPermutationCrossover>()
     564          .Union(ApplicationManager.Manager.GetInstances<IPermutationCrossover>(), new TypeEqualityComparer<IPermutationCrossover>())
     565          .ToList();
    548566        foreach (var xo in crossovers) {
    549567          xo.ChildParameter.ActualName = permCreator.PermutationParameter.ActualName;
     
    552570          xo.ParentsParameter.Hidden = true;
    553571        }
    554         Operators.AddRange(crossovers.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     572        Operators.AddRange(crossovers.Except(Operators.OfType<IPermutationCrossover>()));
    555573        #endregion
    556574        #region Wire Permutation Manipulators
    557         Operators.RemoveAll(x => x is IPermutationManipulator && ((IPermutationManipulator)x).PermutationParameter.ActualName != paramName);
    558         var manipulators = ApplicationManager.Manager.GetInstances<IPermutationManipulator>().ToList();
     575        var manipulators = Operators.OfType<IPermutationManipulator>()
     576          .Union(ApplicationManager.Manager.GetInstances<IPermutationManipulator>(), new TypeEqualityComparer<IPermutationManipulator>())
     577          .ToList();
    559578        foreach (var m in manipulators) {
    560579          m.PermutationParameter.ActualName = permCreator.PermutationParameter.ActualName;
    561580          m.PermutationParameter.Hidden = true;
    562581        }
    563         Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
    564         #endregion
    565         #region Wire ShakingOperators
    566         Operators.RemoveAll(x => x is IPermutationMultiNeighborhoodShakingOperator && ((IPermutationMultiNeighborhoodShakingOperator)x).PermutationParameter.ActualName != paramName);
    567         var shakingOperators = ApplicationManager.Manager.GetInstances<IPermutationMultiNeighborhoodShakingOperator>().ToList();
     582        Operators.AddRange(manipulators.Except(Operators.OfType<IPermutationManipulator>()));
     583        #endregion
     584        #region Wire Permutation ShakingOperators
     585        var shakingOperators = Operators.OfType<IPermutationMultiNeighborhoodShakingOperator>()
     586          .Union(ApplicationManager.Manager.GetInstances<IPermutationMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IPermutationMultiNeighborhoodShakingOperator>())
     587          .ToList();
    568588        foreach (var op in shakingOperators) {
    569589          op.PermutationParameter.ActualName = paramName;
    570590          op.PermutationParameter.Hidden = true;
    571591        }
    572         Operators.AddRange(shakingOperators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
     592        Operators.AddRange(shakingOperators.Except(Operators.OfType<IPermutationMultiNeighborhoodShakingOperator>()));
    573593        #endregion
    574594      } else {
     
    580600    }
    581601
    582     protected virtual void UpdateMultiVectorEncodingOperators(List<ISolutionCreator> solutionCreators, Configuration configuration) {
    583       var oldCreator = SolutionCreator as ParameterVectorCreater;
    584       var newCreator = new ParameterVectorCreater();
    585 
    586       #region Configure BinaryVector Creator
    587       var newBinParams = new HashSet<string>(solutionCreators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName));
    588       if (oldCreator != null) {
    589         // we want to reuse the old creator
    590         var oldParams = new HashSet<string>(oldCreator.Operators.OfType<IBinaryVectorCreator>()
    591           .Select(x => x.BinaryVectorParameter.ActualName));
    592         foreach (var toAdd in newBinParams.Except(oldParams)) {
    593           var paramName = toAdd;
    594           oldCreator.Operators.Add(
    595             solutionCreators.OfType<IBinaryVectorCreator>().Single(x => x.BinaryVectorParameter.ActualName == paramName));
    596         }
    597         foreach (var toRemove in oldParams.Except(newBinParams)) {
    598           var paramName = toRemove;
    599           var op =
    600             oldCreator.Operators.OfType<IBinaryVectorCreator>()
    601               .SingleOrDefault(x => x.BinaryVectorParameter.ActualName == paramName);
     602    protected virtual void ConfigureMultiVectorEncodingOperators(MultiEncodingCreator newCreator, MultiEncoding encoding) {
     603      var newBinParams = new HashSet<string>(newCreator.Operators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName));
     604      var newIntParams = new HashSet<string>(newCreator.Operators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName));
     605      var newRealParams = new HashSet<string>(newCreator.Operators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName));
     606      var newPermParams = new HashSet<string>(newCreator.Operators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName));
     607
     608      var oldCreator = SolutionCreator as MultiEncodingCreator;
     609      if (oldCreator == null) SolutionCreator = newCreator;
     610      else {
     611        #region Configure BinaryVector Creator
     612        var oldBinParams = new HashSet<string>(oldCreator.Operators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName));
     613        foreach (var toAdd in newBinParams.Except(oldBinParams)) {
     614          oldCreator.Operators.Add(newCreator.Operators.OfType<IBinaryVectorCreator>().Single(x => x.BinaryVectorParameter.ActualName == toAdd));
     615        }
     616        foreach (var toRemove in oldBinParams.Except(newBinParams)) {
     617          var op = oldCreator.Operators.OfType<IBinaryVectorCreator>().SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove);
    602618          if (op != null) oldCreator.Operators.Remove(op);
    603619        }
    604       } else {
    605         // we will use the new creator
    606         foreach (var binCreator in solutionCreators.OfType<IBinaryVectorCreator>()) {
    607           newCreator.Operators.Add(binCreator);
    608         }
    609       }
    610       #endregion
    611       #region Configure IntegerVector Creator
    612       var newIntParams = new HashSet<string>(solutionCreators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName));
    613       if (oldCreator != null) {
    614         // we want to reuse the old creator
    615         var oldParams = new HashSet<string>(oldCreator
    616           .Operators.OfType<IIntegerVectorCreator>()
    617           .Select(x => x.IntegerVectorParameter.ActualName));
    618         foreach (var toAdd in newIntParams.Except(oldParams)) {
    619           var paramName = toAdd;
    620           oldCreator.Operators.Add(
    621             solutionCreators.OfType<IIntegerVectorCreator>().Single(x => x.IntegerVectorParameter.ActualName == paramName));
    622         }
    623         foreach (var toRemove in oldParams.Except(newIntParams)) {
    624           var paramName = toRemove;
    625           var op =
    626             oldCreator.Operators.OfType<IIntegerVectorCreator>()
    627               .SingleOrDefault(x => x.IntegerVectorParameter.ActualName == paramName);
     620        #endregion
     621
     622        #region Configure IntegerVector Creator
     623        var oldIntParams = new HashSet<string>(oldCreator.Operators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName));
     624        foreach (var toAdd in newIntParams.Except(oldIntParams)) {
     625          oldCreator.Operators.Add(newCreator.Operators.OfType<IIntegerVectorCreator>().Single(x => x.IntegerVectorParameter.ActualName == toAdd));
     626        }
     627        foreach (var toRemove in oldIntParams.Except(newIntParams)) {
     628          var op = oldCreator.Operators.OfType<IIntegerVectorCreator>().SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove);
    628629          if (op != null) oldCreator.Operators.Remove(op);
    629630        }
    630       } else {
    631         // we will use the new creator
    632         foreach (var intCreator in solutionCreators.OfType<IIntegerVectorCreator>()) {
    633           newCreator.Operators.Add(intCreator);
    634         }
    635       }
    636       #endregion
    637       #region Configure RealVector Creator
    638       var newRealParams = new HashSet<string>(solutionCreators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName));
    639       if (oldCreator != null) {
    640         // we want to reuse the old creator
    641         var oldParams = new HashSet<string>(oldCreator
    642           .Operators.OfType<IRealVectorCreator>()
    643           .Select(x => x.RealVectorParameter.ActualName));
    644         foreach (var toAdd in newRealParams.Except(oldParams)) {
    645           var paramName = toAdd;
    646           oldCreator.Operators.Add(
    647             solutionCreators.OfType<IRealVectorCreator>().Single(x => x.RealVectorParameter.ActualName == paramName));
    648         }
    649         foreach (var toRemove in oldParams.Except(newRealParams)) {
    650           var paramName = toRemove;
    651           var op =
    652             oldCreator.Operators.OfType<IRealVectorCreator>()
    653               .SingleOrDefault(x => x.RealVectorParameter.ActualName == paramName);
     631        #endregion
     632
     633        #region Configure RealVector Creator
     634        var oldRealParams = new HashSet<string>(oldCreator.Operators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName));
     635        foreach (var toAdd in newRealParams.Except(oldRealParams)) {
     636          oldCreator.Operators.Add(newCreator.Operators.OfType<IRealVectorCreator>().Single(x => x.RealVectorParameter.ActualName == toAdd));
     637        }
     638        foreach (var toRemove in oldRealParams.Except(newRealParams)) {
     639          var op = oldCreator.Operators.OfType<IRealVectorCreator>().SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove);
    654640          if (op != null) oldCreator.Operators.Remove(op);
    655641        }
    656       } else {
    657         // we will use the new creator
    658         foreach (var realCreator in solutionCreators.OfType<IRealVectorCreator>()) {
    659           newCreator.Operators.Add(realCreator);
    660         }
    661       }
    662       #endregion
    663       #region Configure Permutation Creator
    664       var newPermParams = new HashSet<string>(solutionCreators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName));
    665       if (oldCreator != null) {
    666         // we want to reuse the old creator
    667         var oldParams = new HashSet<string>(oldCreator
    668           .Operators.OfType<IPermutationCreator>()
    669           .Select(x => x.PermutationParameter.ActualName));
    670         foreach (var toAdd in newPermParams.Except(oldParams)) {
    671           var paramName = toAdd;
    672           oldCreator.Operators.Add(
    673             solutionCreators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == paramName));
    674         }
    675         foreach (var toRemove in oldParams.Except(newPermParams)) {
    676           var paramName = toRemove;
    677           var op =
    678             oldCreator.Operators.OfType<IPermutationCreator>()
    679               .SingleOrDefault(x => x.PermutationParameter.ActualName == paramName);
     642        #endregion
     643
     644        #region Configure Permutation Creator
     645        var oldPermParams = new HashSet<string>(oldCreator.Operators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName));
     646        foreach (var toAdd in newPermParams.Except(oldPermParams)) {
     647          oldCreator.Operators.Add(newCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == toAdd));
     648        }
     649        foreach (var toRemove in oldPermParams.Except(newPermParams)) {
     650          var op = oldCreator.Operators.OfType<IPermutationCreator>().SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove);
    680651          if (op != null) oldCreator.Operators.Remove(op);
    681652        }
    682653        // we also have to sync the permutation type (in case this changes, as it is a value parameter)
    683         foreach (var intersect in newPermParams.Intersect(oldParams)) {
    684           var paramName = intersect;
    685           var oldPermCreator = oldCreator.Operators.OfType<IPermutationCreator>()
    686             .Single(x => x.PermutationParameter.ActualName == paramName);
    687           var newPermCreator = solutionCreators.OfType<IPermutationCreator>()
    688             .Single(x => x.PermutationParameter.ActualName == paramName);
     654        foreach (var intersect in newPermParams.Intersect(oldPermParams)) {
     655          var oldPermCreator = oldCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == intersect);
     656          var newPermCreator = newCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == intersect);
    689657          oldPermCreator.PermutationTypeParameter.Value = newPermCreator.PermutationTypeParameter.Value;
    690658        }
    691       } else {
    692         // we will use the new creator
    693         foreach (var permCreator in solutionCreators.OfType<IPermutationCreator>()) {
    694           newCreator.Operators.Add(permCreator);
    695         }
    696       }
    697       #endregion
    698 
    699       if (oldCreator == null) SolutionCreator = newCreator;
     659        #endregion
     660
     661      }
    700662
    701663      // crossover and manipulator for multi-vector encoding
    702664      // the condition checks if a multi-vector encoding is to be updated (there already exists ParameterVectorCrossover and ParameterVectorManipulator)
    703       if (Operators.OfType<ParameterVectorCrossover>().Any() && Operators.OfType<ParameterVectorManipulator>().Any()) {
     665      if (Operators.OfType<MultiEncodingCrossover>().Any() && Operators.OfType<MultiEncodingManipulator>().Any()) {
    704666        #region Update existing multi-vector encoding
    705667        #region Update ParameterVector Crossover ...
    706         foreach (var oldXo in Operators.OfType<ParameterVectorCrossover>()) {
     668        foreach (var oldXo in Operators.OfType<MultiEncodingCrossover>()) {
    707669          #region ... for binary parameters
    708           var oldBinParams = new HashSet<string>(oldXo.Operators.OfType<IBinaryVectorCrossover>()
    709             .Select(x => x.ChildParameter.ActualName));
     670          var oldBinParams = new HashSet<string>(oldXo.Operators.OfType<IBinaryVectorCrossover>().Select(x => x.ChildParameter.ActualName));
    710671          foreach (var toAdd in newBinParams.Except(oldBinParams))
    711             oldXo.Operators.Add(GetDefaultBinaryCrossover(toAdd, configuration));
     672            oldXo.Operators.Add(GetDefaultBinaryCrossover(toAdd, encoding));
    712673          foreach (var toRemove in oldBinParams.Except(newBinParams)) {
    713             var op =
    714               oldXo.Operators.OfType<IBinaryVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
     674            var op = oldXo.Operators.OfType<IBinaryVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
    715675            if (op != null) oldXo.Operators.Remove(op);
    716676          }
    717677          #endregion
    718678          #region ... for integer parameters
    719           var oldIntParams = new HashSet<string>(oldXo.Operators.OfType<IIntegerVectorCrossover>()
    720             .Select(x => x.ChildParameter.ActualName));
     679          var oldIntParams = new HashSet<string>(oldXo.Operators.OfType<IIntegerVectorCrossover>().Select(x => x.ChildParameter.ActualName));
    721680          foreach (var toAdd in newIntParams.Except(oldIntParams))
    722             oldXo.Operators.Add(GetDefaultIntegerCrossover(toAdd, configuration));
     681            oldXo.Operators.Add(GetDefaultIntegerCrossover(toAdd, encoding));
    723682          foreach (var toRemove in oldIntParams.Except(newIntParams)) {
    724             var op =
    725               oldXo.Operators.OfType<IIntegerVectorCrossover>()
    726                 .SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
     683            var op = oldXo.Operators.OfType<IIntegerVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
    727684            if (op != null) oldXo.Operators.Remove(op);
    728685          }
    729686          #endregion
    730687          #region ... for real parameters
    731           var oldRealParams = new HashSet<string>(oldXo.Operators.OfType<IRealVectorCrossover>()
    732             .Select(x => x.ChildParameter.ActualName));
     688          var oldRealParams = new HashSet<string>(oldXo.Operators.OfType<IRealVectorCrossover>().Select(x => x.ChildParameter.ActualName));
    733689          foreach (var toAdd in newRealParams.Except(oldRealParams))
    734             oldXo.Operators.Add(GetDefaultRealCrossover(toAdd, configuration));
     690            oldXo.Operators.Add(GetDefaultRealCrossover(toAdd, encoding));
    735691          foreach (var toRemove in oldRealParams.Except(newRealParams)) {
    736             var op =
    737               oldXo.Operators.OfType<IRealVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
     692            var op = oldXo.Operators.OfType<IRealVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
    738693            if (op != null) oldXo.Operators.Remove(op);
    739694          }
    740695          #endregion
    741696          #region ... for permutation parameters
    742           var oldPermParams = new HashSet<string>(oldXo.Operators.OfType<IPermutationCrossover>()
    743             .Select(x => x.ChildParameter.ActualName));
     697          var oldPermParams = new HashSet<string>(oldXo.Operators.OfType<IPermutationCrossover>().Select(x => x.ChildParameter.ActualName));
    744698          foreach (var toAdd in newPermParams.Except(oldPermParams))
    745             oldXo.Operators.Add(GetDefaultPermutationCrossover(toAdd, configuration));
     699            oldXo.Operators.Add(GetDefaultPermutationCrossover(toAdd, encoding));
    746700          foreach (var toRemove in oldPermParams.Except(newPermParams)) {
    747             var op =
    748               oldXo.Operators.OfType<IPermutationCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
     701            var op = oldXo.Operators.OfType<IPermutationCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
    749702            if (op != null) oldXo.Operators.Remove(op);
    750703          }
     
    753706        #endregion
    754707        #region Update ParameterVector Manipulator ...
    755         foreach (var oldM in Operators.OfType<ParameterVectorManipulator>()) {
     708        foreach (var oldM in Operators.OfType<MultiEncodingManipulator>()) {
    756709          #region ... for binary parameters
    757           var oldBinParams = new HashSet<string>(oldM.Operators.OfType<IBinaryVectorManipulator>()
    758             .Select(x => x.BinaryVectorParameter.ActualName));
     710          var oldBinParams = new HashSet<string>(oldM.Operators.OfType<IBinaryVectorManipulator>().Select(x => x.BinaryVectorParameter.ActualName));
    759711          foreach (var toAdd in newBinParams.Except(oldBinParams))
    760             oldM.Operators.Add(GetDefaultBinaryManipulator(toAdd, configuration));
     712            oldM.Operators.Add(GetDefaultBinaryManipulator(toAdd, encoding));
    761713          foreach (var toRemove in oldBinParams.Except(newBinParams)) {
    762             var op =
    763               oldM.Operators.OfType<IBinaryVectorManipulator>()
    764                 .SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove);
     714            var op = oldM.Operators.OfType<IBinaryVectorManipulator>().SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove);
    765715            if (op != null) oldM.Operators.Remove(op);
    766716          }
    767717          #endregion
    768718          #region ... for integer parameters
    769           var oldIntParams = new HashSet<string>(oldM.Operators.OfType<IIntegerVectorManipulator>()
    770             .Select(x => x.IntegerVectorParameter.ActualName));
     719          var oldIntParams = new HashSet<string>(oldM.Operators.OfType<IIntegerVectorManipulator>().Select(x => x.IntegerVectorParameter.ActualName));
    771720          foreach (var toAdd in newIntParams.Except(oldIntParams))
    772             oldM.Operators.Add(GetDefaultIntegerManipulator(toAdd, configuration));
     721            oldM.Operators.Add(GetDefaultIntegerManipulator(toAdd, encoding));
    773722          foreach (var toRemove in oldIntParams.Except(newIntParams)) {
    774             var op =
    775               oldM.Operators.OfType<IIntegerVectorManipulator>()
    776                 .SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove);
     723            var op = oldM.Operators.OfType<IIntegerVectorManipulator>().SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove);
    777724            if (op != null) oldM.Operators.Remove(op);
    778725          }
    779726          #endregion
    780727          #region ... for real parameters
    781           var oldRealParams = new HashSet<string>(oldM.Operators.OfType<IRealVectorManipulator>()
    782             .Select(x => x.RealVectorParameter.ActualName));
     728          var oldRealParams = new HashSet<string>(oldM.Operators.OfType<IRealVectorManipulator>().Select(x => x.RealVectorParameter.ActualName));
    783729          foreach (var toAdd in newRealParams.Except(oldRealParams))
    784             oldM.Operators.Add(GetDefaultRealManipulator(toAdd, configuration));
     730            oldM.Operators.Add(GetDefaultRealManipulator(toAdd, encoding));
    785731          foreach (var toRemove in oldRealParams.Except(newRealParams)) {
    786             var op =
    787               oldM.Operators.OfType<IRealVectorManipulator>()
    788                 .SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove);
     732            var op = oldM.Operators.OfType<IRealVectorManipulator>().SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove);
    789733            if (op != null) oldM.Operators.Remove(op);
    790734          }
    791735          #endregion
    792736          #region ... for permutation parameters
    793           var oldPermParams = new HashSet<string>(oldM.Operators.OfType<IPermutationManipulator>()
    794             .Select(x => x.PermutationParameter.ActualName));
     737          var oldPermParams = new HashSet<string>(oldM.Operators.OfType<IPermutationManipulator>().Select(x => x.PermutationParameter.ActualName));
    795738          foreach (var toAdd in newPermParams.Except(oldPermParams))
    796             oldM.Operators.Add(GetDefaultPermutationManipulator(toAdd, configuration));
     739            oldM.Operators.Add(GetDefaultPermutationManipulator(toAdd, encoding));
    797740          foreach (var toRemove in oldPermParams.Except(newPermParams)) {
    798             var op =
    799               oldM.Operators.OfType<IPermutationManipulator>()
    800                 .SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove);
     741            var op = oldM.Operators.OfType<IPermutationManipulator>().SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove);
    801742            if (op != null) oldM.Operators.Remove(op);
    802743          }
     
    815756        Operators.RemoveAll(x => x is IMultiNeighborhoodShakingOperator);
    816757
    817         var crossover = new ParameterVectorCrossover();
    818         var manipulator = new ParameterVectorManipulator();
    819         foreach (var param in configuration.Parameters) {
    820           if (param.Value is BinaryParameterConfiguration) {
    821             crossover.Operators.Add(GetDefaultBinaryCrossover(param.Key, configuration));
    822             manipulator.Operators.Add(GetDefaultBinaryManipulator(param.Key, configuration));
     758        var crossover = new MultiEncodingCrossover();
     759        var manipulator = new MultiEncodingManipulator();
     760        foreach (var enc in encoding.Encodings) {
     761          if (enc is BinaryEncoding) {
     762            crossover.Operators.Add(GetDefaultBinaryCrossover(enc.Name, encoding));
     763            manipulator.Operators.Add(GetDefaultBinaryManipulator(enc.Name, encoding));
    823764            continue;
    824765          }
    825           var intConfig = param.Value as IntegerParameterConfiguration;
     766          var intConfig = enc as IntegerEncoding;
    826767          if (intConfig != null) {
    827             crossover.Operators.Add(GetDefaultIntegerCrossover(param.Key, configuration));
    828             manipulator.Operators.Add(GetDefaultIntegerManipulator(param.Key, configuration));
     768            crossover.Operators.Add(GetDefaultIntegerCrossover(enc.Name, encoding));
     769            manipulator.Operators.Add(GetDefaultIntegerManipulator(enc.Name, encoding));
    829770            continue;
    830771          }
    831           var realConfig = param.Value as RealParameterConfiguration;
     772          var realConfig = enc as RealEncoding;
    832773          if (realConfig != null) {
    833             crossover.Operators.Add(GetDefaultRealCrossover(param.Key, configuration));
    834             manipulator.Operators.Add(GetDefaultRealManipulator(param.Key, configuration));
     774            crossover.Operators.Add(GetDefaultRealCrossover(enc.Name, encoding));
     775            manipulator.Operators.Add(GetDefaultRealManipulator(enc.Name, encoding));
    835776            continue;
    836777          }
    837           var permConfig = param.Value as PermutationParameterConfiguration;
     778          var permConfig = enc as PermutationEncoding;
    838779          if (permConfig != null) {
    839             crossover.Operators.Add(GetDefaultPermutationCrossover(param.Key, configuration));
    840             manipulator.Operators.Add(GetDefaultPermutationManipulator(param.Key, configuration));
     780            crossover.Operators.Add(GetDefaultPermutationCrossover(enc.Name, encoding));
     781            manipulator.Operators.Add(GetDefaultPermutationManipulator(enc.Name, encoding));
    841782            continue;
    842783          }
    843           throw new InvalidOperationException("Unknown type for parameter " + param.Key);
     784          throw new InvalidOperationException("Unknown type for parameter " + enc.Name);
    844785        }
    845786        Operators.Add(crossover);
     
    849790    }
    850791
    851     protected virtual void UpdateMoveOperators() {
    852       Operators.RemoveAll(x => x is IParameterVectorMoveOperator);
    853       var generator = new ParameterVectorMoveGenerator();
    854       generator.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
    855       generator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
    856 
    857       var evaluator = new ParameterVectorMoveEvaluator();
    858       evaluator.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
    859       evaluator.QualityParameter.ActualName = Evaluator.QualitiesParameter.ActualName;
    860       evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
    861 
    862       var maker = new ParameterVectorMoveMaker();
    863       maker.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
    864       maker.MoveQualityParameter.ActualName = evaluator.MoveQualityParameter.ActualName;
    865       maker.QualityParameter.ActualName = Evaluator.QualitiesParameter.ActualName;
    866 
    867       Operators.AddRange(new IItem[] { generator, evaluator, maker });
    868     }
    869 
    870792    #region GetDefaultOperators for Crossovers and Manipulators
    871793    // ReSharper disable RedundantNameQualifier
    872     protected virtual IBinaryVectorCrossover GetDefaultBinaryCrossover(string paramName, Configuration config) {
    873       var binConfig = (BinaryParameterConfiguration)config.Parameters[paramName];
     794    protected virtual IBinaryVectorCrossover GetDefaultBinaryCrossover(string paramName, MultiEncoding config) {
     795      var binConfig = (BinaryEncoding)config.Encodings[paramName];
    874796      IBinaryVectorCrossover binXo;
    875797      if (binConfig.Length.Value > 3) binXo = new Encodings.BinaryVectorEncoding.SinglePointCrossover();
     
    880802    }
    881803
    882     protected virtual IBinaryVectorManipulator GetDefaultBinaryManipulator(string paramName, Configuration config) {
     804    protected virtual IBinaryVectorManipulator GetDefaultBinaryManipulator(string paramName, MultiEncoding config) {
    883805      var binM = new Encodings.BinaryVectorEncoding.SomePositionsBitflipManipulator();
    884806      binM.BinaryVectorParameter.ActualName = paramName;
     
    887809    }
    888810
    889     protected virtual IIntegerVectorCrossover GetDefaultIntegerCrossover(string paramName, Configuration config) {
     811    protected virtual IIntegerVectorCrossover GetDefaultIntegerCrossover(string paramName, MultiEncoding config) {
    890812      var intXo = new Encodings.IntegerVectorEncoding.RoundedBlendAlphaCrossover();
    891813      intXo.ChildParameter.ActualName = paramName;
     
    895817    }
    896818
    897     protected virtual IIntegerVectorManipulator GetDefaultIntegerManipulator(string paramName, Configuration configuration) {
     819    protected virtual IIntegerVectorManipulator GetDefaultIntegerManipulator(string paramName, MultiEncoding configuration) {
    898820      var intM = new Encodings.IntegerVectorEncoding.UniformSomePositionsManipulator();
    899821      intM.IntegerVectorParameter.ActualName = paramName;
     
    903825    }
    904826
    905     protected virtual IRealVectorCrossover GetDefaultRealCrossover(string paramName, Configuration configuration) {
     827    protected virtual IRealVectorCrossover GetDefaultRealCrossover(string paramName, MultiEncoding configuration) {
    906828      var realXo = new Encodings.RealVectorEncoding.BlendAlphaCrossover();
    907829      realXo.ChildParameter.ActualName = paramName;
     
    911833    }
    912834
    913     protected virtual IRealVectorManipulator GetDefaultRealManipulator(string paramName, Configuration configuration) {
     835    protected virtual IRealVectorManipulator GetDefaultRealManipulator(string paramName, MultiEncoding configuration) {
    914836      var realM = new Encodings.RealVectorEncoding.BreederGeneticAlgorithmManipulator();
    915837      realM.RealVectorParameter.ActualName = paramName;
     
    918840    }
    919841
    920     protected virtual IPermutationCrossover GetDefaultPermutationCrossover(string paramName, Configuration configuration) {
     842    protected virtual IPermutationCrossover GetDefaultPermutationCrossover(string paramName, MultiEncoding configuration) {
    921843      var permXo = new Encodings.PermutationEncoding.PartiallyMatchedCrossover();
    922844      permXo.ChildParameter.ActualName = paramName;
     
    925847    }
    926848
    927     protected virtual IPermutationManipulator GetDefaultPermutationManipulator(string paramName, Configuration configuration) {
     849    protected virtual IPermutationManipulator GetDefaultPermutationManipulator(string paramName, MultiEncoding configuration) {
    928850      var permM = new Encodings.PermutationEncoding.Swap2Manipulator();
    929851      permM.PermutationParameter.ActualName = paramName;
Note: See TracChangeset for help on using the changeset viewer.