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

Last change on this file since 8554 was 8554, checked in by mkommend, 7 years ago

#1915:

  • Corrected class names and class values caching in ClassificationProblemData
  • Removed caching of classification penalties
  • Corrected AccuracyMaximizationThresholdCalculator (retrieving of penalties was switched)
  • Added asserts for the achieved accuracy to the classification sample unit test
File size: 55.1 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      var bestTrainingSolution = (IClassificationSolution)ga.Results["Best training solution"].Value;
346      Assert.AreEqual(0.80625, bestTrainingSolution.TrainingAccuracy, 1E-8);
347      Assert.AreEqual(0.782608695652174, bestTrainingSolution.TestAccuracy, 1E-8);
348    }
349
350    private GeneticAlgorithm CreateGpSymbolicClassificationSample() {
351      GeneticAlgorithm ga = new GeneticAlgorithm();
352      #region Problem Configuration
353      SymbolicClassificationSingleObjectiveProblem symbClassProblem = new SymbolicClassificationSingleObjectiveProblem();
354      symbClassProblem.Name = "Mammography Classification Problem";
355      symbClassProblem.Description = "Mammography dataset imported from the UCI machine learning repository (http://archive.ics.uci.edu/ml/datasets/Mammographic+Mass)";
356      ClassificationRealWorldInstanceProvider provider = new ClassificationRealWorldInstanceProvider();
357      var instance = provider.GetDataDescriptors().Where(x => x.Name.Equals("Mammography")).Single();
358      var mammoData = (ClassificationProblemData)provider.LoadData(instance);
359      mammoData.TargetVariableParameter.Value = mammoData.TargetVariableParameter.ValidValues
360        .First(v => v.Value == "Severity");
361      mammoData.InputVariables.SetItemCheckedState(
362        mammoData.InputVariables.Single(x => x.Value == "BI-RADS"), false);
363      mammoData.InputVariables.SetItemCheckedState(
364        mammoData.InputVariables.Single(x => x.Value == "Age"), true);
365      mammoData.InputVariables.SetItemCheckedState(
366        mammoData.InputVariables.Single(x => x.Value == "Shape"), true);
367      mammoData.InputVariables.SetItemCheckedState(
368        mammoData.InputVariables.Single(x => x.Value == "Margin"), true);
369      mammoData.InputVariables.SetItemCheckedState(
370        mammoData.InputVariables.Single(x => x.Value == "Density"), true);
371      mammoData.InputVariables.SetItemCheckedState(
372        mammoData.InputVariables.Single(x => x.Value == "Severity"), false);
373      mammoData.TrainingPartition.Start = 0;
374      mammoData.TrainingPartition.End = 800;
375      mammoData.TestPartition.Start = 800;
376      mammoData.TestPartition.End = 961;
377      mammoData.Name = "Data imported from mammographic_masses.csv";
378      mammoData.Description = "Original dataset: http://archive.ics.uci.edu/ml/datasets/Mammographic+Mass, missing values have been replaced with median values.";
379      symbClassProblem.ProblemData = mammoData;
380
381      // configure grammar
382      var grammar = new TypeCoherentExpressionGrammar();
383      grammar.ConfigureAsDefaultClassificationGrammar();
384      grammar.Symbols.OfType<VariableCondition>().Single().Enabled = false;
385      var varSymbol = grammar.Symbols.OfType<Variable>().Where(x => !(x is LaggedVariable)).Single();
386      varSymbol.WeightMu = 1.0;
387      varSymbol.WeightSigma = 1.0;
388      varSymbol.WeightManipulatorMu = 0.0;
389      varSymbol.WeightManipulatorSigma = 0.05;
390      varSymbol.MultiplicativeWeightManipulatorSigma = 0.03;
391      var constSymbol = grammar.Symbols.OfType<Constant>().Single();
392      constSymbol.MaxValue = 20;
393      constSymbol.MinValue = -20;
394      constSymbol.ManipulatorMu = 0.0;
395      constSymbol.ManipulatorSigma = 1;
396      constSymbol.MultiplicativeManipulatorSigma = 0.03;
397      symbClassProblem.SymbolicExpressionTreeGrammar = grammar;
398
399      // configure remaining problem parameters
400      symbClassProblem.BestKnownQuality.Value = 0.0;
401      symbClassProblem.FitnessCalculationPartition.Start = 0;
402      symbClassProblem.FitnessCalculationPartition.End = 400;
403      symbClassProblem.ValidationPartition.Start = 400;
404      symbClassProblem.ValidationPartition.End = 800;
405      symbClassProblem.RelativeNumberOfEvaluatedSamples.Value = 1;
406      symbClassProblem.MaximumSymbolicExpressionTreeLength.Value = 100;
407      symbClassProblem.MaximumSymbolicExpressionTreeDepth.Value = 10;
408      symbClassProblem.MaximumFunctionDefinitions.Value = 0;
409      symbClassProblem.MaximumFunctionArguments.Value = 0;
410      symbClassProblem.EvaluatorParameter.Value = new SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator();
411      #endregion
412      #region Algorithm Configuration
413      ga.Problem = symbClassProblem;
414      ga.Name = "Genetic Programming - Symbolic Classification";
415      ga.Description = "A standard genetic programming algorithm to solve a classification problem (Mammographic+Mass dataset)";
416      ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(
417        ga, 1000, 1, 100, 0.15, 5
418        );
419
420      var mutator = (MultiSymbolicExpressionTreeManipulator)ga.Mutator;
421      mutator.Operators.OfType<FullTreeShaker>().Single().ShakingFactor = 0.1;
422      mutator.Operators.OfType<OnePointShaker>().Single().ShakingFactor = 1.0;
423
424      ga.Analyzer.Operators.SetItemCheckedState(
425        ga.Analyzer.Operators
426        .OfType<SymbolicClassificationSingleObjectiveOverfittingAnalyzer>()
427        .Single(), false);
428      ga.Analyzer.Operators.SetItemCheckedState(
429        ga.Analyzer.Operators
430        .OfType<SymbolicDataAnalysisAlleleFrequencyAnalyzer>()
431        .First(), false);
432      #endregion
433      return ga;
434    }
435    #endregion
436    #region LawnMower
437    [TestMethod]
438    public void RunGpLawnMowerSampleTest() {
439      var ga = CreateGpLawnMowerSample();
440      ga.SetSeedRandomly.Value = false;
441      RunAlgorithm(ga);
442    }
443
444    public GeneticAlgorithm CreateGpLawnMowerSample() {
445      GeneticAlgorithm ga = new GeneticAlgorithm();
446      #region Problem Configuration
447      var problem = new HeuristicLab.Problems.LawnMower.Problem();
448      #endregion
449      #region Algorithm Configuration
450      ga.Name = "Genetic Programming - Lawn Mower";
451      ga.Description = "A standard genetic programming algorithm to solve the lawn mower problem";
452      ga.Problem = problem;
453      ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeArchitectureManipulator>(
454        ga, 1000, 1, 50, 0.25, 5);
455      var mutator = (MultiSymbolicExpressionTreeArchitectureManipulator)ga.Mutator;
456      mutator.Operators.SetItemCheckedState(mutator.Operators
457        .OfType<OnePointShaker>()
458        .Single(), false);
459      #endregion
460      return ga;
461    }
462    #endregion
463    #endregion
464
465    #region ES
466    #region Griewank
467    [TestMethod]
468    public void CreateEsGriewankSampleTest() {
469      var es = CreateEsGriewankSample();
470      XmlGenerator.Serialize(es, "../../ES_Griewank.hl");
471    }
472    [TestMethod]
473    public void RunEsGriewankSampleTest() {
474      var es = CreateEsGriewankSample();
475      es.SetSeedRandomly.Value = false;
476      RunAlgorithm(es);
477      Assert.AreEqual(0, GetDoubleResult(es, "BestQuality"));
478      Assert.AreEqual(0, GetDoubleResult(es, "CurrentAverageQuality"));
479      Assert.AreEqual(0, GetDoubleResult(es, "CurrentWorstQuality"));
480      Assert.AreEqual(100020, GetIntResult(es, "EvaluatedSolutions"));
481    }
482
483    private EvolutionStrategy CreateEsGriewankSample() {
484      EvolutionStrategy es = new EvolutionStrategy();
485      #region Problem Configuration
486      SingleObjectiveTestFunctionProblem problem = new SingleObjectiveTestFunctionProblem();
487
488      problem.ProblemSize.Value = 10;
489      problem.EvaluatorParameter.Value = new GriewankEvaluator();
490      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
491      problem.Maximization.Value = false;
492      problem.Bounds = new DoubleMatrix(new double[,] { { -600, 600 } });
493      problem.BestKnownQuality.Value = 0;
494      problem.BestKnownSolutionParameter.Value = new RealVector(10);
495      problem.Name = "Single Objective Test Function";
496      problem.Description = "Test function with real valued inputs and a single objective.";
497      #endregion
498      #region Algorithm Configuration
499      es.Name = "Evolution Strategy - Griewank";
500      es.Description = "An evolution strategy which solves the 10-dimensional Griewank test function";
501      es.Problem = problem;
502      ConfigureEvolutionStrategyParameters<AverageCrossover, NormalAllPositionsManipulator,
503        StdDevStrategyVectorCreator, StdDevStrategyVectorCrossover, StdDevStrategyVectorManipulator>(
504        es, 20, 500, 2, 200, false);
505
506      StdDevStrategyVectorCreator strategyCreator = (StdDevStrategyVectorCreator)es.StrategyParameterCreator;
507      strategyCreator.BoundsParameter.Value = new DoubleMatrix(new double[,] { { 1, 20 } });
508
509      StdDevStrategyVectorManipulator strategyManipulator = (StdDevStrategyVectorManipulator)es.StrategyParameterManipulator;
510      strategyManipulator.BoundsParameter.Value = new DoubleMatrix(new double[,] { { 1E-12, 30 } });
511      strategyManipulator.GeneralLearningRateParameter.Value = new DoubleValue(0.22360679774997896);
512      strategyManipulator.LearningRateParameter.Value = new DoubleValue(0.39763536438352531);
513      #endregion
514      return es;
515    }
516    #endregion
517    #endregion
518
519    #region Island GA
520    #region TSP
521    [TestMethod]
522    public void CreateIslandGaTspSampleTest() {
523      var ga = CreateIslandGaTspSample();
524      XmlGenerator.Serialize(ga, "../../IslandGA_TSP.hl");
525    }
526    [TestMethod]
527    public void RunIslandGaTspSampleTest() {
528      var ga = CreateIslandGaTspSample();
529      ga.SetSeedRandomly.Value = false;
530      RunAlgorithm(ga);
531      Assert.AreEqual(9918, GetDoubleResult(ga, "BestQuality"));
532      Assert.AreEqual(10324.64, GetDoubleResult(ga, "CurrentAverageQuality"));
533      Assert.AreEqual(11823, GetDoubleResult(ga, "CurrentWorstQuality"));
534      Assert.AreEqual(495500, GetIntResult(ga, "EvaluatedSolutions"));
535    }
536
537    private IslandGeneticAlgorithm CreateIslandGaTspSample() {
538      IslandGeneticAlgorithm ga = new IslandGeneticAlgorithm();
539      #region Problem Configuration
540      var provider = new TSPLIBTSPInstanceProvider();
541      var instance = provider.GetDataDescriptors().Where(x => x.Name == "ch130").Single();
542      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
543      tspProblem.Load(provider.LoadData(instance));
544      tspProblem.UseDistanceMatrix.Value = true;
545      #endregion
546      #region Algorithm Configuration
547      ga.Name = "Island Genetic Algorithm - TSP";
548      ga.Description = "An island genetic algorithm which solves the \"ch130\" traveling salesman problem (imported from TSPLIB)";
549      ga.Problem = tspProblem;
550      ConfigureIslandGeneticAlgorithmParameters<ProportionalSelector, OrderCrossover2, InversionManipulator,
551        UnidirectionalRingMigrator, BestSelector, WorstReplacer>(
552        ga, 100, 1, 1000, 0.05, 5, 50, 0.25);
553      #endregion
554      return ga;
555    }
556    #endregion
557    #endregion
558
559    #region LS
560    #region Knapsack
561    [TestMethod]
562    public void CreateLocalSearchKnapsackSampleTest() {
563      var ls = CreateLocalSearchKnapsackSample();
564      XmlGenerator.Serialize(ls, "../../LS_Knapsack.hl");
565    }
566    [TestMethod]
567    public void RunLocalSearchKnapsackSampleTest() {
568      var ls = CreateLocalSearchKnapsackSample();
569      ls.SetSeedRandomly.Value = false;
570      RunAlgorithm(ls);
571      Assert.AreEqual(345, GetDoubleResult(ls, "BestQuality"));
572      Assert.AreEqual(340.70731707317071, GetDoubleResult(ls, "CurrentAverageQuality"));
573      Assert.AreEqual(337, GetDoubleResult(ls, "CurrentWorstQuality"));
574      Assert.AreEqual(82000, GetIntResult(ls, "EvaluatedMoves"));
575    }
576
577    private LocalSearch CreateLocalSearchKnapsackSample() {
578      LocalSearch ls = new LocalSearch();
579      #region Problem Configuration
580      KnapsackProblem problem = new KnapsackProblem();
581      problem.BestKnownQuality = new DoubleValue(362);
582      problem.BestKnownSolution = new HeuristicLab.Encodings.BinaryVectorEncoding.BinaryVector(new bool[] { 
583       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});
584      problem.EvaluatorParameter.Value = new KnapsackEvaluator();
585      problem.SolutionCreatorParameter.Value = new RandomBinaryVectorCreator();
586      problem.KnapsackCapacity.Value = 297;
587      problem.Maximization.Value = true;
588      problem.Penalty.Value = 1;
589      problem.Values = new IntArray(new int[] { 
590  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});
591      problem.Weights = new IntArray(new int[] { 
592 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});
593      problem.Name = "Knapsack Problem";
594      problem.Description = "Represents a Knapsack problem.";
595      #endregion
596      #region Algorithm Configuration
597      ls.Name = "Local Search - Knapsack";
598      ls.Description = "A local search algorithm that solves a randomly generated Knapsack problem";
599      ls.Problem = problem;
600      ls.MaximumIterations.Value = 1000;
601      ls.MoveEvaluator = ls.MoveEvaluatorParameter.ValidValues
602        .OfType<KnapsackOneBitflipMoveEvaluator>()
603        .Single();
604      ls.MoveGenerator = ls.MoveGeneratorParameter.ValidValues
605        .OfType<ExhaustiveOneBitflipMoveGenerator>()
606        .Single();
607      ls.MoveMaker = ls.MoveMakerParameter.ValidValues
608        .OfType<OneBitflipMoveMaker>()
609        .Single();
610      ls.SampleSize.Value = 100;
611      ls.Seed.Value = 0;
612      ls.SetSeedRandomly.Value = true;
613      #endregion
614      ls.Engine = new ParallelEngine();
615      return ls;
616    }
617    #endregion
618    #endregion
619
620    #region PSO
621    #region Schwefel
622    [TestMethod]
623    public void CreatePsoSchwefelSampleTest() {
624      var pso = CreatePsoSchwefelSample();
625      XmlGenerator.Serialize(pso, "../../PSO_Schwefel.hl");
626    }
627    [TestMethod]
628    public void RunPsoSchwefelSampleTest() {
629      var pso = CreatePsoSchwefelSample();
630      pso.SetSeedRandomly.Value = false;
631      RunAlgorithm(pso);
632      if (!Environment.Is64BitProcess) {
633        Assert.AreEqual(118.44027985932837, GetDoubleResult(pso, "BestQuality"));
634        Assert.AreEqual(140.71570105946438, GetDoubleResult(pso, "CurrentAverageQuality"));
635        Assert.AreEqual(220.956806502853, GetDoubleResult(pso, "CurrentWorstQuality"));
636        Assert.AreEqual(1000, GetIntResult(pso, "Iterations"));
637      } else {
638        Assert.AreEqual(118.43958282879345, GetDoubleResult(pso, "BestQuality"));
639        Assert.AreEqual(139.43946864779372, GetDoubleResult(pso, "CurrentAverageQuality"));
640        Assert.AreEqual(217.14654589055152, GetDoubleResult(pso, "CurrentWorstQuality"));
641        Assert.AreEqual(1000, GetIntResult(pso, "Iterations"));
642      }
643    }
644    private ParticleSwarmOptimization CreatePsoSchwefelSample() {
645      ParticleSwarmOptimization pso = new ParticleSwarmOptimization();
646      #region Problem Configuration
647      var problem = new SingleObjectiveTestFunctionProblem();
648      problem.BestKnownQuality.Value = 0.0;
649      problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 420.968746, 420.968746 });
650      problem.Bounds = new DoubleMatrix(new double[,] { { -500, 500 } });
651      problem.EvaluatorParameter.Value = new SchwefelEvaluator();
652      problem.Maximization.Value = false;
653      problem.ProblemSize.Value = 2;
654      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
655      #endregion
656      #region Algorithm Configuration
657      pso.Name = "Particle Swarm Optimization - Schwefel";
658      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)";
659      pso.Problem = problem;
660      pso.Inertia.Value = 10;
661      pso.MaxIterations.Value = 1000;
662      pso.NeighborBestAttraction.Value = 0.5;
663      pso.PersonalBestAttraction.Value = -0.01;
664      pso.SwarmSize.Value = 50;
665
666      var inertiaUpdater = pso.InertiaUpdaterParameter.ValidValues
667        .OfType<ExponentialDiscreteDoubleValueModifier>()
668        .Single();
669      inertiaUpdater.StartValueParameter.Value = new DoubleValue(10);
670      inertiaUpdater.EndValueParameter.Value = new DoubleValue(1);
671      pso.InertiaUpdater = inertiaUpdater;
672
673      pso.ParticleCreator = pso.ParticleCreatorParameter.ValidValues
674        .OfType<RealVectorParticleCreator>()
675        .Single();
676      var swarmUpdater = pso.SwarmUpdaterParameter.ValidValues
677        .OfType<RealVectorSwarmUpdater>()
678        .Single();
679      swarmUpdater.VelocityBoundsIndexParameter.ActualName = "Iterations";
680      swarmUpdater.VelocityBoundsParameter.Value = new DoubleMatrix(new double[,] { { -10, 10 } });
681      swarmUpdater.VelocityBoundsStartValueParameter.Value = new DoubleValue(10.0);
682      swarmUpdater.VelocityBoundsEndValueParameter.Value = new DoubleValue(1.0);
683      swarmUpdater.VelocityBoundsScalingOperatorParameter.Value = swarmUpdater.VelocityBoundsScalingOperatorParameter.ValidValues
684        .OfType<ExponentialDiscreteDoubleValueModifier>()
685        .Single();
686
687      pso.TopologyInitializer = null;
688      pso.TopologyUpdater = null;
689      pso.SwarmUpdater = swarmUpdater;
690      pso.Seed.Value = 0;
691      pso.SetSeedRandomly.Value = true;
692      #endregion
693      pso.Engine = new ParallelEngine();
694      return pso;
695    }
696    #endregion
697    #endregion
698
699    #region SA
700    #region Rastrigin
701    [TestMethod]
702    public void CreateSimulatedAnnealingRastriginSampleTest() {
703      var sa = CreateSimulatedAnnealingRastriginSample();
704      XmlGenerator.Serialize(sa, "../../SA_Rastrigin.hl");
705    }
706    [TestMethod]
707    public void RunSimulatedAnnealingRastriginSampleTest() {
708      var sa = CreateSimulatedAnnealingRastriginSample();
709      sa.SetSeedRandomly.Value = false;
710      RunAlgorithm(sa);
711      Assert.AreEqual(0.00014039606034543795, GetDoubleResult(sa, "BestQuality"));
712      Assert.AreEqual(5000, GetIntResult(sa, "EvaluatedMoves"));
713    }
714    private SimulatedAnnealing CreateSimulatedAnnealingRastriginSample() {
715      SimulatedAnnealing sa = new SimulatedAnnealing();
716      #region Problem Configuration
717      var problem = new SingleObjectiveTestFunctionProblem();
718      problem.BestKnownQuality.Value = 0.0;
719      problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 0, 0 });
720      problem.Bounds = new DoubleMatrix(new double[,] { { -5.12, 5.12 } });
721      problem.EvaluatorParameter.Value = new RastriginEvaluator();
722      problem.Maximization.Value = false;
723      problem.ProblemSize.Value = 2;
724      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
725      #endregion
726      #region Algorithm Configuration
727      sa.Name = "Simulated Annealing - Rastrigin";
728      sa.Description = "A simulated annealing algorithm that solves the 2-dimensional Rastrigin test function";
729      sa.Problem = problem;
730      var annealingOperator = sa.AnnealingOperatorParameter.ValidValues
731        .OfType<ExponentialDiscreteDoubleValueModifier>()
732        .Single();
733      annealingOperator.StartIndexParameter.Value = new IntValue(0);
734      sa.AnnealingOperator = annealingOperator;
735
736      sa.EndTemperature.Value = 1E-6;
737      sa.InnerIterations.Value = 50;
738      sa.MaximumIterations.Value = 100;
739      var moveEvaluator = sa.MoveEvaluatorParameter.ValidValues
740        .OfType<RastriginAdditiveMoveEvaluator>()
741        .Single();
742      moveEvaluator.A.Value = 10;
743      sa.MoveEvaluator = moveEvaluator;
744
745      var moveGenerator = sa.MoveGeneratorParameter.ValidValues
746        .OfType<StochasticNormalMultiMoveGenerator>()
747        .Single();
748      moveGenerator.SigmaParameter.Value = new DoubleValue(1);
749      sa.MoveGenerator = moveGenerator;
750
751      sa.MoveMaker = sa.MoveMakerParameter.ValidValues
752        .OfType<AdditiveMoveMaker>()
753        .Single();
754
755      sa.Seed.Value = 0;
756      sa.SetSeedRandomly.Value = true;
757      sa.StartTemperature.Value = 1;
758      #endregion
759      sa.Engine = new ParallelEngine();
760      return sa;
761    }
762    #endregion
763    #endregion
764
765    #region TS
766    #region TSP
767    [TestMethod]
768    public void CreateTabuSearchTspSampleTest() {
769      var ts = CreateTabuSearchTspSample();
770      XmlGenerator.Serialize(ts, "../../TS_TSP.hl");
771    }
772    [TestMethod]
773    public void RunTabuSearchTspSampleTest() {
774      var ts = CreateTabuSearchTspSample();
775      ts.SetSeedRandomly.Value = false;
776      RunAlgorithm(ts);
777      Assert.AreEqual(6441, GetDoubleResult(ts, "BestQuality"));
778      Assert.AreEqual(7401.666666666667, GetDoubleResult(ts, "CurrentAverageQuality"));
779      Assert.AreEqual(8418, GetDoubleResult(ts, "CurrentWorstQuality"));
780      Assert.AreEqual(750000, GetIntResult(ts, "EvaluatedMoves"));
781    }
782
783    private TabuSearch CreateTabuSearchTspSample() {
784      TabuSearch ts = new TabuSearch();
785      #region Problem Configuration
786      var provider = new TSPLIBTSPInstanceProvider();
787      var instance = provider.GetDataDescriptors().Where(x => x.Name == "ch130").Single();
788      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
789      tspProblem.Load(provider.LoadData(instance));
790      tspProblem.UseDistanceMatrix.Value = true;
791      #endregion
792      #region Algorithm Configuration
793      ts.Name = "Tabu Search - TSP";
794      ts.Description = "A tabu search algorithm that solves the \"ch130\" TSP (imported from TSPLIB)";
795      ts.Problem = tspProblem;
796
797      ts.MaximumIterations.Value = 1000;
798      // move generator has to be set first
799      var moveGenerator = ts.MoveGeneratorParameter.ValidValues
800        .OfType<StochasticInversionMultiMoveGenerator>()
801        .Single();
802      ts.MoveGenerator = moveGenerator;
803      var moveEvaluator = ts.MoveEvaluatorParameter.ValidValues
804        .OfType<TSPInversionMoveRoundedEuclideanPathEvaluator>()
805        .Single();
806      ts.MoveEvaluator = moveEvaluator;
807      var moveMaker = ts.MoveMakerParameter.ValidValues
808        .OfType<InversionMoveMaker>()
809        .Single();
810      ts.MoveMaker = moveMaker;
811      ts.SampleSize.Value = 750;
812      ts.Seed.Value = 0;
813      ts.SetSeedRandomly.Value = true;
814
815      var tabuChecker = ts.TabuCheckerParameter.ValidValues
816        .OfType<InversionMoveSoftTabuCriterion>()
817        .Single();
818      tabuChecker.UseAspirationCriterion.Value = true;
819      ts.TabuChecker = tabuChecker;
820
821      var tabuMaker = ts.TabuMakerParameter.ValidValues
822        .OfType<InversionMoveTabuMaker>()
823        .Single();
824      ts.TabuMaker = tabuMaker;
825      ts.TabuTenure.Value = 60;
826
827      #endregion
828      ts.Engine = new ParallelEngine();
829      return ts;
830    }
831    #endregion
832    #endregion
833
834    #region VNS
835    #region TSP
836    [TestMethod]
837    public void CreateVnsTspSampleTest() {
838      var vns = CreateVnsTspSample();
839      XmlGenerator.Serialize(vns, "../../VNS_TSP.hl");
840    }
841    [TestMethod]
842    public void RunVnsTspSampleTest() {
843      var vns = CreateVnsTspSample();
844      vns.SetSeedRandomly = false;
845      RunAlgorithm(vns);
846      Assert.AreEqual(867, GetDoubleResult(vns, "BestQuality"));
847      Assert.AreEqual(867, GetDoubleResult(vns, "CurrentAverageQuality"));
848      Assert.AreEqual(867, GetDoubleResult(vns, "CurrentWorstQuality"));
849      Assert.AreEqual(12975173, GetIntResult(vns, "EvaluatedSolutions"));
850    }
851
852    private VariableNeighborhoodSearch CreateVnsTspSample() {
853      VariableNeighborhoodSearch vns = new VariableNeighborhoodSearch();
854      #region Problem Configuration
855      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
856      tspProblem.BestKnownSolution = new Permutation(PermutationTypes.Absolute, new int[] {
857117, 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, 
858      });
859      tspProblem.Coordinates = new DoubleMatrix(new double[,] {
860{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}
861      });
862      tspProblem.BestKnownQuality = new DoubleValue(867);
863
864      tspProblem.EvaluatorParameter.Value = new TSPRoundedEuclideanPathEvaluator();
865      tspProblem.SolutionCreatorParameter.Value = new RandomPermutationCreator();
866      tspProblem.UseDistanceMatrix.Value = true;
867      tspProblem.Name = "Funny TSP";
868      tspProblem.Description = "Represents a symmetric Traveling Salesman Problem.";
869      #endregion
870      #region Algorithm Configuration
871      vns.Name = "Variable Neighborhood Search - TSP";
872      vns.Description = "A variable neighborhood search algorithm which solves a funny TSP instance";
873      vns.Problem = tspProblem;
874
875      var localImprovement = vns.LocalImprovementParameter.ValidValues
876        .OfType<LocalSearchImprovementOperator>()
877        .Single();
878      // move generator has to be set first
879      localImprovement.MoveGenerator = localImprovement.MoveGeneratorParameter.ValidValues
880        .OfType<StochasticInversionMultiMoveGenerator>()
881        .Single();
882      localImprovement.MoveEvaluator = localImprovement.MoveEvaluatorParameter.ValidValues
883        .OfType<TSPInversionMoveRoundedEuclideanPathEvaluator>()
884        .Single();
885      localImprovement.MoveMaker = localImprovement.MoveMakerParameter.ValidValues
886        .OfType<InversionMoveMaker>()
887        .Single();
888      localImprovement.SampleSizeParameter.Value = new IntValue(500);
889      vns.LocalImprovement = localImprovement;
890
891      vns.LocalImprovementMaximumIterations = 150;
892      vns.MaximumIterations = 25;
893      vns.Seed = 0;
894      vns.SetSeedRandomly = true;
895      var shakingOperator = vns.ShakingOperatorParameter.ValidValues
896        .OfType<PermutationShakingOperator>()
897        .Single();
898      shakingOperator.Operators.SetItemCheckedState(shakingOperator.Operators
899        .OfType<Swap2Manipulator>()
900        .Single(), false);
901      shakingOperator.Operators.SetItemCheckedState(shakingOperator.Operators
902        .OfType<Swap3Manipulator>()
903        .Single(), false);
904      vns.ShakingOperator = shakingOperator;
905      #endregion
906      vns.Engine = new ParallelEngine();
907      return vns;
908    }
909    #endregion
910    #endregion
911
912    #region Helpers
913    private void ConfigureEvolutionStrategyParameters<R, M, SC, SR, SM>(EvolutionStrategy es, int popSize, int children, int parentsPerChild, int maxGens, bool plusSelection)
914      where R : ICrossover
915      where M : IManipulator
916      where SC : IStrategyParameterCreator
917      where SR : IStrategyParameterCrossover
918      where SM : IStrategyParameterManipulator {
919      es.PopulationSize.Value = popSize;
920      es.Children.Value = children;
921      es.ParentsPerChild.Value = parentsPerChild;
922      es.MaximumGenerations.Value = maxGens;
923      es.PlusSelection.Value = false;
924
925      es.Seed.Value = 0;
926      es.SetSeedRandomly.Value = true;
927
928      es.Recombinator = es.RecombinatorParameter.ValidValues
929        .OfType<R>()
930        .Single();
931
932      es.Mutator = es.MutatorParameter.ValidValues
933        .OfType<M>()
934        .Single();
935
936      es.StrategyParameterCreator = es.StrategyParameterCreatorParameter.ValidValues
937        .OfType<SC>()
938        .Single();
939      es.StrategyParameterCrossover = es.StrategyParameterCrossoverParameter.ValidValues
940        .OfType<SR>()
941        .Single();
942      es.StrategyParameterManipulator = es.StrategyParameterManipulatorParameter.ValidValues
943        .OfType<SM>()
944        .Single();
945      es.Engine = new ParallelEngine();
946    }
947
948    private void ConfigureGeneticAlgorithmParameters<S, C, M>(GeneticAlgorithm ga, int popSize, int elites, int maxGens, double mutationRate, int tournGroupSize = 0)
949      where S : ISelector
950      where C : ICrossover
951      where M : IManipulator {
952      ga.Elites.Value = elites;
953      ga.MaximumGenerations.Value = maxGens;
954      ga.MutationProbability.Value = mutationRate;
955      ga.PopulationSize.Value = popSize;
956      ga.Seed.Value = 0;
957      ga.SetSeedRandomly.Value = true;
958      ga.Selector = ga.SelectorParameter.ValidValues
959        .OfType<S>()
960        .First();
961
962      ga.Crossover = ga.CrossoverParameter.ValidValues
963        .OfType<C>()
964        .First();
965
966      ga.Mutator = ga.MutatorParameter.ValidValues
967        .OfType<M>()
968        .First();
969
970      var tSelector = ga.Selector as TournamentSelector;
971      if (tSelector != null) {
972        tSelector.GroupSizeParameter.Value.Value = tournGroupSize;
973      }
974      ga.Engine = new ParallelEngine();
975    }
976
977    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)
978      where S : ISelector
979      where C : ICrossover
980      where M : IManipulator
981      where Mi : IMigrator
982      where MiS : ISelector
983      where MiR : IReplacer {
984      ga.Elites.Value = elites;
985      ga.MaximumGenerations.Value = maxGens;
986      ga.MutationProbability.Value = mutationRate;
987      ga.PopulationSize.Value = popSize;
988      ga.NumberOfIslands.Value = numberOfIslands;
989      ga.MigrationInterval.Value = migrationInterval;
990      ga.MigrationRate.Value = migrationRate;
991      ga.Seed.Value = 0;
992      ga.SetSeedRandomly.Value = true;
993      ga.Selector = ga.SelectorParameter.ValidValues
994        .OfType<S>()
995        .Single();
996
997      ga.Crossover = ga.CrossoverParameter.ValidValues
998        .OfType<C>()
999        .Single();
1000
1001      ga.Mutator = ga.MutatorParameter.ValidValues
1002        .OfType<M>()
1003        .Single();
1004      ga.Migrator = ga.MigratorParameter.ValidValues
1005        .OfType<Mi>()
1006        .Single();
1007      ga.EmigrantsSelector = ga.EmigrantsSelectorParameter.ValidValues
1008        .OfType<MiS>()
1009        .Single();
1010      ga.ImmigrationReplacer = ga.ImmigrationReplacerParameter.ValidValues
1011        .OfType<MiR>()
1012        .Single();
1013      ga.Engine = new ParallelEngine();
1014    }
1015
1016
1017    private void RunAlgorithm(IAlgorithm a) {
1018      var trigger = new EventWaitHandle(false, EventResetMode.ManualReset);
1019      Exception ex = null;
1020      a.Stopped += (src, e) => { trigger.Set(); };
1021      a.ExceptionOccurred += (src, e) => { ex = e.Value; trigger.Set(); };
1022      a.Prepare();
1023      a.Start();
1024      trigger.WaitOne();
1025
1026      Assert.AreEqual(ex, null);
1027    }
1028
1029    private double GetDoubleResult(IAlgorithm a, string resultName) {
1030      return ((DoubleValue)a.Results[resultName].Value).Value;
1031    }
1032    private int GetIntResult(IAlgorithm a, string resultName) {
1033      return ((IntValue)a.Results[resultName].Value).Value;
1034    }
1035    #endregion
1036  }
1037}
Note: See TracBrowser for help on using the repository browser.