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