Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Tests/HeuristicLab-3.3/SamplesTest.cs @ 9764

Last change on this file since 9764 was 9764, checked in by abeham, 9 years ago

#2088: Renamed namespaces (removed _33 and _34 postfixes)

File size: 63.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2013 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.Linq;
24using System.Threading;
25using HeuristicLab.Algorithms.DataAnalysis;
26using HeuristicLab.Algorithms.EvolutionStrategy;
27using HeuristicLab.Algorithms.GeneticAlgorithm;
28using HeuristicLab.Algorithms.LocalSearch;
29using HeuristicLab.Algorithms.ParticleSwarmOptimization;
30using HeuristicLab.Algorithms.RAPGA;
31using HeuristicLab.Algorithms.ScatterSearch;
32using HeuristicLab.Algorithms.SimulatedAnnealing;
33using HeuristicLab.Algorithms.TabuSearch;
34using HeuristicLab.Algorithms.VariableNeighborhoodSearch;
35using HeuristicLab.Data;
36using HeuristicLab.Encodings.BinaryVectorEncoding;
37using HeuristicLab.Encodings.PermutationEncoding;
38using HeuristicLab.Encodings.RealVectorEncoding;
39using HeuristicLab.Encodings.ScheduleEncoding.JobSequenceMatrix;
40using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
41using HeuristicLab.Optimization;
42using HeuristicLab.Optimization.Operators;
43using HeuristicLab.Persistence.Default.Xml;
44using HeuristicLab.Problems.ArtificialAnt;
45using HeuristicLab.Problems.DataAnalysis;
46using HeuristicLab.Problems.DataAnalysis.Symbolic;
47using HeuristicLab.Problems.DataAnalysis.Symbolic.Classification;
48using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
49using HeuristicLab.Problems.Instances;
50using HeuristicLab.Problems.Instances.DataAnalysis;
51using HeuristicLab.Problems.Instances.TSPLIB;
52using HeuristicLab.Problems.Instances.VehicleRouting;
53using HeuristicLab.Problems.Knapsack;
54using HeuristicLab.Problems.Scheduling;
55using HeuristicLab.Problems.TestFunctions;
56using HeuristicLab.Problems.TravelingSalesman;
57using HeuristicLab.Problems.VehicleRouting;
58using HeuristicLab.Problems.VehicleRouting.Encodings.General;
59using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
60using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
61using HeuristicLab.Selection;
62using Microsoft.VisualStudio.TestTools.UnitTesting;
63
64
65namespace HeuristicLab.Tests {
66  [TestClass]
67  [DeploymentItem(@"HeuristicLab-3.3/Resources/C101.opt.txt")]
68  [DeploymentItem(@"HeuristicLab-3.3/Resources/C101.txt")]
69  public class SamplesTest {
70    #region GA
71    #region TSP
72    [TestMethod]
73    public void CreateGaTspSampleTest() {
74      var ga = CreateGaTspSample();
75      XmlGenerator.Serialize(ga, "../../GA_TSP.hl");
76    }
77    [TestMethod]
78    public void RunGaTspSampleTest() {
79      var ga = CreateGaTspSample();
80      ga.SetSeedRandomly.Value = false;
81      RunAlgorithm(ga);
82      Assert.AreEqual(12332, GetDoubleResult(ga, "BestQuality"));
83      Assert.AreEqual(13123.2, GetDoubleResult(ga, "CurrentAverageQuality"));
84      Assert.AreEqual(14538, GetDoubleResult(ga, "CurrentWorstQuality"));
85      Assert.AreEqual(99100, GetIntResult(ga, "EvaluatedSolutions"));
86    }
87
88    private GeneticAlgorithm CreateGaTspSample() {
89      GeneticAlgorithm ga = new GeneticAlgorithm();
90      #region Problem Configuration
91      var provider = new TSPLIBTSPInstanceProvider();
92      var instance = provider.GetDataDescriptors().Where(x => x.Name == "ch130").Single();
93      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
94      tspProblem.Load(provider.LoadData(instance));
95      tspProblem.UseDistanceMatrix.Value = true;
96      #endregion
97      #region Algorithm Configuration
98      ga.Name = "Genetic Algorithm - TSP";
99      ga.Description = "A genetic algorithm which solves the \"ch130\" traveling salesman problem (imported from TSPLIB)";
100      ga.Problem = tspProblem;
101      ConfigureGeneticAlgorithmParameters<ProportionalSelector, OrderCrossover2, InversionManipulator>(
102        ga, 100, 1, 1000, 0.05);
103      #endregion
104      return ga;
105    }
106    #endregion
107    #region VRP
108    [TestMethod]
109    public void CreateGaVrpSampleTest() {
110      var ga = CreateGaVrpSample();
111      XmlGenerator.Serialize(ga, "../../GA_VRP.hl");
112    }
113
114    [TestMethod]
115    public void RunGaVrpSampleTest() {
116      var ga = CreateGaVrpSample();
117      ga.SetSeedRandomly.Value = false;
118      RunAlgorithm(ga);
119      Assert.AreEqual(1828.9368669428338, GetDoubleResult(ga, "BestQuality"));
120      Assert.AreEqual(1830.1444308908331, GetDoubleResult(ga, "CurrentAverageQuality"));
121      Assert.AreEqual(1871.7128510304112, GetDoubleResult(ga, "CurrentWorstQuality"));
122      Assert.AreEqual(99100, GetIntResult(ga, "EvaluatedSolutions"));
123    }
124
125    private GeneticAlgorithm CreateGaVrpSample() {
126      GeneticAlgorithm ga = new GeneticAlgorithm();
127      #region Problem Configuration
128      VehicleRoutingProblem vrpProblem = new VehicleRoutingProblem();
129
130      SolomonFormatInstanceProvider instanceProvider = new SolomonInstanceProvider();
131      CVRPTWData data = instanceProvider.Import("C101.txt", "C101.opt.txt") as CVRPTWData;
132      vrpProblem.Load(data);
133      vrpProblem.Name = "C101 VRP (imported from Solomon)";
134      vrpProblem.Description = "Represents a Vehicle Routing Problem.";
135      CVRPTWProblemInstance instance = vrpProblem.ProblemInstance as CVRPTWProblemInstance;
136      instance.DistanceFactor.Value = 1;
137      instance.FleetUsageFactor.Value = 100;
138      instance.OverloadPenalty.Value = 100;
139      instance.TardinessPenalty.Value = 100;
140      instance.TimeFactor.Value = 0;
141      vrpProblem.MaximizationParameter.Value.Value = false;
142      instance.UseDistanceMatrix.Value = true;
143      instance.Vehicles.Value = 25;
144      #endregion
145      #region Algorithm Configuration
146      ga.Name = "Genetic Algorithm - VRP";
147      ga.Description = "A genetic algorithm which solves the \"C101\" vehicle routing problem (imported from Solomon)";
148      ga.Problem = vrpProblem;
149      ConfigureGeneticAlgorithmParameters<TournamentSelector, MultiVRPSolutionCrossover, MultiVRPSolutionManipulator>(
150        ga, 100, 1, 1000, 0.05, 3);
151
152      var xOver = (MultiVRPSolutionCrossover)ga.Crossover;
153      foreach (var op in xOver.Operators) {
154        xOver.Operators.SetItemCheckedState(op, false);
155      }
156      xOver.Operators.SetItemCheckedState(xOver.Operators
157        .OfType<PotvinRouteBasedCrossover>()
158        .Single(), true);
159      xOver.Operators.SetItemCheckedState(xOver.Operators
160        .OfType<PotvinSequenceBasedCrossover>()
161        .Single(), true);
162
163      var manipulator = (MultiVRPSolutionManipulator)ga.Mutator;
164      foreach (var op in manipulator.Operators) {
165        manipulator.Operators.SetItemCheckedState(op, false);
166      }
167      manipulator.Operators.SetItemCheckedState(manipulator.Operators
168        .OfType<PotvinOneLevelExchangeMainpulator>()
169        .Single(), true);
170      manipulator.Operators.SetItemCheckedState(manipulator.Operators
171        .OfType<PotvinTwoLevelExchangeManipulator>()
172        .Single(), true);
173      #endregion
174      return ga;
175    }
176    #endregion
177    #region ArtificialAnt
178    [TestMethod]
179    public void CreateGpArtificialAntSampleTest() {
180      var ga = CreateGpArtificialAntSample();
181      XmlGenerator.Serialize(ga, "../../SGP_SantaFe.hl");
182    }
183
184    [TestMethod]
185    public void RunGpArtificialAntSampleTest() {
186      var ga = CreateGpArtificialAntSample();
187      ga.SetSeedRandomly.Value = false;
188      RunAlgorithm(ga);
189      Assert.AreEqual(81, GetDoubleResult(ga, "BestQuality"));
190      Assert.AreEqual(48.19, GetDoubleResult(ga, "CurrentAverageQuality"));
191      Assert.AreEqual(0, GetDoubleResult(ga, "CurrentWorstQuality"));
192      Assert.AreEqual(50950, GetIntResult(ga, "EvaluatedSolutions"));
193    }
194
195    public GeneticAlgorithm CreateGpArtificialAntSample() {
196      GeneticAlgorithm ga = new GeneticAlgorithm();
197      #region Problem Configuration
198      ArtificialAntProblem antProblem = new ArtificialAntProblem();
199      antProblem.BestKnownQuality.Value = 89;
200      antProblem.MaxExpressionDepth.Value = 10;
201      antProblem.MaxExpressionLength.Value = 100;
202      antProblem.MaxFunctionArguments.Value = 3;
203      antProblem.MaxFunctionDefinitions.Value = 3;
204      antProblem.MaxTimeSteps.Value = 600;
205      #endregion
206      #region Algorithm Configuration
207      ga.Name = "Genetic Programming - Artificial Ant";
208      ga.Description = "A standard genetic programming algorithm to solve the artificial ant problem (Santa-Fe trail)";
209      ga.Problem = antProblem;
210      ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeArchitectureManipulator>(
211        ga, 1000, 1, 50, 0.15, 5);
212      var mutator = (MultiSymbolicExpressionTreeArchitectureManipulator)ga.Mutator;
213      mutator.Operators.SetItemCheckedState(mutator.Operators
214        .OfType<FullTreeShaker>()
215        .Single(), false);
216      mutator.Operators.SetItemCheckedState(mutator.Operators
217        .OfType<OnePointShaker>()
218        .Single(), false);
219      mutator.Operators.SetItemCheckedState(mutator.Operators
220        .OfType<ArgumentDeleter>()
221        .Single(), false);
222      mutator.Operators.SetItemCheckedState(mutator.Operators
223        .OfType<SubroutineDeleter>()
224        .Single(), false);
225      #endregion
226      return ga;
227    }
228    #endregion
229    #region Symbolic Regression
230    [TestMethod]
231    public void CreateGpSymbolicRegressionSampleTest() {
232      var ga = CreateGpSymbolicRegressionSample();
233      XmlGenerator.Serialize(ga, "../../SGP_SymbReg.hl");
234    }
235    [TestMethod]
236    public void RunGpSymbolicRegressionSampleTest() {
237      var ga = CreateGpSymbolicRegressionSample();
238      ga.SetSeedRandomly.Value = false;
239      RunAlgorithm(ga);
240      Assert.AreEqual(0.858344291534625, GetDoubleResult(ga, "BestQuality"), 1E-8);
241      Assert.AreEqual(0.56758466520692641, GetDoubleResult(ga, "CurrentAverageQuality"), 1E-8);
242      Assert.AreEqual(0, GetDoubleResult(ga, "CurrentWorstQuality"), 1E-8);
243      Assert.AreEqual(50950, GetIntResult(ga, "EvaluatedSolutions"));
244    }
245
246    private GeneticAlgorithm CreateGpSymbolicRegressionSample() {
247      GeneticAlgorithm ga = new GeneticAlgorithm();
248      #region Problem Configuration
249      SymbolicRegressionSingleObjectiveProblem symbRegProblem = new SymbolicRegressionSingleObjectiveProblem();
250      symbRegProblem.Name = "Tower Symbolic Regression Problem";
251      symbRegProblem.Description = "Tower Dataset (downloaded from: http://www.symbolicregression.com/?q=towerProblem)";
252      RegressionRealWorldInstanceProvider provider = new RegressionRealWorldInstanceProvider();
253      var instance = provider.GetDataDescriptors().Where(x => x.Name.Equals("Tower")).Single();
254      var towerProblemData = (RegressionProblemData)provider.LoadData(instance);
255      towerProblemData.TargetVariableParameter.Value = towerProblemData.TargetVariableParameter.ValidValues
256        .First(v => v.Value == "towerResponse");
257      towerProblemData.InputVariables.SetItemCheckedState(
258        towerProblemData.InputVariables.Single(x => x.Value == "x1"), true);
259      towerProblemData.InputVariables.SetItemCheckedState(
260        towerProblemData.InputVariables.Single(x => x.Value == "x7"), false);
261      towerProblemData.InputVariables.SetItemCheckedState(
262        towerProblemData.InputVariables.Single(x => x.Value == "x11"), false);
263      towerProblemData.InputVariables.SetItemCheckedState(
264        towerProblemData.InputVariables.Single(x => x.Value == "x16"), false);
265      towerProblemData.InputVariables.SetItemCheckedState(
266        towerProblemData.InputVariables.Single(x => x.Value == "x21"), false);
267      towerProblemData.InputVariables.SetItemCheckedState(
268        towerProblemData.InputVariables.Single(x => x.Value == "x25"), false);
269      towerProblemData.InputVariables.SetItemCheckedState(
270        towerProblemData.InputVariables.Single(x => x.Value == "towerResponse"), false);
271      towerProblemData.TrainingPartition.Start = 0;
272      towerProblemData.TrainingPartition.End = 3136;
273      towerProblemData.TestPartition.Start = 3136;
274      towerProblemData.TestPartition.End = 4999;
275      towerProblemData.Name = "Data imported from towerData.txt";
276      towerProblemData.Description = "Chemical concentration at top of distillation tower, dataset downloaded from: http://vanillamodeling.com/realproblems.html, best R² achieved with nu-SVR = 0.97";
277      symbRegProblem.ProblemData = towerProblemData;
278
279      // configure grammar
280      var grammar = new TypeCoherentExpressionGrammar();
281      grammar.ConfigureAsDefaultRegressionGrammar();
282      grammar.Symbols.OfType<VariableCondition>().Single().InitialFrequency = 0.0;
283      var varSymbol = grammar.Symbols.OfType<Variable>().Where(x => !(x is LaggedVariable)).Single();
284      varSymbol.WeightMu = 1.0;
285      varSymbol.WeightSigma = 1.0;
286      varSymbol.WeightManipulatorMu = 0.0;
287      varSymbol.WeightManipulatorSigma = 0.05;
288      varSymbol.MultiplicativeWeightManipulatorSigma = 0.03;
289      var constSymbol = grammar.Symbols.OfType<Constant>().Single();
290      constSymbol.MaxValue = 20;
291      constSymbol.MinValue = -20;
292      constSymbol.ManipulatorMu = 0.0;
293      constSymbol.ManipulatorSigma = 1;
294      constSymbol.MultiplicativeManipulatorSigma = 0.03;
295      symbRegProblem.SymbolicExpressionTreeGrammar = grammar;
296
297      // configure remaining problem parameters
298      symbRegProblem.BestKnownQuality.Value = 0.97;
299      symbRegProblem.FitnessCalculationPartition.Start = 0;
300      symbRegProblem.FitnessCalculationPartition.End = 2300;
301      symbRegProblem.ValidationPartition.Start = 2300;
302      symbRegProblem.ValidationPartition.End = 3136;
303      symbRegProblem.RelativeNumberOfEvaluatedSamples.Value = 1;
304      symbRegProblem.MaximumSymbolicExpressionTreeLength.Value = 150;
305      symbRegProblem.MaximumSymbolicExpressionTreeDepth.Value = 12;
306      symbRegProblem.MaximumFunctionDefinitions.Value = 0;
307      symbRegProblem.MaximumFunctionArguments.Value = 0;
308
309      symbRegProblem.EvaluatorParameter.Value = new SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator();
310      #endregion
311      #region Algorithm Configuration
312      ga.Problem = symbRegProblem;
313      ga.Name = "Genetic Programming - Symbolic Regression";
314      ga.Description = "A standard genetic programming algorithm to solve a symbolic regression problem (tower dataset)";
315      ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(
316        ga, 1000, 1, 50, 0.15, 5);
317      var mutator = (MultiSymbolicExpressionTreeManipulator)ga.Mutator;
318      mutator.Operators.OfType<FullTreeShaker>().Single().ShakingFactor = 0.1;
319      mutator.Operators.OfType<OnePointShaker>().Single().ShakingFactor = 1.0;
320
321      ga.Analyzer.Operators.SetItemCheckedState(
322        ga.Analyzer.Operators
323        .OfType<SymbolicRegressionSingleObjectiveOverfittingAnalyzer>()
324        .Single(), false);
325      ga.Analyzer.Operators.SetItemCheckedState(
326        ga.Analyzer.Operators
327        .OfType<SymbolicDataAnalysisAlleleFrequencyAnalyzer>()
328        .First(), false);
329      #endregion
330      return ga;
331    }
332    #endregion
333    #region Symbolic Classification
334    [TestMethod]
335    public void CreateGpSymbolicClassificationSampleTest() {
336      var ga = CreateGpSymbolicClassificationSample();
337      XmlGenerator.Serialize(ga, "../../SGP_SymbClass.hl");
338    }
339
340    [TestMethod]
341    public void RunGpSymbolicClassificationSampleTest() {
342      var ga = CreateGpSymbolicClassificationSample();
343      ga.SetSeedRandomly.Value = false;
344      RunAlgorithm(ga);
345      Assert.AreEqual(0.141880203907627, GetDoubleResult(ga, "BestQuality"), 1E-8);
346      Assert.AreEqual(4.3246992327753295, GetDoubleResult(ga, "CurrentAverageQuality"), 1E-8);
347      Assert.AreEqual(100.62175156249987, GetDoubleResult(ga, "CurrentWorstQuality"), 1E-8);
348      Assert.AreEqual(100900, GetIntResult(ga, "EvaluatedSolutions"));
349      var bestTrainingSolution = (IClassificationSolution)ga.Results["Best training solution"].Value;
350      Assert.AreEqual(0.80875, bestTrainingSolution.TrainingAccuracy, 1E-8);
351      Assert.AreEqual(0.795031055900621, bestTrainingSolution.TestAccuracy, 1E-8);
352    }
353
354    private GeneticAlgorithm CreateGpSymbolicClassificationSample() {
355      GeneticAlgorithm ga = new GeneticAlgorithm();
356      #region Problem Configuration
357      SymbolicClassificationSingleObjectiveProblem symbClassProblem = new SymbolicClassificationSingleObjectiveProblem();
358      symbClassProblem.Name = "Mammography Classification Problem";
359      symbClassProblem.Description = "Mammography dataset imported from the UCI machine learning repository (http://archive.ics.uci.edu/ml/datasets/Mammographic+Mass)";
360      UCIInstanceProvider provider = new UCIInstanceProvider();
361      var instance = provider.GetDataDescriptors().Where(x => x.Name.Equals("Mammography, M. Elter, 2007")).Single();
362      var mammoData = (ClassificationProblemData)provider.LoadData(instance);
363      mammoData.TargetVariableParameter.Value = mammoData.TargetVariableParameter.ValidValues
364        .First(v => v.Value == "Severity");
365      mammoData.InputVariables.SetItemCheckedState(
366        mammoData.InputVariables.Single(x => x.Value == "BI-RADS"), false);
367      mammoData.InputVariables.SetItemCheckedState(
368        mammoData.InputVariables.Single(x => x.Value == "Age"), true);
369      mammoData.InputVariables.SetItemCheckedState(
370        mammoData.InputVariables.Single(x => x.Value == "Shape"), true);
371      mammoData.InputVariables.SetItemCheckedState(
372        mammoData.InputVariables.Single(x => x.Value == "Margin"), true);
373      mammoData.InputVariables.SetItemCheckedState(
374        mammoData.InputVariables.Single(x => x.Value == "Density"), true);
375      mammoData.InputVariables.SetItemCheckedState(
376        mammoData.InputVariables.Single(x => x.Value == "Severity"), false);
377      mammoData.TrainingPartition.Start = 0;
378      mammoData.TrainingPartition.End = 800;
379      mammoData.TestPartition.Start = 800;
380      mammoData.TestPartition.End = 961;
381      mammoData.Name = "Data imported from mammographic_masses.csv";
382      mammoData.Description = "Original dataset: http://archive.ics.uci.edu/ml/datasets/Mammographic+Mass, missing values have been replaced with median values.";
383      symbClassProblem.ProblemData = mammoData;
384
385      // configure grammar
386      var grammar = new TypeCoherentExpressionGrammar();
387      grammar.ConfigureAsDefaultClassificationGrammar();
388      grammar.Symbols.OfType<VariableCondition>().Single().Enabled = false;
389      var varSymbol = grammar.Symbols.OfType<Variable>().Where(x => !(x is LaggedVariable)).Single();
390      varSymbol.WeightMu = 1.0;
391      varSymbol.WeightSigma = 1.0;
392      varSymbol.WeightManipulatorMu = 0.0;
393      varSymbol.WeightManipulatorSigma = 0.05;
394      varSymbol.MultiplicativeWeightManipulatorSigma = 0.03;
395      var constSymbol = grammar.Symbols.OfType<Constant>().Single();
396      constSymbol.MaxValue = 20;
397      constSymbol.MinValue = -20;
398      constSymbol.ManipulatorMu = 0.0;
399      constSymbol.ManipulatorSigma = 1;
400      constSymbol.MultiplicativeManipulatorSigma = 0.03;
401      symbClassProblem.SymbolicExpressionTreeGrammar = grammar;
402
403      // configure remaining problem parameters
404      symbClassProblem.BestKnownQuality.Value = 0.0;
405      symbClassProblem.FitnessCalculationPartition.Start = 0;
406      symbClassProblem.FitnessCalculationPartition.End = 400;
407      symbClassProblem.ValidationPartition.Start = 400;
408      symbClassProblem.ValidationPartition.End = 800;
409      symbClassProblem.RelativeNumberOfEvaluatedSamples.Value = 1;
410      symbClassProblem.MaximumSymbolicExpressionTreeLength.Value = 100;
411      symbClassProblem.MaximumSymbolicExpressionTreeDepth.Value = 10;
412      symbClassProblem.MaximumFunctionDefinitions.Value = 0;
413      symbClassProblem.MaximumFunctionArguments.Value = 0;
414      symbClassProblem.EvaluatorParameter.Value = new SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator();
415      #endregion
416      #region Algorithm Configuration
417      ga.Problem = symbClassProblem;
418      ga.Name = "Genetic Programming - Symbolic Classification";
419      ga.Description = "A standard genetic programming algorithm to solve a classification problem (Mammographic+Mass dataset)";
420      ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(
421        ga, 1000, 1, 100, 0.15, 5
422        );
423
424      var mutator = (MultiSymbolicExpressionTreeManipulator)ga.Mutator;
425      mutator.Operators.OfType<FullTreeShaker>().Single().ShakingFactor = 0.1;
426      mutator.Operators.OfType<OnePointShaker>().Single().ShakingFactor = 1.0;
427
428      ga.Analyzer.Operators.SetItemCheckedState(
429        ga.Analyzer.Operators
430        .OfType<SymbolicClassificationSingleObjectiveOverfittingAnalyzer>()
431        .Single(), false);
432      ga.Analyzer.Operators.SetItemCheckedState(
433        ga.Analyzer.Operators
434        .OfType<SymbolicDataAnalysisAlleleFrequencyAnalyzer>()
435        .First(), false);
436      #endregion
437      return ga;
438    }
439    #endregion
440    #region LawnMower
441    [TestMethod]
442    public void RunGpLawnMowerSampleTest() {
443      var ga = CreateGpLawnMowerSample();
444      ga.SetSeedRandomly.Value = false;
445      RunAlgorithm(ga);
446    }
447
448    public GeneticAlgorithm CreateGpLawnMowerSample() {
449      GeneticAlgorithm ga = new GeneticAlgorithm();
450      #region Problem Configuration
451      var problem = new HeuristicLab.Problems.LawnMower.Problem();
452      #endregion
453      #region Algorithm Configuration
454      ga.Name = "Genetic Programming - Lawn Mower";
455      ga.Description = "A standard genetic programming algorithm to solve the lawn mower problem";
456      ga.Problem = problem;
457      ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeArchitectureManipulator>(
458        ga, 1000, 1, 50, 0.25, 5);
459      var mutator = (MultiSymbolicExpressionTreeArchitectureManipulator)ga.Mutator;
460      mutator.Operators.SetItemCheckedState(mutator.Operators
461        .OfType<OnePointShaker>()
462        .Single(), false);
463      #endregion
464      return ga;
465    }
466    #endregion
467    #endregion
468
469    #region ES
470    #region Griewank
471    [TestMethod]
472    public void CreateEsGriewankSampleTest() {
473      var es = CreateEsGriewankSample();
474      XmlGenerator.Serialize(es, "../../ES_Griewank.hl");
475    }
476    [TestMethod]
477    public void RunEsGriewankSampleTest() {
478      var es = CreateEsGriewankSample();
479      es.SetSeedRandomly.Value = false;
480      RunAlgorithm(es);
481      Assert.AreEqual(0, GetDoubleResult(es, "BestQuality"));
482      Assert.AreEqual(0, GetDoubleResult(es, "CurrentAverageQuality"));
483      Assert.AreEqual(0, GetDoubleResult(es, "CurrentWorstQuality"));
484      Assert.AreEqual(100020, GetIntResult(es, "EvaluatedSolutions"));
485    }
486
487    private EvolutionStrategy CreateEsGriewankSample() {
488      EvolutionStrategy es = new EvolutionStrategy();
489      #region Problem Configuration
490      SingleObjectiveTestFunctionProblem problem = new SingleObjectiveTestFunctionProblem();
491
492      problem.ProblemSize.Value = 10;
493      problem.EvaluatorParameter.Value = new GriewankEvaluator();
494      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
495      problem.Maximization.Value = false;
496      problem.Bounds = new DoubleMatrix(new double[,] { { -600, 600 } });
497      problem.BestKnownQuality.Value = 0;
498      problem.BestKnownSolutionParameter.Value = new RealVector(10);
499      problem.Name = "Single Objective Test Function";
500      problem.Description = "Test function with real valued inputs and a single objective.";
501      #endregion
502      #region Algorithm Configuration
503      es.Name = "Evolution Strategy - Griewank";
504      es.Description = "An evolution strategy which solves the 10-dimensional Griewank test function";
505      es.Problem = problem;
506      ConfigureEvolutionStrategyParameters<AverageCrossover, NormalAllPositionsManipulator,
507        StdDevStrategyVectorCreator, StdDevStrategyVectorCrossover, StdDevStrategyVectorManipulator>(
508        es, 20, 500, 2, 200, false);
509
510      StdDevStrategyVectorCreator strategyCreator = (StdDevStrategyVectorCreator)es.StrategyParameterCreator;
511      strategyCreator.BoundsParameter.Value = new DoubleMatrix(new double[,] { { 1, 20 } });
512
513      StdDevStrategyVectorManipulator strategyManipulator = (StdDevStrategyVectorManipulator)es.StrategyParameterManipulator;
514      strategyManipulator.BoundsParameter.Value = new DoubleMatrix(new double[,] { { 1E-12, 30 } });
515      strategyManipulator.GeneralLearningRateParameter.Value = new DoubleValue(0.22360679774997896);
516      strategyManipulator.LearningRateParameter.Value = new DoubleValue(0.39763536438352531);
517      #endregion
518      return es;
519    }
520    #endregion
521    #endregion
522
523    #region Island GA
524    #region TSP
525    [TestMethod]
526    public void CreateIslandGaTspSampleTest() {
527      var ga = CreateIslandGaTspSample();
528      XmlGenerator.Serialize(ga, "../../IslandGA_TSP.hl");
529    }
530    [TestMethod]
531    public void RunIslandGaTspSampleTest() {
532      var ga = CreateIslandGaTspSample();
533      ga.SetSeedRandomly.Value = false;
534      RunAlgorithm(ga);
535      Assert.AreEqual(9918, GetDoubleResult(ga, "BestQuality"));
536      Assert.AreEqual(10324.64, GetDoubleResult(ga, "CurrentAverageQuality"));
537      Assert.AreEqual(11823, GetDoubleResult(ga, "CurrentWorstQuality"));
538      Assert.AreEqual(495500, GetIntResult(ga, "EvaluatedSolutions"));
539    }
540
541    private IslandGeneticAlgorithm CreateIslandGaTspSample() {
542      IslandGeneticAlgorithm ga = new IslandGeneticAlgorithm();
543      #region Problem Configuration
544      var provider = new TSPLIBTSPInstanceProvider();
545      var instance = provider.GetDataDescriptors().Where(x => x.Name == "ch130").Single();
546      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
547      tspProblem.Load(provider.LoadData(instance));
548      tspProblem.UseDistanceMatrix.Value = true;
549      #endregion
550      #region Algorithm Configuration
551      ga.Name = "Island Genetic Algorithm - TSP";
552      ga.Description = "An island genetic algorithm which solves the \"ch130\" traveling salesman problem (imported from TSPLIB)";
553      ga.Problem = tspProblem;
554      ConfigureIslandGeneticAlgorithmParameters<ProportionalSelector, OrderCrossover2, InversionManipulator,
555        UnidirectionalRingMigrator, BestSelector, WorstReplacer>(
556        ga, 100, 1, 1000, 0.05, 5, 50, 0.25);
557      #endregion
558      return ga;
559    }
560    #endregion
561    #endregion
562
563    #region LS
564    #region Knapsack
565    [TestMethod]
566    public void CreateLocalSearchKnapsackSampleTest() {
567      var ls = CreateLocalSearchKnapsackSample();
568      XmlGenerator.Serialize(ls, "../../LS_Knapsack.hl");
569    }
570    [TestMethod]
571    public void RunLocalSearchKnapsackSampleTest() {
572      var ls = CreateLocalSearchKnapsackSample();
573      ls.SetSeedRandomly.Value = false;
574      RunAlgorithm(ls);
575      Assert.AreEqual(345, GetDoubleResult(ls, "BestQuality"));
576      Assert.AreEqual(340.70731707317071, GetDoubleResult(ls, "CurrentAverageQuality"));
577      Assert.AreEqual(337, GetDoubleResult(ls, "CurrentWorstQuality"));
578      Assert.AreEqual(82000, GetIntResult(ls, "EvaluatedMoves"));
579    }
580
581    private LocalSearch CreateLocalSearchKnapsackSample() {
582      LocalSearch ls = new LocalSearch();
583      #region Problem Configuration
584      KnapsackProblem problem = new KnapsackProblem();
585      problem.BestKnownQuality = new DoubleValue(362);
586      problem.BestKnownSolution = new HeuristicLab.Encodings.BinaryVectorEncoding.BinaryVector(new bool[] {
587       true , false, false, true , true , true , true , true , false, true , true , true , true , true , true , false, true , false, true , true , false, true , true , false, true , false, true , true , true , false, true , true , false, true , true , false, true , false, true , true , true , true , true , true , true , true , true , true , true , true , true , false, true , false, false, true , true , false, true , true , true , true , true , true , true , true , false, true , false, true , true , true , true , false, true , true , true , true , true , true , true , true});
588      problem.EvaluatorParameter.Value = new KnapsackEvaluator();
589      problem.SolutionCreatorParameter.Value = new RandomBinaryVectorCreator();
590      problem.KnapsackCapacity.Value = 297;
591      problem.Maximization.Value = true;
592      problem.Penalty.Value = 1;
593      problem.Values = new IntArray(new int[] {
594  6, 1, 1, 6, 7, 8, 7, 4, 2, 5, 2, 6, 7, 8, 7, 1, 7, 1, 9, 4, 2, 6, 5,  3, 5, 3, 3, 6, 5, 2, 4, 9, 4, 5, 7, 1, 4, 3, 5, 5, 8, 3, 6, 7, 3, 9, 7, 7, 5, 5, 7, 1, 4, 4, 3, 9, 5, 1, 6, 2, 2, 6, 1, 6, 5, 4, 4, 7, 1,  8, 9, 9, 7, 4, 3, 8, 7, 5, 7, 4, 4, 5});
595      problem.Weights = new IntArray(new int[] {
596 1, 9, 3, 6, 5, 3, 8, 1, 7, 4, 2, 1, 2, 7, 9, 9, 8, 4, 9, 2, 4, 8, 3, 7, 5, 7, 5, 5, 1, 9, 8, 7, 8, 9, 1, 3, 3, 8, 8, 5, 1, 2, 4, 3, 6, 9, 4, 4, 9, 7, 4, 5, 1, 9, 7, 6, 7, 4, 7, 1, 2, 1, 2, 9, 8, 6, 8, 4, 7, 6, 7, 5, 3, 9, 4, 7, 4, 6, 1, 2, 5, 4});
597      problem.Name = "Knapsack Problem";
598      problem.Description = "Represents a Knapsack problem.";
599      #endregion
600      #region Algorithm Configuration
601      ls.Name = "Local Search - Knapsack";
602      ls.Description = "A local search algorithm that solves a randomly generated Knapsack problem";
603      ls.Problem = problem;
604      ls.MaximumIterations.Value = 1000;
605      ls.MoveEvaluator = ls.MoveEvaluatorParameter.ValidValues
606        .OfType<KnapsackOneBitflipMoveEvaluator>()
607        .Single();
608      ls.MoveGenerator = ls.MoveGeneratorParameter.ValidValues
609        .OfType<ExhaustiveOneBitflipMoveGenerator>()
610        .Single();
611      ls.MoveMaker = ls.MoveMakerParameter.ValidValues
612        .OfType<OneBitflipMoveMaker>()
613        .Single();
614      ls.SampleSize.Value = 100;
615      ls.Seed.Value = 0;
616      ls.SetSeedRandomly.Value = true;
617      #endregion
618      ls.Engine = new ParallelEngine.ParallelEngine();
619      return ls;
620    }
621    #endregion
622    #endregion
623
624    #region PSO
625    #region Schwefel
626    [TestMethod]
627    public void CreatePsoSchwefelSampleTest() {
628      var pso = CreatePsoSchwefelSample();
629      XmlGenerator.Serialize(pso, "../../PSO_Schwefel.hl");
630    }
631    [TestMethod]
632    public void RunPsoSchwefelSampleTest() {
633      var pso = CreatePsoSchwefelSample();
634      pso.SetSeedRandomly.Value = false;
635      RunAlgorithm(pso);
636      if (!Environment.Is64BitProcess) {
637        Assert.AreEqual(118.44027985932837, GetDoubleResult(pso, "BestQuality"));
638        Assert.AreEqual(140.71570105946438, GetDoubleResult(pso, "CurrentAverageQuality"));
639        Assert.AreEqual(220.956806502853, GetDoubleResult(pso, "CurrentWorstQuality"));
640        Assert.AreEqual(1000, GetIntResult(pso, "Iterations"));
641      } else {
642        Assert.AreEqual(118.43958282879345, GetDoubleResult(pso, "BestQuality"));
643        Assert.AreEqual(139.43946864779372, GetDoubleResult(pso, "CurrentAverageQuality"));
644        Assert.AreEqual(217.14654589055152, GetDoubleResult(pso, "CurrentWorstQuality"));
645        Assert.AreEqual(1000, GetIntResult(pso, "Iterations"));
646      }
647    }
648    private ParticleSwarmOptimization CreatePsoSchwefelSample() {
649      ParticleSwarmOptimization pso = new ParticleSwarmOptimization();
650      #region Problem Configuration
651      var problem = new SingleObjectiveTestFunctionProblem();
652      problem.BestKnownQuality.Value = 0.0;
653      problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 420.968746, 420.968746 });
654      problem.Bounds = new DoubleMatrix(new double[,] { { -500, 500 } });
655      problem.EvaluatorParameter.Value = new SchwefelEvaluator();
656      problem.Maximization.Value = false;
657      problem.ProblemSize.Value = 2;
658      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
659      #endregion
660      #region Algorithm Configuration
661      pso.Name = "Particle Swarm Optimization - Schwefel";
662      pso.Description = "A particle swarm optimization algorithm which solves the 2-dimensional Schwefel test function (based on the description in Pedersen, M.E.H. (2010). PhD thesis. University of Southampton)";
663      pso.Problem = problem;
664      pso.Inertia.Value = 10;
665      pso.MaxIterations.Value = 1000;
666      pso.NeighborBestAttraction.Value = 0.5;
667      pso.PersonalBestAttraction.Value = -0.01;
668      pso.SwarmSize.Value = 50;
669
670      var inertiaUpdater = pso.InertiaUpdaterParameter.ValidValues
671        .OfType<ExponentialDiscreteDoubleValueModifier>()
672        .Single();
673      inertiaUpdater.StartValueParameter.Value = new DoubleValue(10);
674      inertiaUpdater.EndValueParameter.Value = new DoubleValue(1);
675      pso.InertiaUpdater = inertiaUpdater;
676
677      pso.ParticleCreator = pso.ParticleCreatorParameter.ValidValues
678        .OfType<RealVectorParticleCreator>()
679        .Single();
680      var swarmUpdater = pso.SwarmUpdaterParameter.ValidValues
681        .OfType<RealVectorSwarmUpdater>()
682        .Single();
683      swarmUpdater.VelocityBoundsIndexParameter.ActualName = "Iterations";
684      swarmUpdater.VelocityBoundsParameter.Value = new DoubleMatrix(new double[,] { { -10, 10 } });
685      swarmUpdater.VelocityBoundsStartValueParameter.Value = new DoubleValue(10.0);
686      swarmUpdater.VelocityBoundsEndValueParameter.Value = new DoubleValue(1.0);
687      swarmUpdater.VelocityBoundsScalingOperatorParameter.Value = swarmUpdater.VelocityBoundsScalingOperatorParameter.ValidValues
688        .OfType<ExponentialDiscreteDoubleValueModifier>()
689        .Single();
690
691      pso.TopologyInitializer = null;
692      pso.TopologyUpdater = null;
693      pso.SwarmUpdater = swarmUpdater;
694      pso.Seed.Value = 0;
695      pso.SetSeedRandomly.Value = true;
696      #endregion
697      pso.Engine = new ParallelEngine.ParallelEngine();
698      return pso;
699    }
700    #endregion
701    #endregion
702
703    #region SA
704    #region Rastrigin
705    [TestMethod]
706    public void CreateSimulatedAnnealingRastriginSampleTest() {
707      var sa = CreateSimulatedAnnealingRastriginSample();
708      XmlGenerator.Serialize(sa, "../../SA_Rastrigin.hl");
709    }
710    [TestMethod]
711    public void RunSimulatedAnnealingRastriginSampleTest() {
712      var sa = CreateSimulatedAnnealingRastriginSample();
713      sa.SetSeedRandomly.Value = false;
714      RunAlgorithm(sa);
715      Assert.AreEqual(0.00014039606034543795, GetDoubleResult(sa, "BestQuality"));
716      Assert.AreEqual(5000, GetIntResult(sa, "EvaluatedMoves"));
717    }
718    private SimulatedAnnealing CreateSimulatedAnnealingRastriginSample() {
719      SimulatedAnnealing sa = new SimulatedAnnealing();
720      #region Problem Configuration
721      var problem = new SingleObjectiveTestFunctionProblem();
722      problem.BestKnownQuality.Value = 0.0;
723      problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 0, 0 });
724      problem.Bounds = new DoubleMatrix(new double[,] { { -5.12, 5.12 } });
725      problem.EvaluatorParameter.Value = new RastriginEvaluator();
726      problem.Maximization.Value = false;
727      problem.ProblemSize.Value = 2;
728      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
729      #endregion
730      #region Algorithm Configuration
731      sa.Name = "Simulated Annealing - Rastrigin";
732      sa.Description = "A simulated annealing algorithm that solves the 2-dimensional Rastrigin test function";
733      sa.Problem = problem;
734      var annealingOperator = sa.AnnealingOperatorParameter.ValidValues
735        .OfType<ExponentialDiscreteDoubleValueModifier>()
736        .Single();
737      annealingOperator.StartIndexParameter.Value = new IntValue(0);
738      sa.AnnealingOperator = annealingOperator;
739
740      sa.EndTemperature.Value = 1E-6;
741      sa.InnerIterations.Value = 50;
742      sa.MaximumIterations.Value = 100;
743      var moveEvaluator = sa.MoveEvaluatorParameter.ValidValues
744        .OfType<RastriginAdditiveMoveEvaluator>()
745        .Single();
746      moveEvaluator.A.Value = 10;
747      sa.MoveEvaluator = moveEvaluator;
748
749      var moveGenerator = sa.MoveGeneratorParameter.ValidValues
750        .OfType<StochasticNormalMultiMoveGenerator>()
751        .Single();
752      moveGenerator.SigmaParameter.Value = new DoubleValue(1);
753      sa.MoveGenerator = moveGenerator;
754
755      sa.MoveMaker = sa.MoveMakerParameter.ValidValues
756        .OfType<AdditiveMoveMaker>()
757        .Single();
758
759      sa.Seed.Value = 0;
760      sa.SetSeedRandomly.Value = true;
761      sa.StartTemperature.Value = 1;
762      #endregion
763      sa.Engine = new ParallelEngine.ParallelEngine();
764      return sa;
765    }
766    #endregion
767    #endregion
768
769    #region TS
770    #region TSP
771    [TestMethod]
772    public void CreateTabuSearchTspSampleTest() {
773      var ts = CreateTabuSearchTspSample();
774      XmlGenerator.Serialize(ts, "../../TS_TSP.hl");
775    }
776    [TestMethod]
777    public void RunTabuSearchTspSampleTest() {
778      var ts = CreateTabuSearchTspSample();
779      ts.SetSeedRandomly.Value = false;
780      RunAlgorithm(ts);
781      Assert.AreEqual(6441, GetDoubleResult(ts, "BestQuality"));
782      Assert.AreEqual(7401.666666666667, GetDoubleResult(ts, "CurrentAverageQuality"));
783      Assert.AreEqual(8418, GetDoubleResult(ts, "CurrentWorstQuality"));
784      Assert.AreEqual(750000, GetIntResult(ts, "EvaluatedMoves"));
785    }
786
787    private TabuSearch CreateTabuSearchTspSample() {
788      TabuSearch ts = new TabuSearch();
789      #region Problem Configuration
790      var provider = new TSPLIBTSPInstanceProvider();
791      var instance = provider.GetDataDescriptors().Where(x => x.Name == "ch130").Single();
792      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
793      tspProblem.Load(provider.LoadData(instance));
794      tspProblem.UseDistanceMatrix.Value = true;
795      #endregion
796      #region Algorithm Configuration
797      ts.Name = "Tabu Search - TSP";
798      ts.Description = "A tabu search algorithm that solves the \"ch130\" TSP (imported from TSPLIB)";
799      ts.Problem = tspProblem;
800
801      ts.MaximumIterations.Value = 1000;
802      // move generator has to be set first
803      var moveGenerator = ts.MoveGeneratorParameter.ValidValues
804        .OfType<StochasticInversionMultiMoveGenerator>()
805        .Single();
806      ts.MoveGenerator = moveGenerator;
807      var moveEvaluator = ts.MoveEvaluatorParameter.ValidValues
808        .OfType<TSPInversionMoveRoundedEuclideanPathEvaluator>()
809        .Single();
810      ts.MoveEvaluator = moveEvaluator;
811      var moveMaker = ts.MoveMakerParameter.ValidValues
812        .OfType<InversionMoveMaker>()
813        .Single();
814      ts.MoveMaker = moveMaker;
815      ts.SampleSize.Value = 750;
816      ts.Seed.Value = 0;
817      ts.SetSeedRandomly.Value = true;
818
819      var tabuChecker = ts.TabuCheckerParameter.ValidValues
820        .OfType<InversionMoveSoftTabuCriterion>()
821        .Single();
822      tabuChecker.UseAspirationCriterion.Value = true;
823      ts.TabuChecker = tabuChecker;
824
825      var tabuMaker = ts.TabuMakerParameter.ValidValues
826        .OfType<InversionMoveTabuMaker>()
827        .Single();
828      ts.TabuMaker = tabuMaker;
829      ts.TabuTenure.Value = 60;
830
831      #endregion
832      ts.Engine = new ParallelEngine.ParallelEngine();
833      return ts;
834    }
835    #endregion
836
837    #region VRP
838    [TestMethod]
839    public void CreateTabuSearchVRPSampleTest() {
840      var vrp = CreateTabuSearchVrpSample();
841      XmlGenerator.Serialize(vrp, "../../TS_VRP.hl");
842    }
843    [TestMethod]
844    public void RunTabuSearchVRPSampleTest() {
845      var vrp = CreateTabuSearchVrpSample();
846      vrp.SetSeedRandomly.Value = false;
847      RunAlgorithm(vrp);
848      Assert.AreEqual(1436, GetDoubleResult(vrp, "BestQuality"));
849      Assert.AreEqual(2132.2478893442621, GetDoubleResult(vrp, "CurrentAverageQuality"));
850      Assert.AreEqual(4176.0, GetDoubleResult(vrp, "CurrentWorstQuality"));
851      Assert.AreEqual(119011, GetIntResult(vrp, "EvaluatedMoves"));
852    }
853
854    private TabuSearch CreateTabuSearchVrpSample() {
855      TabuSearch ts = new TabuSearch();
856      #region Problem Configuration
857      var provider = new AugeratInstanceProvider();
858      var instance = provider.GetDataDescriptors().Where(x => x.Name == "A-n62-k8").Single();
859      VehicleRoutingProblem vrpProblem = new VehicleRoutingProblem();
860      vrpProblem.Load(provider.LoadData(instance));
861      #endregion
862      #region Algorithm Configuration
863      ts.Name = "Tabu Search - VRP";
864      ts.Description = "A tabu search algorithm that solves the \"A-n62-k8\" VRP (imported from Augerat)";
865      ts.Problem = vrpProblem;
866
867      ts.MaximumIterations.Value = 200;
868      // move generator has to be set first
869      var moveGenerator = ts.MoveGeneratorParameter.ValidValues
870        .OfType<PotvinCustomerRelocationExhaustiveMoveGenerator>()
871        .Single();
872      ts.MoveGenerator = moveGenerator;
873      var moveEvaluator = ts.MoveEvaluatorParameter.ValidValues
874        .OfType<PotvinCustomerRelocationMoveEvaluator>()
875        .Single();
876      ts.MoveEvaluator = moveEvaluator;
877      var moveMaker = ts.MoveMakerParameter.ValidValues
878        .OfType<PotvinCustomerRelocationMoveMaker>()
879        .Single();
880      ts.MoveMaker = moveMaker;
881      ts.SampleSize.Value = 1000;
882      ts.Seed.Value = 0;
883      ts.SetSeedRandomly.Value = true;
884
885      var tabuChecker = ts.TabuCheckerParameter.ValidValues
886        .OfType<PotvinCustomerRelocationMoveTabuCriterion>()
887        .Single();
888      tabuChecker.UseAspirationCriterion.Value = false;
889      ts.TabuChecker = tabuChecker;
890
891      var tabuMaker = ts.TabuMakerParameter.ValidValues
892        .OfType<PotvinCustomerRelocationMoveTabuMaker>()
893        .Single();
894      ts.TabuMaker = tabuMaker;
895      ts.TabuTenure.Value = 6;
896
897      #endregion
898      ts.Engine = new ParallelEngine.ParallelEngine();
899      return ts;
900    }
901    #endregion
902    #endregion
903
904    #region VNS
905    #region TSP
906    [TestMethod]
907    public void CreateVnsTspSampleTest() {
908      var vns = CreateVnsTspSample();
909      XmlGenerator.Serialize(vns, "../../VNS_TSP.hl");
910    }
911    [TestMethod]
912    public void RunVnsTspSampleTest() {
913      var vns = CreateVnsTspSample();
914      vns.SetSeedRandomly = false;
915      RunAlgorithm(vns);
916      Assert.AreEqual(867, GetDoubleResult(vns, "BestQuality"));
917      Assert.AreEqual(867, GetDoubleResult(vns, "CurrentAverageQuality"));
918      Assert.AreEqual(867, GetDoubleResult(vns, "CurrentWorstQuality"));
919      Assert.AreEqual(12975173, GetIntResult(vns, "EvaluatedSolutions"));
920    }
921
922    private VariableNeighborhoodSearch CreateVnsTspSample() {
923      VariableNeighborhoodSearch vns = new VariableNeighborhoodSearch();
924      #region Problem Configuration
925      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
926      tspProblem.BestKnownSolution = new Permutation(PermutationTypes.Absolute, new int[] {
927117, 65, 73, 74, 75, 76, 82, 86, 87, 94, 100, 106, 115, 120, 124, 107, 101, 108, 109, 102, 97, 90, 96, 95, 88, 89, 84, 78, 69, 57, 68, 56, 44, 55, 45, 36, 46, 37, 38, 47, 48, 59, 49, 58, 70, 77, 83, 79, 50, 80, 85, 98, 103, 110, 116, 121, 125, 133, 132, 138, 139, 146, 147, 159, 168, 169, 175, 182, 188, 201, 213, 189, 214, 221, 230, 246, 262, 276, 284, 275, 274, 261, 245, 229, 220, 228, 243, 259, 273, 282, 272, 258, 242, 257, 293, 292, 302, 310, 319, 320, 327, 326, 333, 340, 346, 339, 345, 344, 337, 338, 332, 325, 318, 309, 301, 291, 271, 251, 270, 233, 250, 269, 268, 280, 290, 300, 415, 440, 416, 417, 441, 458, 479, 418, 419, 395, 420, 442, 421, 396, 397, 422, 423, 461, 481, 502, 460, 501, 459, 480, 500, 517, 531, 516, 530, 499, 478, 457, 439, 414, 413, 412, 438, 456, 477, 498, 515, 529, 538, 547, 558, 559, 560, 548, 539, 549, 561, 562, 551, 550, 532, 540, 533, 541, 518, 534, 542, 552, 553, 554, 555, 535, 543, 556, 544, 536, 522, 505, 521, 520, 504, 519, 503, 482, 462, 463, 464, 483, 443, 465, 484, 506, 485, 507, 508, 487, 467, 486, 466, 445, 428, 444, 424, 425, 426, 427, 398, 399, 400, 381, 382, 371, 372, 401, 429, 446, 430, 402, 383, 366, 356, 357, 352, 385, 384, 403, 431, 447, 469, 468, 488, 489, 490, 470, 471, 448, 432, 433, 404, 405, 386, 373, 374, 367, 376, 375, 387, 491, 509, 537, 510, 492, 472, 449, 388, 389, 406, 450, 407, 377, 368, 359, 354, 350, 335, 324, 330, 390, 434, 451, 473, 493, 511, 523, 545, 563, 565, 567, 570, 569, 578, 577, 576, 575, 574, 573, 572, 580, 584, 583, 582, 587, 586, 585, 581, 579, 571, 568, 566, 564, 557, 546, 527, 513, 526, 525, 524, 512, 495, 494, 474, 452, 436, 409, 435, 453, 475, 496, 514, 528, 497, 455, 476, 454, 437, 411, 410, 394, 393, 392, 380, 370, 379, 408, 391, 378, 369, 364, 365, 361, 355, 351, 343, 336, 331, 317, 299, 286, 287, 278, 263, 264, 265, 223, 202, 248, 266, 279, 288, 289, 281, 267, 249, 232, 224, 216, 215, 204, 192, 193, 194, 186, 179, 185, 203, 191, 190, 177, 171, 161, 128, 135, 140, 149, 162, 150, 163, 172, 178, 173, 164, 152, 151, 141, 153, 165, 154, 142, 155, 143, 137, 136, 130, 129, 118, 114, 113, 105, 119, 123, 131, 144, 156, 157, 145, 158, 166, 167, 174, 180, 181, 187, 195, 205, 217, 226, 236, 225, 234, 252, 235, 253, 254, 255, 238, 239, 240, 241, 256, 237, 206, 207, 208, 196, 197, 198, 209, 199, 200, 211, 212, 219, 210, 218, 227, 244, 260, 283, 294, 295, 303, 296, 311, 304, 297, 298, 305, 285, 306, 314, 329, 321, 313, 312, 328, 334, 341, 347, 348, 353, 358, 362, 363, 360, 349, 342, 322, 323, 315, 316, 308, 307, 277, 247, 231, 222, 184, 183, 176, 170, 160, 148, 134, 127, 126, 111, 104, 92, 91, 71, 60, 51, 52, 40, 32, 23, 21, 20, 18, 17, 16, 14, 13, 11, 10, 7, 6, 5, 2, 1, 0, 3, 4, 31, 39, 25, 30, 35, 34, 33, 43, 54, 42, 27, 28, 29, 9, 8, 12, 15, 19, 22, 24, 26, 41, 67, 66, 64, 63, 53, 62, 61, 72, 81, 93, 99, 112, 122,
928      });
929      tspProblem.Coordinates = new DoubleMatrix(new double[,] {
930{48, 71}, {49, 71}, {50, 71}, {44, 70}, {45, 70}, {52, 70}, {53, 70}, {54, 70}, {41, 69}, {42, 69}, {55, 69}, {56, 69}, {40, 68}, {56, 68}, {57, 68}, {39, 67}, {57, 67}, {58, 67}, {59, 67}, {38, 66}, {59, 66}, {60, 66}, {37, 65}, {60, 65}, {36, 64}, {43, 64}, {35, 63}, {37, 63}, {41, 63}, {42, 63}, {43, 63}, {47, 63}, {61, 63}, {40, 62}, {41, 62}, {42, 62}, {43, 62}, {45, 62}, {46, 62}, {47, 62}, {62, 62}, {34, 61}, {38, 61}, {39, 61}, {42, 61}, {43, 61}, {44, 61}, {45, 61}, {46, 61}, {47, 61}, {52, 61}, {62, 61}, {63, 61}, {26, 60}, {38, 60}, {42, 60}, {43, 60}, {44, 60}, {46, 60}, {47, 60}, {63, 60}, {23, 59}, {24, 59}, {27, 59}, {29, 59}, {30, 59}, {31, 59}, {33, 59}, {42, 59}, {46, 59}, {47, 59}, {63, 59}, {21, 58}, {32, 58}, {33, 58}, {34, 58}, {35, 58}, {46, 58}, {47, 58}, {48, 58}, {53, 58}, {21, 57}, {35, 57}, {47, 57}, {48, 57}, {53, 57}, {36, 56}, {37, 56}, {46, 56}, {47, 56}, {48, 56}, {64, 56}, {65, 56}, {20, 55}, {38, 55}, {46, 55}, {47, 55}, {48, 55}, {52, 55}, {21, 54}, {40, 54}, {47, 54}, {48, 54}, {52, 54}, {65, 54}, {30, 53}, {41, 53}, {46, 53}, {47, 53}, {48, 53}, {52, 53}, {65, 53}, {21, 52}, {32, 52}, {33, 52}, {42, 52}, {51, 52}, {21, 51}, {33, 51}, {34, 51}, {43, 51}, {51, 51}, {21, 50}, {35, 50}, {44, 50}, {50, 50}, {66, 50}, {67, 50}, {21, 49}, {34, 49}, {36, 49}, {37, 49}, {46, 49}, {49, 49}, {67, 49}, {22, 48}, {36, 48}, {37, 48}, {46, 48}, {47, 48}, {22, 47}, {30, 47}, {34, 47}, {37, 47}, {38, 47}, {39, 47}, {47, 47}, {48, 47}, {67, 47}, {23, 46}, {28, 46}, {29, 46}, {30, 46}, {31, 46}, {32, 46}, {35, 46}, {37, 46}, {38, 46}, {39, 46}, {49, 46}, {67, 46}, {23, 45}, {28, 45}, {29, 45}, {31, 45}, {32, 45}, {40, 45}, {41, 45}, {49, 45}, {50, 45}, {68, 45}, {24, 44}, {29, 44}, {32, 44}, {41, 44}, {51, 44}, {68, 44}, {25, 43}, {30, 43}, {32, 43}, {42, 43}, {43, 43}, {51, 43}, {68, 43}, {69, 43}, {31, 42}, {32, 42}, {43, 42}, {52, 42}, {55, 42}, {26, 41}, {27, 41}, {31, 41}, {32, 41}, {33, 41}, {44, 41}, {45, 41}, {46, 41}, {47, 41}, {48, 41}, {49, 41}, {53, 41}, {25, 40}, {27, 40}, {32, 40}, {43, 40}, {44, 40}, {45, 40}, {46, 40}, {48, 40}, {49, 40}, {50, 40}, {51, 40}, {53, 40}, {56, 40}, {32, 39}, {33, 39}, {43, 39}, {50, 39}, {51, 39}, {54, 39}, {56, 39}, {69, 39}, {24, 38}, {32, 38}, {41, 38}, {42, 38}, {51, 38}, {52, 38}, {54, 38}, {57, 38}, {69, 38}, {31, 37}, {32, 37}, {40, 37}, {41, 37}, {42, 37}, {43, 37}, {44, 37}, {45, 37}, {46, 37}, {47, 37}, {48, 37}, {51, 37}, {52, 37}, {55, 37}, {57, 37}, {69, 37}, {24, 36}, {31, 36}, {32, 36}, {39, 36}, {40, 36}, {41, 36}, {42, 36}, {43, 36}, {45, 36}, {48, 36}, {49, 36}, {51, 36}, {53, 36}, {55, 36}, {58, 36}, {22, 35}, {23, 35}, {24, 35}, {25, 35}, {30, 35}, {31, 35}, {32, 35}, {39, 35}, {41, 35}, {49, 35}, {51, 35}, {55, 35}, {56, 35}, {58, 35}, {71, 35}, {20, 34}, {27, 34}, {30, 34}, {31, 34}, {51, 34}, {53, 34}, {57, 34}, {60, 34}, {18, 33}, {19, 33}, {29, 33}, {30, 33}, {31, 33}, {45, 33}, {46, 33}, {47, 33}, {52, 33}, {53, 33}, {55, 33}, {57, 33}, {58, 33}, {17, 32}, {30, 32}, {44, 32}, {47, 32}, {54, 32}, {57, 32}, {59, 32}, {61, 32}, {71, 32}, {72, 32}, {43, 31}, {47, 31}, {56, 31}, {58, 31}, {59, 31}, {61, 31}, {72, 31}, {74, 31}, {16, 30}, {43, 30}, {46, 30}, {47, 30}, {59, 30}, {63, 30}, {71, 30}, {75, 30}, {43, 29}, {46, 29}, {47, 29}, {59, 29}, {60, 29}, {75, 29}, {15, 28}, {43, 28}, {46, 28}, {61, 28}, {76, 28}, {15, 27}, {43, 27}, {44, 27}, {45, 27}, {46, 27}, {60, 27}, {62, 27}, {15, 26}, {43, 26}, {44, 26}, {46, 26}, {59, 26}, {60, 26}, {64, 26}, {77, 26}, {15, 25}, {58, 25}, {61, 25}, {77, 25}, {15, 24}, {53, 24}, {55, 24}, {61, 24}, {77, 24}, {62, 23}, {16, 22}, {61, 22}, {62, 22}, {15, 21}, {16, 21}, {52, 21}, {63, 21}, {77, 21}, {16, 20}, {17, 20}, {46, 20}, {47, 20}, {60, 20}, {62, 20}, {63, 20}, {65, 20}, {76, 20}, {15, 19}, {17, 19}, {18, 19}, {44, 19}, {45, 19}, {48, 19}, {53, 19}, {56, 19}, {60, 19}, {62, 19}, {67, 19}, {68, 19}, {76, 19}, {15, 18}, {18, 18}, {19, 18}, {20, 18}, {32, 18}, {33, 18}, {34, 18}, {41, 18}, {42, 18}, {43, 18}, {46, 18}, {48, 18}, {53, 18}, {59, 18}, {60, 18}, {69, 18}, {75, 18}, {16, 17}, {17, 17}, {20, 17}, {21, 17}, {22, 17}, {23, 17}, {24, 17}, {26, 17}, {28, 17}, {29, 17}, {30, 17}, {31, 17}, {32, 17}, {34, 17}, {35, 17}, {36, 17}, {37, 17}, {38, 17}, {39, 17}, {40, 17}, {44, 17}, {46, 17}, {48, 17}, {53, 17}, {56, 17}, {58, 17}, {75, 17}, {17, 16}, {18, 16}, {20, 16}, {24, 16}, {26, 16}, {27, 16}, {29, 16}, {33, 16}, {41, 16}, {42, 16}, {44, 16}, {47, 16}, {52, 16}, {57, 16}, {70, 16}, {73, 16}, {74, 16}, {17, 15}, {18, 15}, {20, 15}, {22, 15}, {24, 15}, {27, 15}, {29, 15}, {31, 15}, {33, 15}, {35, 15}, {36, 15}, {38, 15}, {39, 15}, {42, 15}, {45, 15}, {47, 15}, {52, 15}, {53, 15}, {55, 15}, {56, 15}, {70, 15}, {73, 15}, {17, 14}, {19, 14}, {21, 14}, {24, 14}, {26, 14}, {29, 14}, {31, 14}, {34, 14}, {37, 14}, {40, 14}, {42, 14}, {44, 14}, {46, 14}, {47, 14}, {53, 14}, {54, 14}, {55, 14}, {62, 14}, {70, 14}, {72, 14}, {17, 13}, {19, 13}, {21, 13}, {23, 13}, {25, 13}, {27, 13}, {30, 13}, {32, 13}, {34, 13}, {36, 13}, {38, 13}, {41, 13}, {43, 13}, {44, 13}, {45, 13}, {60, 13}, {70, 13}, {71, 13}, {18, 12}, {21, 12}, {23, 12}, {26, 12}, {28, 12}, {31, 12}, {34, 12}, {37, 12}, {39, 12}, {41, 12}, {42, 12}, {70, 12}, {18, 11}, {19, 11}, {20, 11}, {21, 11}, {24, 11}, {25, 11}, {27, 11}, {29, 11}, {31, 11}, {33, 11}, {35, 11}, {38, 11}, {41, 11}, {59, 11}, {26, 10}, {29, 10}, {32, 10}, {34, 10}, {36, 10}, {39, 10}, {40, 10}, {69, 10}, {21, 9}, {26, 9}, {28, 9}, {30, 9}, {32, 9}, {33, 9}, {35, 9}, {36, 9}, {37, 9}, {38, 9}, {39, 9}, {22, 8}, {27, 8}, {28, 8}, {29, 8}, {30, 8}, {31, 8}, {68, 8}, {23, 7}, {66, 7}, {24, 6}, {65, 6}, {25, 5}, {62, 5}, {63, 5}, {26, 4}, {55, 4}, {56, 4}, {57, 4}, {58, 4}, {59, 4}, {60, 4}, {61, 4}, {28, 3}, {53, 3}, {29, 2}, {50, 2}, {51, 2}, {52, 2}, {31, 1}, {32, 1}, {48, 1}
931      });
932      tspProblem.BestKnownQuality = new DoubleValue(867);
933
934      tspProblem.EvaluatorParameter.Value = new TSPRoundedEuclideanPathEvaluator();
935      tspProblem.SolutionCreatorParameter.Value = new RandomPermutationCreator();
936      tspProblem.UseDistanceMatrix.Value = true;
937      tspProblem.Name = "Funny TSP";
938      tspProblem.Description = "Represents a symmetric Traveling Salesman Problem.";
939      #endregion
940      #region Algorithm Configuration
941      vns.Name = "Variable Neighborhood Search - TSP";
942      vns.Description = "A variable neighborhood search algorithm which solves a funny TSP instance";
943      vns.Problem = tspProblem;
944
945      var localImprovement = vns.LocalImprovementParameter.ValidValues
946        .OfType<LocalSearchImprovementOperator>()
947        .Single();
948      // move generator has to be set first
949      localImprovement.MoveGenerator = localImprovement.MoveGeneratorParameter.ValidValues
950        .OfType<StochasticInversionMultiMoveGenerator>()
951        .Single();
952      localImprovement.MoveEvaluator = localImprovement.MoveEvaluatorParameter.ValidValues
953        .OfType<TSPInversionMoveRoundedEuclideanPathEvaluator>()
954        .Single();
955      localImprovement.MoveMaker = localImprovement.MoveMakerParameter.ValidValues
956        .OfType<InversionMoveMaker>()
957        .Single();
958      localImprovement.SampleSizeParameter.Value = new IntValue(500);
959      vns.LocalImprovement = localImprovement;
960
961      vns.LocalImprovementMaximumIterations = 150;
962      vns.MaximumIterations = 25;
963      vns.Seed = 0;
964      vns.SetSeedRandomly = true;
965      var shakingOperator = vns.ShakingOperatorParameter.ValidValues
966        .OfType<PermutationShakingOperator>()
967        .Single();
968      shakingOperator.Operators.SetItemCheckedState(shakingOperator.Operators
969        .OfType<Swap2Manipulator>()
970        .Single(), false);
971      shakingOperator.Operators.SetItemCheckedState(shakingOperator.Operators
972        .OfType<Swap3Manipulator>()
973        .Single(), false);
974      vns.ShakingOperator = shakingOperator;
975      #endregion
976      vns.Engine = new ParallelEngine.ParallelEngine();
977      return vns;
978    }
979    #endregion
980    #endregion
981
982    #region Gaussian Process Regression
983    [TestMethod]
984    public void CreateGaussianProcessRegressionSampleTest() {
985      var gpr = CreateGaussianProcessRegressionSample();
986      XmlGenerator.Serialize(gpr, "../../GPR.hl");
987    }
988    [TestMethod]
989    public void RunGaussianProcessRegressionSample() {
990      var gpr = CreateGaussianProcessRegressionSample();
991      gpr.SetSeedRandomly = false;
992      gpr.Seed = 1618551877;
993      RunAlgorithm(gpr);
994      Assert.AreEqual(-940.48768748097029, GetDoubleResult(gpr, "NegativeLogLikelihood"));
995      Assert.AreEqual(0.99561947047986976, GetDoubleResult(gpr, "Training R²"));
996    }
997
998    private GaussianProcessRegression CreateGaussianProcessRegressionSample() {
999      var gpr = new GaussianProcessRegression();
1000      var provider = new VariousInstanceProvider();
1001      var instance = provider.GetDataDescriptors().Where(x => x.Name.Contains("Spatial co-evolution")).Single();
1002      var regProblem = new RegressionProblem();
1003      regProblem.Load(provider.LoadData(instance));
1004      #region Algorithm Configuration
1005      gpr.Name = "Gaussian Process Regression";
1006      gpr.Description = "A Gaussian process regression algorithm which solves the spatial co-evolution benchmark problem";
1007      gpr.Problem = regProblem;
1008
1009      gpr.CovarianceFunction = new CovarianceSquaredExponentialIso();
1010      gpr.MeanFunction = new MeanConst();
1011      gpr.MinimizationIterations = 20;
1012      gpr.Seed = 0;
1013      gpr.SetSeedRandomly = true;
1014      #endregion
1015      gpr.Engine = new ParallelEngine.ParallelEngine();
1016      return gpr;
1017    }
1018    #endregion
1019
1020    #region Scatter Search
1021    #region VRP
1022    [TestMethod]
1023    public void CreateScatterSearchVRPSampleTest() {
1024      var ss = CreateScatterSearchVRPSample();
1025      XmlGenerator.Serialize(ss, "../../SS_VRP.hl");
1026    }
1027
1028    [TestMethod]
1029    public void RunScatterSearchVRPSampleTest() {
1030      var ss = CreateScatterSearchVRPSample();
1031      ss.SetSeedRandomly.Value = false;
1032      RunAlgorithm(ss);
1033      Assert.AreEqual(828.93686694283383, GetDoubleResult(ss, "BestQuality"));
1034      Assert.AreEqual(868.63623986983077, GetDoubleResult(ss, "CurrentAverageQuality"));
1035      Assert.AreEqual(1048.8333559209832, GetDoubleResult(ss, "CurrentWorstQuality"));
1036      Assert.AreEqual(262622, GetIntResult(ss, "EvaluatedSolutions"));
1037    }
1038
1039    private ScatterSearch CreateScatterSearchVRPSample() {
1040      #region Problem Configuration
1041      var provider = new SolomonInstanceProvider();
1042      var instance = provider.GetDataDescriptors().Single(x => x.Name == "C101");
1043      VehicleRoutingProblem vrpProblem = new VehicleRoutingProblem();
1044      vrpProblem.Load(provider.LoadData(instance));
1045      #endregion
1046
1047      #region Algorithm Configuration
1048      ScatterSearch ss = new ScatterSearch();
1049      ss.Engine = new SequentialEngine.SequentialEngine();
1050      ss.Name = "Scatter Search - VRP";
1051      ss.Description = "A scatter search algorithm which solves the \"C101\" vehicle routing problem (imported from Solomon)";
1052      ss.Problem = vrpProblem;
1053
1054      var improver = ss.Problem.Operators.OfType<VRPIntraRouteImprovementOperator>().First();
1055      improver.ImprovementAttemptsParameter.Value.Value = 15;
1056      improver.SampleSizeParameter.Value.Value = 10;
1057      ss.Improver = improver;
1058
1059      var pathRelinker = ss.Problem.Operators.OfType<VRPPathRelinker>().First();
1060      pathRelinker.IterationsParameter.Value.Value = 25;
1061      ss.PathRelinker = pathRelinker;
1062
1063      var similarityCalculator = ss.SimilarityCalculatorParameter.ValidValues.OfType<VRPSimilarityCalculator>().First();
1064      ss.SimilarityCalculator = similarityCalculator;
1065
1066      ss.MaximumIterations.Value = 2;
1067      ss.PopulationSize.Value = 20;
1068      ss.ReferenceSetSize.Value = 10;
1069      ss.Seed.Value = 0;
1070      return ss;
1071      #endregion
1072    }
1073    #endregion
1074    #endregion
1075
1076    #region RAPGA
1077    #region Scheduling
1078    [TestMethod]
1079    public void CreateRAPGASchedulingSampleTest() {
1080      var ss = CreateRAPGASchedulingSample();
1081      XmlGenerator.Serialize(ss, "../../RAPGA_JSSP.hl");
1082    }
1083
1084    [TestMethod]
1085    public void RunRAPGASchedulingSampleTest() {
1086      var rapga = CreateRAPGASchedulingSample();
1087      rapga.SetSeedRandomly.Value = false;
1088      RunAlgorithm(rapga);
1089      Assert.AreEqual(988.00, GetDoubleResult(rapga, "BestQuality"));
1090      Assert.AreEqual(988.00, GetDoubleResult(rapga, "CurrentAverageQuality"));
1091      Assert.AreEqual(988.00, GetDoubleResult(rapga, "CurrentWorstQuality"));
1092      Assert.AreEqual(27100, GetIntResult(rapga, "EvaluatedSolutions"));
1093    }
1094
1095    private RAPGA CreateRAPGASchedulingSample() {
1096      #region Problem Configuration
1097      JobShopSchedulingProblem problem = new JobShopSchedulingProblem();
1098      #endregion
1099
1100      #region Algorithm Configuration
1101      RAPGA rapga = new RAPGA();
1102      rapga.Engine = new SequentialEngine.SequentialEngine();
1103      rapga.Name = "RAPGA - Job Shop Scheduling";
1104      rapga.Description = "A relevant alleles preserving genetic algorithm which solves a job shop scheduling problem";
1105      rapga.Problem = problem;
1106      rapga.Mutator = rapga.MutatorParameter.ValidValues.OfType<JSMSwapManipulator>().First();
1107      rapga.Seed.Value = 0;
1108      return rapga;
1109      #endregion
1110    }
1111    #endregion
1112    #endregion
1113
1114    #region Helpers
1115    private void ConfigureEvolutionStrategyParameters<R, M, SC, SR, SM>(EvolutionStrategy es, int popSize, int children, int parentsPerChild, int maxGens, bool plusSelection)
1116      where R : ICrossover
1117      where M : IManipulator
1118      where SC : IStrategyParameterCreator
1119      where SR : IStrategyParameterCrossover
1120      where SM : IStrategyParameterManipulator {
1121      es.PopulationSize.Value = popSize;
1122      es.Children.Value = children;
1123      es.ParentsPerChild.Value = parentsPerChild;
1124      es.MaximumGenerations.Value = maxGens;
1125      es.PlusSelection.Value = false;
1126
1127      es.Seed.Value = 0;
1128      es.SetSeedRandomly.Value = true;
1129
1130      es.Recombinator = es.RecombinatorParameter.ValidValues
1131        .OfType<R>()
1132        .Single();
1133
1134      es.Mutator = es.MutatorParameter.ValidValues
1135        .OfType<M>()
1136        .Single();
1137
1138      es.StrategyParameterCreator = es.StrategyParameterCreatorParameter.ValidValues
1139        .OfType<SC>()
1140        .Single();
1141      es.StrategyParameterCrossover = es.StrategyParameterCrossoverParameter.ValidValues
1142        .OfType<SR>()
1143        .Single();
1144      es.StrategyParameterManipulator = es.StrategyParameterManipulatorParameter.ValidValues
1145        .OfType<SM>()
1146        .Single();
1147      es.Engine = new ParallelEngine.ParallelEngine();
1148    }
1149
1150    private void ConfigureGeneticAlgorithmParameters<S, C, M>(GeneticAlgorithm ga, int popSize, int elites, int maxGens, double mutationRate, int tournGroupSize = 0)
1151      where S : ISelector
1152      where C : ICrossover
1153      where M : IManipulator {
1154      ga.Elites.Value = elites;
1155      ga.MaximumGenerations.Value = maxGens;
1156      ga.MutationProbability.Value = mutationRate;
1157      ga.PopulationSize.Value = popSize;
1158      ga.Seed.Value = 0;
1159      ga.SetSeedRandomly.Value = true;
1160      ga.Selector = ga.SelectorParameter.ValidValues
1161        .OfType<S>()
1162        .First();
1163
1164      ga.Crossover = ga.CrossoverParameter.ValidValues
1165        .OfType<C>()
1166        .First();
1167
1168      ga.Mutator = ga.MutatorParameter.ValidValues
1169        .OfType<M>()
1170        .First();
1171
1172      var tSelector = ga.Selector as TournamentSelector;
1173      if (tSelector != null) {
1174        tSelector.GroupSizeParameter.Value.Value = tournGroupSize;
1175      }
1176      ga.Engine = new ParallelEngine.ParallelEngine();
1177    }
1178
1179    private void ConfigureIslandGeneticAlgorithmParameters<S, C, M, Mi, MiS, MiR>(IslandGeneticAlgorithm ga, int popSize, int elites, int maxGens, double mutationRate, int numberOfIslands, int migrationInterval, double migrationRate)
1180      where S : ISelector
1181      where C : ICrossover
1182      where M : IManipulator
1183      where Mi : IMigrator
1184      where MiS : ISelector
1185      where MiR : IReplacer {
1186      ga.Elites.Value = elites;
1187      ga.MaximumGenerations.Value = maxGens;
1188      ga.MutationProbability.Value = mutationRate;
1189      ga.PopulationSize.Value = popSize;
1190      ga.NumberOfIslands.Value = numberOfIslands;
1191      ga.MigrationInterval.Value = migrationInterval;
1192      ga.MigrationRate.Value = migrationRate;
1193      ga.Seed.Value = 0;
1194      ga.SetSeedRandomly.Value = true;
1195      ga.Selector = ga.SelectorParameter.ValidValues
1196        .OfType<S>()
1197        .Single();
1198
1199      ga.Crossover = ga.CrossoverParameter.ValidValues
1200        .OfType<C>()
1201        .Single();
1202
1203      ga.Mutator = ga.MutatorParameter.ValidValues
1204        .OfType<M>()
1205        .Single();
1206      ga.Migrator = ga.MigratorParameter.ValidValues
1207        .OfType<Mi>()
1208        .Single();
1209      ga.EmigrantsSelector = ga.EmigrantsSelectorParameter.ValidValues
1210        .OfType<MiS>()
1211        .Single();
1212      ga.ImmigrationReplacer = ga.ImmigrationReplacerParameter.ValidValues
1213        .OfType<MiR>()
1214        .Single();
1215      ga.Engine = new ParallelEngine.ParallelEngine();
1216    }
1217
1218
1219    private void RunAlgorithm(IAlgorithm a) {
1220      var trigger = new EventWaitHandle(false, EventResetMode.ManualReset);
1221      Exception ex = null;
1222      a.Stopped += (src, e) => { trigger.Set(); };
1223      a.ExceptionOccurred += (src, e) => { ex = e.Value; trigger.Set(); };
1224      a.Prepare();
1225      a.Start();
1226      trigger.WaitOne();
1227
1228      Assert.AreEqual(ex, null);
1229    }
1230
1231    private double GetDoubleResult(IAlgorithm a, string resultName) {
1232      return ((DoubleValue)a.Results[resultName].Value).Value;
1233    }
1234    private int GetIntResult(IAlgorithm a, string resultName) {
1235      return ((IntValue)a.Results[resultName].Value).Value;
1236    }
1237    #endregion
1238  }
1239}
Note: See TracBrowser for help on using the repository browser.