Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 6477 was 6477, checked in by gkronber, 11 years ago

#1553: fixed result values in assertions for the unit test of the PSO_Schwefel sample.

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