Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.TimeSeries/HeuristicLab.Tests/HeuristicLab-3.3/SamplesTest.cs @ 7842

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

merged r7609:7840 from trunk into time series branch

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