Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs @ 3359

Last change on this file since 3359 was 3359, checked in by abeham, 14 years ago

Fixed bug in IslandGeneticAlgorithm #971
(updated TS workbench)

File size: 24.1 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 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.Linq;
25using HeuristicLab.Core;
26using HeuristicLab.Data;
27using HeuristicLab.Operators;
28using HeuristicLab.Optimization;
29using HeuristicLab.Optimization.Operators;
30using HeuristicLab.Parameters;
31using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
32using HeuristicLab.PluginInfrastructure;
33using HeuristicLab.Selection;
34
35namespace HeuristicLab.Algorithms.GeneticAlgorithm {
36  /// <summary>
37  /// An island genetic algorithm.
38  /// </summary>
39  [Item("Island Genetic Algorithm", "An island genetic algorithm.")]
40  [Creatable("Algorithms")]
41  [StorableClass]
42  public sealed class IslandGeneticAlgorithm : EngineAlgorithm {
43
44    #region Problem Properties
45    public override Type ProblemType {
46      get { return typeof(ISingleObjectiveProblem); }
47    }
48    public new ISingleObjectiveProblem Problem {
49      get { return (ISingleObjectiveProblem)base.Problem; }
50      set { base.Problem = value; }
51    }
52    #endregion
53
54    #region Parameter Properties
55    private ValueParameter<IntValue> SeedParameter {
56      get { return (ValueParameter<IntValue>)Parameters["Seed"]; }
57    }
58    private ValueParameter<BoolValue> SetSeedRandomlyParameter {
59      get { return (ValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
60    }
61    private ValueParameter<IntValue> NumberOfIslandsParameter {
62      get { return (ValueParameter<IntValue>)Parameters["NumberOfIslands"]; }
63    }
64    private ValueParameter<IntValue> MigrationIntervalParameter {
65      get { return (ValueParameter<IntValue>)Parameters["MigrationInterval"]; }
66    }
67    private ValueParameter<PercentValue> MigrationRateParameter {
68      get { return (ValueParameter<PercentValue>)Parameters["MigrationRate"]; }
69    }
70    private ConstrainedValueParameter<IMigrator> MigratorParameter {
71      get { return (ConstrainedValueParameter<IMigrator>)Parameters["Migrator"]; }
72    }
73    private ConstrainedValueParameter<ISelector> EmigrantsSelectorParameter {
74      get { return (ConstrainedValueParameter<ISelector>)Parameters["EmigrantsSelector"]; }
75    }
76    private ConstrainedValueParameter<ISelector> ImmigrationSelectorParameter {
77      get { return (ConstrainedValueParameter<ISelector>)Parameters["ImmigrationSelector"]; }
78    }
79    private ValueParameter<IntValue> PopulationSizeParameter {
80      get { return (ValueParameter<IntValue>)Parameters["PopulationSize"]; }
81    }
82    private ValueParameter<IntValue> MaximumMigrationsParameter {
83      get { return (ValueParameter<IntValue>)Parameters["MaximumMigrations"]; }
84    }
85    private ConstrainedValueParameter<ISelector> SelectorParameter {
86      get { return (ConstrainedValueParameter<ISelector>)Parameters["Selector"]; }
87    }
88    private ConstrainedValueParameter<ICrossover> CrossoverParameter {
89      get { return (ConstrainedValueParameter<ICrossover>)Parameters["Crossover"]; }
90    }
91    private ValueParameter<PercentValue> MutationProbabilityParameter {
92      get { return (ValueParameter<PercentValue>)Parameters["MutationProbability"]; }
93    }
94    private OptionalConstrainedValueParameter<IManipulator> MutatorParameter {
95      get { return (OptionalConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; }
96    }
97    private ValueParameter<IntValue> ElitesParameter {
98      get { return (ValueParameter<IntValue>)Parameters["Elites"]; }
99    }
100    private ValueParameter<BoolValue> ParallelParameter {
101      get { return (ValueParameter<BoolValue>)Parameters["Parallel"]; }
102    }
103    #endregion
104
105    #region Properties
106    public IntValue Seed {
107      get { return SeedParameter.Value; }
108      set { SeedParameter.Value = value; }
109    }
110    public BoolValue SetSeedRandomly {
111      get { return SetSeedRandomlyParameter.Value; }
112      set { SetSeedRandomlyParameter.Value = value; }
113    }
114    public IntValue NumberOfIslands {
115      get { return NumberOfIslandsParameter.Value; }
116      set { NumberOfIslandsParameter.Value = value; }
117    }
118    public IntValue MigrationInterval {
119      get { return MigrationIntervalParameter.Value; }
120      set { MigrationIntervalParameter.Value = value; }
121    }
122    public PercentValue MigrationRate {
123      get { return MigrationRateParameter.Value; }
124      set { MigrationRateParameter.Value = value; }
125    }
126    public IMigrator Migrator {
127      get { return MigratorParameter.Value; }
128      set { MigratorParameter.Value = value; }
129    }
130    public ISelector EmigrantsSelector {
131      get { return EmigrantsSelectorParameter.Value; }
132      set { EmigrantsSelectorParameter.Value = value; }
133    }
134    public ISelector ImmigrationSelector {
135      get { return ImmigrationSelectorParameter.Value; }
136      set { ImmigrationSelectorParameter.Value = value; }
137    }
138    public IntValue PopulationSize {
139      get { return PopulationSizeParameter.Value; }
140      set { PopulationSizeParameter.Value = value; }
141    }
142    public IntValue MaximumMigrations {
143      get { return MaximumMigrationsParameter.Value; }
144      set { MaximumMigrationsParameter.Value = value; }
145    }
146    public ISelector Selector {
147      get { return SelectorParameter.Value; }
148      set { SelectorParameter.Value = value; }
149    }
150    public ICrossover Crossover {
151      get { return CrossoverParameter.Value; }
152      set { CrossoverParameter.Value = value; }
153    }
154    public PercentValue MutationProbability {
155      get { return MutationProbabilityParameter.Value; }
156      set { MutationProbabilityParameter.Value = value; }
157    }
158    public IManipulator Mutator {
159      get { return MutatorParameter.Value; }
160      set { MutatorParameter.Value = value; }
161    }
162    public IntValue Elites {
163      get { return ElitesParameter.Value; }
164      set { ElitesParameter.Value = value; }
165    }
166    public BoolValue Parallel {
167      get { return ParallelParameter.Value; }
168      set { ParallelParameter.Value = value; }
169    }
170    private List<ISelector> selectors;
171    private IEnumerable<ISelector> Selectors {
172      get { return selectors; }
173    }
174    private List<ISelector> emigrantsSelectors;
175    private List<ISelector> immigrationSelectors;
176    private List<IMigrator> migrators;
177    private RandomCreator RandomCreator {
178      get { return (RandomCreator)OperatorGraph.InitialOperator; }
179    }
180    private SolutionsCreator SolutionsCreator {
181      get { return (SolutionsCreator)((RandomCreator.Successor as SubScopesCreator).Successor as UniformSubScopesProcessor).Operator; }
182    }
183    private IslandGeneticAlgorithmMainLoop MainLoop {
184      get { return (IslandGeneticAlgorithmMainLoop)((RandomCreator.Successor as SubScopesCreator).Successor as UniformSubScopesProcessor).Successor; }
185    }
186    #endregion
187
188    [StorableConstructor]
189    private IslandGeneticAlgorithm(bool deserializing) : base(deserializing) { }
190    public IslandGeneticAlgorithm()
191      : base() {
192      Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
193      Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
194      Parameters.Add(new ValueParameter<IntValue>("NumberOfIslands", "The number of islands.", new IntValue(5)));
195      Parameters.Add(new ValueParameter<IntValue>("MigrationInterval", "The number of generations that should pass between migration phases.", new IntValue(20)));
196      Parameters.Add(new ValueParameter<PercentValue>("MigrationRate", "The proportion of individuals that should migrate between the islands.", new PercentValue(0.15)));
197      Parameters.Add(new ConstrainedValueParameter<IMigrator>("Migrator", "The migration strategy."));
198      Parameters.Add(new ConstrainedValueParameter<ISelector>("EmigrantsSelector", "Selects the individuals that will be migrated."));
199      Parameters.Add(new ConstrainedValueParameter<ISelector>("ImmigrationSelector", "Selects the population from the unification of the original population and the immigrants."));
200      Parameters.Add(new ValueParameter<IntValue>("PopulationSize", "The size of the population of solutions.", new IntValue(100)));
201      Parameters.Add(new ValueParameter<IntValue>("MaximumMigrations", "The maximum number of migrations that should occur.", new IntValue(100)));
202      Parameters.Add(new ConstrainedValueParameter<ISelector>("Selector", "The operator used to select solutions for reproduction."));
203      Parameters.Add(new ConstrainedValueParameter<ICrossover>("Crossover", "The operator used to cross solutions."));
204      Parameters.Add(new ValueParameter<PercentValue>("MutationProbability", "The probability that the mutation operator is applied on a solution.", new PercentValue(0.05)));
205      Parameters.Add(new OptionalConstrainedValueParameter<IManipulator>("Mutator", "The operator used to mutate solutions."));
206      Parameters.Add(new ValueParameter<IntValue>("Elites", "The numer of elite solutions which are kept in each generation.", new IntValue(1)));
207      Parameters.Add(new ValueParameter<BoolValue>("Parallel", "True if the islands should be run in parallel (also requires a parallel engine)", new BoolValue(false)));
208
209      RandomCreator randomCreator = new RandomCreator();
210      SubScopesCreator populationCreator = new SubScopesCreator();
211      UniformSubScopesProcessor ussp1 = new UniformSubScopesProcessor();
212      SolutionsCreator solutionsCreator = new SolutionsCreator();
213      IslandGeneticAlgorithmMainLoop mainLoop = new IslandGeneticAlgorithmMainLoop();
214      OperatorGraph.InitialOperator = randomCreator;
215
216      randomCreator.RandomParameter.ActualName = "Random";
217      randomCreator.SeedParameter.ActualName = SeedParameter.Name;
218      randomCreator.SeedParameter.Value = null;
219      randomCreator.SetSeedRandomlyParameter.ActualName = SetSeedRandomlyParameter.Name;
220      randomCreator.SetSeedRandomlyParameter.Value = null;
221      randomCreator.Successor = populationCreator;
222
223      populationCreator.NumberOfSubScopesParameter.ActualName = NumberOfIslandsParameter.Name;
224      populationCreator.Successor = ussp1;
225
226      ussp1.Operator = solutionsCreator;
227      ussp1.Successor = mainLoop;
228
229      solutionsCreator.NumberOfSolutionsParameter.ActualName = PopulationSizeParameter.Name;
230      solutionsCreator.Successor = null;
231
232      mainLoop.EmigrantsSelectorParameter.ActualName = EmigrantsSelectorParameter.Name;
233      mainLoop.ImmigrationSelectorParameter.ActualName = ImmigrationSelectorParameter.Name;
234      mainLoop.MaximumMigrationsParameter.ActualName = MaximumMigrationsParameter.Name;
235      mainLoop.MigrationIntervalParameter.ActualName = MigrationIntervalParameter.Name;
236      mainLoop.MigrationRateParameter.ActualName = MigrationRateParameter.Name;
237      mainLoop.MigratorParameter.ActualName = MigratorParameter.Name;
238      mainLoop.NumberOfIslandsParameter.ActualName = NumberOfIslandsParameter.Name;
239      mainLoop.SelectorParameter.ActualName = SelectorParameter.Name;
240      mainLoop.CrossoverParameter.ActualName = CrossoverParameter.Name;
241      mainLoop.ElitesParameter.ActualName = ElitesParameter.Name;
242      mainLoop.MutatorParameter.ActualName = MutatorParameter.Name;
243      mainLoop.MutationProbabilityParameter.ActualName = MutationProbabilityParameter.Name;
244      mainLoop.RandomParameter.ActualName = randomCreator.RandomParameter.ActualName;
245      mainLoop.ResultsParameter.ActualName = "Results";
246
247      mainLoop.Successor = null;
248
249      Initialize();
250    }
251
252    public override IDeepCloneable Clone(Cloner cloner) {
253      IslandGeneticAlgorithm clone = (IslandGeneticAlgorithm)base.Clone(cloner);
254      clone.Initialize();
255      return clone;
256    }
257
258    public override void Prepare() {
259      if (Problem != null) base.Prepare();
260    }
261
262    #region Events
263    protected override void OnProblemChanged() {
264      ParameterizeStochasticOperator(Problem.SolutionCreator);
265      ParameterizeStochasticOperator(Problem.Evaluator);
266      ParameterizeStochasticOperator(Problem.Visualizer);
267      foreach (IOperator op in Problem.Operators) ParameterizeStochasticOperator(op);
268      ParameterizeSolutionsCreator();
269      ParameterizeMainLoop();
270      ParameterizeSelectors();
271      UpdateCrossovers();
272      UpdateMutators();
273      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
274      if (Problem.Visualizer != null) Problem.Visualizer.VisualizationParameter.ActualNameChanged += new EventHandler(Visualizer_VisualizationParameter_ActualNameChanged);
275      base.OnProblemChanged();
276    }
277
278    protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) {
279      ParameterizeStochasticOperator(Problem.SolutionCreator);
280      ParameterizeSolutionsCreator();
281      base.Problem_SolutionCreatorChanged(sender, e);
282    }
283    protected override void Problem_EvaluatorChanged(object sender, EventArgs e) {
284      ParameterizeStochasticOperator(Problem.Evaluator);
285      ParameterizeSolutionsCreator();
286      ParameterizeMainLoop();
287      ParameterizeSelectors();
288      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
289      base.Problem_EvaluatorChanged(sender, e);
290    }
291    protected override void Problem_VisualizerChanged(object sender, EventArgs e) {
292      ParameterizeStochasticOperator(Problem.Visualizer);
293      ParameterizeMainLoop();
294      if (Problem.Visualizer != null) Problem.Visualizer.VisualizationParameter.ActualNameChanged += new EventHandler(Visualizer_VisualizationParameter_ActualNameChanged);
295      base.Problem_VisualizerChanged(sender, e);
296    }
297    protected override void Problem_OperatorsChanged(object sender, EventArgs e) {
298      foreach (IOperator op in Problem.Operators) ParameterizeStochasticOperator(op);
299      UpdateCrossovers();
300      UpdateMutators();
301      base.Problem_OperatorsChanged(sender, e);
302    }
303    private void ElitesParameter_ValueChanged(object sender, EventArgs e) {
304      Elites.ValueChanged += new EventHandler(Elites_ValueChanged);
305      ParameterizeSelectors();
306    }
307    private void Elites_ValueChanged(object sender, EventArgs e) {
308      ParameterizeSelectors();
309    }
310    private void PopulationSizeParameter_ValueChanged(object sender, EventArgs e) {
311      NumberOfIslands.ValueChanged += new EventHandler(PopulationSize_ValueChanged);
312      ParameterizeSelectors();
313    }
314    private void PopulationSize_ValueChanged(object sender, EventArgs e) {
315      ParameterizeSelectors();
316    }
317    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
318      ParameterizeMainLoop();
319      ParameterizeSelectors();
320    }
321    private void Visualizer_VisualizationParameter_ActualNameChanged(object sender, EventArgs e) {
322      ParameterizeMainLoop();
323    }
324    private void MigrationRateParameter_ValueChanged(object sender, EventArgs e) {
325      MigrationRate.ValueChanged += new EventHandler(MigrationRate_ValueChanged);
326      ParameterizeSelectors();
327    }
328    private void MigrationRate_ValueChanged(object sender, EventArgs e) {
329      ParameterizeSelectors();
330    }
331    #endregion
332
333    #region Helpers
334    [StorableHook(HookType.AfterDeserialization)]
335    private void Initialize() {
336      InitializeSelectors();
337      UpdateSelectors();
338      InitializeMigrators();
339      UpdateMigrators();
340      PopulationSizeParameter.ValueChanged += new EventHandler(PopulationSizeParameter_ValueChanged);
341      PopulationSize.ValueChanged += new EventHandler(PopulationSize_ValueChanged);
342      MigrationRateParameter.ValueChanged += new EventHandler(MigrationRateParameter_ValueChanged);
343      MigrationRate.ValueChanged += new EventHandler(MigrationRate_ValueChanged);
344      ElitesParameter.ValueChanged += new EventHandler(ElitesParameter_ValueChanged);
345      Elites.ValueChanged += new EventHandler(Elites_ValueChanged);
346      if (Problem != null) {
347        UpdateCrossovers();
348        UpdateMutators();
349        Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
350        if (Problem.Visualizer != null) Problem.Visualizer.VisualizationParameter.ActualNameChanged += new EventHandler(Visualizer_VisualizationParameter_ActualNameChanged);
351      }
352    }
353    private void ParameterizeSolutionsCreator() {
354      SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
355      SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
356    }
357    private void ParameterizeMainLoop() {
358      MainLoop.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
359      MainLoop.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
360      MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
361      MainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
362      MainLoop.VisualizerParameter.ActualName = Problem.VisualizerParameter.Name;
363      if (Problem.Visualizer != null)
364        MainLoop.VisualizationParameter.ActualName = Problem.Visualizer.VisualizationParameter.ActualName;
365    }
366    private void ParameterizeStochasticOperator(IOperator op) {
367      if (op is IStochasticOperator)
368        ((IStochasticOperator)op).RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName;
369    }
370    private void InitializeSelectors() {
371      selectors = new List<ISelector>();
372      selectors.AddRange(ApplicationManager.Manager.GetInstances<ISelector>().Where(x => !(x is IMultiObjectiveSelector)).OrderBy(x => x.Name));
373      emigrantsSelectors = new List<ISelector>();
374      emigrantsSelectors.AddRange(ApplicationManager.Manager.GetInstances<ISelector>().Where(x => !(x is IMultiObjectiveSelector)).OrderBy(x => x.Name));
375      immigrationSelectors = new List<ISelector>();
376      immigrationSelectors.AddRange(ApplicationManager.Manager.GetInstances<ISelector>().Where(x => !(x is IMultiObjectiveSelector)).OrderBy(x => x.Name));
377      ParameterizeSelectors();
378    }
379    private void InitializeMigrators() {
380      migrators = new List<IMigrator>();
381      migrators.AddRange(ApplicationManager.Manager.GetInstances<IMigrator>().OrderBy(x => x.Name));
382      UpdateMigrators();
383    }
384    private void ParameterizeSelectors() {
385      foreach (ISelector selector in Selectors) {
386        selector.CopySelected = new BoolValue(true);
387        selector.NumberOfSelectedSubScopesParameter.Value = new IntValue(2 * (PopulationSize.Value - Elites.Value));
388        ParameterizeStochasticOperator(selector);
389      }
390      foreach (ISelector selector in emigrantsSelectors) {
391        selector.CopySelected = new BoolValue(true);
392        selector.NumberOfSelectedSubScopesParameter.Value = new IntValue((int)Math.Ceiling(PopulationSize.Value * MigrationRate.Value));
393        ParameterizeStochasticOperator(selector);
394      }
395      foreach (ISelector selector in immigrationSelectors) {
396        selector.CopySelected = new BoolValue(false);
397        selector.NumberOfSelectedSubScopesParameter.Value = PopulationSize;
398        ParameterizeStochasticOperator(selector);
399      }
400      if (Problem != null) {
401        foreach (ISingleObjectiveSelector selector in Selectors.OfType<ISingleObjectiveSelector>()) {
402          selector.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
403          selector.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
404        }
405        foreach (ISingleObjectiveSelector selector in emigrantsSelectors.OfType<ISingleObjectiveSelector>()) {
406          selector.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
407          selector.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
408        }
409        foreach (ISingleObjectiveSelector selector in immigrationSelectors.OfType<ISingleObjectiveSelector>()) {
410          selector.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
411          selector.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
412        }
413      }
414    }
415    private void UpdateSelectors() {
416      ISelector oldSelector = SelectorParameter.Value;
417      SelectorParameter.ValidValues.Clear();
418      foreach (ISelector selector in Selectors.OrderBy(x => x.Name))
419        SelectorParameter.ValidValues.Add(selector);
420
421      ISelector proportionalSelector = SelectorParameter.ValidValues.FirstOrDefault(x => x.GetType().Name.Equals("ProportionalSelector"));
422      if (proportionalSelector != null) SelectorParameter.Value = proportionalSelector;
423
424      if (oldSelector != null) {
425        ISelector selector = SelectorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldSelector.GetType());
426        if (selector != null) SelectorParameter.Value = selector;
427      }
428
429      oldSelector = EmigrantsSelector;
430      EmigrantsSelectorParameter.ValidValues.Clear();
431      foreach (ISelector selector in emigrantsSelectors)
432        EmigrantsSelectorParameter.ValidValues.Add(selector);
433      if (oldSelector != null) {
434        ISelector selector = EmigrantsSelectorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldSelector.GetType());
435        if (selector != null) EmigrantsSelectorParameter.Value = selector;
436      }
437
438      oldSelector = ImmigrationSelectorParameter.Value;
439      ImmigrationSelectorParameter.ValidValues.Clear();
440      foreach (ISelector selector in immigrationSelectors)
441        ImmigrationSelectorParameter.ValidValues.Add(selector);
442      if (oldSelector != null) {
443        ISelector selector = ImmigrationSelectorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldSelector.GetType());
444        if (selector != null) ImmigrationSelectorParameter.Value = selector;
445      }
446    }
447    private void UpdateMigrators() {
448      IMigrator oldMigrator = Migrator;
449      MigratorParameter.ValidValues.Clear();
450      foreach (IMigrator migrator in migrators)
451        MigratorParameter.ValidValues.Add(migrator);
452      if (oldMigrator != null) {
453        IMigrator migrator = MigratorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMigrator.GetType());
454        if (migrator != null) MigratorParameter.Value = migrator;
455      } else if (MigratorParameter.ValidValues.Count > 0) MigratorParameter.Value = MigratorParameter.ValidValues.First();
456    }
457    private void UpdateCrossovers() {
458      ICrossover oldCrossover = CrossoverParameter.Value;
459      CrossoverParameter.ValidValues.Clear();
460      foreach (ICrossover crossover in Problem.Operators.OfType<ICrossover>().OrderBy(x => x.Name))
461        CrossoverParameter.ValidValues.Add(crossover);
462      if (oldCrossover != null) {
463        ICrossover crossover = CrossoverParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldCrossover.GetType());
464        if (crossover != null) CrossoverParameter.Value = crossover;
465      }
466    }
467    private void UpdateMutators() {
468      IManipulator oldMutator = MutatorParameter.Value;
469      MutatorParameter.ValidValues.Clear();
470      foreach (IManipulator mutator in Problem.Operators.OfType<IManipulator>().OrderBy(x => x.Name))
471        MutatorParameter.ValidValues.Add(mutator);
472      if (oldMutator != null) {
473        IManipulator mutator = MutatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMutator.GetType());
474        if (mutator != null) MutatorParameter.Value = mutator;
475      }
476    }
477    #endregion
478  }
479}
Note: See TracBrowser for help on using the repository browser.