Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 11051 was 11051, checked in by mkommend, 10 years ago

#1638: Extracted samples unit test into separate folder, extracted utility methods and added a unit test for the multiplexer problem.

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