Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 11575 was 11575, checked in by mkommend, 9 years ago

#2174: Adapted permutation encoding.

File size: 29.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<ISingleObjectiveProblemDefinition> ProblemDefinitionParameter {
58      get { return (IValueParameter<ISingleObjectiveProblemDefinition>)Parameters["ProblemDefinition"]; }
59    }
60
61    protected IValueParameter<IEncoding> EncodingParameter {
62      get { return (IValueParameter<IEncoding>)Parameters["Encoding"]; }
63    }
64
65
66    public ISingleObjectiveProblemDefinition ProblemDefinition {
67      get { return ProblemDefinitionParameter.Value; }
68      set { ProblemDefinitionParameter.Value = value; }
69    }
70
71    [Storable]
72    protected List<IParameter> DynamicEncodingParameters;
73
74    protected override IEnumerable<IItem> GetOperators() {
75      return base.GetOperators().Concat(ProblemDefinition.Encoding.Operators);
76    }
77
78    [StorableConstructor]
79    protected SingleObjectiveProgrammableProblem(bool deserializing) : base(deserializing) { }
80
81    protected SingleObjectiveProgrammableProblem(SingleObjectiveProgrammableProblem original, Cloner cloner)
82      : base(original, cloner) {
83      DynamicEncodingParameters = original.DynamicEncodingParameters.Select(cloner.Clone).ToList();
84      RegisterEventHandlers();
85    }
86    public SingleObjectiveProgrammableProblem()
87      : base(new SingleObjectiveEvaluator(), new MultiEncodingCreator()) {
88      Parameters.Add(new ValueParameter<ISingleObjectiveProblemDefinition>("ProblemDefinition", "Defines the problem.", new SingleObjectiveProblemScript() { Name = Name }));
89      Parameters.Add(new ValueParameter<IEncoding>("Encoding", "Describes the configuration of the encoding, what the variables are called, what type they are and their bounds if any."));
90
91      DynamicEncodingParameters = new List<IParameter>();
92
93      Operators.Add(new BestScopeSolutionAnalyzer());
94      Operators.Add(new SingleObjectiveAnalyzer());
95      Operators.Add(Evaluator);
96      Operators.Add(SolutionCreator);
97
98      RegisterEventHandlers();
99    }
100
101    public override IDeepCloneable Clone(Cloner cloner) {
102      return new SingleObjectiveProgrammableProblem(this, cloner);
103    }
104
105    [StorableHook(HookType.AfterDeserialization)]
106    // ReSharper disable UnusedMember.Local
107    private void AfterDeserialization() {
108      RegisterEventHandlers();
109    }
110    // ReSharper restore UnusedMember.Local
111
112    private void RegisterEventHandlers() {
113      ProblemDefinitionParameter.ValueChanged += ProblemDefinitionParameterOnValueChanged;
114      RegisterProblemDefinitionEventHandlers();
115    }
116
117    private void ProblemDefinitionParameterOnValueChanged(object sender, EventArgs eventArgs) {
118      RegisterProblemDefinitionEventHandlers();
119      Parameterize();
120    }
121
122    private void RegisterProblemDefinitionEventHandlers() {
123      ProblemDefinitionParameter.Value.ProblemDefinitionChanged += ProblemDefinitionChanged;
124      ProblemDefinitionParameter.Value.NameChanged += ProblemDefinitionNameChanged;
125    }
126
127    private void ProblemDefinitionNameChanged(object sender, EventArgs eventArgs) {
128      if (sender != ProblemDefinitionParameter.Value) return;
129      Name = ProblemDefinitionParameter.Value.Name;
130    }
131
132    protected override void OnNameChanged() {
133      base.OnNameChanged();
134      ProblemDefinitionParameter.Value.Name = Name;
135    }
136
137    protected override void OnEvaluatorChanged() {
138      base.OnEvaluatorChanged();
139      Parameterize();
140    }
141
142    protected virtual void ProblemDefinitionChanged(object sender, EventArgs eventArgs) {
143      Parameterize();
144    }
145
146    protected virtual void Parameterize() {
147      var definition = ProblemDefinitionParameter.Value;
148      if (definition == null) return;
149
150      IEncoding encoding = definition.Encoding;
151
152      EncodingParameter.Value = encoding;
153      Maximization.Value = definition.IsMaximizationProblem;
154
155      Evaluator.EncodingParameter.ActualName = EncodingParameter.Name;
156      Evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
157      foreach (var evalOp in Operators.OfType<ISingleObjectiveProgrammableProblemEvaluator>()) {
158        evalOp.EncodingParameter.ActualName = EncodingParameter.Name;
159        evalOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
160      }
161      foreach (var analyzeOp in Operators.OfType<ISingleObjectiveProgrammableProblemAnalyzer>()) {
162        analyzeOp.EncodingParameter.ActualName = EncodingParameter.Name;
163        analyzeOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
164        analyzeOp.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
165      }
166
167      foreach (var param in DynamicEncodingParameters)
168        if (Parameters.Contains(param)) Parameters.Remove(param);
169      DynamicEncodingParameters.Clear();
170
171      var creator = ConfigureCreator(encoding);
172
173      foreach (var param in DynamicEncodingParameters) {
174        param.Hidden = true;
175        Parameters.Add(param);
176      }
177
178      var multiEncoding = encoding as MultiEncoding;
179      if (multiEncoding != null) {
180        ConfigureMultiVectorEncodingOperators((MultiEncodingCreator)creator, multiEncoding);
181      } else {
182        ConfigureSingleEncodingOperators(creator, encoding);
183      }
184      UpdateImprovementOperators();
185      UpdateMoveOperators();
186    }
187
188    protected virtual ISolutionCreator ConfigureCreator(IEncoding encoding) {
189      #region Configure RealVector Creator
190      var realEnc = encoding as RealEncoding;
191      if (realEnc != null) {
192        DynamicEncodingParameters.AddRange(realEnc.Parameters);
193        return realEnc.DefaultSolutionCreator;
194      }
195      #endregion
196      #region Configure BinaryVector Creator
197      var binEnc = encoding as BinaryEncoding;
198      if (binEnc != null) {
199        DynamicEncodingParameters.AddRange(binEnc.Parameters);
200        return binEnc.DefaultSolutionCreator;
201      }
202      #endregion
203      #region Configure IntegerVector Creator
204      var intEnc = encoding as IntegerEncoding;
205      if (intEnc != null) {
206        DynamicEncodingParameters.AddRange(intEnc.Parameters);
207        return intEnc.SolutionCreator;
208      }
209      #endregion
210      #region Configure Permutation Creator
211      var permEnc = encoding as PermutationEncoding;
212      if (permEnc != null) {
213        DynamicEncodingParameters.AddRange(permEnc.Parameters);
214        return permEnc.SolutionCreator;
215      }
216      #endregion
217      #region Configure MultiEncoding Creator
218      var multiEncoding = encoding as MultiEncoding;
219      if (multiEncoding != null) {
220        var creator = new MultiEncodingCreator();
221        foreach (var enc in multiEncoding.Encodings) {
222          if (enc is MultiEncoding) throw new InvalidOperationException("MultiEncoding within a MultiEncoding is not supported.");
223          creator.Operators.Add(ConfigureCreator(enc));
224        }
225        return creator;
226      }
227      #endregion
228      throw new ArgumentException(string.Format("Encoding {0} is unknown.", encoding != null ? encoding.GetType().FullName : "(null)"));
229    }
230
231    protected virtual void ConfigureSingleEncodingOperators(ISolutionCreator newCreator, IEncoding encoding) {
232      // remove all multiencoding operators
233      Operators.RemoveAll(x => x is MultiEncodingCrossover
234                            || x is MultiEncodingManipulator
235                            || x is MultiEncodingCreator);
236
237      #region Configure Operators for RealVectorEncoding
238      var realEncoding = encoding as RealEncoding;
239      if (realEncoding != null) {
240        // do not replace a real vector creator that was manually set
241        if (!(SolutionCreator is IRealVectorCreator)
242            || ((IRealVectorCreator)SolutionCreator).RealVectorParameter.ActualName != realEncoding.Name) {
243          Operators.Remove(SolutionCreator);
244          SolutionCreator = newCreator;
245        }
246
247        foreach (var su in realEncoding.Operators.OfType<IRealVectorSwarmUpdater>()) {
248          su.MaximizationParameter.ActualName = MaximizationParameter.Name;
249        }
250      }
251      #endregion
252      #region Configure Operators for BinaryVectorEncoding
253      var binEncoding = encoding as BinaryEncoding;
254      if (binEncoding != null) {
255        // do not replace a binary vector creator that was manually set
256        if (!(SolutionCreator is IBinaryVectorCreator) || ((IBinaryVectorCreator)SolutionCreator).BinaryVectorParameter.ActualName != binEncoding.Name) {
257          Operators.Remove(SolutionCreator);
258          SolutionCreator = newCreator;
259        }
260      }
261      #endregion
262      #region Configure Operators for IntegerVectorEncoding
263      var intEncoding = encoding as IntegerEncoding;
264      if (intEncoding != null) {
265        // do not replace an integer vector creator that was manually set
266        if (!(SolutionCreator is IIntegerVectorCreator)
267          || ((IIntegerVectorCreator)SolutionCreator).IntegerVectorParameter.ActualName != intEncoding.Name) {
268          Operators.Remove(SolutionCreator);
269          SolutionCreator = newCreator;
270        }
271      }
272      #endregion
273      #region Configure Operators for PermutationEncoding
274      var permEncoding = encoding as PermutationEncoding;
275      if (permEncoding != null) {
276        // do not replace a permutation creator that was manually set
277        if (!(SolutionCreator is IPermutationCreator)
278            || ((IPermutationCreator)SolutionCreator).PermutationParameter.ActualName != permEncoding.Name) {
279          Operators.Remove(SolutionCreator);
280          SolutionCreator = newCreator;
281        }
282      } else {
283        Operators.RemoveAll(x => x is IPermutationCrossover
284          || x is IPermutationManipulator
285          || x is IPermutationMultiNeighborhoodShakingOperator);
286      }
287      #endregion
288    }
289
290    protected virtual void ConfigureMultiVectorEncodingOperators(MultiEncodingCreator newCreator, MultiEncoding encoding) {
291      var newBinParams = new HashSet<string>(newCreator.Operators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName));
292      var newIntParams = new HashSet<string>(newCreator.Operators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName));
293      var newRealParams = new HashSet<string>(newCreator.Operators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName));
294      var newPermParams = new HashSet<string>(newCreator.Operators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName));
295
296      var oldCreator = SolutionCreator as MultiEncodingCreator;
297      if (oldCreator == null) SolutionCreator = newCreator;
298      else {
299        #region Configure BinaryVector Creator
300        var oldBinParams = new HashSet<string>(oldCreator.Operators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName));
301        foreach (var toAdd in newBinParams.Except(oldBinParams)) {
302          oldCreator.Operators.Add(newCreator.Operators.OfType<IBinaryVectorCreator>().Single(x => x.BinaryVectorParameter.ActualName == toAdd));
303        }
304        foreach (var toRemove in oldBinParams.Except(newBinParams)) {
305          var op = oldCreator.Operators.OfType<IBinaryVectorCreator>().SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove);
306          if (op != null) oldCreator.Operators.Remove(op);
307        }
308        #endregion
309
310        #region Configure IntegerVector Creator
311        var oldIntParams = new HashSet<string>(oldCreator.Operators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName));
312        foreach (var toAdd in newIntParams.Except(oldIntParams)) {
313          oldCreator.Operators.Add(newCreator.Operators.OfType<IIntegerVectorCreator>().Single(x => x.IntegerVectorParameter.ActualName == toAdd));
314        }
315        foreach (var toRemove in oldIntParams.Except(newIntParams)) {
316          var op = oldCreator.Operators.OfType<IIntegerVectorCreator>().SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove);
317          if (op != null) oldCreator.Operators.Remove(op);
318        }
319        #endregion
320
321        #region Configure RealVector Creator
322        var oldRealParams = new HashSet<string>(oldCreator.Operators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName));
323        foreach (var toAdd in newRealParams.Except(oldRealParams)) {
324          oldCreator.Operators.Add(newCreator.Operators.OfType<IRealVectorCreator>().Single(x => x.RealVectorParameter.ActualName == toAdd));
325        }
326        foreach (var toRemove in oldRealParams.Except(newRealParams)) {
327          var op = oldCreator.Operators.OfType<IRealVectorCreator>().SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove);
328          if (op != null) oldCreator.Operators.Remove(op);
329        }
330        #endregion
331
332        #region Configure Permutation Creator
333        var oldPermParams = new HashSet<string>(oldCreator.Operators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName));
334        foreach (var toAdd in newPermParams.Except(oldPermParams)) {
335          oldCreator.Operators.Add(newCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == toAdd));
336        }
337        foreach (var toRemove in oldPermParams.Except(newPermParams)) {
338          var op = oldCreator.Operators.OfType<IPermutationCreator>().SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove);
339          if (op != null) oldCreator.Operators.Remove(op);
340        }
341        // we also have to sync the permutation type (in case this changes, as it is a value parameter)
342        foreach (var intersect in newPermParams.Intersect(oldPermParams)) {
343          var oldPermCreator = oldCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == intersect);
344          var newPermCreator = newCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == intersect);
345          oldPermCreator.PermutationTypeParameter.Value = newPermCreator.PermutationTypeParameter.Value;
346        }
347        #endregion
348
349      }
350
351      // crossover and manipulator for multi-vector encoding
352      // the condition checks if a multi-vector encoding is to be updated (there already exists ParameterVectorCrossover and ParameterVectorManipulator)
353      if (Operators.OfType<MultiEncodingCrossover>().Any() && Operators.OfType<MultiEncodingManipulator>().Any()) {
354        #region Update existing multi-vector encoding
355        #region Update ParameterVector Crossover ...
356        foreach (var oldXo in Operators.OfType<MultiEncodingCrossover>()) {
357          #region ... for binary parameters
358          var oldBinParams = new HashSet<string>(oldXo.Operators.OfType<IBinaryVectorCrossover>().Select(x => x.ChildParameter.ActualName));
359          foreach (var toAdd in newBinParams.Except(oldBinParams))
360            oldXo.Operators.Add(GetDefaultBinaryCrossover(toAdd, encoding));
361          foreach (var toRemove in oldBinParams.Except(newBinParams)) {
362            var op = oldXo.Operators.OfType<IBinaryVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
363            if (op != null) oldXo.Operators.Remove(op);
364          }
365          #endregion
366          #region ... for integer parameters
367          var oldIntParams = new HashSet<string>(oldXo.Operators.OfType<IIntegerVectorCrossover>().Select(x => x.ChildParameter.ActualName));
368          foreach (var toAdd in newIntParams.Except(oldIntParams))
369            oldXo.Operators.Add(GetDefaultIntegerCrossover(toAdd, encoding));
370          foreach (var toRemove in oldIntParams.Except(newIntParams)) {
371            var op = oldXo.Operators.OfType<IIntegerVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
372            if (op != null) oldXo.Operators.Remove(op);
373          }
374          #endregion
375          #region ... for real parameters
376          var oldRealParams = new HashSet<string>(oldXo.Operators.OfType<IRealVectorCrossover>().Select(x => x.ChildParameter.ActualName));
377          foreach (var toAdd in newRealParams.Except(oldRealParams))
378            oldXo.Operators.Add(GetDefaultRealCrossover(toAdd, encoding));
379          foreach (var toRemove in oldRealParams.Except(newRealParams)) {
380            var op = oldXo.Operators.OfType<IRealVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
381            if (op != null) oldXo.Operators.Remove(op);
382          }
383          #endregion
384          #region ... for permutation parameters
385          var oldPermParams = new HashSet<string>(oldXo.Operators.OfType<IPermutationCrossover>().Select(x => x.ChildParameter.ActualName));
386          foreach (var toAdd in newPermParams.Except(oldPermParams))
387            oldXo.Operators.Add(GetDefaultPermutationCrossover(toAdd, encoding));
388          foreach (var toRemove in oldPermParams.Except(newPermParams)) {
389            var op = oldXo.Operators.OfType<IPermutationCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
390            if (op != null) oldXo.Operators.Remove(op);
391          }
392          #endregion
393        }
394        #endregion
395        #region Update ParameterVector Manipulator ...
396        foreach (var oldM in Operators.OfType<MultiEncodingManipulator>()) {
397          #region ... for binary parameters
398          var oldBinParams = new HashSet<string>(oldM.Operators.OfType<IBinaryVectorManipulator>().Select(x => x.BinaryVectorParameter.ActualName));
399          foreach (var toAdd in newBinParams.Except(oldBinParams))
400            oldM.Operators.Add(GetDefaultBinaryManipulator(toAdd, encoding));
401          foreach (var toRemove in oldBinParams.Except(newBinParams)) {
402            var op = oldM.Operators.OfType<IBinaryVectorManipulator>().SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove);
403            if (op != null) oldM.Operators.Remove(op);
404          }
405          #endregion
406          #region ... for integer parameters
407          var oldIntParams = new HashSet<string>(oldM.Operators.OfType<IIntegerVectorManipulator>().Select(x => x.IntegerVectorParameter.ActualName));
408          foreach (var toAdd in newIntParams.Except(oldIntParams))
409            oldM.Operators.Add(GetDefaultIntegerManipulator(toAdd, encoding));
410          foreach (var toRemove in oldIntParams.Except(newIntParams)) {
411            var op = oldM.Operators.OfType<IIntegerVectorManipulator>().SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove);
412            if (op != null) oldM.Operators.Remove(op);
413          }
414          #endregion
415          #region ... for real parameters
416          var oldRealParams = new HashSet<string>(oldM.Operators.OfType<IRealVectorManipulator>().Select(x => x.RealVectorParameter.ActualName));
417          foreach (var toAdd in newRealParams.Except(oldRealParams))
418            oldM.Operators.Add(GetDefaultRealManipulator(toAdd, encoding));
419          foreach (var toRemove in oldRealParams.Except(newRealParams)) {
420            var op = oldM.Operators.OfType<IRealVectorManipulator>().SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove);
421            if (op != null) oldM.Operators.Remove(op);
422          }
423          #endregion
424          #region ... for permutation parameters
425          var oldPermParams = new HashSet<string>(oldM.Operators.OfType<IPermutationManipulator>().Select(x => x.PermutationParameter.ActualName));
426          foreach (var toAdd in newPermParams.Except(oldPermParams))
427            oldM.Operators.Add(GetDefaultPermutationManipulator(toAdd, encoding));
428          foreach (var toRemove in oldPermParams.Except(newPermParams)) {
429            var op = oldM.Operators.OfType<IPermutationManipulator>().SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove);
430            if (op != null) oldM.Operators.Remove(op);
431          }
432          #endregion
433        }
434        #endregion
435        #endregion
436      } else {
437        #region Handle transition from single-vector to multi-vector encoding
438        Operators.RemoveAll(x => x is ICrossover);
439        Operators.RemoveAll(x => x is IManipulator);
440        Operators.RemoveAll(x => x is IStrategyParameterCreator || x is IStrategyParameterManipulator || x is IStrategyParameterCrossover);
441        Operators.RemoveAll(x => x is IParticleCreator);
442        Operators.RemoveAll(x => x is IParticleUpdater);
443        Operators.RemoveAll(x => x is ISwarmUpdater);
444        Operators.RemoveAll(x => x is IMultiNeighborhoodShakingOperator);
445
446        var crossover = new MultiEncodingCrossover();
447        var manipulator = new MultiEncodingManipulator();
448        foreach (var enc in encoding.Encodings) {
449          if (enc is BinaryEncoding) {
450            crossover.Operators.Add(GetDefaultBinaryCrossover(enc.Name, encoding));
451            manipulator.Operators.Add(GetDefaultBinaryManipulator(enc.Name, encoding));
452            continue;
453          }
454          var intConfig = enc as IntegerEncoding;
455          if (intConfig != null) {
456            crossover.Operators.Add(GetDefaultIntegerCrossover(enc.Name, encoding));
457            manipulator.Operators.Add(GetDefaultIntegerManipulator(enc.Name, encoding));
458            continue;
459          }
460          var realConfig = enc as RealEncoding;
461          if (realConfig != null) {
462            crossover.Operators.Add(GetDefaultRealCrossover(enc.Name, encoding));
463            manipulator.Operators.Add(GetDefaultRealManipulator(enc.Name, encoding));
464            continue;
465          }
466          var permConfig = enc as PermutationEncoding;
467          if (permConfig != null) {
468            crossover.Operators.Add(GetDefaultPermutationCrossover(enc.Name, encoding));
469            manipulator.Operators.Add(GetDefaultPermutationManipulator(enc.Name, encoding));
470            continue;
471          }
472          throw new InvalidOperationException("Unknown type for parameter " + enc.Name);
473        }
474        Operators.Add(crossover);
475        Operators.Add(manipulator);
476        #endregion
477      }
478    }
479
480    protected virtual void UpdateImprovementOperators() {
481      if (!Operators.Any(x => x is SingleObjectiveImprover))
482        Operators.Add(new SingleObjectiveImprover());
483      foreach (var improver in Operators.OfType<SingleObjectiveImprover>()) {
484        improver.EncodingParameter.ActualName = EncodingParameter.Name;
485        improver.MaximizationParameter.ActualName = MaximizationParameter.Name;
486        improver.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
487        improver.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
488      }
489    }
490    protected virtual void UpdateMoveOperators() {
491      if (!Operators.Any(x => x is SingleObjectiveMoveGenerator))
492        Operators.Add(new SingleObjectiveMoveGenerator());
493      if (!Operators.Any(x => x is SingleObjectiveMoveEvaluator))
494        Operators.Add(new SingleObjectiveMoveEvaluator());
495      if (!Operators.Any(x => x is SingleObjectiveMoveMaker))
496        Operators.Add(new SingleObjectiveMoveMaker());
497
498      foreach (var generator in Operators.OfType<SingleObjectiveMoveGenerator>()) {
499        generator.EncodingParameter.ActualName = EncodingParameter.Name;
500        generator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
501      }
502      foreach (var evaluator in Operators.OfType<SingleObjectiveMoveEvaluator>()) {
503        evaluator.EncodingParameter.ActualName = EncodingParameter.Name;
504        evaluator.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
505        evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
506      }
507      foreach (var maker in Operators.OfType<SingleObjectiveMoveMaker>()) {
508        maker.EncodingParameter.ActualName = EncodingParameter.Name;
509        maker.MoveQualityParameter.ActualName = Operators.OfType<SingleObjectiveMoveEvaluator>().First().MoveQualityParameter.ActualName;
510        maker.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
511      }
512    }
513
514    #region GetDefaultOperators for Crossovers and Manipulators
515    // ReSharper disable RedundantNameQualifier
516    protected virtual IBinaryVectorCrossover GetDefaultBinaryCrossover(string paramName, MultiEncoding config) {
517      var binConfig = (BinaryEncoding)config.Encodings[paramName];
518      IBinaryVectorCrossover binXo;
519      if (binConfig.Length > 3) binXo = new Encodings.BinaryVectorEncoding.SinglePointCrossover();
520      else binXo = new Encodings.BinaryVectorEncoding.UniformCrossover();
521      binXo.ChildParameter.ActualName = paramName;
522      binXo.ParentsParameter.ActualName = paramName;
523      return binXo;
524    }
525
526    protected virtual IBinaryVectorManipulator GetDefaultBinaryManipulator(string paramName, MultiEncoding config) {
527      var binM = new Encodings.BinaryVectorEncoding.SomePositionsBitflipManipulator();
528      binM.BinaryVectorParameter.ActualName = paramName;
529      binM.MutationProbabilityParameter.Value = new DoubleValue(0.1);
530      return binM;
531    }
532
533    protected virtual IIntegerVectorCrossover GetDefaultIntegerCrossover(string paramName, MultiEncoding config) {
534      var intXo = new Encodings.IntegerVectorEncoding.RoundedBlendAlphaBetaCrossover();
535      intXo.ChildParameter.ActualName = paramName;
536      intXo.ParentsParameter.ActualName = paramName;
537      intXo.BoundsParameter.ActualName = paramName + "Bounds";
538      intXo.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
539      intXo.MaximizationParameter.ActualName = MaximizationParameter.Name;
540      return intXo;
541    }
542
543    protected virtual IIntegerVectorManipulator GetDefaultIntegerManipulator(string paramName, MultiEncoding configuration) {
544      var intM = new Encodings.IntegerVectorEncoding.UniformSomePositionsManipulator();
545      intM.IntegerVectorParameter.ActualName = paramName;
546      intM.BoundsParameter.ActualName = paramName + "Bounds";
547      intM.ProbabilityParameter.Value = new DoubleValue(0.1);
548      return intM;
549    }
550
551    protected virtual IRealVectorCrossover GetDefaultRealCrossover(string paramName, MultiEncoding configuration) {
552      var realXo = new Encodings.RealVectorEncoding.BlendAlphaBetaCrossover();
553      realXo.ChildParameter.ActualName = paramName;
554      realXo.ParentsParameter.ActualName = paramName;
555      realXo.BoundsParameter.ActualName = paramName + "Bounds";
556      realXo.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
557      realXo.MaximizationParameter.ActualName = MaximizationParameter.Name;
558      return realXo;
559    }
560
561    protected virtual IRealVectorManipulator GetDefaultRealManipulator(string paramName, MultiEncoding configuration) {
562      var realM = new Encodings.RealVectorEncoding.BreederGeneticAlgorithmManipulator();
563      realM.RealVectorParameter.ActualName = paramName;
564      realM.BoundsParameter.ActualName = paramName + "Bounds";
565      return realM;
566    }
567
568    protected virtual IPermutationCrossover GetDefaultPermutationCrossover(string paramName, MultiEncoding configuration) {
569      var permXo = new Encodings.PermutationEncoding.PartiallyMatchedCrossover();
570      permXo.ChildParameter.ActualName = paramName;
571      permXo.ParentsParameter.ActualName = paramName;
572      return permXo;
573    }
574
575    protected virtual IPermutationManipulator GetDefaultPermutationManipulator(string paramName, MultiEncoding configuration) {
576      var permM = new Encodings.PermutationEncoding.Swap2Manipulator();
577      permM.PermutationParameter.ActualName = paramName;
578      return permM;
579    }
580    // ReSharper restore RedundantNameQualifier
581    #endregion
582  }
583}
Note: See TracBrowser for help on using the repository browser.