Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 8335 was 8335, checked in by mkommend, 12 years ago

#1070: Adapted unit test to take new GP manipulator into account.

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