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

Last change on this file since 7442 was 7442, checked in by abeham, 10 years ago

#1770

  • removed protected modifier from Maximization.Set and BestKnownQuality.Set
  • fixed some parts that expected a default value
File size: 55.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.Knapsack;
47using HeuristicLab.Problems.TestFunctions;
48using HeuristicLab.Problems.TravelingSalesman;
49using HeuristicLab.Problems.VehicleRouting;
50using HeuristicLab.Problems.VehicleRouting.Encodings.General;
51using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
52using HeuristicLab.Selection;
53using Microsoft.VisualStudio.TestTools.UnitTesting;
54
55namespace HeuristicLab_33.Tests {
56  [TestClass]
57  [DeploymentItem(@"HeuristicLab-3.3/Resources/C101.opt.txt")]
58  [DeploymentItem(@"HeuristicLab-3.3/Resources/ch130.tsp")]
59  [DeploymentItem(@"HeuristicLab-3.3/Resources/ch130.opt.tour")]
60  [DeploymentItem(@"HeuristicLab-3.3/Resources/mammographic_masses.txt")]
61  [DeploymentItem(@"HeuristicLab-3.3/Resources/towerData.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      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
86      tspProblem.ImportFromTSPLIB("ch130.tsp", "ch130.opt.tour", 6110);
87      tspProblem.EvaluatorParameter.Value = new TSPRoundedEuclideanPathEvaluator();
88      tspProblem.SolutionCreatorParameter.Value = new RandomPermutationCreator();
89      tspProblem.UseDistanceMatrix.Value = true;
90      tspProblem.Name = "ch130 TSP (imported from TSPLIB)";
91      tspProblem.Description = "130 city problem (Churritz)";
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.9368669428336, GetDoubleResult(ga, "BestQuality"));
123      Assert.AreEqual(1831.5504074358635, GetDoubleResult(ga, "CurrentAverageQuality"));
124      Assert.AreEqual(1895.8980772167054, 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      vrpProblem.ImportFromSolomon("C101.txt");
134      vrpProblem.ImportSolution("C101.opt.txt");
135      vrpProblem.Name = "C101 VRP (imported from Solomon)";
136      vrpProblem.Description = "Represents a Vehicle Routing Problem.";
137      vrpProblem.DistanceFactorParameter.Value.Value = 1;
138      vrpProblem.FleetUsageFactorParameter.Value.Value = 100;
139      vrpProblem.OverloadPenaltyParameter.Value.Value = 100;
140      vrpProblem.TardinessPenaltyParameter.Value.Value = 100;
141      vrpProblem.TimeFactorParameter.Value.Value = 0;
142      vrpProblem.EvaluatorParameter.Value = new VRPEvaluator();
143      vrpProblem.MaximizationParameter.Value.Value = false;
144      vrpProblem.SolutionCreatorParameter.Value = new RandomCreator();
145      vrpProblem.UseDistanceMatrix.Value = true;
146      vrpProblem.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(63, GetDoubleResult(ga, "BestQuality"));
193      Assert.AreEqual(47.26, 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.82932035115203739, GetDoubleResult(ga, "BestQuality"));
244      Assert.AreEqual(0.53850226351927422, GetDoubleResult(ga, "CurrentAverageQuality"));
245      Assert.AreEqual(0, GetDoubleResult(ga, "CurrentWorstQuality"));
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      var towerProblemData = RegressionProblemData.ImportFromFile("towerData.txt");
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.13941049901558636, GetDoubleResult(ga, "BestQuality"));
347      Assert.AreEqual(5.7121443289014842, GetDoubleResult(ga, "CurrentAverageQuality"));
348      Assert.AreEqual(102.59400156249991, GetDoubleResult(ga, "CurrentWorstQuality"));
349      Assert.AreEqual(100900, GetIntResult(ga, "EvaluatedSolutions"));
350    }
351
352    private GeneticAlgorithm CreateGpSymbolicClassificationSample() {
353      GeneticAlgorithm ga = new GeneticAlgorithm();
354      #region Problem Configuration
355      SymbolicClassificationSingleObjectiveProblem symbClassProblem = new SymbolicClassificationSingleObjectiveProblem();
356      symbClassProblem.Name = "Mammography Classification Problem";
357      symbClassProblem.Description = "Mammography dataset imported from the UCI machine learning repository (http://archive.ics.uci.edu/ml/datasets/Mammographic+Mass)";
358      var mammoData = ClassificationProblemData.ImportFromFile("mammographic_masses.txt");
359      mammoData.TargetVariableParameter.Value = mammoData.TargetVariableParameter.ValidValues
360        .First(v => v.Value == "Severity");
361      mammoData.InputVariables.SetItemCheckedState(
362        mammoData.InputVariables.Single(x => x.Value == "BI-RADS"), false);
363      mammoData.InputVariables.SetItemCheckedState(
364        mammoData.InputVariables.Single(x => x.Value == "Age"), true);
365      mammoData.InputVariables.SetItemCheckedState(
366        mammoData.InputVariables.Single(x => x.Value == "Shape"), true);
367      mammoData.InputVariables.SetItemCheckedState(
368        mammoData.InputVariables.Single(x => x.Value == "Margin"), true);
369      mammoData.InputVariables.SetItemCheckedState(
370        mammoData.InputVariables.Single(x => x.Value == "Density"), true);
371      mammoData.InputVariables.SetItemCheckedState(
372        mammoData.InputVariables.Single(x => x.Value == "Severity"), false);
373      mammoData.TrainingPartition.Start = 0;
374      mammoData.TrainingPartition.End = 800;
375      mammoData.TestPartition.Start = 800;
376      mammoData.TestPartition.End = 961;
377      mammoData.Name = "Data imported from mammographic_masses.csv";
378      mammoData.Description = "Original dataset: http://archive.ics.uci.edu/ml/datasets/Mammographic+Mass, missing values have been replaced with median values.";
379      symbClassProblem.ProblemData = mammoData;
380
381      // configure grammar
382      var grammar = new TypeCoherentExpressionGrammar();
383      grammar.ConfigureAsDefaultClassificationGrammar();
384      grammar.Symbols.OfType<VariableCondition>().Single().Enabled = false;
385      var varSymbol = grammar.Symbols.OfType<Variable>().Where(x => !(x is LaggedVariable)).Single();
386      varSymbol.WeightMu = 1.0;
387      varSymbol.WeightSigma = 1.0;
388      varSymbol.WeightManipulatorMu = 0.0;
389      varSymbol.WeightManipulatorSigma = 0.05;
390      varSymbol.MultiplicativeWeightManipulatorSigma = 0.03;
391      var constSymbol = grammar.Symbols.OfType<Constant>().Single();
392      constSymbol.MaxValue = 20;
393      constSymbol.MinValue = -20;
394      constSymbol.ManipulatorMu = 0.0;
395      constSymbol.ManipulatorSigma = 1;
396      constSymbol.MultiplicativeManipulatorSigma = 0.03;
397      symbClassProblem.SymbolicExpressionTreeGrammar = grammar;
398
399      // configure remaining problem parameters
400      symbClassProblem.BestKnownQuality.Value = 0.0;
401      symbClassProblem.FitnessCalculationPartition.Start = 0;
402      symbClassProblem.FitnessCalculationPartition.End = 400;
403      symbClassProblem.ValidationPartition.Start = 400;
404      symbClassProblem.ValidationPartition.End = 800;
405      symbClassProblem.RelativeNumberOfEvaluatedSamples.Value = 1;
406      symbClassProblem.MaximumSymbolicExpressionTreeLength.Value = 100;
407      symbClassProblem.MaximumSymbolicExpressionTreeDepth.Value = 10;
408      symbClassProblem.MaximumFunctionDefinitions.Value = 0;
409      symbClassProblem.MaximumFunctionArguments.Value = 0;
410      symbClassProblem.EvaluatorParameter.Value = new SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator();
411      #endregion
412      #region Algorithm Configuration
413      ga.Problem = symbClassProblem;
414      ga.Name = "Genetic Programming - Symbolic Classification";
415      ga.Description = "A standard genetic programming algorithm to solve a classification problem (Mammographic+Mass dataset)";
416      ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(
417        ga, 1000, 1, 100, 0.15, 5
418        );
419
420      var mutator = (MultiSymbolicExpressionTreeManipulator)ga.Mutator;
421      mutator.Operators.OfType<FullTreeShaker>().Single().ShakingFactor = 0.1;
422      mutator.Operators.OfType<OnePointShaker>().Single().ShakingFactor = 1.0;
423
424      ga.Analyzer.Operators.SetItemCheckedState(
425        ga.Analyzer.Operators
426        .OfType<SymbolicClassificationSingleObjectiveOverfittingAnalyzer>()
427        .Single(), false);
428      ga.Analyzer.Operators.SetItemCheckedState(
429        ga.Analyzer.Operators
430        .OfType<SymbolicDataAnalysisAlleleFrequencyAnalyzer>()
431        .First(), false);
432      #endregion
433      return ga;
434    }
435    #endregion
436    #endregion
437
438    #region ES
439    #region Griewank
440    [TestMethod]
441    public void CreateEsGriewankSampleTest() {
442      var es = CreateEsGriewankSample();
443      XmlGenerator.Serialize(es, "../../ES_Griewank.hl");
444    }
445    [TestMethod]
446    public void RunEsGriewankSampleTest() {
447      var es = CreateEsGriewankSample();
448      es.SetSeedRandomly.Value = false;
449      RunAlgorithm(es);
450      Assert.AreEqual(0, GetDoubleResult(es, "BestQuality"));
451      Assert.AreEqual(0, GetDoubleResult(es, "CurrentAverageQuality"));
452      Assert.AreEqual(0, GetDoubleResult(es, "CurrentWorstQuality"));
453      Assert.AreEqual(100020, GetIntResult(es, "EvaluatedSolutions"));
454    }
455
456    private EvolutionStrategy CreateEsGriewankSample() {
457      EvolutionStrategy es = new EvolutionStrategy();
458      #region Problem Configuration
459      SingleObjectiveTestFunctionProblem problem = new SingleObjectiveTestFunctionProblem();
460
461      problem.ProblemSize.Value = 10;
462      problem.EvaluatorParameter.Value = new GriewankEvaluator();
463      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
464      problem.Maximization.Value = false;
465      problem.Bounds = new DoubleMatrix(new double[,] { { -600, 600 } });
466      problem.BestKnownQuality.Value = 0;
467      problem.BestKnownSolutionParameter.Value = new RealVector(10);
468      problem.Name = "Single Objective Test Function";
469      problem.Description = "Test function with real valued inputs and a single objective.";
470      #endregion
471      #region Algorithm Configuration
472      es.Name = "Evolution Strategy - Griewank";
473      es.Description = "An evolution strategy which solves the 10-dimensional Griewank test function";
474      es.Problem = problem;
475      ConfigureEvolutionStrategyParameters<AverageCrossover, NormalAllPositionsManipulator,
476        StdDevStrategyVectorCreator, StdDevStrategyVectorCrossover, StdDevStrategyVectorManipulator>(
477        es, 20, 500, 2, 200, false);
478
479      StdDevStrategyVectorCreator strategyCreator = (StdDevStrategyVectorCreator)es.StrategyParameterCreator;
480      strategyCreator.BoundsParameter.Value = new DoubleMatrix(new double[,] { { 1, 20 } });
481
482      StdDevStrategyVectorManipulator strategyManipulator = (StdDevStrategyVectorManipulator)es.StrategyParameterManipulator;
483      strategyManipulator.BoundsParameter.Value = new DoubleMatrix(new double[,] { { 1E-12, 30 } });
484      strategyManipulator.GeneralLearningRateParameter.Value = new DoubleValue(0.22360679774997896);
485      strategyManipulator.LearningRateParameter.Value = new DoubleValue(0.39763536438352531);
486      #endregion
487      return es;
488    }
489    #endregion
490    #endregion
491
492    #region Island GA
493    #region TSP
494    [TestMethod]
495    public void CreateIslandGaTspSampleTest() {
496      var ga = CreateIslandGaTspSample();
497      XmlGenerator.Serialize(ga, "../../IslandGA_TSP.hl");
498    }
499    [TestMethod]
500    public void RunIslandGaTspSampleTest() {
501      var ga = CreateIslandGaTspSample();
502      ga.SetSeedRandomly.Value = false;
503      RunAlgorithm(ga);
504      Assert.AreEqual(9918, GetDoubleResult(ga, "BestQuality"));
505      Assert.AreEqual(10324.64, GetDoubleResult(ga, "CurrentAverageQuality"));
506      Assert.AreEqual(11823, GetDoubleResult(ga, "CurrentWorstQuality"));
507      Assert.AreEqual(495500, GetIntResult(ga, "EvaluatedSolutions"));
508    }
509
510    private IslandGeneticAlgorithm CreateIslandGaTspSample() {
511      IslandGeneticAlgorithm ga = new IslandGeneticAlgorithm();
512      #region Problem Configuration
513      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
514      tspProblem.ImportFromTSPLIB("ch130.tsp", "ch130.opt.tour", 6110);
515      tspProblem.EvaluatorParameter.Value = new TSPRoundedEuclideanPathEvaluator();
516      tspProblem.SolutionCreatorParameter.Value = new RandomPermutationCreator();
517      tspProblem.UseDistanceMatrix.Value = true;
518      tspProblem.Name = "ch130 TSP (imported from TSPLIB)";
519      tspProblem.Description = "130 city problem (Churritz)";
520      #endregion
521      #region Algorithm Configuration
522      ga.Name = "Island Genetic Algorithm - TSP";
523      ga.Description = "An island genetic algorithm which solves the \"ch130\" traveling salesman problem (imported from TSPLIB)";
524      ga.Problem = tspProblem;
525      ConfigureIslandGeneticAlgorithmParameters<ProportionalSelector, OrderCrossover2, InversionManipulator,
526        UnidirectionalRingMigrator, BestSelector, WorstReplacer>(
527        ga, 100, 1, 1000, 0.05, 5, 50, 0.25);
528
529      ga.Analyzer.Operators.SetItemCheckedState(ga.Analyzer.Operators
530        .OfType<TSPAlleleFrequencyAnalyzer>()
531        .Single(), false);
532      ga.Analyzer.Operators.SetItemCheckedState(ga.Analyzer.Operators
533        .OfType<TSPPopulationDiversityAnalyzer>()
534        .Single(), false);
535      #endregion
536      return ga;
537    }
538    #endregion
539    #endregion
540
541    #region LS
542    #region Knapsack
543    [TestMethod]
544    public void CreateLocalSearchKnapsackSampleTest() {
545      var ls = CreateLocalSearchKnapsackSample();
546      XmlGenerator.Serialize(ls, "../../LS_Knapsack.hl");
547    }
548    [TestMethod]
549    public void RunLocalSearchKnapsackSampleTest() {
550      var ls = CreateLocalSearchKnapsackSample();
551      ls.SetSeedRandomly.Value = false;
552      RunAlgorithm(ls);
553      Assert.AreEqual(345, GetDoubleResult(ls, "BestQuality"));
554      Assert.AreEqual(340.70731707317071, GetDoubleResult(ls, "CurrentAverageQuality"));
555      Assert.AreEqual(337, GetDoubleResult(ls, "CurrentWorstQuality"));
556      Assert.AreEqual(82000, GetIntResult(ls, "EvaluatedMoves"));
557    }
558
559    private LocalSearch CreateLocalSearchKnapsackSample() {
560      LocalSearch ls = new LocalSearch();
561      #region Problem Configuration
562      KnapsackProblem problem = new KnapsackProblem();
563      problem.BestKnownQuality = new DoubleValue(362);
564      problem.BestKnownSolution = new HeuristicLab.Encodings.BinaryVectorEncoding.BinaryVector(new bool[] {
565       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});
566      problem.EvaluatorParameter.Value = new KnapsackEvaluator();
567      problem.SolutionCreatorParameter.Value = new RandomBinaryVectorCreator();
568      problem.KnapsackCapacity.Value = 297;
569      problem.Maximization.Value = true;
570      problem.Penalty.Value = 1;
571      problem.Values = new IntArray(new int[] {
572  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});
573      problem.Weights = new IntArray(new int[] {
574 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});
575      problem.Name = "Knapsack Problem";
576      problem.Description = "Represents a Knapsack problem.";
577      #endregion
578      #region Algorithm Configuration
579      ls.Name = "Local Search - Knapsack";
580      ls.Description = "A local search algorithm that solves a randomly generated Knapsack problem";
581      ls.Problem = problem;
582      ls.MaximumIterations.Value = 1000;
583      ls.MoveEvaluator = ls.MoveEvaluatorParameter.ValidValues
584        .OfType<KnapsackOneBitflipMoveEvaluator>()
585        .Single();
586      ls.MoveGenerator = ls.MoveGeneratorParameter.ValidValues
587        .OfType<ExhaustiveOneBitflipMoveGenerator>()
588        .Single();
589      ls.MoveMaker = ls.MoveMakerParameter.ValidValues
590        .OfType<OneBitflipMoveMaker>()
591        .Single();
592      ls.SampleSize.Value = 100;
593      ls.Seed.Value = 0;
594      ls.SetSeedRandomly.Value = true;
595      #endregion
596      ls.Engine = new ParallelEngine();
597      return ls;
598    }
599    #endregion
600    #endregion
601
602    #region PSO
603    #region Schwefel
604    [TestMethod]
605    public void CreatePsoSchwefelSampleTest() {
606      var pso = CreatePsoSchwefelSample();
607      XmlGenerator.Serialize(pso, "../../PSO_Schwefel.hl");
608    }
609    [TestMethod]
610    public void RunPsoSchwefelSampleTest() {
611      var pso = CreatePsoSchwefelSample();
612      pso.SetSeedRandomly.Value = false;
613      RunAlgorithm(pso);
614      if (!Environment.Is64BitProcess) {
615        Assert.AreEqual(118.44027985932837, GetDoubleResult(pso, "BestQuality"));
616        Assert.AreEqual(140.71570105946438, GetDoubleResult(pso, "CurrentAverageQuality"));
617        Assert.AreEqual(220.956806502853, GetDoubleResult(pso, "CurrentWorstQuality"));
618        Assert.AreEqual(1000, GetIntResult(pso, "Iterations"));
619      } else {
620        Assert.AreEqual(118.43958282879345, GetDoubleResult(pso, "BestQuality"));
621        Assert.AreEqual(139.43946864779372, GetDoubleResult(pso, "CurrentAverageQuality"));
622        Assert.AreEqual(217.14654589055152, GetDoubleResult(pso, "CurrentWorstQuality"));
623        Assert.AreEqual(1000, GetIntResult(pso, "Iterations"));
624      }
625    }
626    private ParticleSwarmOptimization CreatePsoSchwefelSample() {
627      ParticleSwarmOptimization pso = new ParticleSwarmOptimization();
628      #region Problem Configuration
629      var problem = new SingleObjectiveTestFunctionProblem();
630      problem.BestKnownQuality.Value = 0.0;
631      problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 420.968746, 420.968746 });
632      problem.Bounds = new DoubleMatrix(new double[,] { { -500, 500 } });
633      problem.EvaluatorParameter.Value = new SchwefelEvaluator();
634      problem.Maximization.Value = false;
635      problem.ProblemSize.Value = 2;
636      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
637      #endregion
638      #region Algorithm Configuration
639      pso.Name = "Particle Swarm Optimization - Schwefel";
640      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)";
641      pso.Problem = problem;
642      pso.Inertia.Value = 10;
643      pso.MaxIterations.Value = 1000;
644      pso.NeighborBestAttraction.Value = 0.5;
645      pso.PersonalBestAttraction.Value = -0.01;
646      pso.SwarmSize.Value = 50;
647
648      var inertiaUpdater = pso.InertiaUpdaterParameter.ValidValues
649        .OfType<ExponentialDiscreteDoubleValueModifier>()
650        .Single();
651      inertiaUpdater.StartValueParameter.Value = new DoubleValue(10);
652      inertiaUpdater.EndValueParameter.Value = new DoubleValue(1);
653      pso.InertiaUpdater = inertiaUpdater;
654
655      pso.ParticleCreator = pso.ParticleCreatorParameter.ValidValues
656        .OfType<RealVectorParticleCreator>()
657        .Single();
658      var swarmUpdater = pso.SwarmUpdaterParameter.ValidValues
659        .OfType<RealVectorSwarmUpdater>()
660        .Single();
661      swarmUpdater.VelocityBoundsIndexParameter.ActualName = "Iterations";
662      swarmUpdater.VelocityBoundsParameter.Value = new DoubleMatrix(new double[,] { { -10, 10 } });
663      swarmUpdater.VelocityBoundsStartValueParameter.Value = new DoubleValue(10.0);
664      swarmUpdater.VelocityBoundsEndValueParameter.Value = new DoubleValue(1.0);
665      swarmUpdater.VelocityBoundsScalingOperatorParameter.Value = swarmUpdater.VelocityBoundsScalingOperatorParameter.ValidValues
666        .OfType<ExponentialDiscreteDoubleValueModifier>()
667        .Single();
668
669      pso.TopologyInitializer = null;
670      pso.TopologyUpdater = null;
671      pso.SwarmUpdater = swarmUpdater;
672      pso.Seed.Value = 0;
673      pso.SetSeedRandomly.Value = true;
674      #endregion
675      pso.Engine = new ParallelEngine();
676      return pso;
677    }
678    #endregion
679    #endregion
680
681    #region SA
682    #region Rastrigin
683    [TestMethod]
684    public void CreateSimulatedAnnealingRastriginSampleTest() {
685      var sa = CreateSimulatedAnnealingRastriginSample();
686      XmlGenerator.Serialize(sa, "../../SA_Rastrigin.hl");
687    }
688    [TestMethod]
689    public void RunSimulatedAnnealingRastriginSampleTest() {
690      var sa = CreateSimulatedAnnealingRastriginSample();
691      sa.SetSeedRandomly.Value = false;
692      RunAlgorithm(sa);
693      Assert.AreEqual(0.00014039606034543795, GetDoubleResult(sa, "BestQuality"));
694      Assert.AreEqual(5000, GetIntResult(sa, "EvaluatedMoves"));
695    }
696    private SimulatedAnnealing CreateSimulatedAnnealingRastriginSample() {
697      SimulatedAnnealing sa = new SimulatedAnnealing();
698      #region Problem Configuration
699      var problem = new SingleObjectiveTestFunctionProblem();
700      problem.BestKnownQuality.Value = 0.0;
701      problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 0, 0 });
702      problem.Bounds = new DoubleMatrix(new double[,] { { -5.12, 5.12 } });
703      problem.EvaluatorParameter.Value = new RastriginEvaluator();
704      problem.Maximization.Value = false;
705      problem.ProblemSize.Value = 2;
706      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
707      #endregion
708      #region Algorithm Configuration
709      sa.Name = "Simulated Annealing - Rastrigin";
710      sa.Description = "A simulated annealing algorithm that solves the 2-dimensional Rastrigin test function";
711      sa.Problem = problem;
712      var annealingOperator = sa.AnnealingOperatorParameter.ValidValues
713        .OfType<ExponentialDiscreteDoubleValueModifier>()
714        .Single();
715      annealingOperator.StartIndexParameter.Value = new IntValue(0);
716      sa.AnnealingOperator = annealingOperator;
717
718      sa.EndTemperature.Value = 1E-6;
719      sa.InnerIterations.Value = 50;
720      sa.MaximumIterations.Value = 100;
721      var moveEvaluator = sa.MoveEvaluatorParameter.ValidValues
722        .OfType<RastriginAdditiveMoveEvaluator>()
723        .Single();
724      moveEvaluator.A.Value = 10;
725      sa.MoveEvaluator = moveEvaluator;
726
727      var moveGenerator = sa.MoveGeneratorParameter.ValidValues
728        .OfType<StochasticNormalMultiMoveGenerator>()
729        .Single();
730      moveGenerator.SigmaParameter.Value = new DoubleValue(1);
731      sa.MoveGenerator = moveGenerator;
732
733      sa.MoveMaker = sa.MoveMakerParameter.ValidValues
734        .OfType<AdditiveMoveMaker>()
735        .Single();
736
737      sa.Seed.Value = 0;
738      sa.SetSeedRandomly.Value = true;
739      sa.StartTemperature.Value = 1;
740      #endregion
741      sa.Engine = new ParallelEngine();
742      return sa;
743    }
744    #endregion
745    #endregion
746
747    #region TS
748    #region TSP
749    [TestMethod]
750    public void CreateTabuSearchTspSampleTest() {
751      var ts = CreateTabuSearchTspSample();
752      XmlGenerator.Serialize(ts, "../../TS_TSP.hl");
753    }
754    [TestMethod]
755    public void RunTabuSearchTspSampleTest() {
756      var ts = CreateTabuSearchTspSample();
757      ts.SetSeedRandomly.Value = false;
758      RunAlgorithm(ts);
759      Assert.AreEqual(6441, GetDoubleResult(ts, "BestQuality"));
760      Assert.AreEqual(7401.666666666667, GetDoubleResult(ts, "CurrentAverageQuality"));
761      Assert.AreEqual(8418, GetDoubleResult(ts, "CurrentWorstQuality"));
762      Assert.AreEqual(750000, GetIntResult(ts, "EvaluatedMoves"));
763    }
764
765    private TabuSearch CreateTabuSearchTspSample() {
766      TabuSearch ts = new TabuSearch();
767      #region Problem Configuration
768      var tspProblem = new TravelingSalesmanProblem();
769      tspProblem.ImportFromTSPLIB("ch130.tsp", "ch130.opt.tour", 6110);
770      tspProblem.EvaluatorParameter.Value = new TSPRoundedEuclideanPathEvaluator();
771      tspProblem.SolutionCreatorParameter.Value = new RandomPermutationCreator();
772      tspProblem.UseDistanceMatrix.Value = true;
773      tspProblem.Name = "ch130 TSP (imported from TSPLIB)";
774      tspProblem.Description = "130 city problem (Churritz)";
775      #endregion
776      #region Algorithm Configuration
777      ts.Name = "Tabu Search - TSP";
778      ts.Description = "A tabu search algorithm that solves the \"ch130\" TSP (imported from TSPLIB)";
779      ts.Problem = tspProblem;
780
781      ts.MaximumIterations.Value = 1000;
782      // move generator has to be set first
783      var moveGenerator = ts.MoveGeneratorParameter.ValidValues
784        .OfType<StochasticInversionMultiMoveGenerator>()
785        .Single();
786      ts.MoveGenerator = moveGenerator;
787      var moveEvaluator = ts.MoveEvaluatorParameter.ValidValues
788        .OfType<TSPInversionMoveRoundedEuclideanPathEvaluator>()
789        .Single();
790      ts.MoveEvaluator = moveEvaluator;
791      var moveMaker = ts.MoveMakerParameter.ValidValues
792        .OfType<InversionMoveMaker>()
793        .Single();
794      ts.MoveMaker = moveMaker;
795      ts.SampleSize.Value = 750;
796      ts.Seed.Value = 0;
797      ts.SetSeedRandomly.Value = true;
798
799      var tabuChecker = ts.TabuCheckerParameter.ValidValues
800        .OfType<InversionMoveSoftTabuCriterion>()
801        .Single();
802      tabuChecker.UseAspirationCriterion.Value = true;
803      ts.TabuChecker = tabuChecker;
804
805      var tabuMaker = ts.TabuMakerParameter.ValidValues
806        .OfType<InversionMoveTabuMaker>()
807        .Single();
808      ts.TabuMaker = tabuMaker;
809      ts.TabuTenure.Value = 60;
810
811      ts.Analyzer.Operators.SetItemCheckedState(ts.Analyzer.Operators
812        .OfType<TSPAlleleFrequencyAnalyzer>()
813        .Single(), false);
814      ts.Analyzer.Operators.SetItemCheckedState(ts.Analyzer.Operators
815        .OfType<TSPPopulationDiversityAnalyzer>()
816        .Single(), false);
817      #endregion
818      ts.Engine = new ParallelEngine();
819      return ts;
820    }
821    #endregion
822    #endregion
823
824    #region VNS
825    #region TSP
826    [TestMethod]
827    public void CreateVnsTspSampleTest() {
828      var vns = CreateVnsTspSample();
829      XmlGenerator.Serialize(vns, "../../VNS_TSP.hl");
830    }
831    [TestMethod]
832    public void RunVnsTspSampleTest() {
833      var vns = CreateVnsTspSample();
834      vns.SetSeedRandomly = false;
835      RunAlgorithm(vns);
836      Assert.AreEqual(867, GetDoubleResult(vns, "BestQuality"));
837      Assert.AreEqual(867, GetDoubleResult(vns, "CurrentAverageQuality"));
838      Assert.AreEqual(867, GetDoubleResult(vns, "CurrentWorstQuality"));
839      Assert.AreEqual(12975173, GetIntResult(vns, "EvaluatedSolutions"));
840    }
841
842    private VariableNeighborhoodSearch CreateVnsTspSample() {
843      VariableNeighborhoodSearch vns = new VariableNeighborhoodSearch();
844      #region Problem Configuration
845      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
846      tspProblem.BestKnownSolution = new Permutation(PermutationTypes.Absolute, new int[] {
847117, 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,
848      });
849      tspProblem.Coordinates = new DoubleMatrix(new double[,] {
850{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}
851      });
852      tspProblem.BestKnownQuality = new DoubleValue(867);
853
854      tspProblem.EvaluatorParameter.Value = new TSPRoundedEuclideanPathEvaluator();
855      tspProblem.SolutionCreatorParameter.Value = new RandomPermutationCreator();
856      tspProblem.UseDistanceMatrix.Value = true;
857      tspProblem.Name = "Funny TSP";
858      tspProblem.Description = "Represents a symmetric Traveling Salesman Problem.";
859      #endregion
860      #region Algorithm Configuration
861      vns.Name = "Variable Neighborhood Search - TSP";
862      vns.Description = "A variable neighborhood search algorithm which solves a funny TSP instance";
863      vns.Problem = tspProblem;
864
865      var localImprovement = vns.LocalImprovementParameter.ValidValues
866        .OfType<LocalSearchImprovementOperator>()
867        .Single();
868      // move generator has to be set first
869      localImprovement.MoveGenerator = localImprovement.MoveGeneratorParameter.ValidValues
870        .OfType<StochasticInversionMultiMoveGenerator>()
871        .Single();
872      localImprovement.MoveEvaluator = localImprovement.MoveEvaluatorParameter.ValidValues
873        .OfType<TSPInversionMoveRoundedEuclideanPathEvaluator>()
874        .Single();
875      localImprovement.MoveMaker = localImprovement.MoveMakerParameter.ValidValues
876        .OfType<InversionMoveMaker>()
877        .Single();
878      localImprovement.SampleSizeParameter.Value = new IntValue(500);
879      vns.LocalImprovement = localImprovement;
880
881      vns.LocalImprovementMaximumIterations = 150;
882      vns.MaximumIterations = 25;
883      vns.Seed = 0;
884      vns.SetSeedRandomly = true;
885      var shakingOperator = vns.ShakingOperatorParameter.ValidValues
886        .OfType<PermutationShakingOperator>()
887        .Single();
888      shakingOperator.Operators.SetItemCheckedState(shakingOperator.Operators
889        .OfType<Swap2Manipulator>()
890        .Single(), false);
891      shakingOperator.Operators.SetItemCheckedState(shakingOperator.Operators
892        .OfType<Swap3Manipulator>()
893        .Single(), false);
894      vns.ShakingOperator = shakingOperator;
895      vns.Analyzer.Operators.SetItemCheckedState(vns.Analyzer.Operators
896        .OfType<TSPAlleleFrequencyAnalyzer>()
897        .Single(), false);
898      vns.Analyzer.Operators.SetItemCheckedState(vns.Analyzer.Operators
899        .OfType<TSPPopulationDiversityAnalyzer>()
900        .Single(), false);
901      #endregion
902      vns.Engine = new ParallelEngine();
903      return vns;
904    }
905    #endregion
906    #endregion
907
908    #region Helpers
909    private void ConfigureEvolutionStrategyParameters<R, M, SC, SR, SM>(EvolutionStrategy es, int popSize, int children, int parentsPerChild, int maxGens, bool plusSelection)
910      where R : ICrossover
911      where M : IManipulator
912      where SC : IStrategyParameterCreator
913      where SR : IStrategyParameterCrossover
914      where SM : IStrategyParameterManipulator {
915      es.PopulationSize.Value = popSize;
916      es.Children.Value = children;
917      es.ParentsPerChild.Value = parentsPerChild;
918      es.MaximumGenerations.Value = maxGens;
919      es.PlusSelection.Value = false;
920
921      es.Seed.Value = 0;
922      es.SetSeedRandomly.Value = true;
923
924      es.Recombinator = es.RecombinatorParameter.ValidValues
925        .OfType<R>()
926        .Single();
927
928      es.Mutator = es.MutatorParameter.ValidValues
929        .OfType<M>()
930        .Single();
931
932      es.StrategyParameterCreator = es.StrategyParameterCreatorParameter.ValidValues
933        .OfType<SC>()
934        .Single();
935      es.StrategyParameterCrossover = es.StrategyParameterCrossoverParameter.ValidValues
936        .OfType<SR>()
937        .Single();
938      es.StrategyParameterManipulator = es.StrategyParameterManipulatorParameter.ValidValues
939        .OfType<SM>()
940        .Single();
941      es.Engine = new ParallelEngine();
942    }
943
944    private void ConfigureGeneticAlgorithmParameters<S, C, M>(GeneticAlgorithm ga, int popSize, int elites, int maxGens, double mutationRate, int tournGroupSize = 0)
945      where S : ISelector
946      where C : ICrossover
947      where M : IManipulator {
948      ga.Elites.Value = elites;
949      ga.MaximumGenerations.Value = maxGens;
950      ga.MutationProbability.Value = mutationRate;
951      ga.PopulationSize.Value = popSize;
952      ga.Seed.Value = 0;
953      ga.SetSeedRandomly.Value = true;
954      ga.Selector = ga.SelectorParameter.ValidValues
955        .OfType<S>()
956        .Single();
957
958      ga.Crossover = ga.CrossoverParameter.ValidValues
959        .OfType<C>()
960        .Single();
961
962      ga.Mutator = ga.MutatorParameter.ValidValues
963        .OfType<M>()
964        .Single();
965
966      var tSelector = ga.Selector as TournamentSelector;
967      if (tSelector != null) {
968        tSelector.GroupSizeParameter.Value.Value = tournGroupSize;
969      }
970      ga.Engine = new ParallelEngine();
971    }
972
973    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)
974      where S : ISelector
975      where C : ICrossover
976      where M : IManipulator
977      where Mi : IMigrator
978      where MiS : ISelector
979      where MiR : IReplacer {
980      ga.Elites.Value = elites;
981      ga.MaximumGenerations.Value = maxGens;
982      ga.MutationProbability.Value = mutationRate;
983      ga.PopulationSize.Value = popSize;
984      ga.NumberOfIslands.Value = numberOfIslands;
985      ga.MigrationInterval.Value = migrationInterval;
986      ga.MigrationRate.Value = migrationRate;
987      ga.Seed.Value = 0;
988      ga.SetSeedRandomly.Value = true;
989      ga.Selector = ga.SelectorParameter.ValidValues
990        .OfType<S>()
991        .Single();
992
993      ga.Crossover = ga.CrossoverParameter.ValidValues
994        .OfType<C>()
995        .Single();
996
997      ga.Mutator = ga.MutatorParameter.ValidValues
998        .OfType<M>()
999        .Single();
1000      ga.Migrator = ga.MigratorParameter.ValidValues
1001        .OfType<Mi>()
1002        .Single();
1003      ga.EmigrantsSelector = ga.EmigrantsSelectorParameter.ValidValues
1004        .OfType<MiS>()
1005        .Single();
1006      ga.ImmigrationReplacer = ga.ImmigrationReplacerParameter.ValidValues
1007        .OfType<MiR>()
1008        .Single();
1009      ga.Engine = new ParallelEngine();
1010    }
1011
1012
1013    private void RunAlgorithm(IAlgorithm a) {
1014      var trigger = new EventWaitHandle(false, EventResetMode.ManualReset);
1015      Exception ex = null;
1016      a.Stopped += (src, e) => { trigger.Set(); };
1017      a.ExceptionOccurred += (src, e) => { ex = e.Value; trigger.Set(); };
1018      a.Prepare();
1019      a.Start();
1020      trigger.WaitOne();
1021
1022      Assert.AreEqual(ex, null);
1023    }
1024
1025    private double GetDoubleResult(IAlgorithm a, string resultName) {
1026      return ((DoubleValue)a.Results[resultName].Value).Value;
1027    }
1028    private int GetIntResult(IAlgorithm a, string resultName) {
1029      return ((IntValue)a.Results[resultName].Value).Value;
1030    }
1031    #endregion
1032  }
1033}
Note: See TracBrowser for help on using the repository browser.