Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 6922 was 6922, checked in by mkommend, 13 years ago

#1653: Updated GP samples unit test and saved samples.

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