Free cookie consent management tool by TermsFeed Policy Generator

source: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs @ 11424

Last change on this file since 11424 was 11424, checked in by abeham, 10 years ago

#2174: fixed a casting bug and bugs regarding the parameterization of move operators

File size: 51.4 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Drawing;
25using System.Linq;
26using HeuristicLab.Analysis;
27using HeuristicLab.Common;
28using HeuristicLab.Core;
29using HeuristicLab.Data;
30using HeuristicLab.Encodings.BinaryVectorEncoding;
31using HeuristicLab.Encodings.IntegerVectorEncoding;
32using HeuristicLab.Encodings.PermutationEncoding;
33using HeuristicLab.Encodings.RealVectorEncoding;
34using HeuristicLab.Optimization;
35using HeuristicLab.Parameters;
36using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
37using HeuristicLab.PluginInfrastructure;
38
39namespace HeuristicLab.Problems.Programmable {
40  [Item("Programmable Problem (single-objective)", "Represents a single-objective problem that can be programmed.")]
41  [Creatable("Problems")]
42  [StorableClass]
43  public class SingleObjectiveProgrammableProblem : SingleObjectiveHeuristicOptimizationProblem<ISingleObjectiveProgrammableProblemEvaluator, ISolutionCreator>, IParameterizedNamedItem, IStorableContent {
44    public string Filename { get; set; }
45
46    public static new Image StaticItemImage {
47      get { return Common.Resources.VSImageLibrary.Script; }
48    }
49
50    public new ParameterCollection Parameters {
51      get { return base.Parameters; }
52    }
53    IKeyedItemCollection<string, IParameter> IParameterizedItem.Parameters {
54      get { return Parameters; }
55    }
56
57    public IValueParameter<ISingleObjectiveProblemDefinitionHost> ProblemDefinitionParameter {
58      get { return (IValueParameter<ISingleObjectiveProblemDefinitionHost>)Parameters["ProblemDefinition"]; }
59    }
60
61    protected IValueParameter<Configuration> ConfigurationParameter {
62      get { return (IValueParameter<Configuration>)Parameters["Configuration"]; }
63    }
64
65    public ISingleObjectiveProblemDefinitionHost ProblemDefinition {
66      get { return ProblemDefinitionParameter.Value; }
67      set { ProblemDefinitionParameter.Value = value; }
68    }
69
70    [Storable]
71    protected List<IParameter> DynamicConfigurationParameters;
72
73    [StorableConstructor]
74    protected SingleObjectiveProgrammableProblem(bool deserializing) : base(deserializing) { }
75
76    protected SingleObjectiveProgrammableProblem(SingleObjectiveProgrammableProblem original, Cloner cloner)
77      : base(original, cloner) {
78      DynamicConfigurationParameters = original.DynamicConfigurationParameters.Select(cloner.Clone).ToList();
79      RegisterEventHandlers();
80    }
81    public SingleObjectiveProgrammableProblem()
82      : base(new SingleObjectiveEvaluator(), new ParameterVectorCreater()) {
83      Parameters.Add(new ValueParameter<ISingleObjectiveProblemDefinitionHost>("ProblemDefinition", "Defines the problem.", new SingleObjectiveProblemDefinitionScript() { Name = Name }));
84      Parameters.Add(new ValueParameter<Configuration>("Configuration", "Describes which parameters exist, what they're called, what type they are and their bounds if any."));
85
86      DynamicConfigurationParameters = new List<IParameter>();
87
88      Operators.Add(new BestScopeSolutionAnalyzer());
89      Operators.Add(new SingleObjectiveAnalyzer());
90      Operators.Add(Evaluator);
91      Operators.Add(SolutionCreator);
92
93      RegisterEventHandlers();
94    }
95
96    public override IDeepCloneable Clone(Cloner cloner) {
97      return new SingleObjectiveProgrammableProblem(this, cloner);
98    }
99
100    [StorableHook(HookType.AfterDeserialization)]
101    // ReSharper disable UnusedMember.Local
102    private void AfterDeserialization() {
103      RegisterEventHandlers();
104    }
105    // ReSharper restore UnusedMember.Local
106
107    private void RegisterEventHandlers() {
108      ProblemDefinitionParameter.ValueChanged += ProblemDefinitionParameterOnValueChanged;
109      RegisterHostInstanceChanges();
110    }
111
112    private void ProblemDefinitionParameterOnValueChanged(object sender, EventArgs eventArgs) {
113      RegisterHostInstanceChanges();
114      Parameterize();
115    }
116
117    private void RegisterHostInstanceChanges() {
118      ProblemDefinitionParameter.Value.InstanceChanged += ProblemDefinitionHostOnInstanceChanged;
119      ProblemDefinitionParameter.Value.NameChanged += ProblemDefinitionHostOnNameChanged;
120    }
121
122    private void ProblemDefinitionHostOnNameChanged(object sender, EventArgs eventArgs) {
123      if (sender != ProblemDefinitionParameter.Value) return;
124      Name = ProblemDefinitionParameter.Value.Name;
125    }
126
127    protected override void OnNameChanged() {
128      base.OnNameChanged();
129      ProblemDefinitionParameter.Value.Name = Name;
130    }
131
132    protected override void OnEvaluatorChanged() {
133      base.OnEvaluatorChanged();
134      Parameterize();
135    }
136
137    protected virtual void ProblemDefinitionHostOnInstanceChanged(object sender, EventArgs eventArgs) {
138      Parameterize();
139    }
140
141    protected virtual void Parameterize() {
142      var instance = ProblemDefinitionParameter.Value.Instance;
143      if (instance == null) return;
144
145      Configuration configuration;
146      try {
147        configuration = instance.GetConfiguration();
148      } catch { return; }
149      ConfigurationParameter.Value = configuration;
150      Maximization.Value = instance.IsMaximizationProblem;
151
152      Evaluator.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
153      Evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
154      foreach (var evalOp in Operators.OfType<ISingleObjectiveProgrammableProblemEvaluator>()) {
155        evalOp.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
156        evalOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
157      }
158      foreach (var analyzeOp in Operators.OfType<ISingleObjectiveProgrammableProblemAnalyzer>()) {
159        analyzeOp.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
160        analyzeOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
161        analyzeOp.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
162      }
163
164      var solutionCreators = UpdateDynamicConfigurationParameters(configuration);
165
166      if (solutionCreators.Count == 1) {
167        Operators.RemoveAll(x => x is ParameterVectorCrossover
168                              || x is ParameterVectorManipulator);
169        UpdateSingleVectorEncodingOperators(solutionCreators, configuration);
170      } else {
171        UpdateMultiVectorEncodingOperators(solutionCreators, configuration);
172      }
173      UpdateImprovementOperators();
174      UpdateMoveOperators();
175    }
176
177    protected virtual List<ISolutionCreator> UpdateDynamicConfigurationParameters(Configuration configuration) {
178      foreach (var param in DynamicConfigurationParameters)
179        if (Parameters.Contains(param)) Parameters.Remove(param);
180      DynamicConfigurationParameters.Clear();
181
182      var solutionCreators = new List<ISolutionCreator>();
183      foreach (var param in configuration.Parameters) {
184        #region Configure BinaryVector Creator
185        var binConfig = param.Value as BinaryParameterConfiguration;
186        if (binConfig != null) {
187          var p = new ValueParameter<IntValue>(param.Key + "Length", binConfig.Length);
188          DynamicConfigurationParameters.Add(p);
189
190          var creator = new RandomBinaryVectorCreator();
191          creator.BinaryVectorParameter.ActualName = param.Key;
192          creator.LengthParameter.ActualName = p.Name;
193          solutionCreators.Add(creator);
194        }
195        #endregion
196        #region Configure IntegerVector Creator
197        var intConfig = param.Value as IntegerParameterConfiguration;
198        if (intConfig != null) {
199          var l = new ValueParameter<IntValue>(param.Key + "Length", intConfig.Length);
200          var b = new ValueParameter<IntMatrix>(param.Key + "Bounds", intConfig.Bounds);
201          DynamicConfigurationParameters.Add(l);
202          DynamicConfigurationParameters.Add(b);
203
204          var creator = new UniformRandomIntegerVectorCreator();
205          creator.IntegerVectorParameter.ActualName = param.Key;
206          creator.LengthParameter.ActualName = l.Name;
207          creator.BoundsParameter.ActualName = b.Name;
208          solutionCreators.Add(creator);
209        }
210        #endregion
211        #region Configure RealVector Creator
212        var realConfig = param.Value as RealParameterConfiguration;
213        if (realConfig != null) {
214          var l = new ValueParameter<IntValue>(param.Key + "Length", realConfig.Length);
215          var b = new ValueParameter<DoubleMatrix>(param.Key + "Bounds", realConfig.Bounds);
216          DynamicConfigurationParameters.Add(l);
217          DynamicConfigurationParameters.Add(b);
218
219          var creator = new UniformRandomRealVectorCreator();
220          creator.RealVectorParameter.ActualName = param.Key;
221          creator.LengthParameter.ActualName = l.Name;
222          creator.BoundsParameter.ActualName = b.Name;
223          solutionCreators.Add(creator);
224        }
225        #endregion
226        #region Configure Permutation Creator
227        var permConfig = param.Value as PermutationParameterConfiguration;
228        if (permConfig != null) {
229          var l = new ValueParameter<IntValue>(param.Key + "Length", permConfig.Length);
230          DynamicConfigurationParameters.Add(l);
231
232          var creator = new RandomPermutationCreator();
233          creator.PermutationParameter.ActualName = param.Key;
234          creator.LengthParameter.ActualName = l.Name;
235          creator.PermutationTypeParameter.Value = permConfig.Type;
236          solutionCreators.Add(creator);
237        }
238        #endregion
239      }
240
241      foreach (var param in DynamicConfigurationParameters) {
242        param.Hidden = true;
243        Parameters.Add(param);
244      }
245      return solutionCreators;
246    }
247
248    protected virtual void UpdateSingleVectorEncodingOperators(List<ISolutionCreator> solutionCreators, Configuration configuration) {
249      var newCreator = solutionCreators.Single();
250      #region Configure Operators for BinaryVectorEncoding
251      var binCreator = newCreator as IBinaryVectorCreator;
252      if (binCreator != null) {
253        var paramName = binCreator.BinaryVectorParameter.ActualName;
254        // do not replace a binary vector creator that was manually set
255        if (!(SolutionCreator is IBinaryVectorCreator) || ((IBinaryVectorCreator)SolutionCreator).BinaryVectorParameter.ActualName != paramName) {
256          Operators.Remove(SolutionCreator);
257          SolutionCreator = newCreator;
258          Operators.Add(SolutionCreator);
259        }
260
261        #region Wire BinaryVector Crossovers
262        Operators.RemoveAll(x => x is IBinaryVectorCrossover && ((IBinaryVectorCrossover)x).ChildParameter.ActualName != paramName);
263        var crossovers = ApplicationManager.Manager.GetInstances<IBinaryVectorCrossover>().ToList();
264        foreach (var xo in crossovers) {
265          xo.ChildParameter.ActualName = binCreator.BinaryVectorParameter.ActualName;
266          xo.ChildParameter.Hidden = true;
267          xo.ParentsParameter.ActualName = binCreator.BinaryVectorParameter.ActualName;
268          xo.ParentsParameter.Hidden = true;
269        }
270        Operators.AddRange(crossovers.Where(x => Operators.All(y => x.GetType() != y.GetType())));
271        #endregion
272        #region Wire BinaryVector Manipulators
273        Operators.RemoveAll(x => x is IBinaryVectorManipulator && ((IBinaryVectorManipulator)x).BinaryVectorParameter.ActualName != paramName);
274        var manipulators = ApplicationManager.Manager.GetInstances<IBinaryVectorManipulator>().ToList();
275        foreach (var m in manipulators) {
276          m.BinaryVectorParameter.ActualName = binCreator.BinaryVectorParameter.ActualName;
277          m.BinaryVectorParameter.Hidden = true;
278        }
279        Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
280        #endregion
281        #region Wire BinaryVector ShakingOperators
282        Operators.RemoveAll(x => x is IBinaryVectorMultiNeighborhoodShakingOperator && ((IBinaryVectorMultiNeighborhoodShakingOperator)x).BinaryVectorParameter.ActualName != paramName);
283        var shakingOperators = ApplicationManager.Manager.GetInstances<IBinaryVectorMultiNeighborhoodShakingOperator>().ToList();
284        foreach (var so in shakingOperators) {
285          so.BinaryVectorParameter.ActualName = paramName;
286          so.BinaryVectorParameter.Hidden = true;
287        }
288        Operators.AddRange(shakingOperators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
289        #endregion
290      } else {
291        Operators.RemoveAll(x => x is IBinaryVectorCrossover
292          || x is IBinaryVectorManipulator
293          || x is IBinaryVectorMultiNeighborhoodShakingOperator);
294      }
295      #endregion
296      #region Configure Operators for IntegerVectorEncoding
297      var intCreator = newCreator as IIntegerVectorCreator;
298      if (intCreator != null) {
299        var paramName = intCreator.IntegerVectorParameter.ActualName;
300        // do not replace an integer vector creator that was manually set
301        if (!(SolutionCreator is IIntegerVectorCreator)
302          || ((IIntegerVectorCreator)SolutionCreator).IntegerVectorParameter.ActualName != intCreator.IntegerVectorParameter.ActualName) {
303          Operators.Remove(SolutionCreator);
304          SolutionCreator = newCreator;
305          Operators.Add(SolutionCreator);
306        }
307
308        #region Wire IntegerVector Crossovers
309        Operators.RemoveAll(x => x is IIntegerVectorCrossover && ((IIntegerVectorCrossover)x).ChildParameter.ActualName != paramName);
310        var crossovers = ApplicationManager.Manager.GetInstances<IIntegerVectorCrossover>().ToList();
311        foreach (var xo in crossovers) {
312          xo.ChildParameter.ActualName = intCreator.IntegerVectorParameter.ActualName;
313          xo.ChildParameter.Hidden = true;
314          xo.ParentsParameter.ActualName = intCreator.IntegerVectorParameter.ActualName;
315          xo.ParentsParameter.Hidden = true;
316          var bx = xo as IBoundedIntegerVectorOperator;
317          if (bx != null) {
318            bx.BoundsParameter.ActualName = intCreator.BoundsParameter.ActualName;
319            bx.BoundsParameter.Hidden = true;
320          }
321        }
322        Operators.AddRange(crossovers.Where(x => Operators.All(y => x.GetType() != y.GetType())));
323        #endregion
324        #region Wire IntegerVector Manipulators
325        Operators.RemoveAll(x => x is IIntegerVectorManipulator && ((IIntegerVectorManipulator)x).IntegerVectorParameter.ActualName != paramName);
326        var manipulators = ApplicationManager.Manager.GetInstances<IIntegerVectorManipulator>().ToList();
327        foreach (var m in manipulators) {
328          m.IntegerVectorParameter.ActualName = intCreator.IntegerVectorParameter.ActualName;
329          m.IntegerVectorParameter.Hidden = true;
330          var sm = m as ISelfAdaptiveManipulator;
331          if (sm != null) {
332            var p = sm.StrategyParameterParameter as ILookupParameter;
333            if (p != null) {
334              p.ActualName = paramName + "Strategy";
335              p.Hidden = true;
336            }
337          }
338          var bm = m as IBoundedIntegerVectorOperator;
339          if (bm != null) {
340            bm.BoundsParameter.ActualName = intCreator.BoundsParameter.ActualName;
341            bm.BoundsParameter.Hidden = true;
342          }
343        }
344        Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
345        #region Wire IntegerVector StrategyParameters for SelfAdaptiveManipulators
346        Operators.RemoveAll(x => x is IStrategyParameterCreator && !(x is IIntegerVectorStdDevStrategyParameterCreator) || x is IIntegerVectorStdDevStrategyParameterCreator && ((IIntegerVectorStdDevStrategyParameterCreator)x).StrategyParameterParameter.ActualName != paramName + "Strategy");
347        Operators.RemoveAll(x => x is IStrategyParameterManipulator && !(x is IIntegerVectorStdDevStrategyParameterManipulator) || x is IIntegerVectorStdDevStrategyParameterManipulator && ((IIntegerVectorStdDevStrategyParameterManipulator)x).StrategyParameterParameter.ActualName != paramName + "Strategy");
348        Operators.RemoveAll(x => x is IStrategyParameterCrossover && !(x is IIntegerVectorStdDevStrategyParameterCrossover) || x is IIntegerVectorStdDevStrategyParameterCrossover && ((IIntegerVectorStdDevStrategyParameterCrossover)x).StrategyParameterParameter.ActualName != paramName + "Strategy");
349        var strategyOperators = ApplicationManager.Manager.GetInstances<IIntegerVectorStdDevStrategyParameterOperator>().ToList();
350        if (!(configuration.Parameters.First().Value is IntegerParameterConfiguration)) throw new InvalidOperationException("Single-encoded problem with integervector creator that is not an integer-coded problem.");
351        var problemSize = ((IntegerParameterConfiguration)configuration.Parameters.First().Value).Length.Value;
352        var b = ((IntegerParameterConfiguration)configuration.Parameters.First().Value).Bounds;
353        var bounds = new DoubleMatrix(b.Rows, b.Columns);
354        for (var i = 0; i < bounds.Rows; i++) {
355          bounds[i, 1] = (int)Math.Ceiling(0.33 * (b[i, 1] - b[i, 0]));
356          bounds[i, 0] = 0;
357          if (bounds.Columns > 2) bounds[i, 2] = b[i, 2];
358        }
359        foreach (var s in strategyOperators) {
360          var c = s as IIntegerVectorStdDevStrategyParameterCreator;
361          if (c != null) {
362            c.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
363            c.LengthParameter.ActualName = intCreator.LengthParameter.ActualName;
364            c.StrategyParameterParameter.ActualName = paramName + "Strategy";
365          }
366          var m = s as IIntegerVectorStdDevStrategyParameterManipulator;
367          if (m != null) {
368            m.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
369            m.StrategyParameterParameter.ActualName = paramName + "Strategy";
370          }
371          var mm = s as Encodings.IntegerVectorEncoding.StdDevStrategyVectorManipulator;
372          if (mm != null) {
373            mm.GeneralLearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * problemSize));
374            mm.LearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Math.Sqrt(problemSize)));
375          }
376          var x = s as IIntegerVectorStdDevStrategyParameterCrossover;
377          if (x != null) {
378            x.ParentsParameter.ActualName = paramName + "Strategy";
379            x.StrategyParameterParameter.ActualName = paramName + "Strategy";
380          }
381        }
382        Operators.AddRange(strategyOperators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
383        #endregion
384        #endregion
385        #region Wire IntegerVector ShakingOperators
386        Operators.RemoveAll(x => x is IIntegerVectorMultiNeighborhoodShakingOperator && ((IIntegerVectorMultiNeighborhoodShakingOperator)x).IntegerVectorParameter.ActualName != paramName);
387        var shakingOperators = ApplicationManager.Manager.GetInstances<IIntegerVectorMultiNeighborhoodShakingOperator>().ToList();
388        foreach (var so in shakingOperators) {
389          so.IntegerVectorParameter.ActualName = paramName;
390          so.IntegerVectorParameter.Hidden = true;
391        }
392        Operators.AddRange(shakingOperators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
393        #endregion
394      } else {
395        Operators.RemoveAll(x => x is IIntegerVectorCrossover
396          || x is IIntegerVectorManipulator
397          || x is IIntegerVectorStdDevStrategyParameterOperator
398          || x is IIntegerVectorMultiNeighborhoodShakingOperator);
399      }
400      #endregion
401      #region Configure Operators for RealVectorEncoding
402      var realCreator = newCreator as IRealVectorCreator;
403      if (realCreator != null) {
404        var paramName = realCreator.RealVectorParameter.ActualName;
405        // do not replace a real vector creator that was manually set
406        if (!(SolutionCreator is IRealVectorCreator)
407            || ((IRealVectorCreator)SolutionCreator).RealVectorParameter.ActualName != realCreator.RealVectorParameter.ActualName) {
408          Operators.Remove(SolutionCreator);
409          SolutionCreator = newCreator;
410          Operators.Add(SolutionCreator);
411        }
412
413        #region Wire RealVector Crossovers
414        Operators.RemoveAll(x => x is IRealVectorCrossover && ((IRealVectorCrossover)x).ChildParameter.ActualName != paramName);
415        var crossovers = ApplicationManager.Manager.GetInstances<IRealVectorCrossover>().ToList();
416        foreach (var xo in crossovers) {
417          xo.ChildParameter.ActualName = paramName;
418          xo.ChildParameter.Hidden = true;
419          xo.ParentsParameter.ActualName = paramName;
420          xo.ParentsParameter.Hidden = true;
421          xo.BoundsParameter.ActualName = realCreator.BoundsParameter.ActualName;
422          xo.BoundsParameter.Hidden = true;
423        }
424        Operators.AddRange(crossovers.Where(x => Operators.All(y => x.GetType() != y.GetType())));
425        #endregion
426        #region Wire RealVector Manipulators
427        Operators.RemoveAll(x => x is IRealVectorManipulator && ((IRealVectorManipulator)x).RealVectorParameter.ActualName != paramName);
428        var manipulators = ApplicationManager.Manager.GetInstances<IRealVectorManipulator>().ToList();
429        foreach (var m in manipulators) {
430          m.RealVectorParameter.ActualName = paramName;
431          m.RealVectorParameter.Hidden = true;
432          m.BoundsParameter.ActualName = realCreator.BoundsParameter.ActualName;
433          m.BoundsParameter.Hidden = true;
434          var sm = m as ISelfAdaptiveManipulator;
435          if (sm != null) {
436            var p = sm.StrategyParameterParameter as ILookupParameter;
437            if (p != null) {
438              p.ActualName = paramName + "Strategy";
439              p.Hidden = true;
440            }
441          }
442        }
443        Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
444        #region Wire RealVector Strategy Parameters for SelfAdaptiveManipulators
445
446        Operators.RemoveAll(x => x is IStrategyParameterCreator && !(x is IRealVectorStdDevStrategyParameterCreator) || x is IRealVectorStdDevStrategyParameterCreator && ((IRealVectorStdDevStrategyParameterCreator)x).StrategyParameterParameter.ActualName != paramName + "Strategy");
447        Operators.RemoveAll(x => x is IStrategyParameterManipulator && !(x is IRealVectorStdDevStrategyParameterManipulator) || x is IRealVectorStdDevStrategyParameterManipulator && ((IRealVectorStdDevStrategyParameterManipulator)x).StrategyParameterParameter.ActualName != paramName + "Strategy");
448        Operators.RemoveAll(x => x is IStrategyParameterCrossover && !(x is IRealVectorStdDevStrategyParameterCrossover) || x is IRealVectorStdDevStrategyParameterCrossover && ((IRealVectorStdDevStrategyParameterCrossover)x).StrategyParameterParameter.ActualName != paramName + "Strategy");
449        var strategyOperators = ApplicationManager.Manager.GetInstances<IRealVectorStdDevStrategyParameterOperator>().ToList();
450        if (!(configuration.Parameters.First().Value is RealParameterConfiguration)) throw new InvalidOperationException("Single-encoded problem with realvector creator that is not a real-coded problem.");
451        var problemSize = ((RealParameterConfiguration)configuration.Parameters.First().Value).Length.Value;
452        var bounds = (DoubleMatrix)((RealParameterConfiguration)configuration.Parameters.First().Value).Bounds.Clone();
453        for (var i = 0; i < bounds.Rows; i++) {
454          bounds[i, 1] = 0.1 * (bounds[i, 1] - bounds[i, 0]);
455          bounds[i, 0] = 0;
456        }
457        foreach (var s in strategyOperators) {
458          var c = s as IRealVectorStdDevStrategyParameterCreator;
459          if (c != null) {
460            c.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
461            c.LengthParameter.ActualName = realCreator.LengthParameter.ActualName;
462            c.StrategyParameterParameter.ActualName = paramName + "Strategy";
463          }
464          var m = s as IRealVectorStdDevStrategyParameterManipulator;
465          if (m != null) {
466            m.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
467            m.StrategyParameterParameter.ActualName = paramName + "Strategy";
468          }
469          var mm = s as Encodings.RealVectorEncoding.StdDevStrategyVectorManipulator;
470          if (mm != null) {
471            mm.GeneralLearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * problemSize));
472            mm.LearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Math.Sqrt(problemSize)));
473          }
474          var x = s as IRealVectorStdDevStrategyParameterCrossover;
475          if (x != null) {
476            x.ParentsParameter.ActualName = paramName + "Strategy";
477            x.StrategyParameterParameter.ActualName = paramName + "Strategy";
478          }
479        }
480        Operators.AddRange(strategyOperators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
481        #endregion
482        #endregion
483        #region Wire RealVector ParticleCreators
484        Operators.RemoveAll(x => x is IRealVectorParticleCreator && ((IRealVectorParticleCreator)x).RealVectorParameter.ActualName != paramName);
485        var particleCreators = ApplicationManager.Manager.GetInstances<IRealVectorParticleCreator>().ToList();
486        foreach (var pc in particleCreators) {
487          pc.RealVectorParameter.ActualName = paramName;
488          pc.RealVectorParameter.Hidden = true;
489          pc.BoundsParameter.ActualName = realCreator.BoundsParameter.ActualName;
490          pc.BoundsParameter.Hidden = true;
491          pc.ProblemSizeParameter.ActualName = realCreator.LengthParameter.ActualName;
492          pc.ProblemSizeParameter.Hidden = true;
493        }
494        Operators.AddRange(particleCreators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
495        #endregion
496        #region Wire RealVector ParticleUpdaters
497        Operators.RemoveAll(x => x is IRealVectorParticleUpdater && ((IRealVectorParticleUpdater)x).RealVectorParameter.ActualName != paramName);
498        var particleUpdaters = ApplicationManager.Manager.GetInstances<IRealVectorParticleUpdater>().ToList();
499        foreach (var pu in particleUpdaters) {
500          pu.RealVectorParameter.ActualName = paramName;
501          pu.RealVectorParameter.Hidden = true;
502          pu.BoundsParameter.ActualName = realCreator.BoundsParameter.ActualName;
503          pu.BoundsParameter.Hidden = true;
504        }
505        Operators.AddRange(particleUpdaters.Where(x => Operators.All(y => x.GetType() != y.GetType())));
506        #endregion
507        #region Wire RealVector SwarmUpdaters
508        Operators.RemoveAll(x => x is IRealVectorSwarmUpdater && ((IRealVectorSwarmUpdater)x).RealVectorParameter.ActualName != paramName);
509        var swarmUpdaters = ApplicationManager.Manager.GetInstances<IRealVectorSwarmUpdater>().ToList();
510        foreach (var su in swarmUpdaters) {
511          su.RealVectorParameter.ActualName = paramName;
512          su.RealVectorParameter.Hidden = true;
513          su.MaximizationParameter.ActualName = MaximizationParameter.Name;
514          su.MaximizationParameter.Hidden = true;
515        }
516        Operators.AddRange(swarmUpdaters.Where(x => Operators.All(y => x.GetType() != y.GetType())));
517        #endregion
518        #region Wire RealVector ShakingOperators
519        Operators.RemoveAll(x => x is IRealVectorMultiNeighborhoodShakingOperator && ((IRealVectorMultiNeighborhoodShakingOperator)x).RealVectorParameter.ActualName != paramName);
520        var shakingOperators = ApplicationManager.Manager.GetInstances<IRealVectorMultiNeighborhoodShakingOperator>().ToList();
521        foreach (var so in shakingOperators) {
522          so.RealVectorParameter.ActualName = paramName;
523          so.RealVectorParameter.Hidden = true;
524        }
525        Operators.AddRange(shakingOperators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
526        #endregion
527      } else {
528        Operators.RemoveAll(x => x is IRealVectorCrossover
529          || x is IRealVectorManipulator
530          || x is IRealVectorStdDevStrategyParameterOperator
531          || x is IRealVectorParticleCreator
532          || x is IRealVectorParticleUpdater
533          || x is IRealVectorSwarmUpdater
534          || x is IRealVectorMultiNeighborhoodShakingOperator);
535      }
536      #endregion
537      #region Configure Operators for PermutationEncoding
538      var permCreator = newCreator as IPermutationCreator;
539      if (permCreator != null) {
540        var paramName = permCreator.PermutationParameter.ActualName;
541        // do not replace a permutation creator that was manually set
542        if (!(SolutionCreator is IPermutationCreator)
543            || ((IPermutationCreator)SolutionCreator).PermutationParameter.ActualName != permCreator.PermutationParameter.ActualName) {
544          Operators.Remove(SolutionCreator);
545          SolutionCreator = newCreator;
546          Operators.Add(SolutionCreator);
547        }
548
549        #region Wire Permutation Crossovers
550        Operators.RemoveAll(x => x is IPermutationCrossover && ((IPermutationCrossover)x).ChildParameter.ActualName != paramName);
551        var crossovers = ApplicationManager.Manager.GetInstances<IPermutationCrossover>().ToList();
552        foreach (var xo in crossovers) {
553          xo.ChildParameter.ActualName = permCreator.PermutationParameter.ActualName;
554          xo.ChildParameter.Hidden = true;
555          xo.ParentsParameter.ActualName = permCreator.PermutationParameter.ActualName;
556          xo.ParentsParameter.Hidden = true;
557        }
558        Operators.AddRange(crossovers.Where(x => Operators.All(y => x.GetType() != y.GetType())));
559        #endregion
560        #region Wire Permutation Manipulators
561        Operators.RemoveAll(x => x is IPermutationManipulator && ((IPermutationManipulator)x).PermutationParameter.ActualName != paramName);
562        var manipulators = ApplicationManager.Manager.GetInstances<IPermutationManipulator>().ToList();
563        foreach (var m in manipulators) {
564          m.PermutationParameter.ActualName = permCreator.PermutationParameter.ActualName;
565          m.PermutationParameter.Hidden = true;
566        }
567        Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
568        #endregion
569        #region Wire ShakingOperators
570        Operators.RemoveAll(x => x is IPermutationMultiNeighborhoodShakingOperator && ((IPermutationMultiNeighborhoodShakingOperator)x).PermutationParameter.ActualName != paramName);
571        var shakingOperators = ApplicationManager.Manager.GetInstances<IPermutationMultiNeighborhoodShakingOperator>().ToList();
572        foreach (var op in shakingOperators) {
573          op.PermutationParameter.ActualName = paramName;
574          op.PermutationParameter.Hidden = true;
575        }
576        Operators.AddRange(shakingOperators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
577        #endregion
578      } else {
579        Operators.RemoveAll(x => x is IPermutationCrossover
580          || x is IPermutationManipulator
581          || x is IPermutationMultiNeighborhoodShakingOperator);
582      }
583      #endregion
584    }
585
586    protected virtual void UpdateMultiVectorEncodingOperators(List<ISolutionCreator> solutionCreators, Configuration configuration) {
587      var oldCreator = SolutionCreator as ParameterVectorCreater;
588      var newCreator = new ParameterVectorCreater();
589
590      #region Configure BinaryVector Creator
591      var newBinParams = new HashSet<string>(solutionCreators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName));
592      if (oldCreator != null) {
593        // we want to reuse the old creator
594        var oldParams = new HashSet<string>(oldCreator.Operators.OfType<IBinaryVectorCreator>()
595          .Select(x => x.BinaryVectorParameter.ActualName));
596        foreach (var toAdd in newBinParams.Except(oldParams)) {
597          var paramName = toAdd;
598          oldCreator.Operators.Add(
599            solutionCreators.OfType<IBinaryVectorCreator>().Single(x => x.BinaryVectorParameter.ActualName == paramName));
600        }
601        foreach (var toRemove in oldParams.Except(newBinParams)) {
602          var paramName = toRemove;
603          var op =
604            oldCreator.Operators.OfType<IBinaryVectorCreator>()
605              .SingleOrDefault(x => x.BinaryVectorParameter.ActualName == paramName);
606          if (op != null) oldCreator.Operators.Remove(op);
607        }
608      } else {
609        // we will use the new creator
610        foreach (var binCreator in solutionCreators.OfType<IBinaryVectorCreator>()) {
611          newCreator.Operators.Add(binCreator);
612        }
613      }
614      #endregion
615      #region Configure IntegerVector Creator
616      var newIntParams = new HashSet<string>(solutionCreators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName));
617      if (oldCreator != null) {
618        // we want to reuse the old creator
619        var oldParams = new HashSet<string>(oldCreator
620          .Operators.OfType<IIntegerVectorCreator>()
621          .Select(x => x.IntegerVectorParameter.ActualName));
622        foreach (var toAdd in newIntParams.Except(oldParams)) {
623          var paramName = toAdd;
624          oldCreator.Operators.Add(
625            solutionCreators.OfType<IIntegerVectorCreator>().Single(x => x.IntegerVectorParameter.ActualName == paramName));
626        }
627        foreach (var toRemove in oldParams.Except(newIntParams)) {
628          var paramName = toRemove;
629          var op =
630            oldCreator.Operators.OfType<IIntegerVectorCreator>()
631              .SingleOrDefault(x => x.IntegerVectorParameter.ActualName == paramName);
632          if (op != null) oldCreator.Operators.Remove(op);
633        }
634      } else {
635        // we will use the new creator
636        foreach (var intCreator in solutionCreators.OfType<IIntegerVectorCreator>()) {
637          newCreator.Operators.Add(intCreator);
638        }
639      }
640      #endregion
641      #region Configure RealVector Creator
642      var newRealParams = new HashSet<string>(solutionCreators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName));
643      if (oldCreator != null) {
644        // we want to reuse the old creator
645        var oldParams = new HashSet<string>(oldCreator
646          .Operators.OfType<IRealVectorCreator>()
647          .Select(x => x.RealVectorParameter.ActualName));
648        foreach (var toAdd in newRealParams.Except(oldParams)) {
649          var paramName = toAdd;
650          oldCreator.Operators.Add(
651            solutionCreators.OfType<IRealVectorCreator>().Single(x => x.RealVectorParameter.ActualName == paramName));
652        }
653        foreach (var toRemove in oldParams.Except(newRealParams)) {
654          var paramName = toRemove;
655          var op =
656            oldCreator.Operators.OfType<IRealVectorCreator>()
657              .SingleOrDefault(x => x.RealVectorParameter.ActualName == paramName);
658          if (op != null) oldCreator.Operators.Remove(op);
659        }
660      } else {
661        // we will use the new creator
662        foreach (var realCreator in solutionCreators.OfType<IRealVectorCreator>()) {
663          newCreator.Operators.Add(realCreator);
664        }
665      }
666      #endregion
667      #region Configure Permutation Creator
668      var newPermParams = new HashSet<string>(solutionCreators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName));
669      if (oldCreator != null) {
670        // we want to reuse the old creator
671        var oldParams = new HashSet<string>(oldCreator
672          .Operators.OfType<IPermutationCreator>()
673          .Select(x => x.PermutationParameter.ActualName));
674        foreach (var toAdd in newPermParams.Except(oldParams)) {
675          var paramName = toAdd;
676          oldCreator.Operators.Add(
677            solutionCreators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == paramName));
678        }
679        foreach (var toRemove in oldParams.Except(newPermParams)) {
680          var paramName = toRemove;
681          var op =
682            oldCreator.Operators.OfType<IPermutationCreator>()
683              .SingleOrDefault(x => x.PermutationParameter.ActualName == paramName);
684          if (op != null) oldCreator.Operators.Remove(op);
685        }
686        // we also have to sync the permutation type (in case this changes, as it is a value parameter)
687        foreach (var intersect in newPermParams.Intersect(oldParams)) {
688          var paramName = intersect;
689          var oldPermCreator = oldCreator.Operators.OfType<IPermutationCreator>()
690            .Single(x => x.PermutationParameter.ActualName == paramName);
691          var newPermCreator = solutionCreators.OfType<IPermutationCreator>()
692            .Single(x => x.PermutationParameter.ActualName == paramName);
693          oldPermCreator.PermutationTypeParameter.Value = newPermCreator.PermutationTypeParameter.Value;
694        }
695      } else {
696        // we will use the new creator
697        foreach (var permCreator in solutionCreators.OfType<IPermutationCreator>()) {
698          newCreator.Operators.Add(permCreator);
699        }
700      }
701      #endregion
702
703      if (oldCreator == null) SolutionCreator = newCreator;
704
705      // crossover and manipulator for multi-vector encoding
706      // the condition checks if a multi-vector encoding is to be updated (there already exists ParameterVectorCrossover and ParameterVectorManipulator)
707      if (Operators.OfType<ParameterVectorCrossover>().Any() && Operators.OfType<ParameterVectorManipulator>().Any()) {
708        #region Update existing multi-vector encoding
709        #region Update ParameterVector Crossover ...
710        foreach (var oldXo in Operators.OfType<ParameterVectorCrossover>()) {
711          #region ... for binary parameters
712          var oldBinParams = new HashSet<string>(oldXo.Operators.OfType<IBinaryVectorCrossover>()
713            .Select(x => x.ChildParameter.ActualName));
714          foreach (var toAdd in newBinParams.Except(oldBinParams))
715            oldXo.Operators.Add(GetDefaultBinaryCrossover(toAdd, configuration));
716          foreach (var toRemove in oldBinParams.Except(newBinParams)) {
717            var op =
718              oldXo.Operators.OfType<IBinaryVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
719            if (op != null) oldXo.Operators.Remove(op);
720          }
721          #endregion
722          #region ... for integer parameters
723          var oldIntParams = new HashSet<string>(oldXo.Operators.OfType<IIntegerVectorCrossover>()
724            .Select(x => x.ChildParameter.ActualName));
725          foreach (var toAdd in newIntParams.Except(oldIntParams))
726            oldXo.Operators.Add(GetDefaultIntegerCrossover(toAdd, configuration));
727          foreach (var toRemove in oldIntParams.Except(newIntParams)) {
728            var op =
729              oldXo.Operators.OfType<IIntegerVectorCrossover>()
730                .SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
731            if (op != null) oldXo.Operators.Remove(op);
732          }
733          #endregion
734          #region ... for real parameters
735          var oldRealParams = new HashSet<string>(oldXo.Operators.OfType<IRealVectorCrossover>()
736            .Select(x => x.ChildParameter.ActualName));
737          foreach (var toAdd in newRealParams.Except(oldRealParams))
738            oldXo.Operators.Add(GetDefaultRealCrossover(toAdd, configuration));
739          foreach (var toRemove in oldRealParams.Except(newRealParams)) {
740            var op =
741              oldXo.Operators.OfType<IRealVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
742            if (op != null) oldXo.Operators.Remove(op);
743          }
744          #endregion
745          #region ... for permutation parameters
746          var oldPermParams = new HashSet<string>(oldXo.Operators.OfType<IPermutationCrossover>()
747            .Select(x => x.ChildParameter.ActualName));
748          foreach (var toAdd in newPermParams.Except(oldPermParams))
749            oldXo.Operators.Add(GetDefaultPermutationCrossover(toAdd, configuration));
750          foreach (var toRemove in oldPermParams.Except(newPermParams)) {
751            var op =
752              oldXo.Operators.OfType<IPermutationCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
753            if (op != null) oldXo.Operators.Remove(op);
754          }
755          #endregion
756        }
757        #endregion
758        #region Update ParameterVector Manipulator ...
759        foreach (var oldM in Operators.OfType<ParameterVectorManipulator>()) {
760          #region ... for binary parameters
761          var oldBinParams = new HashSet<string>(oldM.Operators.OfType<IBinaryVectorManipulator>()
762            .Select(x => x.BinaryVectorParameter.ActualName));
763          foreach (var toAdd in newBinParams.Except(oldBinParams))
764            oldM.Operators.Add(GetDefaultBinaryManipulator(toAdd, configuration));
765          foreach (var toRemove in oldBinParams.Except(newBinParams)) {
766            var op =
767              oldM.Operators.OfType<IBinaryVectorManipulator>()
768                .SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove);
769            if (op != null) oldM.Operators.Remove(op);
770          }
771          #endregion
772          #region ... for integer parameters
773          var oldIntParams = new HashSet<string>(oldM.Operators.OfType<IIntegerVectorManipulator>()
774            .Select(x => x.IntegerVectorParameter.ActualName));
775          foreach (var toAdd in newIntParams.Except(oldIntParams))
776            oldM.Operators.Add(GetDefaultIntegerManipulator(toAdd, configuration));
777          foreach (var toRemove in oldIntParams.Except(newIntParams)) {
778            var op =
779              oldM.Operators.OfType<IIntegerVectorManipulator>()
780                .SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove);
781            if (op != null) oldM.Operators.Remove(op);
782          }
783          #endregion
784          #region ... for real parameters
785          var oldRealParams = new HashSet<string>(oldM.Operators.OfType<IRealVectorManipulator>()
786            .Select(x => x.RealVectorParameter.ActualName));
787          foreach (var toAdd in newRealParams.Except(oldRealParams))
788            oldM.Operators.Add(GetDefaultRealManipulator(toAdd, configuration));
789          foreach (var toRemove in oldRealParams.Except(newRealParams)) {
790            var op =
791              oldM.Operators.OfType<IRealVectorManipulator>()
792                .SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove);
793            if (op != null) oldM.Operators.Remove(op);
794          }
795          #endregion
796          #region ... for permutation parameters
797          var oldPermParams = new HashSet<string>(oldM.Operators.OfType<IPermutationManipulator>()
798            .Select(x => x.PermutationParameter.ActualName));
799          foreach (var toAdd in newPermParams.Except(oldPermParams))
800            oldM.Operators.Add(GetDefaultPermutationManipulator(toAdd, configuration));
801          foreach (var toRemove in oldPermParams.Except(newPermParams)) {
802            var op =
803              oldM.Operators.OfType<IPermutationManipulator>()
804                .SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove);
805            if (op != null) oldM.Operators.Remove(op);
806          }
807          #endregion
808        }
809        #endregion
810        #endregion
811      } else {
812        #region Handle transition from single-vector to multi-vector encoding
813        Operators.RemoveAll(x => x is ICrossover);
814        Operators.RemoveAll(x => x is IManipulator);
815        Operators.RemoveAll(x => x is IStrategyParameterCreator || x is IStrategyParameterManipulator || x is IStrategyParameterCrossover);
816        Operators.RemoveAll(x => x is IParticleCreator);
817        Operators.RemoveAll(x => x is IParticleUpdater);
818        Operators.RemoveAll(x => x is ISwarmUpdater);
819        Operators.RemoveAll(x => x is IMultiNeighborhoodShakingOperator);
820
821        var crossover = new ParameterVectorCrossover();
822        var manipulator = new ParameterVectorManipulator();
823        foreach (var param in configuration.Parameters) {
824          if (param.Value is BinaryParameterConfiguration) {
825            crossover.Operators.Add(GetDefaultBinaryCrossover(param.Key, configuration));
826            manipulator.Operators.Add(GetDefaultBinaryManipulator(param.Key, configuration));
827            continue;
828          }
829          var intConfig = param.Value as IntegerParameterConfiguration;
830          if (intConfig != null) {
831            crossover.Operators.Add(GetDefaultIntegerCrossover(param.Key, configuration));
832            manipulator.Operators.Add(GetDefaultIntegerManipulator(param.Key, configuration));
833            continue;
834          }
835          var realConfig = param.Value as RealParameterConfiguration;
836          if (realConfig != null) {
837            crossover.Operators.Add(GetDefaultRealCrossover(param.Key, configuration));
838            manipulator.Operators.Add(GetDefaultRealManipulator(param.Key, configuration));
839            continue;
840          }
841          var permConfig = param.Value as PermutationParameterConfiguration;
842          if (permConfig != null) {
843            crossover.Operators.Add(GetDefaultPermutationCrossover(param.Key, configuration));
844            manipulator.Operators.Add(GetDefaultPermutationManipulator(param.Key, configuration));
845            continue;
846          }
847          throw new InvalidOperationException("Unknown type for parameter " + param.Key);
848        }
849        Operators.Add(crossover);
850        Operators.Add(manipulator);
851        #endregion
852      }
853    }
854
855    protected virtual void UpdateImprovementOperators() {
856      if (!Operators.Any(x => x is SingleObjectiveParameterVectorImprover))
857        Operators.Add(new SingleObjectiveParameterVectorImprover());
858      foreach (var improver in Operators.OfType<SingleObjectiveParameterVectorImprover>()) {
859        improver.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
860        improver.MaximizationParameter.ActualName = MaximizationParameter.Name;
861        improver.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
862        improver.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
863      }
864    }
865
866    protected virtual void UpdateMoveOperators() {
867      if (!Operators.Any(x => x is ParameterVectorMoveGenerator))
868        Operators.Add(new ParameterVectorMoveGenerator());
869      if (!Operators.Any(x => x is ParameterVectorMoveEvaluator))
870        Operators.Add(new ParameterVectorMoveEvaluator());
871      if (!Operators.Any(x => x is ParameterVectorMoveMaker))
872        Operators.Add(new ParameterVectorMoveMaker());
873
874      foreach (var generator in Operators.OfType<ParameterVectorMoveGenerator>()) {
875        generator.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
876        generator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
877      }
878      foreach (var evaluator in Operators.OfType<ParameterVectorMoveEvaluator>()) {
879        evaluator.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
880        evaluator.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
881        evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
882      }
883      foreach (var maker in Operators.OfType<ParameterVectorMoveMaker>()) {
884        maker.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
885        maker.MoveQualityParameter.ActualName = Operators.OfType<ParameterVectorMoveEvaluator>().First().MoveQualityParameter.ActualName;
886        maker.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
887      }
888    }
889
890    #region GetDefaultOperators for Crossovers and Manipulators
891    // ReSharper disable RedundantNameQualifier
892    protected virtual IBinaryVectorCrossover GetDefaultBinaryCrossover(string paramName, Configuration config) {
893      var binConfig = (BinaryParameterConfiguration)config.Parameters[paramName];
894      IBinaryVectorCrossover binXo;
895      if (binConfig.Length.Value > 3) binXo = new Encodings.BinaryVectorEncoding.SinglePointCrossover();
896      else binXo = new Encodings.BinaryVectorEncoding.UniformCrossover();
897      binXo.ChildParameter.ActualName = paramName;
898      binXo.ParentsParameter.ActualName = paramName;
899      return binXo;
900    }
901
902    protected virtual IBinaryVectorManipulator GetDefaultBinaryManipulator(string paramName, Configuration config) {
903      var binM = new Encodings.BinaryVectorEncoding.SomePositionsBitflipManipulator();
904      binM.BinaryVectorParameter.ActualName = paramName;
905      binM.MutationProbabilityParameter.Value = new DoubleValue(0.1);
906      return binM;
907    }
908
909    protected virtual IIntegerVectorCrossover GetDefaultIntegerCrossover(string paramName, Configuration config) {
910      var intXo = new Encodings.IntegerVectorEncoding.RoundedBlendAlphaBetaCrossover();
911      intXo.ChildParameter.ActualName = paramName;
912      intXo.ParentsParameter.ActualName = paramName;
913      intXo.BoundsParameter.ActualName = paramName + "Bounds";
914      intXo.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
915      intXo.MaximizationParameter.ActualName = MaximizationParameter.Name;
916      return intXo;
917    }
918
919    protected virtual IIntegerVectorManipulator GetDefaultIntegerManipulator(string paramName, Configuration configuration) {
920      var intM = new Encodings.IntegerVectorEncoding.UniformSomePositionsManipulator();
921      intM.IntegerVectorParameter.ActualName = paramName;
922      intM.BoundsParameter.ActualName = paramName + "Bounds";
923      intM.ProbabilityParameter.Value = new DoubleValue(0.1);
924      return intM;
925    }
926
927    protected virtual IRealVectorCrossover GetDefaultRealCrossover(string paramName, Configuration configuration) {
928      var realXo = new Encodings.RealVectorEncoding.BlendAlphaBetaCrossover();
929      realXo.ChildParameter.ActualName = paramName;
930      realXo.ParentsParameter.ActualName = paramName;
931      realXo.BoundsParameter.ActualName = paramName + "Bounds";
932      realXo.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
933      realXo.MaximizationParameter.ActualName = MaximizationParameter.Name;
934      return realXo;
935    }
936
937    protected virtual IRealVectorManipulator GetDefaultRealManipulator(string paramName, Configuration configuration) {
938      var realM = new Encodings.RealVectorEncoding.BreederGeneticAlgorithmManipulator();
939      realM.RealVectorParameter.ActualName = paramName;
940      realM.BoundsParameter.ActualName = paramName + "Bounds";
941      return realM;
942    }
943
944    protected virtual IPermutationCrossover GetDefaultPermutationCrossover(string paramName, Configuration configuration) {
945      var permXo = new Encodings.PermutationEncoding.PartiallyMatchedCrossover();
946      permXo.ChildParameter.ActualName = paramName;
947      permXo.ParentsParameter.ActualName = paramName;
948      return permXo;
949    }
950
951    protected virtual IPermutationManipulator GetDefaultPermutationManipulator(string paramName, Configuration configuration) {
952      var permM = new Encodings.PermutationEncoding.Swap2Manipulator();
953      permM.PermutationParameter.ActualName = paramName;
954      return permM;
955    }
956    // ReSharper restore RedundantNameQualifier
957    #endregion
958  }
959}
Note: See TracBrowser for help on using the repository browser.