Free cookie consent management tool by TermsFeed Policy Generator

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

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

#1567: added assertions for the x64 results for PSO_Schwefel sample unit test.

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