Free cookie consent management tool by TermsFeed Policy Generator

source: branches/SimSharp/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs @ 11363

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

#2174:

  • Removed SimSharp reference (not the purpose of this branch anymore)
  • Fixed bugs regarding parameter names when no parameter have been defined
  • Added a method to the problem definition to retrieve a neighborhood solution
    • Programmable problem now works with LocalSearch and SimulatedAnnealing
File size: 34.0 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<SingleObjectiveScript> ScriptParameter {
58      get { return (IValueParameter<SingleObjectiveScript>)Parameters["Script"]; }
59    }
60
61    public IValueParameter<Configuration> ConfigurationParameter {
62      get { return (IValueParameter<Configuration>)Parameters["Configuration"]; }
63    }
64
65    [Storable]
66    protected List<IParameter> DynamicConfigurationParameters;
67
68    [StorableConstructor]
69    protected SingleObjectiveProgrammableProblem(bool deserializing) : base(deserializing) { }
70
71    protected SingleObjectiveProgrammableProblem(SingleObjectiveProgrammableProblem original, Cloner cloner)
72      : base(original, cloner) {
73      DynamicConfigurationParameters = original.DynamicConfigurationParameters.Select(cloner.Clone).ToList();
74      RegisterEventHandlers();
75    }
76    public SingleObjectiveProgrammableProblem()
77      : base(new SingleObjectiveEvaluator(), new ParameterVectorCreater()) {
78      Parameters.Add(new ValueParameter<SingleObjectiveScript>("Script", "Defines the problem.", new SingleObjectiveScript() { Name = Name }));
79      Parameters.Add(new ValueParameter<Configuration>("Configuration", "Describes which parameters exist, what they're called, what type they are and their bounds if any."));
80
81      DynamicConfigurationParameters = new List<IParameter>();
82
83      Operators.Add(new BestScopeSolutionAnalyzer());
84      Operators.Add(Evaluator);
85      Operators.Add(SolutionCreator);
86
87      RegisterEventHandlers();
88    }
89
90    public override IDeepCloneable Clone(Cloner cloner) {
91      return new SingleObjectiveProgrammableProblem(this, cloner);
92    }
93
94    [StorableHook(HookType.AfterDeserialization)]
95    // ReSharper disable UnusedMember.Local
96    private void AfterDeserialization() {
97      RegisterEventHandlers();
98    }
99    // ReSharper restore UnusedMember.Local
100
101    private void RegisterEventHandlers() {
102      ScriptParameter.ValueChanged += ScriptParameterOnValueChanged;
103      RegisterScriptInstanceChanges();
104    }
105
106    private void ScriptParameterOnValueChanged(object sender, EventArgs eventArgs) {
107      RegisterScriptInstanceChanges();
108    }
109
110    private void RegisterScriptInstanceChanges() {
111      ScriptParameter.Value.InstanceChanged += ScriptOnInstanceChanged;
112      ScriptParameter.Value.NameChanged += ScriptOnNameChanged;
113    }
114
115    private void ScriptOnNameChanged(object sender, EventArgs eventArgs) {
116      if (sender != ScriptParameter.Value) return;
117      Name = ScriptParameter.Value.Name;
118    }
119
120    protected override void OnNameChanged() {
121      base.OnNameChanged();
122      ScriptParameter.Value.Name = Name;
123    }
124
125    protected virtual void ScriptOnInstanceChanged(object sender, EventArgs eventArgs) {
126      var instance = ScriptParameter.Value.Instance;
127      if (instance == null) return;
128
129      var configuration = instance.GetConfiguration();
130      ConfigurationParameter.Value = configuration;
131      Maximization.Value = instance.IsMaximizationProblem;
132
133      var solutionCreators = UpdateDynamicConfigurationParameters(configuration);
134
135      if (solutionCreators.Count == 1) {
136        UpdateSingleVectorEncodingOperators(solutionCreators);
137      } else {
138        UpdateMultiVectorEncodingOperators(solutionCreators, configuration);
139      }
140      UpdateMoveOperators();
141    }
142
143    protected virtual List<ISolutionCreator> UpdateDynamicConfigurationParameters(Configuration configuration) {
144      foreach (var param in DynamicConfigurationParameters)
145        if (Parameters.Contains(param)) Parameters.Remove(param);
146      DynamicConfigurationParameters.Clear();
147
148      var solutionCreators = new List<ISolutionCreator>();
149      foreach (var param in configuration.Parameters) {
150        /*
151         * Binary Vectors
152         */
153        var binConfig = param.Value as BinaryParameterConfiguration;
154        if (binConfig != null) {
155          var p = new ValueParameter<IntValue>(param.Key + "Length", binConfig.Length);
156          DynamicConfigurationParameters.Add(p);
157
158          var creator = new RandomBinaryVectorCreator();
159          creator.BinaryVectorParameter.ActualName = param.Key;
160          creator.LengthParameter.ActualName = p.Name;
161          solutionCreators.Add(creator);
162        }
163        /*
164         * Integer Vectors
165         */
166        var intConfig = param.Value as IntegerParameterConfiguration;
167        if (intConfig != null) {
168          var l = new ValueParameter<IntValue>(param.Key + "Length", intConfig.Length);
169          var b = new ValueParameter<IntMatrix>(param.Key + "Bounds", intConfig.Bounds);
170          DynamicConfigurationParameters.Add(l);
171          DynamicConfigurationParameters.Add(b);
172
173          var creator = new UniformRandomIntegerVectorCreator();
174          creator.IntegerVectorParameter.ActualName = param.Key;
175          creator.LengthParameter.ActualName = l.Name;
176          creator.BoundsParameter.ActualName = b.Name;
177          solutionCreators.Add(creator);
178        }
179        /*
180         * Real Vectors
181         */
182        var realConfig = param.Value as RealParameterConfiguration;
183        if (realConfig != null) {
184          var l = new ValueParameter<IntValue>(param.Key + "Length", realConfig.Length);
185          var b = new ValueParameter<DoubleMatrix>(param.Key + "Bounds", realConfig.Bounds);
186          DynamicConfigurationParameters.Add(l);
187          DynamicConfigurationParameters.Add(b);
188
189          var creator = new UniformRandomRealVectorCreator();
190          creator.RealVectorParameter.ActualName = param.Key;
191          creator.LengthParameter.ActualName = l.Name;
192          creator.BoundsParameter.ActualName = b.Name;
193          solutionCreators.Add(creator);
194        }
195        /*
196         * Permutations
197         */
198        var permConfig = param.Value as PermutationParameterConfiguration;
199        if (permConfig != null) {
200          var l = new ValueParameter<IntValue>(param.Key + "Length", permConfig.Length);
201          DynamicConfigurationParameters.Add(l);
202
203          var creator = new RandomPermutationCreator();
204          creator.PermutationParameter.ActualName = param.Key;
205          creator.LengthParameter.ActualName = l.Name;
206          creator.PermutationTypeParameter.Value = permConfig.Type;
207          solutionCreators.Add(creator);
208        }
209      }
210
211      foreach (var param in DynamicConfigurationParameters) {
212        param.Hidden = true;
213        Parameters.Add(param);
214      }
215      return solutionCreators;
216    }
217
218    protected virtual void UpdateSingleVectorEncodingOperators(List<ISolutionCreator> solutionCreators) {
219      var newCreator = solutionCreators.Single();
220      var binCreator = newCreator as IBinaryVectorCreator;
221      if (binCreator != null) {
222        var paramName = binCreator.BinaryVectorParameter.ActualName;
223        // do not replace a binary vector creator that was manually set
224        if (!(SolutionCreator is IBinaryVectorCreator) || ((IBinaryVectorCreator)SolutionCreator).BinaryVectorParameter.ActualName != paramName) {
225          Operators.Remove(SolutionCreator);
226          SolutionCreator = newCreator;
227          Operators.Add(SolutionCreator);
228        }
229        Operators.RemoveAll(x => x is ICrossover && !(x is IBinaryVectorCrossover) || x is IBinaryVectorCrossover && ((IBinaryVectorCrossover)x).ChildParameter.ActualName != paramName);
230        Operators.RemoveAll(x => x is IManipulator && !(x is IBinaryVectorManipulator) || x is IBinaryVectorManipulator && ((IBinaryVectorManipulator)x).BinaryVectorParameter.ActualName != paramName);
231        var crossovers = ApplicationManager.Manager.GetInstances<IBinaryVectorCrossover>().ToList();
232        var manipulators = ApplicationManager.Manager.GetInstances<IBinaryVectorManipulator>().ToList();
233        foreach (var xo in crossovers) {
234          xo.ChildParameter.ActualName = binCreator.BinaryVectorParameter.ActualName;
235          xo.ParentsParameter.ActualName = binCreator.BinaryVectorParameter.ActualName;
236        }
237        foreach (var m in manipulators)
238          m.BinaryVectorParameter.ActualName = binCreator.BinaryVectorParameter.ActualName;
239        Operators.AddRange(crossovers.Where(x => Operators.All(y => x.GetType() != y.GetType())));
240        Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
241      }
242      var intCreator = newCreator as IIntegerVectorCreator;
243      if (intCreator != null) {
244        var paramName = intCreator.IntegerVectorParameter.ActualName;
245        // do not replace an integer vector creator that was manually set
246        if (!(SolutionCreator is IIntegerVectorCreator)
247          || ((IIntegerVectorCreator)SolutionCreator).IntegerVectorParameter.ActualName != intCreator.IntegerVectorParameter.ActualName) {
248          Operators.Remove(SolutionCreator);
249          SolutionCreator = newCreator;
250          Operators.Add(SolutionCreator);
251        }
252        Operators.RemoveAll(x => x is ICrossover && !(x is IIntegerVectorCrossover) || x is IIntegerVectorCrossover && ((IIntegerVectorCrossover)x).ChildParameter.ActualName != paramName);
253        Operators.RemoveAll(x => x is IManipulator && !(x is IIntegerVectorManipulator) || x is IIntegerVectorManipulator && ((IIntegerVectorManipulator)x).IntegerVectorParameter.ActualName != paramName);
254        var crossovers = ApplicationManager.Manager.GetInstances<IIntegerVectorCrossover>().ToList();
255        var manipulators = ApplicationManager.Manager.GetInstances<IIntegerVectorManipulator>().ToList();
256        foreach (var xo in crossovers) {
257          xo.ChildParameter.ActualName = intCreator.IntegerVectorParameter.ActualName;
258          xo.ParentsParameter.ActualName = intCreator.IntegerVectorParameter.ActualName;
259        }
260        foreach (var m in manipulators)
261          m.IntegerVectorParameter.ActualName = intCreator.IntegerVectorParameter.ActualName;
262        foreach (var bo in crossovers.OfType<IBoundedIntegerVectorOperator>()
263              .Concat(manipulators.OfType<IBoundedIntegerVectorOperator>())
264              .ToList()) {
265          bo.BoundsParameter.ActualName = intCreator.BoundsParameter.ActualName;
266        }
267        Operators.AddRange(crossovers.Where(x => Operators.All(y => x.GetType() != y.GetType())));
268        Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
269      }
270      var realCreator = newCreator as IRealVectorCreator;
271      if (realCreator != null) {
272        var paramName = realCreator.RealVectorParameter.ActualName;
273        // do not replace a real vector creator that was manually set
274        if (!(SolutionCreator is IRealVectorCreator)
275            || ((IRealVectorCreator)SolutionCreator).RealVectorParameter.ActualName != realCreator.RealVectorParameter.ActualName) {
276          Operators.Remove(SolutionCreator);
277          SolutionCreator = newCreator;
278          Operators.Add(SolutionCreator);
279        }
280        Operators.RemoveAll(x => x is ICrossover && !(x is IRealVectorCrossover) || x is IRealVectorCrossover && ((IRealVectorCrossover)x).ChildParameter.ActualName != paramName);
281        Operators.RemoveAll(x => x is IManipulator && !(x is IRealVectorManipulator) || x is IRealVectorManipulator && ((IRealVectorManipulator)x).RealVectorParameter.ActualName != paramName);
282        var crossovers = ApplicationManager.Manager.GetInstances<IRealVectorCrossover>().ToList();
283        var manipulators = ApplicationManager.Manager.GetInstances<IRealVectorManipulator>().ToList();
284        foreach (var xo in crossovers) {
285          xo.ChildParameter.ActualName = realCreator.RealVectorParameter.ActualName;
286          xo.ParentsParameter.ActualName = realCreator.RealVectorParameter.ActualName;
287          xo.BoundsParameter.ActualName = realCreator.BoundsParameter.ActualName;
288        }
289        foreach (var m in manipulators) {
290          m.RealVectorParameter.ActualName = realCreator.RealVectorParameter.ActualName;
291          m.BoundsParameter.ActualName = realCreator.BoundsParameter.ActualName;
292        }
293        Operators.AddRange(crossovers.Where(x => Operators.All(y => x.GetType() != y.GetType())));
294        Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
295      }
296      var permCreator = newCreator as IPermutationCreator;
297      if (permCreator != null) {
298        var paramName = permCreator.PermutationParameter.ActualName;
299        // do not replace a permutation creator that was manually set
300        if (!(SolutionCreator is IPermutationCreator)
301            || ((IPermutationCreator)SolutionCreator).PermutationParameter.ActualName != permCreator.PermutationParameter.ActualName) {
302          Operators.Remove(SolutionCreator);
303          SolutionCreator = newCreator;
304          Operators.Add(SolutionCreator);
305        }
306        Operators.RemoveAll(x => x is ICrossover && !(x is IPermutationCrossover) || x is IPermutationCrossover && ((IPermutationCrossover)x).ChildParameter.ActualName != paramName);
307        Operators.RemoveAll(x => x is IManipulator && !(x is IPermutationManipulator) || x is IPermutationManipulator && ((IPermutationManipulator)x).PermutationParameter.ActualName != paramName);
308        var crossovers = ApplicationManager.Manager.GetInstances<IPermutationCrossover>().ToList();
309        var manipulators = ApplicationManager.Manager.GetInstances<IPermutationManipulator>().ToList();
310        foreach (var xo in crossovers) {
311          xo.ChildParameter.ActualName = permCreator.PermutationParameter.ActualName;
312          xo.ParentsParameter.ActualName = permCreator.PermutationParameter.ActualName;
313        }
314        foreach (var m in manipulators)
315          m.PermutationParameter.ActualName = permCreator.PermutationParameter.ActualName;
316        Operators.AddRange(crossovers.Where(x => Operators.All(y => x.GetType() != y.GetType())));
317        Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType())));
318      }
319    }
320
321    protected virtual void UpdateMultiVectorEncodingOperators(List<ISolutionCreator> solutionCreators, Configuration configuration) {
322      var oldCreator = SolutionCreator as ParameterVectorCreater;
323      var newCreator = new ParameterVectorCreater();
324
325      /*
326       * Binary Vectors
327       */
328      var newBinParams = new HashSet<string>(solutionCreators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName));
329      if (oldCreator != null) {
330        // we want to reuse the old creator
331        var oldParams = new HashSet<string>(oldCreator.Operators.OfType<IBinaryVectorCreator>()
332          .Select(x => x.BinaryVectorParameter.ActualName));
333        foreach (var toAdd in newBinParams.Except(oldParams)) {
334          var paramName = toAdd;
335          oldCreator.Operators.Add(
336            solutionCreators.OfType<IBinaryVectorCreator>().Single(x => x.BinaryVectorParameter.ActualName == paramName));
337        }
338        foreach (var toRemove in oldParams.Except(newBinParams)) {
339          var paramName = toRemove;
340          var op =
341            oldCreator.Operators.OfType<IBinaryVectorCreator>()
342              .SingleOrDefault(x => x.BinaryVectorParameter.ActualName == paramName);
343          if (op != null) oldCreator.Operators.Remove(op);
344        }
345      } else {
346        // we will use the new creator
347        foreach (var binCreator in solutionCreators.OfType<IBinaryVectorCreator>()) {
348          newCreator.Operators.Add(binCreator);
349        }
350      }
351
352      /*
353       * Integer Vectors
354       */
355      var newIntParams = new HashSet<string>(solutionCreators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName));
356      if (oldCreator != null) {
357        // we want to reuse the old creator
358        var oldParams = new HashSet<string>(oldCreator
359          .Operators.OfType<IIntegerVectorCreator>()
360          .Select(x => x.IntegerVectorParameter.ActualName));
361        foreach (var toAdd in newIntParams.Except(oldParams)) {
362          var paramName = toAdd;
363          oldCreator.Operators.Add(
364            solutionCreators.OfType<IIntegerVectorCreator>().Single(x => x.IntegerVectorParameter.ActualName == paramName));
365        }
366        foreach (var toRemove in oldParams.Except(newIntParams)) {
367          var paramName = toRemove;
368          var op =
369            oldCreator.Operators.OfType<IIntegerVectorCreator>()
370              .SingleOrDefault(x => x.IntegerVectorParameter.ActualName == paramName);
371          if (op != null) oldCreator.Operators.Remove(op);
372        }
373      } else {
374        // we will use the new creator
375        foreach (var intCreator in solutionCreators.OfType<IIntegerVectorCreator>()) {
376          newCreator.Operators.Add(intCreator);
377        }
378      }
379
380      /*
381       * Real Vectors
382       */
383      var newRealParams = new HashSet<string>(solutionCreators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName));
384      if (oldCreator != null) {
385        // we want to reuse the old creator
386        var oldParams = new HashSet<string>(oldCreator
387          .Operators.OfType<IRealVectorCreator>()
388          .Select(x => x.RealVectorParameter.ActualName));
389        foreach (var toAdd in newRealParams.Except(oldParams)) {
390          var paramName = toAdd;
391          oldCreator.Operators.Add(
392            solutionCreators.OfType<IRealVectorCreator>().Single(x => x.RealVectorParameter.ActualName == paramName));
393        }
394        foreach (var toRemove in oldParams.Except(newRealParams)) {
395          var paramName = toRemove;
396          var op =
397            oldCreator.Operators.OfType<IRealVectorCreator>()
398              .SingleOrDefault(x => x.RealVectorParameter.ActualName == paramName);
399          if (op != null) oldCreator.Operators.Remove(op);
400        }
401      } else {
402        // we will use the new creator
403        foreach (var realCreator in solutionCreators.OfType<IRealVectorCreator>()) {
404          newCreator.Operators.Add(realCreator);
405        }
406      }
407
408      /*
409       * Permutations
410       */
411      var newPermParams = new HashSet<string>(solutionCreators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName));
412      if (oldCreator != null) {
413        // we want to reuse the old creator
414        var oldParams = new HashSet<string>(oldCreator
415          .Operators.OfType<IPermutationCreator>()
416          .Select(x => x.PermutationParameter.ActualName));
417        foreach (var toAdd in newPermParams.Except(oldParams)) {
418          var paramName = toAdd;
419          oldCreator.Operators.Add(
420            solutionCreators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == paramName));
421        }
422        foreach (var toRemove in oldParams.Except(newPermParams)) {
423          var paramName = toRemove;
424          var op =
425            oldCreator.Operators.OfType<IPermutationCreator>()
426              .SingleOrDefault(x => x.PermutationParameter.ActualName == paramName);
427          if (op != null) oldCreator.Operators.Remove(op);
428        }
429        // we also have to sync the permutation type (in case this changes, as it is a value parameter)
430        foreach (var intersect in newPermParams.Intersect(oldParams)) {
431          var paramName = intersect;
432          var oldPermCreator = oldCreator.Operators.OfType<IPermutationCreator>()
433            .Single(x => x.PermutationParameter.ActualName == paramName);
434          var newPermCreator = solutionCreators.OfType<IPermutationCreator>()
435            .Single(x => x.PermutationParameter.ActualName == paramName);
436          oldPermCreator.PermutationTypeParameter.Value = newPermCreator.PermutationTypeParameter.Value;
437        }
438      } else {
439        // we will use the new creator
440        foreach (var permCreator in solutionCreators.OfType<IPermutationCreator>()) {
441          newCreator.Operators.Add(permCreator);
442        }
443      }
444
445      if (oldCreator == null) SolutionCreator = newCreator;
446
447      // crossover and manipulator for multi-vector encoding
448      // the condition checks if a multi-vector encoding is to be updated (there already exists ParameterVectorCrossover and ParameterVectorManipulator)
449      if (Operators.OfType<ParameterVectorCrossover>().Any() && Operators.OfType<ParameterVectorManipulator>().Any()) {
450        // Update the crossovers
451        foreach (var oldXo in Operators.OfType<ParameterVectorCrossover>()) {
452          /*
453           * Binary Vectors
454           */
455          var oldBinParams = new HashSet<string>(oldXo.Operators.OfType<IBinaryVectorCrossover>()
456            .Select(x => x.ChildParameter.ActualName));
457          foreach (var toAdd in newBinParams.Except(oldBinParams))
458            oldXo.Operators.Add(GetDefaultBinaryCrossover(toAdd, configuration));
459          foreach (var toRemove in oldBinParams.Except(newBinParams)) {
460            var op =
461              oldXo.Operators.OfType<IBinaryVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
462            if (op != null) oldXo.Operators.Remove(op);
463          }
464
465          /*
466           * Integer Vectors
467           */
468          var oldIntParams = new HashSet<string>(oldXo.Operators.OfType<IIntegerVectorCrossover>()
469            .Select(x => x.ChildParameter.ActualName));
470          foreach (var toAdd in newIntParams.Except(oldIntParams))
471            oldXo.Operators.Add(GetDefaultIntegerCrossover(toAdd, configuration));
472          foreach (var toRemove in oldIntParams.Except(newIntParams)) {
473            var op =
474              oldXo.Operators.OfType<IIntegerVectorCrossover>()
475                .SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
476            if (op != null) oldXo.Operators.Remove(op);
477          }
478
479          /*
480           * Real Vectors
481           */
482          var oldRealParams = new HashSet<string>(oldXo.Operators.OfType<IRealVectorCrossover>()
483            .Select(x => x.ChildParameter.ActualName));
484          foreach (var toAdd in newRealParams.Except(oldRealParams))
485            oldXo.Operators.Add(GetDefaultRealCrossover(toAdd, configuration));
486          foreach (var toRemove in oldRealParams.Except(newRealParams)) {
487            var op =
488              oldXo.Operators.OfType<IRealVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
489            if (op != null) oldXo.Operators.Remove(op);
490          }
491
492          /*
493           * Permutations
494           */
495          var oldPermParams = new HashSet<string>(oldXo.Operators.OfType<IPermutationCrossover>()
496            .Select(x => x.ChildParameter.ActualName));
497          foreach (var toAdd in newPermParams.Except(oldPermParams))
498            oldXo.Operators.Add(GetDefaultPermutationCrossover(toAdd, configuration));
499          foreach (var toRemove in oldPermParams.Except(newPermParams)) {
500            var op =
501              oldXo.Operators.OfType<IPermutationCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
502            if (op != null) oldXo.Operators.Remove(op);
503          }
504        }
505        // Update the manipulators
506        foreach (var oldM in Operators.OfType<ParameterVectorManipulator>()) {
507          /*
508           * Binary Vectors
509           */
510          var oldBinParams = new HashSet<string>(oldM.Operators.OfType<IBinaryVectorManipulator>()
511            .Select(x => x.BinaryVectorParameter.ActualName));
512          foreach (var toAdd in newBinParams.Except(oldBinParams))
513            oldM.Operators.Add(GetDefaultBinaryManipulator(toAdd, configuration));
514          foreach (var toRemove in oldBinParams.Except(newBinParams)) {
515            var op =
516              oldM.Operators.OfType<IBinaryVectorManipulator>()
517                .SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove);
518            if (op != null) oldM.Operators.Remove(op);
519          }
520
521          /*
522           * Integer Vectors
523           */
524          var oldIntParams = new HashSet<string>(oldM.Operators.OfType<IIntegerVectorManipulator>()
525            .Select(x => x.IntegerVectorParameter.ActualName));
526          foreach (var toAdd in newIntParams.Except(oldIntParams))
527            oldM.Operators.Add(GetDefaultIntegerManipulator(toAdd, configuration));
528          foreach (var toRemove in oldIntParams.Except(newIntParams)) {
529            var op =
530              oldM.Operators.OfType<IIntegerVectorManipulator>()
531                .SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove);
532            if (op != null) oldM.Operators.Remove(op);
533          }
534
535          /*
536           * Real Vectors
537           */
538          var oldRealParams = new HashSet<string>(oldM.Operators.OfType<IRealVectorManipulator>()
539            .Select(x => x.RealVectorParameter.ActualName));
540          foreach (var toAdd in newRealParams.Except(oldRealParams))
541            oldM.Operators.Add(GetDefaultRealManipulator(toAdd, configuration));
542          foreach (var toRemove in oldRealParams.Except(newRealParams)) {
543            var op =
544              oldM.Operators.OfType<IRealVectorManipulator>()
545                .SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove);
546            if (op != null) oldM.Operators.Remove(op);
547          }
548
549          /*
550           * Permutations
551           */
552          var oldPermParams = new HashSet<string>(oldM.Operators.OfType<IPermutationManipulator>()
553            .Select(x => x.PermutationParameter.ActualName));
554          foreach (var toAdd in newPermParams.Except(oldPermParams))
555            oldM.Operators.Add(GetDefaultPermutationManipulator(toAdd, configuration));
556          foreach (var toRemove in oldPermParams.Except(newPermParams)) {
557            var op =
558              oldM.Operators.OfType<IPermutationManipulator>()
559                .SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove);
560            if (op != null) oldM.Operators.Remove(op);
561          }
562        }
563      } else {
564        // change from single-vector encoding to multi-vector encoding
565        Operators.RemoveAll(x => x is ICrossover);
566        Operators.RemoveAll(x => x is IManipulator);
567        var crossover = new ParameterVectorCrossover();
568        var manipulator = new ParameterVectorManipulator();
569        foreach (var param in configuration.Parameters) {
570          if (param.Value is BinaryParameterConfiguration) {
571            crossover.Operators.Add(GetDefaultBinaryCrossover(param.Key, configuration));
572            manipulator.Operators.Add(GetDefaultBinaryManipulator(param.Key, configuration));
573            continue;
574          }
575          var intConfig = param.Value as IntegerParameterConfiguration;
576          if (intConfig != null) {
577            crossover.Operators.Add(GetDefaultIntegerCrossover(param.Key, configuration));
578            manipulator.Operators.Add(GetDefaultIntegerManipulator(param.Key, configuration));
579            continue;
580          }
581          var realConfig = param.Value as RealParameterConfiguration;
582          if (realConfig != null) {
583            crossover.Operators.Add(GetDefaultRealCrossover(param.Key, configuration));
584            manipulator.Operators.Add(GetDefaultRealManipulator(param.Key, configuration));
585            continue;
586          }
587          var permConfig = param.Value as PermutationParameterConfiguration;
588          if (permConfig != null) {
589            crossover.Operators.Add(GetDefaultPermutationCrossover(param.Key, configuration));
590            manipulator.Operators.Add(GetDefaultPermutationManipulator(param.Key, configuration));
591            continue;
592          }
593          throw new InvalidOperationException("Unknown type for parameter " + param.Key);
594        }
595        Operators.Add(crossover);
596        Operators.Add(manipulator);
597      }
598    }
599
600    protected virtual void UpdateMoveOperators() {
601      Operators.RemoveAll(x => x is IParameterVectorMoveOperator);
602      var generator = new ParameterVectorMoveGenerator();
603      generator.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
604      generator.ScriptParameter.ActualName = ScriptParameter.Name;
605
606      var evaluator = new ParameterVectorMoveEvaluator();
607      evaluator.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
608      evaluator.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
609      evaluator.ScriptParameter.ActualName = ScriptParameter.Name;
610
611      var maker = new ParameterVectorMoveMaker();
612      maker.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
613      maker.MoveQualityParameter.ActualName = evaluator.MoveQualityParameter.ActualName;
614      maker.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
615
616      Operators.AddRange(new IItem[] { generator, evaluator, maker });
617    }
618
619    // ReSharper disable RedundantNameQualifier
620    protected virtual IBinaryVectorCrossover GetDefaultBinaryCrossover(string paramName, Configuration config) {
621      var binConfig = (BinaryParameterConfiguration)config.Parameters[paramName];
622      IBinaryVectorCrossover binXo;
623      if (binConfig.Length.Value > 3) binXo = new Encodings.BinaryVectorEncoding.SinglePointCrossover();
624      else binXo = new Encodings.BinaryVectorEncoding.UniformCrossover();
625      binXo.ChildParameter.ActualName = paramName;
626      binXo.ParentsParameter.ActualName = paramName;
627      return binXo;
628    }
629
630    protected virtual IBinaryVectorManipulator GetDefaultBinaryManipulator(string paramName, Configuration config) {
631      var binM = new Encodings.BinaryVectorEncoding.SomePositionsBitflipManipulator();
632      binM.BinaryVectorParameter.ActualName = paramName;
633      binM.MutationProbabilityParameter.Value = new DoubleValue(0.1);
634      return binM;
635    }
636
637    protected virtual IIntegerVectorCrossover GetDefaultIntegerCrossover(string paramName, Configuration config) {
638      var intXo = new Encodings.IntegerVectorEncoding.RoundedBlendAlphaBetaCrossover();
639      intXo.ChildParameter.ActualName = paramName;
640      intXo.ParentsParameter.ActualName = paramName;
641      intXo.BoundsParameter.ActualName = paramName + "Bounds";
642      intXo.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
643      intXo.MaximizationParameter.ActualName = MaximizationParameter.Name;
644      return intXo;
645    }
646
647    protected virtual IIntegerVectorManipulator GetDefaultIntegerManipulator(string paramName, Configuration configuration) {
648      var intM = new Encodings.IntegerVectorEncoding.UniformSomePositionsManipulator();
649      intM.IntegerVectorParameter.ActualName = paramName;
650      intM.BoundsParameter.ActualName = paramName + "Bounds";
651      intM.ProbabilityParameter.Value = new DoubleValue(0.1);
652      return intM;
653    }
654
655    protected virtual IRealVectorCrossover GetDefaultRealCrossover(string paramName, Configuration configuration) {
656      var realXo = new Encodings.RealVectorEncoding.BlendAlphaBetaCrossover();
657      realXo.ChildParameter.ActualName = paramName;
658      realXo.ParentsParameter.ActualName = paramName;
659      realXo.BoundsParameter.ActualName = paramName + "Bounds";
660      realXo.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
661      realXo.MaximizationParameter.ActualName = MaximizationParameter.Name;
662      return realXo;
663    }
664
665    protected virtual IRealVectorManipulator GetDefaultRealManipulator(string paramName, Configuration configuration) {
666      var realM = new Encodings.RealVectorEncoding.BreederGeneticAlgorithmManipulator();
667      realM.RealVectorParameter.ActualName = paramName;
668      realM.BoundsParameter.ActualName = paramName + "Bounds";
669      return realM;
670    }
671
672    protected virtual IPermutationCrossover GetDefaultPermutationCrossover(string paramName, Configuration configuration) {
673      var permXo = new Encodings.PermutationEncoding.PartiallyMatchedCrossover();
674      permXo.ChildParameter.ActualName = paramName;
675      permXo.ParentsParameter.ActualName = paramName;
676      return permXo;
677    }
678
679    protected virtual IPermutationManipulator GetDefaultPermutationManipulator(string paramName, Configuration configuration) {
680      var permM = new Encodings.PermutationEncoding.Swap2Manipulator();
681      permM.PermutationParameter.ActualName = paramName;
682      return permM;
683    }
684    // ReSharper restore RedundantNameQualifier
685  }
686}
Note: See TracBrowser for help on using the repository browser.