Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.ES/ES.cs @ 1023

Last change on this file since 1023 was 896, checked in by vdorfer, 16 years ago

Created API documentation for HeuristicLab.ES namespace and changed documentation of some Description properties (#331)

File size: 27.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2008 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.Text;
25using System.Xml;
26using HeuristicLab.Core;
27using HeuristicLab.Data;
28using HeuristicLab.SequentialEngine;
29using HeuristicLab.Operators;
30using HeuristicLab.Random;
31using HeuristicLab.Logging;
32using HeuristicLab.Selection;
33using HeuristicLab.Selection.OffspringSelection;
34using HeuristicLab.Evolutionary;
35
36namespace HeuristicLab.ES {
37  /// <summary>
38  /// Class for the heuristic optimization technique "evolution strategy".
39  /// </summary>
40  public class ES : ItemBase, IEditable {
41    #region Create Operators
42    /// <summary>
43    /// Creates a new evolution strategy.
44    /// </summary>
45    /// <param name="engine">The engine of the ES to create.</param>
46    public static void Create(IEngine engine) {
47      engine.OperatorGraph.Clear();
48
49      CombinedOperator co = CreateES();
50      co.Name = "ES";
51      engine.OperatorGraph.AddOperator(co);
52      engine.OperatorGraph.InitialOperator = co;
53
54      engine.Reset();
55    }
56    private static CombinedOperator CreateES() {
57      CombinedOperator op = new CombinedOperator();
58      SequentialProcessor sp = new SequentialProcessor();
59      op.OperatorGraph.AddOperator(sp);
60      op.OperatorGraph.InitialOperator = sp;
61
62      CombinedOperator co1 = CreateVariableInjection();
63      co1.Name = "Variable Injection";
64      op.OperatorGraph.AddOperator(co1);
65      sp.AddSubOperator(co1);
66
67      // place holder for ProblemInjector
68      EmptyOperator eo1 = new EmptyOperator();
69      eo1.Name = "ProblemInjector";
70      op.OperatorGraph.AddOperator(eo1);
71      co1.AddSubOperator(eo1);
72
73      CombinedOperator co2 = CreatePopulationInitialization();
74      co2.Name = "Population Initialization";
75      op.OperatorGraph.AddOperator(co2);
76      sp.AddSubOperator(co2);
77
78      // place holder for SolutionGenerator
79      EmptyOperator eo2 = new EmptyOperator();
80      eo2.Name = "SolutionGenerator";
81      op.OperatorGraph.AddOperator(eo2);
82      co2.AddSubOperator(eo2);
83
84      // place holder for Evaluator
85      EmptyOperator eo3 = new EmptyOperator();
86      eo3.Name = "Evaluator";
87      op.OperatorGraph.AddOperator(eo3);
88      co2.AddSubOperator(eo3);
89
90      CombinedOperator co3 = CreateESMain();
91      co3.Name = "ES Main";
92      op.OperatorGraph.AddOperator(co3);
93      sp.AddSubOperator(co3);
94
95      // place holder for Mutator
96      EmptyOperator eo4 = new EmptyOperator();
97      eo4.Name = "Mutator";
98      op.OperatorGraph.AddOperator(eo4);
99      co3.AddSubOperator(eo4);
100
101      // place holder for Evaluator
102      co3.AddSubOperator(eo3);
103
104      // place holder for Recombinator
105      EmptyOperator eo5 = new EmptyOperator();
106      eo5.Name = "Recombinator";
107      op.OperatorGraph.AddOperator(eo5);
108      co3.AddSubOperator(eo5);
109
110      return op;
111    }
112    private static CombinedOperator CreateVariableInjection() {
113      CombinedOperator op = new CombinedOperator();
114      SequentialProcessor sp = new SequentialProcessor();
115      op.OperatorGraph.AddOperator(sp);
116      op.OperatorGraph.InitialOperator = sp;
117
118      RandomInjector ri = new RandomInjector();
119      op.OperatorGraph.AddOperator(ri);
120      sp.AddSubOperator(ri);
121
122      OperatorExtractor oe = new OperatorExtractor();
123      oe.Name = "ProblemInjector";
124      oe.GetVariableInfo("Operator").ActualName = "ProblemInjector";
125      op.OperatorGraph.AddOperator(oe);
126      sp.AddSubOperator(oe);
127
128      VariableInjector vi = new VariableInjector();
129      vi.AddVariable(new Variable("ESmu", new IntData(1)));
130      vi.AddVariable(new Variable("ESrho", new IntData(1)));
131      vi.AddVariable(new Variable("ESlambda", new IntData(1)));
132      vi.AddVariable(new Variable("EvaluatedSolutions", new IntData()));
133      vi.AddVariable(new Variable("PlusNotation", new BoolData(true)));
134      vi.AddVariable(new Variable("Generations", new IntData()));
135      vi.AddVariable(new Variable("MaximumGenerations", new IntData(1000)));
136      vi.AddVariable(new Variable("LearningRate", new DoubleData(0.1)));
137      vi.AddVariable(new Variable("DampeningFactor", new DoubleData(10.0)));
138      vi.AddVariable(new Variable("ShakingFactor", new DoubleData(5.0)));
139      vi.AddVariable(new Variable("TargetSuccessProbability", new DoubleData(0.2)));
140      vi.AddVariable(new Variable("SuccessProbability", new DoubleData(0.2)));
141      vi.AddVariable(new Variable("UseSuccessRule", new BoolData(true)));
142      op.OperatorGraph.AddOperator(vi);
143      sp.AddSubOperator(vi);
144
145      return op;
146    }
147    private static CombinedOperator CreatePopulationInitialization() {
148      CombinedOperator op = new CombinedOperator();
149      SequentialProcessor sp1 = new SequentialProcessor();
150      op.OperatorGraph.AddOperator(sp1);
151      op.OperatorGraph.InitialOperator = sp1;
152
153      SubScopesCreater ssc = new SubScopesCreater();
154      ssc.GetVariableInfo("SubScopes").ActualName = "ESmu";
155      op.OperatorGraph.AddOperator(ssc);
156      sp1.AddSubOperator(ssc);
157
158      UniformSequentialSubScopesProcessor ussp = new UniformSequentialSubScopesProcessor();
159      op.OperatorGraph.AddOperator(ussp);
160      sp1.AddSubOperator(ussp);
161
162      SequentialProcessor sp2 = new SequentialProcessor();
163      op.OperatorGraph.AddOperator(sp2);
164      ussp.AddSubOperator(sp2);
165
166      OperatorExtractor oe1 = new OperatorExtractor();
167      oe1.Name = "SolutionGenerator";
168      oe1.GetVariableInfo("Operator").ActualName = "SolutionGenerator";
169      op.OperatorGraph.AddOperator(oe1);
170      sp2.AddSubOperator(oe1);
171
172      OperatorExtractor oe2 = new OperatorExtractor();
173      oe2.Name = "Evaluator";
174      oe2.GetVariableInfo("Operator").ActualName = "Evaluator";
175      op.OperatorGraph.AddOperator(oe2);
176      sp2.AddSubOperator(oe2);
177
178      Counter c = new Counter();
179      c.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
180      op.OperatorGraph.AddOperator(c);
181      sp2.AddSubOperator(c);
182
183      Sorter s = new Sorter();
184      s.GetVariableInfo("Descending").ActualName = "Maximization";
185      s.GetVariableInfo("Value").ActualName = "Quality";
186      op.OperatorGraph.AddOperator(s);
187      sp1.AddSubOperator(s);
188
189      return op;
190    }
191    private static CombinedOperator CreateESMain() {
192      CombinedOperator op = new CombinedOperator();
193      SequentialProcessor sp = new SequentialProcessor();
194      op.OperatorGraph.AddOperator(sp);
195      op.OperatorGraph.InitialOperator = sp;
196
197      ESRandomSelector rs = new ESRandomSelector();
198      rs.Name = "Child Selector";
199      rs.GetVariableInfo("Lambda").ActualName = "ESlambda";
200      rs.GetVariableInfo("Rho").ActualName = "ESrho";
201      op.OperatorGraph.AddOperator(rs);
202      sp.AddSubOperator(rs);
203
204      SequentialSubScopesProcessor ssp = new SequentialSubScopesProcessor();
205      op.OperatorGraph.AddOperator(ssp);
206      sp.AddSubOperator(ssp);
207
208      EmptyOperator eo = new EmptyOperator();
209      op.OperatorGraph.AddOperator(eo);
210      ssp.AddSubOperator(eo);
211
212      CombinedOperator co1 = CreateCreateChildren();
213      co1.Name = "Create Children";
214      op.OperatorGraph.AddOperator(co1);
215      ssp.AddSubOperator(co1);
216
217      ConditionalBranch cb1 = new ConditionalBranch();
218      cb1.Name = "Plus or Comma Replacement";
219      cb1.GetVariableInfo("Condition").ActualName = "PlusNotation";
220      op.OperatorGraph.AddOperator(cb1);
221      sp.AddSubOperator(cb1);
222
223      MergingReducer mr = new MergingReducer();
224      mr.Name = "Plus Replacement";
225      op.OperatorGraph.AddOperator(mr);
226      cb1.AddSubOperator(mr);
227
228      RightReducer rr = new RightReducer();
229      rr.Name = "Comma Replacement";
230      op.OperatorGraph.AddOperator(rr);
231      cb1.AddSubOperator(rr);
232
233      CombinedOperator co2 = CreateReplacement();
234      co2.Name = "Parents Selection";
235      op.OperatorGraph.AddOperator(co2);
236      sp.AddSubOperator(co2);
237
238      QualityLogger ql = new QualityLogger();
239      op.OperatorGraph.AddOperator(ql);
240      sp.AddSubOperator(ql);
241
242      BestAverageWorstQualityCalculator bawqc = new BestAverageWorstQualityCalculator();
243      op.OperatorGraph.AddOperator(bawqc);
244      sp.AddSubOperator(bawqc);
245
246      DataCollector dc = new DataCollector();
247      ItemList<StringData> names = dc.GetVariable("VariableNames").GetValue<ItemList<StringData>>();
248      names.Add(new StringData("BestQuality"));
249      names.Add(new StringData("AverageQuality"));
250      names.Add(new StringData("WorstQuality"));
251      op.OperatorGraph.AddOperator(dc);
252      sp.AddSubOperator(dc);
253
254      LinechartInjector lci = new LinechartInjector();
255      lci.GetVariableInfo("Linechart").ActualName = "Quality Linechart";
256      lci.GetVariable("NumberOfLines").GetValue<IntData>().Data = 3;
257      op.OperatorGraph.AddOperator(lci);
258      sp.AddSubOperator(lci);
259
260      Counter c = new Counter();
261      c.GetVariableInfo("Value").ActualName = "Generations";
262      op.OperatorGraph.AddOperator(c);
263      sp.AddSubOperator(c);
264
265      LessThanComparator ltc = new LessThanComparator();
266      ltc.GetVariableInfo("LeftSide").ActualName = "Generations";
267      ltc.GetVariableInfo("RightSide").ActualName = "MaximumGenerations";
268      ltc.GetVariableInfo("Result").ActualName = "GenerationsCondition";
269      op.OperatorGraph.AddOperator(ltc);
270      sp.AddSubOperator(ltc);
271
272      ConditionalBranch cb2 = new ConditionalBranch();
273      cb2.GetVariableInfo("Condition").ActualName = "GenerationsCondition";
274      op.OperatorGraph.AddOperator(cb2);
275      sp.AddSubOperator(cb2);
276
277      cb2.AddSubOperator(sp);
278
279      return op;
280    }
281    private static CombinedOperator CreateCreateChildren() {
282      CombinedOperator op = new CombinedOperator();
283      SequentialProcessor sp1 = new SequentialProcessor();
284      op.OperatorGraph.AddOperator(sp1);
285      op.OperatorGraph.InitialOperator = sp1;
286
287      ConditionalBranch cb = new ConditionalBranch();
288      cb.GetVariableInfo("Condition").ActualName = "UseSuccessRule";
289      op.OperatorGraph.AddOperator(cb);
290      sp1.AddSubOperator(cb);
291
292      SequentialProcessor sp2 = new SequentialProcessor();
293      op.OperatorGraph.AddOperator(sp2);
294      cb.AddSubOperator(sp2);
295
296      OffspringAnalyzer oa = new OffspringAnalyzer();
297      oa.Name = "Offspring Analyzer";
298      oa.GetVariable("ParentsCount").Value = new IntData(1);
299      oa.GetVariable("ComparisonFactor").Value = new DoubleData(0.0);
300      op.OperatorGraph.AddOperator(oa);
301      sp2.AddSubOperator(oa);
302
303      SequentialProcessor sp3 = new SequentialProcessor();
304      op.OperatorGraph.AddOperator(sp3);
305      oa.AddSubOperator(sp3);
306      cb.AddSubOperator(sp3);
307
308      OperatorExtractor oe1 = new OperatorExtractor();
309      oe1.Name = "Recombinator";
310      oe1.GetVariableInfo("Operator").ActualName = "Recombinator";
311      op.OperatorGraph.AddOperator(oe1);
312      sp3.AddSubOperator(oe1);
313
314      UniformSequentialSubScopesProcessor ussp = new UniformSequentialSubScopesProcessor();
315      op.OperatorGraph.AddOperator(ussp);
316      sp3.AddSubOperator(ussp);
317
318      SequentialProcessor sp4 = new SequentialProcessor();
319      op.OperatorGraph.AddOperator(sp4);
320      ussp.AddSubOperator(sp4);
321
322      OperatorExtractor oe2 = new OperatorExtractor();
323      oe2.Name = "Mutator";
324      oe2.GetVariableInfo("Operator").ActualName = "Mutator";
325      op.OperatorGraph.AddOperator(oe2);
326      sp4.AddSubOperator(oe2);
327
328      OperatorExtractor oe3 = new OperatorExtractor();
329      oe3.Name = "Evaluator";
330      oe3.GetVariableInfo("Operator").ActualName = "Evaluator";
331      op.OperatorGraph.AddOperator(oe3);
332      sp4.AddSubOperator(oe3);
333
334      Counter c = new Counter();
335      c.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
336      op.OperatorGraph.AddOperator(c);
337      sp4.AddSubOperator(c);
338
339      SuccessRuleMutationStrengthAdjuster srmsa = new SuccessRuleMutationStrengthAdjuster();
340      srmsa.Name = "SuccessRuleMutationStrengthAdjuster";
341      op.OperatorGraph.AddOperator(srmsa);
342      sp2.AddSubOperator(srmsa);
343
344      Sorter s = new Sorter();
345      s.GetVariableInfo("Value").ActualName = "Quality";
346      s.GetVariableInfo("Descending").ActualName = "Maximization";
347      op.OperatorGraph.AddOperator(s);
348      sp1.AddSubOperator(s);
349
350      return op;
351    }
352    private static CombinedOperator CreateReplacement() {
353      CombinedOperator op = new CombinedOperator();
354      SequentialProcessor sp1 = new SequentialProcessor();
355      op.OperatorGraph.AddOperator(sp1);
356      op.OperatorGraph.InitialOperator = sp1;
357
358      Sorter s = new Sorter();
359      s.GetVariableInfo("Descending").ActualName = "Maximization";
360      s.GetVariableInfo("Value").ActualName = "Quality";
361      op.OperatorGraph.AddOperator(s);
362      sp1.AddSubOperator(s);
363
364      LeftSelector ls = new LeftSelector();
365      ls.Name = "Parents Selector";
366      ls.GetVariableInfo("Selected").ActualName = "ESmu";
367      ls.GetVariable("CopySelected").Value = new BoolData(false);
368      op.OperatorGraph.AddOperator(ls);
369      sp1.AddSubOperator(ls);
370
371      RightReducer rr = new RightReducer();
372      rr.Name = "RightReducer";
373      op.OperatorGraph.AddOperator(rr);
374      sp1.AddSubOperator(rr);
375
376      return op;
377    }
378    #endregion
379
380    #region Properties
381    private IEngine myEngine;
382    /// <summary>
383    /// Gets the engine of the current instance.
384    /// </summary>
385    public IEngine Engine {
386      get { return myEngine; }
387    }
388    private BoolData mySetSeedRandomly;
389    /// <summary>
390    /// Gets or sets the boolean flag whether to set the seed randomly or not.
391    /// </summary>
392    public bool SetSeedRandomly {
393      get { return mySetSeedRandomly.Data; }
394      set { mySetSeedRandomly.Data = value; }
395    }
396    private IntData mySeed;
397    /// <summary>
398    /// Gets or sets the seed of the current instance.
399    /// </summary>
400    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ItemBase"/>
401    /// in the setter.</remarks>
402    public int Seed {
403      get { return mySeed.Data; }
404      set {
405        mySeed.Data = value;
406        OnChanged();
407      }
408    }
409    private IntData myMu;
410    /// <summary>
411    /// Gets or sets the µ value of the current instance.
412    /// </summary>
413    /// <remarks>Sets also the lambda and the rho value. Calls <see cref="ItemBase.OnChanged"/> of
414    /// base class <see cref="ItemBase"/>.</remarks>
415    public int Mu {
416      get { return myMu.Data; }
417      set {
418        if (value > 0) {
419          myMu.Data = value;
420          if (!PlusNotation && value >= Lambda) myLambda.Data = value + 1;
421          if (value < Rho) myRho.Data = value;
422          OnChanged();
423        }
424      }
425    }
426    private IntData myRho;
427    /// <summary>
428    /// Gets or sets the rho value of the current instance.
429    /// </summary>
430    /// <remarks>Sets also the µ value. Calls <see cref="ItemBase.OnChanged"/> of
431    /// base class <see cref="ItemBase"/>.</remarks>
432    public int Rho {
433      get { return myRho.Data; }
434      set {
435        if (value > 0) {
436          myRho.Data = value;
437          if (value > Mu) Mu = value;
438          OnChanged();
439        }
440      }
441    }
442    private IntData myLambda;
443    /// <summary>
444    /// Gets or sets the lambda value of the current instance.
445    /// </summary>
446    /// <remarks>May also change the µ value under certain circumstances.
447    /// Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ItemBase"/>.</remarks>
448    public int Lambda {
449      get { return myLambda.Data; }
450      set {
451        if (value > 0) {
452          if (PlusNotation) myLambda.Data = value;
453          else {
454            if (value > 1 && value < Mu) {
455              myLambda.Data = value;
456              myMu.Data = value - 1;
457            } else if (value == 1) {
458              myMu.Data = 1;
459              myLambda.Data = 2;
460            } else if (value > Mu) {
461              myLambda.Data = value;
462            }
463          }
464          OnChanged();
465        }
466      }
467    }
468    private BoolData myPlusNotation;
469    /// <summary>
470    /// Gets or sets the boolean flag whether it is a plus notation or not.
471    /// </summary>
472    /// <remarks>May also set the lambda value under certain circumstances.
473    /// Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ItemBase"/>.</remarks>
474    public bool PlusNotation {
475      get { return myPlusNotation.Data; }
476      set {
477        if (!value && myPlusNotation.Data) { // from plus to point
478          if (Lambda <= Mu) {
479            myLambda.Data = Mu + 1;
480          }
481        }
482        myPlusNotation.Data = value;
483        OnChanged();
484      }
485    }
486    private DoubleData myShakingFactor;
487    /// <summary>
488    /// Gets or sets the shaking factor of the current instance.
489    /// </summary>
490    public double ShakingFactor {
491      get { return myShakingFactor.Data; }
492      set { myShakingFactor.Data = value; }
493    }
494    private DoubleData mySuccessProbability;
495   
496    private DoubleData myTargetSuccessProbability;
497    /// <summary>
498    /// Gets or sets the success probability.
499    /// </summary>
500    /// <remarks>Gets the target success probability and sets also the target success probability.</remarks>
501    public double SuccessProbability {
502      get { return myTargetSuccessProbability.Data; }
503      set {
504        myTargetSuccessProbability.Data = value;
505        mySuccessProbability.Data = value;
506      }
507    }
508    private DoubleData myLearningRate;
509    /// <summary>
510    /// Gets or sets the learning rate.
511    /// </summary>
512    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ItemBase"/>
513    /// in the setter.</remarks>
514    public double LearningRate {
515      get { return myLearningRate.Data; }
516      set {
517        if (value > 0.0 && value <= 1.0) {
518          myLearningRate.Data = value;
519          OnChanged();
520        }
521      }
522    }
523    private DoubleData myDampeningFactor;
524    /// <summary>
525    /// Gets or sets the dampening factor.
526    /// </summary>
527    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ItemBase"/>
528    /// in the setter.</remarks>
529    public double DampeningFactor {
530      get { return myDampeningFactor.Data; }
531      set {
532        if (value >= 1.0) {
533          myDampeningFactor.Data = value;
534          OnChanged();
535        }
536      }
537    }
538    private IntData myMaximumGenerations;
539    /// <summary>
540    /// Gets or sets the maximum number of generations.
541    /// </summary>
542    public int MaximumGenerations {
543      get { return myMaximumGenerations.Data; }
544      set { myMaximumGenerations.Data = value; }
545    }
546    private BoolData myUseSuccessRule;
547    /// <summary>
548    /// Gets or sets the boolean flag whether to use the success rule or not.
549    /// </summary>
550    public bool UseSuccessRule {
551      get { return myUseSuccessRule.Data; }
552      set { myUseSuccessRule.Data = value; }
553    }
554    private CombinedOperator myES;
555    private IOperator myESMain;
556    private IOperator myVariableInjection;
557    /// <summary>
558    /// Gets or sets the problem injection operator.
559    /// </summary>
560    public IOperator ProblemInjector {
561      get { return myVariableInjection.SubOperators[0]; }
562      set {
563        value.Name = "ProblemInjector";
564        myES.OperatorGraph.RemoveOperator(ProblemInjector.Guid);
565        myES.OperatorGraph.AddOperator(value);
566        myVariableInjection.AddSubOperator(value, 0);
567      }
568    }
569    private IOperator myPopulationInitialization;
570    /// <summary>
571    /// Gets or sets the solution generation operator.
572    /// </summary>
573    public IOperator SolutionGenerator {
574      get { return myPopulationInitialization.SubOperators[0]; }
575      set {
576        value.Name = "SolutionGenerator";
577        myES.OperatorGraph.RemoveOperator(SolutionGenerator.Guid);
578        myES.OperatorGraph.AddOperator(value);
579        myPopulationInitialization.AddSubOperator(value, 0);
580      }
581    }
582    /// <summary>
583    /// Gets or sets the evaluation operator.
584    /// </summary>
585    public IOperator Evaluator {
586      get { return myPopulationInitialization.SubOperators[1]; }
587      set {
588        value.Name = "Evaluator";
589        myES.OperatorGraph.RemoveOperator(Evaluator.Guid);
590        myES.OperatorGraph.AddOperator(value);
591        myPopulationInitialization.AddSubOperator(value, 1);
592        myESMain.AddSubOperator(value, 1);
593      }
594    }
595    /// <summary>
596    /// Gets or sets the mutation operator.
597    /// </summary>
598    public IOperator Mutator {
599      get { return myESMain.SubOperators[0]; }
600      set {
601        value.Name = "Mutator";
602        myES.OperatorGraph.RemoveOperator(Mutator.Guid);
603        myES.OperatorGraph.AddOperator(value);
604        myESMain.AddSubOperator(value, 0);
605      }
606    }
607    /// <summary>
608    /// Gets or sets the recombination operator.
609    /// </summary>
610    public IOperator Recombinator {
611      get { return myESMain.SubOperators[2]; }
612      set {
613        value.Name = "Recombinator";
614        myES.OperatorGraph.RemoveOperator(Recombinator.Guid);
615        myES.OperatorGraph.AddOperator(value);
616        myESMain.AddSubOperator(value, 2);
617      }
618    }
619    #endregion
620
621    /// <summary>
622    /// Initializes a new instance of <see cref="ES"/> having a <see cref="SequentialEngine"/> as engine.
623    /// </summary>
624    public ES() {
625      myEngine = new SequentialEngine.SequentialEngine();
626      Create(myEngine);
627      SetReferences();
628    }
629
630    /// <summary>
631    /// Creates a new instance of <see cref="ESEditor"/> to display the current instance.
632    /// </summary>
633    /// <returns>The created view as <see cref="ESEditor"/>.</returns>
634    public override IView CreateView() {
635      return new ESEditor(this);
636    }
637    /// <summary>
638    /// Creates a new instance of <see cref="ESEditor"/> to display the current instance.
639    /// </summary>
640    /// <returns>The created editor as <see cref="ESEditor"/>.</returns>
641    public virtual IEditor CreateEditor() {
642      return new ESEditor(this);
643    }
644
645    /// <summary>
646    /// Clones the current instance (deep clone).
647    /// </summary>
648    /// <remarks>Uses <see cref="Auxiliary.Clone"/> method of the <see cref="Auxiliary"/> class to
649    /// clone the engine.</remarks>
650    /// <param name="clonedObjects">A dictionary of all already cloned objects.
651    /// (Needed to avoid cycles.)</param>
652    /// <returns>The cloned object as <see cref="ES"/>.</returns>
653    public override object Clone(IDictionary<Guid, object> clonedObjects) {
654      ES clone = new ES();
655      clonedObjects.Add(Guid, clone);
656      clone.myEngine = (IEngine)Auxiliary.Clone(Engine, clonedObjects);
657      return clone;
658    }
659
660    #region SetReferences Method
661    private void SetReferences() {
662      // ES
663      CombinedOperator co1 = (CombinedOperator)Engine.OperatorGraph.InitialOperator;
664      myES = co1;
665      // SequentialProcessor in ES
666      SequentialProcessor sp1 = (SequentialProcessor)co1.OperatorGraph.InitialOperator;
667      // Variable Injection
668      CombinedOperator co2 = (CombinedOperator)sp1.SubOperators[0];
669      myVariableInjection = co2;
670      // SequentialProcessor in Variable Injection
671      SequentialProcessor sp2 = (SequentialProcessor)co2.OperatorGraph.InitialOperator;
672      // RandomInjector
673      RandomInjector ri = (RandomInjector)sp2.SubOperators[0];
674      mySetSeedRandomly = ri.GetVariable("SetSeedRandomly").GetValue<BoolData>();
675      mySeed = ri.GetVariable("Seed").GetValue<IntData>();
676      // VariableInjector
677      VariableInjector vi = (VariableInjector)sp2.SubOperators[2];
678      myMu = vi.GetVariable("ESmu").GetValue<IntData>();
679      myRho = vi.GetVariable("ESrho").GetValue<IntData>();
680      myLambda = vi.GetVariable("ESlambda").GetValue<IntData>();
681      myMaximumGenerations = vi.GetVariable("MaximumGenerations").GetValue<IntData>();
682      myPlusNotation = vi.GetVariable("PlusNotation").GetValue<BoolData>();
683      myShakingFactor = vi.GetVariable("ShakingFactor").GetValue<DoubleData>();
684      myTargetSuccessProbability = vi.GetVariable("TargetSuccessProbability").GetValue<DoubleData>();
685      mySuccessProbability = vi.GetVariable("SuccessProbability").GetValue<DoubleData>();
686      myLearningRate = vi.GetVariable("LearningRate").GetValue<DoubleData>();
687      myDampeningFactor = vi.GetVariable("DampeningFactor").GetValue<DoubleData>();
688      myUseSuccessRule = vi.GetVariable("UseSuccessRule").GetValue<BoolData>();
689      // Population Initialization
690      CombinedOperator co3 = (CombinedOperator)sp1.SubOperators[1];
691      myPopulationInitialization = co3;
692      // ES Main
693      CombinedOperator co4 = (CombinedOperator)sp1.SubOperators[2];
694      myESMain = co4;
695    }
696    #endregion
697
698    #region Persistence Methods
699    /// <summary>
700    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
701    /// </summary>
702    /// <remarks>Calls <see cref="StorableBase.GetXmlNode"/> of base class <see cref="ItemBase"/>.
703    /// <br/>The engine of the current instance is saved as child node with tag name <c>Engine</c>.</remarks>
704    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
705    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
706    /// <param name="persistedObjects">The dictionary of all already persisted objects.
707    /// (Needed to avoid cycles.)</param>
708    /// <returns>The saved <see cref="XmlNode"/>.</returns>
709    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
710      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
711      node.AppendChild(PersistenceManager.Persist("Engine", Engine, document, persistedObjects));
712      return node;
713    }
714    /// <summary>
715    /// Loads the persisted ES from the specified <paramref name="node"/>.
716    /// </summary>
717    /// <remarks>Calls <see cref="StorableBase.Populate"/> of base class <see cref="ItemBase"/>.<br/>
718    /// The engine must be saved as child node with tag name <c>Engine</c> (see
719    /// <see cref="GetXmlNode"/>).</remarks>
720    /// <param name="node">The <see cref="XmlNode"/> where the value is saved.</param>
721    /// <param name="restoredObjects">The dictionary of all already restored objects.
722    /// (Needed to avoid cycles.)</param>
723    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
724      base.Populate(node, restoredObjects);
725      myEngine = (IEngine)PersistenceManager.Restore(node.SelectSingleNode("Engine"), restoredObjects);
726      SetReferences();
727    }
728    #endregion
729  }
730}
Note: See TracBrowser for help on using the repository browser.