Free cookie consent management tool by TermsFeed Policy Generator

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

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

#1806 improved memory usage of ChangeNodeTypeManipulation and ReplaceBranchManipulation by replacing the linq statements

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