Free cookie consent management tool by TermsFeed Policy Generator

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

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

#1567 changed GP unit tests and reverted changeset 6r499

File size: 56.2 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      Assert.AreEqual(119.30888659302838, GetDoubleResult(pso, "BestQuality"));
648      Assert.AreEqual(140.71570105946438, GetDoubleResult(pso, "CurrentAverageQuality"));
649      Assert.AreEqual(220.956806502853, GetDoubleResult(pso, "CurrentWorstQuality"));
650      Assert.AreEqual(1000, GetIntResult(pso, "Iterations"));
651    }
652    private ParticleSwarmOptimization CreatePsoSchwefelSample() {
653      ParticleSwarmOptimization pso = new ParticleSwarmOptimization();
654      #region problem configuration
655      var problem = new SingleObjectiveTestFunctionProblem();
656      problem.BestKnownQuality.Value = 0.0;
657      problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 420.968746, 420.968746 });
658      problem.Bounds = new DoubleMatrix(new double[,] { { -500, 500 } });
659      problem.Evaluator = new SchwefelEvaluator();
660      problem.Maximization.Value = false;
661      problem.ProblemSize.Value = 2;
662      problem.SolutionCreator = new UniformRandomRealVectorCreator();
663      #endregion
664      #region algorithm configuration
665      pso.Name = "Particle Swarm Optimization - Schwefel";
666      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)";
667      pso.Problem = problem;
668      pso.Inertia.Value = 10;
669      pso.MaxIterations.Value = 1000;
670      pso.NeighborBestAttraction.Value = 0.5;
671      pso.PersonalBestAttraction.Value = -0.01;
672      pso.SwarmSize.Value = 50;
673
674      var inertiaUpdater = pso.InertiaUpdaterParameter.ValidValues
675        .OfType<ExponentialDiscreteDoubleValueModifier>()
676        .Single();
677      inertiaUpdater.StartValueParameter.Value = new DoubleValue(10);
678      inertiaUpdater.EndValueParameter.Value = new DoubleValue(1);
679      pso.InertiaUpdater = inertiaUpdater;
680
681      pso.ParticleCreator = pso.ParticleCreatorParameter.ValidValues
682        .OfType<RealVectorParticleCreator>()
683        .Single();
684      var swarmUpdater = pso.SwarmUpdaterParameter.ValidValues
685        .OfType<RealVectorSwarmUpdater>()
686        .Single();
687      swarmUpdater.VelocityBoundsIndexParameter.ActualName = "Iterations";
688      swarmUpdater.VelocityBoundsParameter.Value = new DoubleMatrix(new double[,] { { -10, 10 } });
689      swarmUpdater.VelocityBoundsStartValueParameter.Value = new DoubleValue(10.0);
690      swarmUpdater.VelocityBoundsEndValueParameter.Value = new DoubleValue(1.0);
691      swarmUpdater.VelocityBoundsScalingOperatorParameter.Value = swarmUpdater.VelocityBoundsScalingOperatorParameter.ValidValues
692        .OfType<ExponentialDiscreteDoubleValueModifier>()
693        .Single();
694
695      pso.TopologyInitializer = null;
696      pso.TopologyUpdater = null;
697      pso.SwarmUpdater = swarmUpdater;
698      pso.Seed.Value = 0;
699      pso.SetSeedRandomly.Value = true;
700
701      #endregion
702      pso.Engine = new ParallelEngine();
703      return pso;
704    }
705    #endregion
706    #endregion
707
708    #region SA
709    #region Rastrigin
710    [TestMethod]
711    public void CreateSimulatedAnnealingRastriginSampleTest() {
712      var sa = CreateSimulatedAnnealingRastriginSample();
713      XmlGenerator.Serialize(sa, "../../SA_Rastrigin.hl");
714    }
715    [TestMethod]
716    public void RunSimulatedAnnealingRastriginSampleTest() {
717      var sa = CreateSimulatedAnnealingRastriginSample();
718      sa.SetSeedRandomly.Value = false;
719      RunAlgorithm(sa);
720      Assert.AreEqual(0.00014039606034543795, GetDoubleResult(sa, "BestQuality"));
721      Assert.AreEqual(5000, GetIntResult(sa, "EvaluatedMoves"));
722    }
723    private SimulatedAnnealing CreateSimulatedAnnealingRastriginSample() {
724      SimulatedAnnealing sa = new SimulatedAnnealing();
725      #region problem configuration
726      var problem = new SingleObjectiveTestFunctionProblem();
727      problem.BestKnownQuality.Value = 0.0;
728      problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 0, 0 });
729      problem.Bounds = new DoubleMatrix(new double[,] { { -5.12, 5.12 } });
730      problem.Evaluator = new RastriginEvaluator();
731      problem.Maximization.Value = false;
732      problem.ProblemSize.Value = 2;
733      problem.SolutionCreator = new UniformRandomRealVectorCreator();
734      #endregion
735      #region algorithm configuration
736      sa.Name = "Simulated Annealing - Rastrigin";
737      sa.Description = "A simulated annealing algorithm that solves the 2-dimensional Rastrigin test function";
738      sa.Problem = problem;
739      var annealingOperator = sa.AnnealingOperatorParameter.ValidValues
740        .OfType<ExponentialDiscreteDoubleValueModifier>()
741        .Single();
742      annealingOperator.StartIndexParameter.Value = new IntValue(0);
743      sa.AnnealingOperator = annealingOperator;
744
745      sa.EndTemperature.Value = 1E-6;
746      sa.InnerIterations.Value = 50;
747      sa.MaximumIterations.Value = 100;
748      var moveEvaluator = sa.MoveEvaluatorParameter.ValidValues
749        .OfType<RastriginAdditiveMoveEvaluator>()
750        .Single();
751      moveEvaluator.A.Value = 10;
752      sa.MoveEvaluator = moveEvaluator;
753
754      var moveGenerator = sa.MoveGeneratorParameter.ValidValues
755        .OfType<StochasticNormalMultiMoveGenerator>()
756        .Single();
757      moveGenerator.SigmaParameter.Value = new DoubleValue(1);
758      sa.MoveGenerator = moveGenerator;
759
760      sa.MoveMaker = sa.MoveMakerParameter.ValidValues
761        .OfType<AdditiveMoveMaker>()
762        .Single();
763
764      sa.Seed.Value = 0;
765      sa.SetSeedRandomly.Value = true;
766      sa.StartTemperature.Value = 1;
767      #endregion
768      sa.Engine = new ParallelEngine();
769      return sa;
770    }
771    #endregion
772    #endregion
773
774    #region TS
775    #region TSP
776    [TestMethod]
777    public void CreateTabuSearchTspSampleTest() {
778      var ts = CreateTabuSearchTspSample();
779      XmlGenerator.Serialize(ts, "../../TS_TSP.hl");
780    }
781    [TestMethod]
782    public void RunTabuSearchTspSampleTest() {
783      var ts = CreateTabuSearchTspSample();
784      ts.SetSeedRandomly.Value = false;
785      RunAlgorithm(ts);
786      Assert.AreEqual(6441, GetDoubleResult(ts, "BestQuality"));
787      Assert.AreEqual(7401.666666666667, GetDoubleResult(ts, "CurrentAverageQuality"));
788      Assert.AreEqual(8418, GetDoubleResult(ts, "CurrentWorstQuality"));
789      Assert.AreEqual(750000, GetIntResult(ts, "EvaluatedMoves"));
790    }
791
792    private TabuSearch CreateTabuSearchTspSample() {
793      TabuSearch ts = new TabuSearch();
794      #region problem configuration
795      var tspProblem = new TravelingSalesmanProblem();
796      tspProblem.ImportFromTSPLIB("ch130.tsp", "ch130.opt.tour", 6110);
797      tspProblem.Evaluator = new TSPRoundedEuclideanPathEvaluator();
798      tspProblem.SolutionCreator = new RandomPermutationCreator();
799      tspProblem.UseDistanceMatrix.Value = true;
800      tspProblem.Name = "ch130 TSP (imported from TSPLIB)";
801      tspProblem.Description = "130 city problem (Churritz)";
802      #endregion
803      #region algorithm configuration
804      ts.Name = "Tabu Search - TSP";
805      ts.Description = "A tabu search algorithm that solves the \"ch130\" TSP (imported from TSPLIB)";
806      ts.Problem = tspProblem;
807
808      ts.MaximumIterations.Value = 1000;
809      // move generator has to be set first
810      var moveGenerator = ts.MoveGeneratorParameter.ValidValues
811        .OfType<StochasticInversionMultiMoveGenerator>()
812        .Single();
813      ts.MoveGenerator = moveGenerator;
814      var moveEvaluator = ts.MoveEvaluatorParameter.ValidValues
815        .OfType<TSPInversionMoveRoundedEuclideanPathEvaluator>()
816        .Single();
817      ts.MoveEvaluator = moveEvaluator;
818      var moveMaker = ts.MoveMakerParameter.ValidValues
819        .OfType<InversionMoveMaker>()
820        .Single();
821      ts.MoveMaker = moveMaker;
822      ts.SampleSize.Value = 750;
823      ts.Seed.Value = 0;
824      ts.SetSeedRandomly.Value = true;
825
826      var tabuChecker = ts.TabuCheckerParameter.ValidValues
827        .OfType<InversionMoveSoftTabuCriterion>()
828        .Single();
829      tabuChecker.UseAspirationCriterion.Value = true;
830      ts.TabuChecker = tabuChecker;
831
832      var tabuMaker = ts.TabuMakerParameter.ValidValues
833        .OfType<InversionMoveTabuMaker>()
834        .Single();
835      ts.TabuMaker = tabuMaker;
836      ts.TabuTenure.Value = 60;
837
838      ts.Analyzer.Operators.SetItemCheckedState(ts.Analyzer.Operators
839        .OfType<TSPAlleleFrequencyAnalyzer>()
840        .Single(), false);
841      ts.Analyzer.Operators.SetItemCheckedState(ts.Analyzer.Operators
842        .OfType<TSPPopulationDiversityAnalyzer>()
843        .Single(), false);
844      #endregion
845      ts.Engine = new ParallelEngine();
846      return ts;
847    }
848
849    #endregion
850    #endregion
851
852    #region VNS
853    #region TSP
854    [TestMethod]
855    public void CreateVnsTspSampleTest() {
856      var vns = CreateVnsTspSample();
857      XmlGenerator.Serialize(vns, "../../VNS_TSP.hl");
858    }
859    [TestMethod]
860    public void RunVnsTspSampleTest() {
861      var vns = CreateVnsTspSample();
862      vns.SetSeedRandomly = false;
863      RunAlgorithm(vns);
864      Assert.AreEqual(867, GetDoubleResult(vns, "BestQuality"));
865      Assert.AreEqual(867, GetDoubleResult(vns, "CurrentAverageQuality"));
866      Assert.AreEqual(867, GetDoubleResult(vns, "CurrentWorstQuality"));
867      Assert.AreEqual(12975173, GetIntResult(vns, "EvaluatedSolutions"));
868    }
869
870    private VariableNeighborhoodSearch CreateVnsTspSample() {
871      VariableNeighborhoodSearch vns = new VariableNeighborhoodSearch();
872      #region problem configuration
873      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
874      tspProblem.BestKnownSolution = new Permutation(PermutationTypes.Absolute, new int[] {
875117, 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,
876      });
877      tspProblem.Coordinates = new DoubleMatrix(new double[,] {
878{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}
879      });
880      tspProblem.BestKnownQuality = new DoubleValue(867);
881
882      tspProblem.Evaluator = new TSPRoundedEuclideanPathEvaluator();
883      tspProblem.SolutionCreator = new RandomPermutationCreator();
884      tspProblem.UseDistanceMatrix.Value = true;
885      tspProblem.Name = "Funny TSP";
886      tspProblem.Description = "Represents a symmetric Traveling Salesman Problem.";
887      #endregion
888      #region algorithm configuration
889      vns.Name = "Variable Neighborhood Search - TSP";
890      vns.Description = "A variable neighborhood search algorithm which solves a funny TSP instance";
891      vns.Problem = tspProblem;
892
893      var localImprovement = vns.LocalImprovementParameter.ValidValues
894        .OfType<LocalSearchImprovementOperator>()
895        .Single();
896      // move generator has to be set first
897      localImprovement.MoveGenerator = localImprovement.MoveGeneratorParameter.ValidValues
898        .OfType<StochasticInversionMultiMoveGenerator>()
899        .Single();
900      localImprovement.MoveEvaluator = localImprovement.MoveEvaluatorParameter.ValidValues
901        .OfType<TSPInversionMoveRoundedEuclideanPathEvaluator>()
902        .Single();
903      localImprovement.MoveMaker = localImprovement.MoveMakerParameter.ValidValues
904        .OfType<InversionMoveMaker>()
905        .Single();
906      localImprovement.SampleSizeParameter.Value = new IntValue(500);
907      vns.LocalImprovement = localImprovement;
908
909      vns.LocalImprovementMaximumIterations = 150;
910      vns.MaximumIterations = 25;
911      vns.Seed = 0;
912      vns.SetSeedRandomly = true;
913      var shakingOperator = vns.ShakingOperatorParameter.ValidValues
914        .OfType<PermutationShakingOperator>()
915        .Single();
916      shakingOperator.Operators.SetItemCheckedState(shakingOperator.Operators
917        .OfType<Swap2Manipulator>()
918        .Single(), false);
919      shakingOperator.Operators.SetItemCheckedState(shakingOperator.Operators
920        .OfType<Swap3Manipulator>()
921        .Single(), false);
922      vns.ShakingOperator = shakingOperator;
923      vns.Analyzer.Operators.SetItemCheckedState(vns.Analyzer.Operators
924        .OfType<TSPAlleleFrequencyAnalyzer>()
925        .Single(), false);
926      vns.Analyzer.Operators.SetItemCheckedState(vns.Analyzer.Operators
927        .OfType<TSPPopulationDiversityAnalyzer>()
928        .Single(), false);
929      #endregion
930      vns.Engine = new ParallelEngine();
931      return vns;
932    }
933
934    #endregion
935    #endregion
936    #region helper
937    private void ConfigureEvolutionStrategyParameters<R, M, SC, SR, SM>(EvolutionStrategy es, int popSize, int children, int parentsPerChild, int maxGens, bool plusSelection)
938      where R : ICrossover
939      where M : IManipulator
940      where SC : IStrategyParameterCreator
941      where SR : IStrategyParameterCrossover
942      where SM : IStrategyParameterManipulator {
943      es.PopulationSize.Value = popSize;
944      es.Children.Value = children;
945      es.ParentsPerChild.Value = parentsPerChild;
946      es.MaximumGenerations.Value = maxGens;
947      es.PlusSelection.Value = false;
948
949      es.Seed.Value = 0;
950      es.SetSeedRandomly.Value = true;
951
952      es.Recombinator = es.RecombinatorParameter.ValidValues
953        .OfType<R>()
954        .Single();
955
956      es.Mutator = es.MutatorParameter.ValidValues
957        .OfType<M>()
958        .Single();
959
960      es.StrategyParameterCreator = es.StrategyParameterCreatorParameter.ValidValues
961        .OfType<SC>()
962        .Single();
963      es.StrategyParameterCrossover = es.StrategyParameterCrossoverParameter.ValidValues
964        .OfType<SR>()
965        .Single();
966      es.StrategyParameterManipulator = es.StrategyParameterManipulatorParameter.ValidValues
967        .OfType<SM>()
968        .Single();
969      es.Engine = new ParallelEngine();
970    }
971
972    private void ConfigureGeneticAlgorithmParameters<S, C, M>(GeneticAlgorithm ga, int popSize, int elites, int maxGens, double mutationRate, int tournGroupSize = 0)
973      where S : ISelector
974      where C : ICrossover
975      where M : IManipulator {
976      ga.Elites.Value = elites;
977      ga.MaximumGenerations.Value = maxGens;
978      ga.MutationProbability.Value = mutationRate;
979      ga.PopulationSize.Value = popSize;
980      ga.Seed.Value = 0;
981      ga.SetSeedRandomly.Value = true;
982      ga.Selector = ga.SelectorParameter.ValidValues
983        .OfType<S>()
984        .Single();
985
986      ga.Crossover = ga.CrossoverParameter.ValidValues
987        .OfType<C>()
988        .Single();
989
990      ga.Mutator = ga.MutatorParameter.ValidValues
991        .OfType<M>()
992        .Single();
993
994      var tSelector = ga.Selector as TournamentSelector;
995      if (tSelector != null) {
996        tSelector.GroupSizeParameter.Value.Value = tournGroupSize;
997      }
998      ga.Engine = new ParallelEngine();
999    }
1000
1001    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)
1002      where S : ISelector
1003      where C : ICrossover
1004      where M : IManipulator
1005      where Mi : IMigrator
1006      where MiS : ISelector
1007      where MiR : IReplacer {
1008      ga.Elites.Value = elites;
1009      ga.MaximumGenerations.Value = maxGens;
1010      ga.MutationProbability.Value = mutationRate;
1011      ga.PopulationSize.Value = popSize;
1012      ga.NumberOfIslands.Value = numberOfIslands;
1013      ga.MigrationInterval.Value = migrationInterval;
1014      ga.MigrationRate.Value = migrationRate;
1015      ga.Seed.Value = 0;
1016      ga.SetSeedRandomly.Value = true;
1017      ga.Selector = ga.SelectorParameter.ValidValues
1018        .OfType<S>()
1019        .Single();
1020
1021      ga.Crossover = ga.CrossoverParameter.ValidValues
1022        .OfType<C>()
1023        .Single();
1024
1025      ga.Mutator = ga.MutatorParameter.ValidValues
1026        .OfType<M>()
1027        .Single();
1028      ga.Migrator = ga.MigratorParameter.ValidValues
1029        .OfType<Mi>()
1030        .Single();
1031      ga.EmigrantsSelector = ga.EmigrantsSelectorParameter.ValidValues
1032        .OfType<MiS>()
1033        .Single();
1034      ga.ImmigrationReplacer = ga.ImmigrationReplacerParameter.ValidValues
1035        .OfType<MiR>()
1036        .Single();
1037      ga.Engine = new ParallelEngine();
1038    }
1039
1040
1041    private void RunAlgorithm(IAlgorithm a) {
1042      var trigger = new EventWaitHandle(false, EventResetMode.ManualReset);
1043      Exception ex = null;
1044      a.Stopped += (src, e) => { trigger.Set(); };
1045      a.ExceptionOccurred += (src, e) => { ex = e.Value; trigger.Set(); };
1046      a.Prepare();
1047      a.Start();
1048      trigger.WaitOne();
1049
1050      Assert.AreEqual(ex, null);
1051    }
1052
1053    private double GetDoubleResult(IAlgorithm a, string resultName) {
1054      return ((DoubleValue)a.Results[resultName].Value).Value;
1055    }
1056    private int GetIntResult(IAlgorithm a, string resultName) {
1057      return ((IntValue)a.Results[resultName].Value).Value;
1058    }
1059    #endregion
1060  }
1061}
Note: See TracBrowser for help on using the repository browser.