1
#region License Information
3 * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
5 * This file is part of HeuristicLab.
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.
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.
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/>.
24 using HeuristicLab
.Analysis
;
25 using HeuristicLab
.Common
;
26 using HeuristicLab
.Core
;
27 using HeuristicLab
.Data
;
28 using HeuristicLab
.Operators
;
29 using HeuristicLab
.Optimization
;
30 using HeuristicLab
.Optimization
.Operators
;
31 using HeuristicLab
.Parameters
;
32 using HeuristicLab
.Persistence
.Default
.CompositeSerializers
.Storable
;
33 using HeuristicLab
.PluginInfrastructure
;
34 using HeuristicLab
.Random
;
36 namespace HeuristicLab
.Algorithms
.GeneticAlgorithm
{
38 /// An island genetic algorithm.
40 [Item("Island Genetic Algorithm", "An island genetic algorithm.")]
41 [Creatable("Algorithms")]
43 public sealed class IslandGeneticAlgorithm
: HeuristicOptimizationEngineAlgorithm
, IStorableContent
{
44 public string Filename { get; set; }
46 #region Problem Properties
47 public override Type ProblemType
{
48 get { return typeof(ISingleObjectiveHeuristicOptimizationProblem); }
50 public new ISingleObjectiveHeuristicOptimizationProblem Problem
{
51 get { return (ISingleObjectiveHeuristicOptimizationProblem)base.Problem; }
52 set { base.Problem = value; }
56 #region Parameter Properties
57 private ValueParameter
<IntValue
> SeedParameter
{
58 get { return (ValueParameter<IntValue>)Parameters["Seed"]; }
60 private ValueParameter
<BoolValue
> SetSeedRandomlyParameter
{
61 get { return (ValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
63 private ValueParameter
<IntValue
> NumberOfIslandsParameter
{
64 get { return (ValueParameter<IntValue>)Parameters["NumberOfIslands"]; }
66 private ValueParameter
<IntValue
> MigrationIntervalParameter
{
67 get { return (ValueParameter<IntValue>)Parameters["MigrationInterval"]; }
69 private ValueParameter
<PercentValue
> MigrationRateParameter
{
70 get { return (ValueParameter<PercentValue>)Parameters["MigrationRate"]; }
72 public ConstrainedValueParameter
<IMigrator
> MigratorParameter
{
73 get { return (ConstrainedValueParameter<IMigrator>)Parameters["Migrator"]; }
75 public ConstrainedValueParameter
<ISelector
> EmigrantsSelectorParameter
{
76 get { return (ConstrainedValueParameter<ISelector>)Parameters["EmigrantsSelector"]; }
78 public ConstrainedValueParameter
<IReplacer
> ImmigrationReplacerParameter
{
79 get { return (ConstrainedValueParameter<IReplacer>)Parameters["ImmigrationReplacer"]; }
81 private ValueParameter
<IntValue
> PopulationSizeParameter
{
82 get { return (ValueParameter<IntValue>)Parameters["PopulationSize"]; }
84 private ValueParameter
<IntValue
> MaximumGenerationsParameter
{
85 get { return (ValueParameter<IntValue>)Parameters["MaximumGenerations"]; }
87 public ConstrainedValueParameter
<ISelector
> SelectorParameter
{
88 get { return (ConstrainedValueParameter<ISelector>)Parameters["Selector"]; }
90 public ConstrainedValueParameter
<ICrossover
> CrossoverParameter
{
91 get { return (ConstrainedValueParameter<ICrossover>)Parameters["Crossover"]; }
93 private ValueParameter
<PercentValue
> MutationProbabilityParameter
{
94 get { return (ValueParameter<PercentValue>)Parameters["MutationProbability"]; }
96 public OptionalConstrainedValueParameter
<IManipulator
> MutatorParameter
{
97 get { return (OptionalConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; }
99 private ValueParameter
<IntValue
> ElitesParameter
{
100 get { return (ValueParameter<IntValue>)Parameters["Elites"]; }
102 private ValueParameter
<MultiAnalyzer
> AnalyzerParameter
{
103 get { return (ValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
105 private ValueParameter
<MultiAnalyzer
> IslandAnalyzerParameter
{
106 get { return (ValueParameter<MultiAnalyzer>)Parameters["IslandAnalyzer"]; }
111 public IntValue Seed
{
112 get { return SeedParameter.Value; }
113 set { SeedParameter.Value = value; }
115 public BoolValue SetSeedRandomly
{
116 get { return SetSeedRandomlyParameter.Value; }
117 set { SetSeedRandomlyParameter.Value = value; }
119 public IntValue NumberOfIslands
{
120 get { return NumberOfIslandsParameter.Value; }
121 set { NumberOfIslandsParameter.Value = value; }
123 public IntValue MigrationInterval
{
124 get { return MigrationIntervalParameter.Value; }
125 set { MigrationIntervalParameter.Value = value; }
127 public PercentValue MigrationRate
{
128 get { return MigrationRateParameter.Value; }
129 set { MigrationRateParameter.Value = value; }
131 public IMigrator Migrator
{
132 get { return MigratorParameter.Value; }
133 set { MigratorParameter.Value = value; }
135 public ISelector EmigrantsSelector
{
136 get { return EmigrantsSelectorParameter.Value; }
137 set { EmigrantsSelectorParameter.Value = value; }
139 public IReplacer ImmigrationReplacer
{
140 get { return ImmigrationReplacerParameter.Value; }
141 set { ImmigrationReplacerParameter.Value = value; }
143 public IntValue PopulationSize
{
144 get { return PopulationSizeParameter.Value; }
145 set { PopulationSizeParameter.Value = value; }
147 public IntValue MaximumGenerations
{
148 get { return MaximumGenerationsParameter.Value; }
149 set { MaximumGenerationsParameter.Value = value; }
151 public ISelector Selector
{
152 get { return SelectorParameter.Value; }
153 set { SelectorParameter.Value = value; }
155 public ICrossover Crossover
{
156 get { return CrossoverParameter.Value; }
157 set { CrossoverParameter.Value = value; }
159 public PercentValue MutationProbability
{
160 get { return MutationProbabilityParameter.Value; }
161 set { MutationProbabilityParameter.Value = value; }
163 public IManipulator Mutator
{
164 get { return MutatorParameter.Value; }
165 set { MutatorParameter.Value = value; }
167 public IntValue Elites
{
168 get { return ElitesParameter.Value; }
169 set { ElitesParameter.Value = value; }
171 public MultiAnalyzer Analyzer
{
172 get { return AnalyzerParameter.Value; }
173 set { AnalyzerParameter.Value = value; }
175 public MultiAnalyzer IslandAnalyzer
{
176 get { return IslandAnalyzerParameter.Value; }
177 set { IslandAnalyzerParameter.Value = value; }
179 private RandomCreator RandomCreator
{
180 get { return (RandomCreator)OperatorGraph.InitialOperator; }
182 private UniformSubScopesProcessor IslandProcessor
{
183 get { return ((RandomCreator.Successor as SubScopesCreator).Successor as UniformSubScopesProcessor); }
185 private SolutionsCreator SolutionsCreator
{
186 get { return (SolutionsCreator)IslandProcessor.Operator; }
188 private IslandGeneticAlgorithmMainLoop MainLoop
{
189 get { return FindMainLoop(IslandProcessor.Successor); }
192 private BestAverageWorstQualityAnalyzer islandQualityAnalyzer
;
194 private BestAverageWorstQualityAnalyzer qualityAnalyzer
;
197 [StorableConstructor
]
198 private IslandGeneticAlgorithm(bool deserializing
) : base(deserializing
) { }
199 [StorableHook(HookType
.AfterDeserialization
)]
200 private void AfterDeserialization() {
203 private IslandGeneticAlgorithm(IslandGeneticAlgorithm original
, Cloner cloner
)
204 : base(original
, cloner
) {
205 islandQualityAnalyzer
= cloner
.Clone(original
.islandQualityAnalyzer
);
206 qualityAnalyzer
= cloner
.Clone(original
.qualityAnalyzer
);
209 public override IDeepCloneable
Clone(Cloner cloner
) {
210 return new IslandGeneticAlgorithm(this, cloner
);
213 public IslandGeneticAlgorithm()
215 Parameters
.Add(new ValueParameter
<IntValue
>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
216 Parameters
.Add(new ValueParameter
<BoolValue
>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
217 Parameters
.Add(new ValueParameter
<IntValue
>("NumberOfIslands", "The number of islands.", new IntValue(5)));
218 Parameters
.Add(new ValueParameter
<IntValue
>("MigrationInterval", "The number of generations that should pass between migration phases.", new IntValue(20)));
219 Parameters
.Add(new ValueParameter
<PercentValue
>("MigrationRate", "The proportion of individuals that should migrate between the islands.", new PercentValue(0.15)));
220 Parameters
.Add(new ConstrainedValueParameter
<IMigrator
>("Migrator", "The migration strategy."));
221 Parameters
.Add(new ConstrainedValueParameter
<ISelector
>("EmigrantsSelector", "Selects the individuals that will be migrated."));
222 Parameters
.Add(new ConstrainedValueParameter
<IReplacer
>("ImmigrationReplacer", "Selects the population from the unification of the original population and the immigrants."));
223 Parameters
.Add(new ValueParameter
<IntValue
>("PopulationSize", "The size of the population of solutions.", new IntValue(100)));
224 Parameters
.Add(new ValueParameter
<IntValue
>("MaximumGenerations", "The maximum number of generations that should be processed.", new IntValue(1000)));
225 Parameters
.Add(new ConstrainedValueParameter
<ISelector
>("Selector", "The operator used to select solutions for reproduction."));
226 Parameters
.Add(new ConstrainedValueParameter
<ICrossover
>("Crossover", "The operator used to cross solutions."));
227 Parameters
.Add(new ValueParameter
<PercentValue
>("MutationProbability", "The probability that the mutation operator is applied on a solution.", new PercentValue(0.05)));
228 Parameters
.Add(new OptionalConstrainedValueParameter
<IManipulator
>("Mutator", "The operator used to mutate solutions."));
229 Parameters
.Add(new ValueParameter
<IntValue
>("Elites", "The numer of elite solutions which are kept in each generation.", new IntValue(1)));
230 Parameters
.Add(new ValueParameter
<MultiAnalyzer
>("Analyzer", "The operator used to analyze the islands.", new MultiAnalyzer()));
231 Parameters
.Add(new ValueParameter
<MultiAnalyzer
>("IslandAnalyzer", "The operator used to analyze each island.", new MultiAnalyzer()));
233 RandomCreator randomCreator
= new RandomCreator();
234 SubScopesCreator populationCreator
= new SubScopesCreator();
235 UniformSubScopesProcessor ussp1
= new UniformSubScopesProcessor();
236 SolutionsCreator solutionsCreator
= new SolutionsCreator();
237 VariableCreator variableCreator
= new VariableCreator();
238 UniformSubScopesProcessor ussp2
= new UniformSubScopesProcessor();
239 SubScopesCounter subScopesCounter
= new SubScopesCounter();
240 ResultsCollector resultsCollector
= new ResultsCollector();
241 IslandGeneticAlgorithmMainLoop mainLoop
= new IslandGeneticAlgorithmMainLoop();
242 OperatorGraph
.InitialOperator
= randomCreator
;
244 randomCreator
.RandomParameter
.ActualName
= "Random";
245 randomCreator
.SeedParameter
.ActualName
= SeedParameter
.Name
;
246 randomCreator
.SeedParameter
.Value
= null;
247 randomCreator
.SetSeedRandomlyParameter
.ActualName
= SetSeedRandomlyParameter
.Name
;
248 randomCreator
.SetSeedRandomlyParameter
.Value
= null;
249 randomCreator
.Successor
= populationCreator
;
251 populationCreator
.NumberOfSubScopesParameter
.ActualName
= NumberOfIslandsParameter
.Name
;
252 populationCreator
.Successor
= ussp1
;
254 ussp1
.Operator
= solutionsCreator
;
255 ussp1
.Successor
= variableCreator
;
257 solutionsCreator
.NumberOfSolutionsParameter
.ActualName
= PopulationSizeParameter
.Name
;
258 solutionsCreator
.Successor
= null;
260 variableCreator
.Name
= "Initialize EvaluatedSolutions";
261 variableCreator
.CollectedValues
.Add(new ValueParameter
<IntValue
>("EvaluatedSolutions", new IntValue()));
262 variableCreator
.Successor
= ussp2
;
264 ussp2
.Operator
= subScopesCounter
;
265 ussp2
.Successor
= resultsCollector
;
267 subScopesCounter
.Name
= "Count EvaluatedSolutions";
268 subScopesCounter
.ValueParameter
.ActualName
= "EvaluatedSolutions";
269 subScopesCounter
.Successor
= null;
271 resultsCollector
.CollectedValues
.Add(new LookupParameter
<IntValue
>("Evaluated Solutions", null, "EvaluatedSolutions"));
272 resultsCollector
.ResultsParameter
.ActualName
= "Results";
273 resultsCollector
.Successor
= mainLoop
;
275 mainLoop
.EmigrantsSelectorParameter
.ActualName
= EmigrantsSelectorParameter
.Name
;
276 mainLoop
.ImmigrationReplacerParameter
.ActualName
= ImmigrationReplacerParameter
.Name
;
277 mainLoop
.MaximumGenerationsParameter
.ActualName
= MaximumGenerationsParameter
.Name
;
278 mainLoop
.MigrationIntervalParameter
.ActualName
= MigrationIntervalParameter
.Name
;
279 mainLoop
.MigrationRateParameter
.ActualName
= MigrationRateParameter
.Name
;
280 mainLoop
.MigratorParameter
.ActualName
= MigratorParameter
.Name
;
281 mainLoop
.NumberOfIslandsParameter
.ActualName
= NumberOfIslandsParameter
.Name
;
282 mainLoop
.SelectorParameter
.ActualName
= SelectorParameter
.Name
;
283 mainLoop
.CrossoverParameter
.ActualName
= CrossoverParameter
.Name
;
284 mainLoop
.ElitesParameter
.ActualName
= ElitesParameter
.Name
;
285 mainLoop
.MutatorParameter
.ActualName
= MutatorParameter
.Name
;
286 mainLoop
.MutationProbabilityParameter
.ActualName
= MutationProbabilityParameter
.Name
;
287 mainLoop
.RandomParameter
.ActualName
= randomCreator
.RandomParameter
.ActualName
;
288 mainLoop
.ResultsParameter
.ActualName
= "Results";
289 mainLoop
.AnalyzerParameter
.ActualName
= AnalyzerParameter
.Name
;
290 mainLoop
.IslandAnalyzerParameter
.ActualName
= IslandAnalyzerParameter
.Name
;
291 mainLoop
.EvaluatedSolutionsParameter
.ActualName
= "EvaluatedSolutions";
292 mainLoop
.Successor
= null;
294 foreach (ISelector selector
in ApplicationManager
.Manager
.GetInstances
<ISelector
>().Where(x
=> !(x
is IMultiObjectiveSelector
)).OrderBy(x
=> x
.Name
))
295 SelectorParameter
.ValidValues
.Add(selector
);
296 ISelector proportionalSelector
= SelectorParameter
.ValidValues
.FirstOrDefault(x
=> x
.GetType().Name
.Equals("ProportionalSelector"));
297 if (proportionalSelector
!= null) SelectorParameter
.Value
= proportionalSelector
;
299 foreach (ISelector selector
in ApplicationManager
.Manager
.GetInstances
<ISelector
>().Where(x
=> !(x
is IMultiObjectiveSelector
)).OrderBy(x
=> x
.Name
))
300 EmigrantsSelectorParameter
.ValidValues
.Add(selector
);
302 foreach (IReplacer replacer
in ApplicationManager
.Manager
.GetInstances
<IReplacer
>().OrderBy(x
=> x
.Name
))
303 ImmigrationReplacerParameter
.ValidValues
.Add(replacer
);
305 ParameterizeSelectors();
307 foreach (IMigrator migrator
in ApplicationManager
.Manager
.GetInstances
<IMigrator
>().OrderBy(x
=> x
.Name
))
308 MigratorParameter
.ValidValues
.Add(migrator
);
310 qualityAnalyzer
= new BestAverageWorstQualityAnalyzer();
311 islandQualityAnalyzer
= new BestAverageWorstQualityAnalyzer();
312 ParameterizeAnalyzers();
318 public override void Prepare() {
319 if (Problem
!= null) base.Prepare();
323 protected override void OnProblemChanged() {
324 ParameterizeStochasticOperator(Problem
.SolutionCreator
);
325 ParameterizeStochasticOperator(Problem
.Evaluator
);
326 foreach (IOperator op
in Problem
.Operators
) ParameterizeStochasticOperator(op
);
327 ParameterizeSolutionsCreator();
328 ParameterizeMainLoop();
329 ParameterizeSelectors();
330 ParameterizeAnalyzers();
331 ParameterizeIterationBasedOperators();
335 Problem
.Evaluator
.QualityParameter
.ActualNameChanged
+= new EventHandler(Evaluator_QualityParameter_ActualNameChanged
);
336 base.OnProblemChanged();
339 protected override void Problem_SolutionCreatorChanged(object sender
, EventArgs e
) {
340 ParameterizeStochasticOperator(Problem
.SolutionCreator
);
341 ParameterizeSolutionsCreator();
342 base.Problem_SolutionCreatorChanged(sender
, e
);
344 protected override void Problem_EvaluatorChanged(object sender
, EventArgs e
) {
345 ParameterizeStochasticOperator(Problem
.Evaluator
);
346 ParameterizeSolutionsCreator();
347 ParameterizeMainLoop();
348 ParameterizeSelectors();
349 ParameterizeAnalyzers();
350 Problem
.Evaluator
.QualityParameter
.ActualNameChanged
+= new EventHandler(Evaluator_QualityParameter_ActualNameChanged
);
351 base.Problem_EvaluatorChanged(sender
, e
);
353 protected override void Problem_OperatorsChanged(object sender
, EventArgs e
) {
354 foreach (IOperator op
in Problem
.Operators
) ParameterizeStochasticOperator(op
);
355 ParameterizeIterationBasedOperators();
359 base.Problem_OperatorsChanged(sender
, e
);
361 private void ElitesParameter_ValueChanged(object sender
, EventArgs e
) {
362 Elites
.ValueChanged
+= new EventHandler(Elites_ValueChanged
);
363 ParameterizeSelectors();
365 private void Elites_ValueChanged(object sender
, EventArgs e
) {
366 ParameterizeSelectors();
368 private void PopulationSizeParameter_ValueChanged(object sender
, EventArgs e
) {
369 NumberOfIslands
.ValueChanged
+= new EventHandler(PopulationSize_ValueChanged
);
370 ParameterizeSelectors();
372 private void PopulationSize_ValueChanged(object sender
, EventArgs e
) {
373 ParameterizeSelectors();
375 private void Evaluator_QualityParameter_ActualNameChanged(object sender
, EventArgs e
) {
376 ParameterizeMainLoop();
377 ParameterizeSelectors();
378 ParameterizeAnalyzers();
380 private void MigrationRateParameter_ValueChanged(object sender
, EventArgs e
) {
381 MigrationRate
.ValueChanged
+= new EventHandler(MigrationRate_ValueChanged
);
382 ParameterizeSelectors();
384 private void MigrationRate_ValueChanged(object sender
, EventArgs e
) {
385 ParameterizeSelectors();
390 private void Initialize() {
391 PopulationSizeParameter
.ValueChanged
+= new EventHandler(PopulationSizeParameter_ValueChanged
);
392 PopulationSize
.ValueChanged
+= new EventHandler(PopulationSize_ValueChanged
);
393 MigrationRateParameter
.ValueChanged
+= new EventHandler(MigrationRateParameter_ValueChanged
);
394 MigrationRate
.ValueChanged
+= new EventHandler(MigrationRate_ValueChanged
);
395 ElitesParameter
.ValueChanged
+= new EventHandler(ElitesParameter_ValueChanged
);
396 Elites
.ValueChanged
+= new EventHandler(Elites_ValueChanged
);
397 if (Problem
!= null) {
398 Problem
.Evaluator
.QualityParameter
.ActualNameChanged
+= new EventHandler(Evaluator_QualityParameter_ActualNameChanged
);
401 private void ParameterizeSolutionsCreator() {
402 SolutionsCreator
.EvaluatorParameter
.ActualName
= Problem
.EvaluatorParameter
.Name
;
403 SolutionsCreator
.SolutionCreatorParameter
.ActualName
= Problem
.SolutionCreatorParameter
.Name
;
405 private void ParameterizeMainLoop() {
406 MainLoop
.BestKnownQualityParameter
.ActualName
= Problem
.BestKnownQualityParameter
.Name
;
407 MainLoop
.EvaluatorParameter
.ActualName
= Problem
.EvaluatorParameter
.Name
;
408 MainLoop
.MaximizationParameter
.ActualName
= Problem
.MaximizationParameter
.Name
;
409 MainLoop
.QualityParameter
.ActualName
= Problem
.Evaluator
.QualityParameter
.ActualName
;
411 private void ParameterizeStochasticOperator(IOperator op
) {
412 IStochasticOperator stochasticOp
= op
as IStochasticOperator
;
413 if (stochasticOp
!= null) {
414 stochasticOp
.RandomParameter
.ActualName
= RandomCreator
.RandomParameter
.ActualName
;
415 stochasticOp
.RandomParameter
.Hidden
= true;
418 private void ParameterizeSelectors() {
419 foreach (ISelector selector
in SelectorParameter
.ValidValues
) {
420 selector
.CopySelected
= new BoolValue(true);
421 selector
.NumberOfSelectedSubScopesParameter
.Value
= new IntValue(2 * (PopulationSize
.Value
- Elites
.Value
));
422 selector
.NumberOfSelectedSubScopesParameter
.Hidden
= true;
423 ParameterizeStochasticOperator(selector
);
425 foreach (ISelector selector
in EmigrantsSelectorParameter
.ValidValues
) {
426 selector
.CopySelected
= new BoolValue(true);
427 selector
.NumberOfSelectedSubScopesParameter
.Value
= new IntValue((int)Math
.Ceiling(PopulationSize
.Value
* MigrationRate
.Value
));
428 selector
.NumberOfSelectedSubScopesParameter
.Hidden
= true;
429 ParameterizeStochasticOperator(selector
);
431 foreach (IReplacer replacer
in ImmigrationReplacerParameter
.ValidValues
) {
432 ParameterizeStochasticOperator(replacer
);
434 if (Problem
!= null) {
435 foreach (ISingleObjectiveSelector selector
in SelectorParameter
.ValidValues
.OfType
<ISingleObjectiveSelector
>()) {
436 selector
.MaximizationParameter
.ActualName
= Problem
.MaximizationParameter
.Name
;
437 selector
.MaximizationParameter
.Hidden
= true;
438 selector
.QualityParameter
.ActualName
= Problem
.Evaluator
.QualityParameter
.ActualName
;
439 selector
.QualityParameter
.Hidden
= true;
441 foreach (ISingleObjectiveSelector selector
in EmigrantsSelectorParameter
.ValidValues
.OfType
<ISingleObjectiveSelector
>()) {
442 selector
.MaximizationParameter
.ActualName
= Problem
.MaximizationParameter
.Name
;
443 selector
.MaximizationParameter
.Hidden
= true;
444 selector
.QualityParameter
.ActualName
= Problem
.Evaluator
.QualityParameter
.ActualName
;
445 selector
.QualityParameter
.Hidden
= true;
447 foreach (ISingleObjectiveReplacer selector
in ImmigrationReplacerParameter
.ValidValues
.OfType
<ISingleObjectiveReplacer
>()) {
448 selector
.MaximizationParameter
.ActualName
= Problem
.MaximizationParameter
.Name
;
449 selector
.MaximizationParameter
.Hidden
= true;
450 selector
.QualityParameter
.ActualName
= Problem
.Evaluator
.QualityParameter
.ActualName
;
451 selector
.QualityParameter
.Hidden
= true;
455 private void ParameterizeAnalyzers() {
456 islandQualityAnalyzer
.ResultsParameter
.ActualName
= "Results";
457 islandQualityAnalyzer
.ResultsParameter
.Hidden
= true;
458 islandQualityAnalyzer
.QualityParameter
.Depth
= 1;
459 qualityAnalyzer
.ResultsParameter
.ActualName
= "Results";
460 qualityAnalyzer
.ResultsParameter
.Hidden
= true;
461 qualityAnalyzer
.QualityParameter
.Depth
= 2;
463 if (Problem
!= null) {
464 islandQualityAnalyzer
.MaximizationParameter
.ActualName
= Problem
.MaximizationParameter
.Name
;
465 islandQualityAnalyzer
.MaximizationParameter
.Hidden
= true;
466 islandQualityAnalyzer
.QualityParameter
.ActualName
= Problem
.Evaluator
.QualityParameter
.ActualName
;
467 islandQualityAnalyzer
.QualityParameter
.Hidden
= true;
468 islandQualityAnalyzer
.BestKnownQualityParameter
.ActualName
= Problem
.BestKnownQualityParameter
.Name
;
469 islandQualityAnalyzer
.BestKnownQualityParameter
.Hidden
= true;
470 qualityAnalyzer
.MaximizationParameter
.ActualName
= Problem
.MaximizationParameter
.Name
;
471 qualityAnalyzer
.MaximizationParameter
.Hidden
= true;
472 qualityAnalyzer
.QualityParameter
.ActualName
= Problem
.Evaluator
.QualityParameter
.ActualName
;
473 qualityAnalyzer
.QualityParameter
.Hidden
= true;
474 qualityAnalyzer
.BestKnownQualityParameter
.ActualName
= Problem
.BestKnownQualityParameter
.Name
;
475 qualityAnalyzer
.BestKnownQualityParameter
.Hidden
= true;
478 private void ParameterizeIterationBasedOperators() {
479 if (Problem
!= null) {
480 foreach (IIterationBasedOperator op
in Problem
.Operators
.OfType
<IIterationBasedOperator
>()) {
481 op
.IterationsParameter
.ActualName
= "Generations";
482 op
.IterationsParameter
.Hidden
= true;
483 op
.MaximumIterationsParameter
.ActualName
= "MaximumGenerations";
484 op
.MaximumIterationsParameter
.Hidden
= true;
488 private void UpdateCrossovers() {
489 ICrossover oldCrossover
= CrossoverParameter
.Value
;
490 CrossoverParameter
.ValidValues
.Clear();
491 foreach (ICrossover crossover
in Problem
.Operators
.OfType
<ICrossover
>().OrderBy(x
=> x
.Name
))
492 CrossoverParameter
.ValidValues
.Add(crossover
);
493 if (oldCrossover
!= null) {
494 ICrossover crossover
= CrossoverParameter
.ValidValues
.FirstOrDefault(x
=> x
.GetType() == oldCrossover
.GetType());
495 if (crossover
!= null) CrossoverParameter
.Value
= crossover
;
498 private void UpdateMutators() {
499 IManipulator oldMutator
= MutatorParameter
.Value
;
500 MutatorParameter
.ValidValues
.Clear();
501 foreach (IManipulator mutator
in Problem
.Operators
.OfType
<IManipulator
>().OrderBy(x
=> x
.Name
))
502 MutatorParameter
.ValidValues
.Add(mutator
);
503 if (oldMutator
!= null) {
504 IManipulator mutator
= MutatorParameter
.ValidValues
.FirstOrDefault(x
=> x
.GetType() == oldMutator
.GetType());
505 if (mutator
!= null) MutatorParameter
.Value
= mutator
;
508 private void UpdateAnalyzers() {
509 IslandAnalyzer
.Operators
.Clear();
510 Analyzer
.Operators
.Clear();
511 IslandAnalyzer
.Operators
.Add(islandQualityAnalyzer
);
512 if (Problem
!= null) {
513 foreach (IAnalyzer analyzer
in Problem
.Operators
.OfType
<IAnalyzer
>()) {
514 foreach (IScopeTreeLookupParameter param
in analyzer
.Parameters
.OfType
<IScopeTreeLookupParameter
>())
516 Analyzer
.Operators
.Add(analyzer
);
519 Analyzer
.Operators
.Add(qualityAnalyzer
);
521 private IslandGeneticAlgorithmMainLoop
FindMainLoop(IOperator start
) {
522 IOperator mainLoop
= start
;
523 while (mainLoop
!= null && !(mainLoop
is IslandGeneticAlgorithmMainLoop
))
524 mainLoop
= ((SingleSuccessorOperator
)mainLoop
).Successor
;
525 if (mainLoop
== null) return null;
526 else return (IslandGeneticAlgorithmMainLoop
)mainLoop
;