Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 8187 was 8132, checked in by gkronber, 12 years ago

#1876 added keys for signing of the LawnMower plugin. Added a unit test for the lawn mower problem.

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