Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.TimeSeries/HeuristicLab.Tests/HeuristicLab-3.3/SamplesTest.cs @ 7603

Last change on this file since 7603 was 7460, checked in by gkronber, 13 years ago

#1081: merged r7266:7459 from the trunk into the time series prognosis branch.

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