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

Last change on this file since 8482 was 8482, checked in by ascheibe, 7 years ago

#1899 removed setting the checked state of certain analyzers in the samples unit test as this is already done correctly with the EnabledByDefault property of the analyzers

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