Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.DiversityAnalysis.sln
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.DiversityAnalysis.sln	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.DiversityAnalysis.sln	(revision 4402)
@@ -0,0 +1,32 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.TravelingSalesman-3.3", "HeuristicLab.Problems.TravelingSalesman\3.3\HeuristicLab.Problems.TravelingSalesman-3.3.csproj", "{D767C38D-8014-46B0-9A32-03A3AECCE34A}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{D767C38D-8014-46B0-9A32-03A3AECCE34A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D767C38D-8014-46B0-9A32-03A3AECCE34A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D767C38D-8014-46B0-9A32-03A3AECCE34A}.Debug|x64.ActiveCfg = Debug|x64
+		{D767C38D-8014-46B0-9A32-03A3AECCE34A}.Debug|x64.Build.0 = Debug|x64
+		{D767C38D-8014-46B0-9A32-03A3AECCE34A}.Debug|x86.ActiveCfg = Debug|x86
+		{D767C38D-8014-46B0-9A32-03A3AECCE34A}.Debug|x86.Build.0 = Debug|x86
+		{D767C38D-8014-46B0-9A32-03A3AECCE34A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D767C38D-8014-46B0-9A32-03A3AECCE34A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D767C38D-8014-46B0-9A32-03A3AECCE34A}.Release|x64.ActiveCfg = Release|x64
+		{D767C38D-8014-46B0-9A32-03A3AECCE34A}.Release|x64.Build.0 = Release|x64
+		{D767C38D-8014-46B0-9A32-03A3AECCE34A}.Release|x86.ActiveCfg = Release|x86
+		{D767C38D-8014-46B0-9A32-03A3AECCE34A}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Analyzers/BestTSPSolutionAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Analyzers/BestTSPSolutionAnalyzer.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Analyzers/BestTSPSolutionAnalyzer.cs	(revision 4402)
@@ -0,0 +1,112 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator for analyzing the best solution of Traveling Salesman Problems given in path representation using city coordinates.
+  /// </summary>
+  [Item("BestTSPSolutionAnalyzer", "An operator for analyzing the best solution of Traveling Salesman Problems given in path representation using city coordinates.")]
+  [StorableClass]
+  public sealed class BestTSPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public LookupParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (LookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    }
+    public ScopeTreeLookupParameter<Permutation> PermutationParameter {
+      get { return (ScopeTreeLookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public LookupParameter<PathTSPTour> BestSolutionParameter {
+      get { return (LookupParameter<PathTSPTour>)Parameters["BestSolution"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public LookupParameter<DoubleValue> BestKnownQualityParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
+    }
+    public LookupParameter<Permutation> BestKnownSolutionParameter {
+      get { return (LookupParameter<Permutation>)Parameters["BestKnownSolution"]; }
+    }
+
+    public BestTSPSolutionAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities."));
+      Parameters.Add(new ScopeTreeLookupParameter<Permutation>("Permutation", "The TSP solutions given in path representation from which the best solution should be analyzed."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the TSP solutions which should be analyzed."));
+      Parameters.Add(new LookupParameter<PathTSPTour>("BestSolution", "The best TSP solution."));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best TSP solution should be stored."));
+      Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this TSP instance."));
+      Parameters.Add(new LookupParameter<Permutation>("BestKnownSolution", "The best known solution of this TSP instance."));
+    }
+
+    public override IOperation Apply() {
+      DoubleMatrix coordinates = CoordinatesParameter.ActualValue;
+      ItemArray<Permutation> permutations = PermutationParameter.ActualValue;
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+      bool max = MaximizationParameter.ActualValue.Value;
+      DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
+
+      int i = -1;
+      if (!max)
+        i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      else i = qualities.Select((x, index) => new { index, x.Value }).OrderByDescending(x => x.Value).First().index;
+
+      if (bestKnownQuality == null ||
+          max && qualities[i].Value > bestKnownQuality.Value ||
+          !max && qualities[i].Value < bestKnownQuality.Value) {
+        BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[i].Value);
+        BestKnownSolutionParameter.ActualValue = (Permutation)permutations[i].Clone();
+      }
+
+      PathTSPTour tour = BestSolutionParameter.ActualValue;
+      if (tour == null) {
+        tour = new PathTSPTour(coordinates, (Permutation)permutations[i].Clone(), new DoubleValue(qualities[i].Value));
+        BestSolutionParameter.ActualValue = tour;
+        results.Add(new Result("Best TSP Solution", tour));
+      } else {
+        if (max && tour.Quality.Value < qualities[i].Value ||
+          !max && tour.Quality.Value > qualities[i].Value) {
+          tour.Coordinates = coordinates;
+          tour.Permutation = (Permutation)permutations[i].Clone();
+          tour.Quality.Value = qualities[i].Value;
+        }
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPCoordinatesPathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPCoordinatesPathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPCoordinatesPathEvaluator.cs	(revision 4402)
@@ -0,0 +1,100 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// A base class for operators which evaluate TSP solutions given in path representation using city coordinates.
+  /// </summary>
+  [Item("TSPCoordinatesPathEvaluator", "A base class for operators which evaluate TSP solutions given in path representation using city coordinates.")]
+  [StorableClass]
+  public abstract class TSPCoordinatesPathEvaluator : TSPEvaluator, ITSPCoordinatesPathEvaluator {
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public ILookupParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    }
+    public ILookupParameter<DoubleMatrix> DistanceMatrixParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
+    }
+    public ILookupParameter<BoolValue> UseDistanceMatrixParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
+    }
+
+    protected TSPCoordinatesPathEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The TSP solution given in path representation which should be evaluated."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
+      Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false."));
+    }
+
+    public sealed override IOperation Apply() {
+      if (UseDistanceMatrixParameter.ActualValue.Value) {
+        Permutation p = PermutationParameter.ActualValue;
+        DoubleMatrix dm = DistanceMatrixParameter.ActualValue;
+
+        if (dm == null) {  // calculate distance matrix
+          DoubleMatrix c = CoordinatesParameter.ActualValue;
+
+          dm = new DoubleMatrix(c.Rows, c.Rows);
+          for (int i = 0; i < dm.Rows; i++) {
+            for (int j = 0; j < dm.Columns; j++)
+              dm[i, j] = CalculateDistance(c[i, 0], c[i, 1], c[j, 0], c[j, 1]);
+          }
+          DistanceMatrixParameter.ActualValue = (DoubleMatrix)dm.AsReadOnly();
+        }
+
+        double length = 0;
+        for (int i = 0; i < p.Length - 1; i++)
+          length += dm[p[i], p[i + 1]];
+        length += dm[p[p.Length - 1], p[0]];
+        QualityParameter.ActualValue = new DoubleValue(length);
+      } else {
+        Permutation p = PermutationParameter.ActualValue;
+        DoubleMatrix c = CoordinatesParameter.ActualValue;
+
+        double length = 0;
+        for (int i = 0; i < p.Length - 1; i++)
+          length += CalculateDistance(c[p[i], 0], c[p[i], 1], c[p[i + 1], 0], c[p[i + 1], 1]);
+        length += CalculateDistance(c[p[p.Length - 1], 0], c[p[p.Length - 1], 1], c[p[0], 0], c[p[0], 1]);
+        QualityParameter.ActualValue = new DoubleValue(length);
+      }
+      return base.Apply();
+    }
+
+    /// <summary>
+    /// Calculates the distance between two points.
+    /// </summary>
+    /// <param name="x1">The x-coordinate of point 1.</param>
+    /// <param name="y1">The y-coordinate of point 1.</param>
+    /// <param name="x2">The x-coordinate of point 2.</param>
+    /// <param name="y2">The y-coordinate of point 2.</param>
+    /// <returns>The calculated distance.</returns>
+    protected abstract double CalculateDistance(double x1, double y1, double x2, double y2);
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPEuclideanPathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPEuclideanPathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPEuclideanPathEvaluator.cs	(revision 4402)
@@ -0,0 +1,45 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator which evaluates TSP solutions given in path representation using the Euclidean distance metric.
+  /// </summary>
+  [Item("TSPEuclideanPathEvaluator", "An operator which evaluates TSP solutions given in path representation using the Euclidean distance metric.")]
+  [StorableClass]
+  public sealed class TSPEuclideanPathEvaluator : TSPCoordinatesPathEvaluator {
+    /// <summary>
+    /// Calculates the distance between two points using the Euclidean distance metric.
+    /// </summary>
+    /// <param name="x1">The x-coordinate of point 1.</param>
+    /// <param name="y1">The y-coordinate of point 1.</param>
+    /// <param name="x2">The x-coordinate of point 2.</param>
+    /// <param name="y2">The y-coordinate of point 2.</param>
+    /// <returns>The calculated distance.</returns>
+    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
+      return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPEvaluator.cs	(revision 4402)
@@ -0,0 +1,48 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// A base class for operators which evaluate TSP solutions.
+  /// </summary>
+  [Item("TSPEvaluator", "A base class for operators which evaluate TSP solutions.")]
+  [StorableClass]
+  public abstract class TSPEvaluator : SingleSuccessorOperator, ITSPEvaluator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    protected TSPEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the TSP solution."));
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPGeoPathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPGeoPathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPGeoPathEvaluator.cs	(revision 4402)
@@ -0,0 +1,66 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator which evaluates TSP solutions given in path representation using the GEO distance metric (globe coordinates).
+  /// </summary>
+  [Item("TSPGeoPathEvaluator", "An operator which evaluates TSP solutions given in path representation using the GEO distance metric (globe coordinates).")]
+  [StorableClass]
+  public sealed class TSPGeoPathEvaluator : TSPCoordinatesPathEvaluator {
+    private const double PI = 3.141592;
+    private const double RADIUS = 6378.388;
+
+    /// <summary>
+    /// Calculates the distance between two points using the GEO distance metric (globe coordinates).
+    /// </summary>
+    /// <param name="x1">The x-coordinate of point 1.</param>
+    /// <param name="y1">The y-coordinate of point 1.</param>
+    /// <param name="x2">The x-coordinate of point 2.</param>
+    /// <param name="y2">The y-coordinate of point 2.</param>
+    /// <returns>The calculated distance.</returns>
+    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
+      double latitude1, longitude1, latitude2, longitude2;
+      double q1, q2, q3;
+      double length;
+
+      latitude1 = ConvertToRadian(x1);
+      longitude1 = ConvertToRadian(y1);
+      latitude2 = ConvertToRadian(x2);
+      longitude2 = ConvertToRadian(y2);
+
+      q1 = Math.Cos(longitude1 - longitude2);
+      q2 = Math.Cos(latitude1 - latitude2);
+      q3 = Math.Cos(latitude1 + latitude2);
+
+      length = (int)(RADIUS * Math.Acos(0.5 * ((1.0 + q1) * q2 - (1.0 - q1) * q3)) + 1.0);
+      return (length);
+    }
+
+    private double ConvertToRadian(double x) {
+      return PI * (Math.Truncate(x) + 5.0 * (x - Math.Truncate(x)) / 3.0) / 180.0;
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPRoundedEuclideanPathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPRoundedEuclideanPathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPRoundedEuclideanPathEvaluator.cs	(revision 4402)
@@ -0,0 +1,45 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator which evaluates TSP solutions given in path representation using the rounded Euclidean distance metric.
+  /// </summary>
+  [Item("TSPRoundedEuclideanPathEvaluator", "An operator which evaluates TSP solutions given in path representation using the rounded Euclidean distance metric.")]
+  [StorableClass]
+  public sealed class TSPRoundedEuclideanPathEvaluator : TSPCoordinatesPathEvaluator {
+    /// <summary>
+    /// Calculates the distance between two points using the rounded Euclidean distance metric.
+    /// </summary>
+    /// <param name="x1">The x-coordinate of point 1.</param>
+    /// <param name="y1">The y-coordinate of point 1.</param>
+    /// <param name="x2">The x-coordinate of point 2.</param>
+    /// <param name="y2">The y-coordinate of point 2.</param>
+    /// <returns>The calculated distance.</returns>
+    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
+      return Math.Round(Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLab.Problems.TravelingSalesman-3.3.csproj
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLab.Problems.TravelingSalesman-3.3.csproj	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLab.Problems.TravelingSalesman-3.3.csproj	(revision 4402)
@@ -0,0 +1,227 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{D767C38D-8014-46B0-9A32-03A3AECCE34A}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.TravelingSalesman</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.TravelingSalesman-3.3</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Problems.TravelingSalesman-3.3.xml</DocumentationFile>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\x86\Release\HeuristicLab.Routing.TSP-3.3.xml</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\x64\Release\HeuristicLab.Routing.TSP-3.3.XML</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.2.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Analyzers\BestTSPSolutionAnalyzer.cs" />
+    <Compile Include="Evaluators\TSPEuclideanPathEvaluator.cs" />
+    <Compile Include="Evaluators\TSPGeoPathEvaluator.cs" />
+    <Compile Include="HeuristicLabProblemsTravelingSalesmanPlugin.cs" />
+    <Compile Include="MoveEvaluators\ThreeOpt\TSPTranslocationMoveEuclideanPathEvaluator.cs" />
+    <Compile Include="MoveEvaluators\ThreeOpt\TSPTranslocationMoveGeoPathEvaluator.cs" />
+    <Compile Include="MoveEvaluators\ThreeOpt\TSPTranslocationMovePathEvaluator.cs" />
+    <Compile Include="MoveEvaluators\ThreeOpt\TSPTranslocationMoveRoundedEuclideanPathEvaluator.cs" />
+    <Compile Include="MoveEvaluators\TwoOpt\TSPInversionMoveEuclideanPathEvaluator.cs" />
+    <Compile Include="MoveEvaluators\TwoOpt\TSPInversionMoveGeoPathEvaluator.cs" />
+    <Compile Include="MoveEvaluators\TwoOpt\TSPInversionMovePathEvaluator.cs" />
+    <Compile Include="MoveEvaluators\TwoOpt\TSPInversionMoveRoundedEuclideanPathEvaluator.cs" />
+    <Compile Include="TravelingSalesmanProblem.cs" />
+    <Compile Include="TSPLIBTourParser.cs" />
+    <Compile Include="PathTSPTour.cs" />
+    <Compile Include="Evaluators\TSPCoordinatesPathEvaluator.cs" />
+    <Compile Include="Evaluators\TSPEvaluator.cs" />
+    <Compile Include="Evaluators\TSPRoundedEuclideanPathEvaluator.cs" />
+    <Compile Include="Interfaces\ITSPCoordinatesPathEvaluator.cs" />
+    <Compile Include="Interfaces\ITSPEvaluator.cs" />
+    <Compile Include="Interfaces\ITSPMoveEvaluator.cs" />
+    <Compile Include="Interfaces\ITSPPathEvaluator.cs" />
+    <Compile Include="Interfaces\ITSPPathMoveEvaluator.cs" />
+    <Compile Include="MoveEvaluators\TSPPathMoveEvaluator.cs" />
+    <Compile Include="MoveEvaluators\TSPMoveEvaluator.cs" />
+    <Compile Include="TSPLIBParser.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="HeuristicLabProblemsTravelingSalesmanPlugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.frame" />
+    <None Include="TSPLIB Sample Problems\ch130.opt.tour" />
+    <None Include="TSPLIB Sample Problems\ch130.tsp" />
+    <None Include="TSPLIB Sample Problems\fl1400.tsp" />
+    <None Include="TSPLIB Sample Problems\gr666.opt.tour" />
+    <None Include="TSPLIB Sample Problems\gr666.tsp" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\HeuristicLabProblemsTravelingSalesmanPlugin.cs.frame" "%25ProjectDir%25\HeuristicLabProblemsTravelingSalesmanPlugin.cs"</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>copy "$(TargetPath)" "C:\Program Files\HeuristicLab 3.3\"</PostBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLabProblemsTravelingSalesmanPlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLabProblemsTravelingSalesmanPlugin.cs.frame	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLabProblemsTravelingSalesmanPlugin.cs.frame	(revision 4402)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Problems.TravelingSalesman plugin
+  /// </summary>
+  [Plugin("HeuristicLab.Problems.TravelingSalesman", "3.3.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.TravelingSalesman-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class HeuristicLabProblemsTravelingSalesmanPlugin : PluginBase {
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPCoordinatesPathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPCoordinatesPathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPCoordinatesPathEvaluator.cs	(revision 4402)
@@ -0,0 +1,34 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An interface which represents an evaluation operator which evaluates TSP solutions given in path representation using city coordinates.
+  /// </summary>
+  public interface ITSPCoordinatesPathEvaluator : ITSPPathEvaluator {
+    ILookupParameter<DoubleMatrix> CoordinatesParameter { get; }
+    ILookupParameter<DoubleMatrix> DistanceMatrixParameter { get; }
+    ILookupParameter<BoolValue> UseDistanceMatrixParameter { get; }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPEvaluator.cs	(revision 4402)
@@ -0,0 +1,29 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An interface which represents an evaluation operator for Traveling Salesman Problems.
+  /// </summary>
+  public interface ITSPEvaluator : ISingleObjectiveEvaluator { }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPMoveEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPMoveEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPMoveEvaluator.cs	(revision 4402)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  public interface ITSPMoveEvaluator : ISingleObjectiveMoveEvaluator, IMoveOperator {
+    Type EvaluatorType { get; }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPPathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPPathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPPathEvaluator.cs	(revision 4402)
@@ -0,0 +1,32 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An interface which represents an evaluation operator which evaluates TSP solutions given in path representation.
+  /// </summary>
+  public interface ITSPPathEvaluator : ITSPEvaluator {
+    ILookupParameter<Permutation> PermutationParameter { get; }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPPathMoveEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPPathMoveEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPPathMoveEvaluator.cs	(revision 4402)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  public interface ITSPPathMoveEvaluator : ITSPMoveEvaluator, IPermutationMoveOperator {
+    ILookupParameter<DoubleMatrix> CoordinatesParameter { get; }
+    ILookupParameter<DoubleMatrix> DistanceMatrixParameter { get; }
+    ILookupParameter<BoolValue> UseDistanceMatrixParameter { get; }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TSPMoveEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TSPMoveEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TSPMoveEvaluator.cs	(revision 4402)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// A base class for operators which evaluate TSP solutions.
+  /// </summary>
+  [Item("TSPMoveEvaluator", "A base class for operators which evaluate TSP moves.")]
+  [StorableClass]
+  public abstract class TSPMoveEvaluator : SingleSuccessorOperator, ITSPMoveEvaluator, IMoveOperator {
+
+    public abstract Type EvaluatorType { get; }
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+
+    protected TSPMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of a TSP solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The evaluated quality of a move on a TSP solution."));
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TSPPathMoveEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TSPPathMoveEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TSPPathMoveEvaluator.cs	(revision 4402)
@@ -0,0 +1,87 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// A base class for operators which evaluate TSP solutions.
+  /// </summary>
+  [Item("TSPMoveEvaluator", "A base class for operators which evaluate TSP moves.")]
+  [StorableClass]
+  public abstract class TSPPathMoveEvaluator : TSPMoveEvaluator, ITSPPathMoveEvaluator {
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public ILookupParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    }
+    public ILookupParameter<DoubleMatrix> DistanceMatrixParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
+    }
+    public ILookupParameter<BoolValue> UseDistanceMatrixParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
+    }
+
+    protected TSPPathMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The city's coordinates."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
+      Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated (if it does not exist already) and used for evaluation, otherwise false."));
+    }
+
+    public override IOperation Apply() {
+      Permutation permutation = PermutationParameter.ActualValue;
+      DoubleMatrix coordinates = CoordinatesParameter.ActualValue;
+      double relativeQualityDifference = 0;
+      if (UseDistanceMatrixParameter.ActualValue.Value) {
+        DoubleMatrix distanceMatrix = DistanceMatrixParameter.ActualValue;
+        if (distanceMatrix == null) {
+          distanceMatrix = CalculateDistanceMatrix(coordinates);
+          DistanceMatrixParameter.ActualValue = distanceMatrix;
+        }
+        relativeQualityDifference = EvaluateByDistanceMatrix(permutation, distanceMatrix);
+      } else relativeQualityDifference = EvaluateByCoordinates(permutation, coordinates);
+      DoubleValue moveQuality = MoveQualityParameter.ActualValue;
+      if (moveQuality == null) MoveQualityParameter.ActualValue = new DoubleValue(QualityParameter.ActualValue.Value + relativeQualityDifference);
+      else moveQuality.Value = QualityParameter.ActualValue.Value + relativeQualityDifference;
+      return base.Apply();
+    }
+
+    protected abstract double CalculateDistance(double x1, double y1, double x2, double y2);
+    protected abstract double EvaluateByDistanceMatrix(Permutation permutation, DoubleMatrix distanceMatrix);
+    protected abstract double EvaluateByCoordinates(Permutation permutation, DoubleMatrix coordinates);
+
+    private DoubleMatrix CalculateDistanceMatrix(DoubleMatrix c) {
+      DoubleMatrix distanceMatrix = new DoubleMatrix(c.Rows, c.Rows);
+      for (int i = 0; i < distanceMatrix.Rows; i++) {
+        for (int j = 0; j < distanceMatrix.Columns; j++)
+          distanceMatrix[i, j] = CalculateDistance(c[i, 0], c[i, 1], c[j, 0], c[j, 1]);
+      }
+      return distanceMatrix;
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMoveEuclideanPathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMoveEuclideanPathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMoveEuclideanPathEvaluator.cs	(revision 4402)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator to evaluate translocation or insertion moves (3-opt).
+  /// </summary>
+  [Item("TSPTranslocationMoveEuclideanPathEvaluator", "Operator for evaluating a translocation or insertion move (3-opt) based on euclidean distances.")]
+  [StorableClass]
+  public class TSPTranslocationMoveEuclideanPathEvaluator : TSPTranslocationMovePathEvaluator {
+    public override Type EvaluatorType {
+      get { return typeof(TSPEuclideanPathEvaluator); }
+    }
+
+    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
+      return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMoveGeoPathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMoveGeoPathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMoveGeoPathEvaluator.cs	(revision 4402)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator to evaluate translocation or insertion moves (3-opt).
+  /// </summary>
+  [Item("TSPTranslocationMoveGeoPathEvaluator", "Operator for evaluating a translocation or insertion move (3-opt) based on geo (world) distances.")]
+  [StorableClass]
+  public class TSPTranslocationMoveGeoPathEvaluator : TSPTranslocationMovePathEvaluator {
+    public override Type EvaluatorType {
+      get { return typeof(TSPGeoPathEvaluator); }
+    }
+
+    private const double PI = 3.141592;
+    private const double RADIUS = 6378.388;
+
+    /// <summary>
+    /// Calculates the distance between two points using the GEO distance metric (globe coordinates).
+    /// </summary>
+    /// <param name="x1">The x-coordinate of point 1.</param>
+    /// <param name="y1">The y-coordinate of point 1.</param>
+    /// <param name="x2">The x-coordinate of point 2.</param>
+    /// <param name="y2">The y-coordinate of point 2.</param>
+    /// <returns>The calculated distance.</returns>
+    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
+      double latitude1, longitude1, latitude2, longitude2;
+      double q1, q2, q3;
+      double length;
+
+      latitude1 = ConvertToRadian(x1);
+      longitude1 = ConvertToRadian(y1);
+      latitude2 = ConvertToRadian(x2);
+      longitude2 = ConvertToRadian(y2);
+
+      q1 = Math.Cos(longitude1 - longitude2);
+      q2 = Math.Cos(latitude1 - latitude2);
+      q3 = Math.Cos(latitude1 + latitude2);
+
+      length = (int)(RADIUS * Math.Acos(0.5 * ((1.0 + q1) * q2 - (1.0 - q1) * q3)) + 1.0);
+      return (length);
+    }
+
+    private double ConvertToRadian(double x) {
+      return PI * (Math.Truncate(x) + 5.0 * (x - Math.Truncate(x)) / 3.0) / 180.0;
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMovePathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMovePathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMovePathEvaluator.cs	(revision 4402)
@@ -0,0 +1,110 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator to evaluate a translocation or insertion move.
+  /// </summary>
+  [Item("TSPTranslocationMovePathEvaluator", "Evaluates a translocation or insertion move (3-opt) by summing up the length of all added edges and subtracting the length of all deleted edges.")]
+  [StorableClass]
+  public abstract class TSPTranslocationMovePathEvaluator : TSPPathMoveEvaluator, IPermutationTranslocationMoveOperator {
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return (ILookupParameter<TranslocationMove>)Parameters["TranslocationMove"]; }
+    }
+
+    public TSPTranslocationMovePathEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<TranslocationMove>("TranslocationMove", "The move to evaluate."));
+    }
+
+    protected override double EvaluateByCoordinates(Permutation permutation, DoubleMatrix coordinates) {
+      TranslocationMove move = TranslocationMoveParameter.ActualValue;
+      int edge1source = permutation.GetCircular(move.Index1 - 1);
+      int edge1target = permutation[move.Index1];
+      int edge2source = permutation[move.Index2];
+      int edge2target = permutation.GetCircular(move.Index2 + 1);
+      int edge3source, edge3target;
+      if (move.Index3 > move.Index1) {
+        edge3source = permutation.GetCircular(move.Index3 + move.Index2 - move.Index1);
+        edge3target = permutation.GetCircular(move.Index3 + move.Index2 - move.Index1 + 1);
+      } else {
+        edge3source = permutation.GetCircular(move.Index3 - 1);
+        edge3target = permutation[move.Index3];
+      }
+      if (move.Index1 == move.Index3
+        || move.Index2 - move.Index1 >= permutation.Length - 2
+        || move.Index1 == permutation.Length - 1 && move.Index3 == 0
+        || move.Index1 == 0 && move.Index3 == permutation.Length - 1) return 0;
+      double moveQuality = 0;
+      // remove three edges
+      moveQuality -= CalculateDistance(coordinates[edge1source, 0], coordinates[edge1source, 1],
+        coordinates[edge1target, 0], coordinates[edge1target, 1]);
+      moveQuality -= CalculateDistance(coordinates[edge2source, 0], coordinates[edge2source, 1],
+        coordinates[edge2target, 0], coordinates[edge2target, 1]);
+      moveQuality -= CalculateDistance(coordinates[edge3source, 0], coordinates[edge3source, 1],
+        coordinates[edge3target, 0], coordinates[edge3target, 1]);
+      // add three edges
+      moveQuality += CalculateDistance(coordinates[edge3source, 0], coordinates[edge3source, 1],
+        coordinates[edge1target, 0], coordinates[edge1target, 1]);
+      moveQuality += CalculateDistance(coordinates[edge2source, 0], coordinates[edge2source, 1],
+        coordinates[edge3target, 0], coordinates[edge3target, 1]);
+      moveQuality += CalculateDistance(coordinates[edge1source, 0], coordinates[edge1source, 1],
+        coordinates[edge2target, 0], coordinates[edge2target, 1]);
+      return moveQuality;
+    }
+
+    protected override double EvaluateByDistanceMatrix(Permutation permutation, DoubleMatrix distanceMatrix) {
+      TranslocationMove move = TranslocationMoveParameter.ActualValue;
+      int edge1source = permutation.GetCircular(move.Index1 - 1);
+      int edge1target = permutation[move.Index1];
+      int edge2source = permutation[move.Index2];
+      int edge2target = permutation.GetCircular(move.Index2 + 1);
+      int edge3source, edge3target;
+      if (move.Index3 > move.Index1) {
+        edge3source = permutation.GetCircular(move.Index3 + move.Index2 - move.Index1);
+        edge3target = permutation.GetCircular(move.Index3 + move.Index2 - move.Index1 + 1);
+      } else {
+        edge3source = permutation.GetCircular(move.Index3 - 1);
+        edge3target = permutation[move.Index3];
+      }
+      if (move.Index1 == move.Index3
+        || move.Index2 - move.Index1 >= permutation.Length - 2
+        || move.Index1 == permutation.Length - 1 && move.Index3 == 0
+        || move.Index1 == 0 && move.Index3 == permutation.Length - 1) return 0;
+      double moveQuality = 0;
+      // remove three edges
+      moveQuality -= distanceMatrix[edge1source, edge1target];
+      moveQuality -= distanceMatrix[edge2source, edge2target];
+      moveQuality -= distanceMatrix[edge3source, edge3target];
+      // add three edges
+      moveQuality += distanceMatrix[edge3source, edge1target];
+      moveQuality += distanceMatrix[edge2source, edge3target];
+      moveQuality += distanceMatrix[edge1source, edge2target];
+      return moveQuality;
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMoveRoundedEuclideanPathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMoveRoundedEuclideanPathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMoveRoundedEuclideanPathEvaluator.cs	(revision 4402)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator to evaluate translocation or insertion moves (3-opt).
+  /// </summary>
+  [Item("TSPTranslocationMoveRoundedEuclideanPathEvaluator", "Operator for evaluating a translocation or insertion move (3-opt) based on rounded euclidean distances.")]
+  [StorableClass]
+  public class TSPTranslocationMoveRoundedEuclideanPathEvaluator : TSPTranslocationMovePathEvaluator {
+    public override Type EvaluatorType {
+      get { return typeof(TSPRoundedEuclideanPathEvaluator); }
+    }
+
+    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
+      return Math.Round(Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMoveEuclideanPathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMoveEuclideanPathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMoveEuclideanPathEvaluator.cs	(revision 4402)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator to evaluate 2-opt moves.
+  /// </summary>
+  [Item("TSPInversionMoveEuclideanPathEvaluator", "Operator for evaluating an inversion move (2-opt) based on euclidean distances.")]
+  [StorableClass]
+  public class TSPInversionMoveEuclideanPathEvaluator : TSPInversionMovePathEvaluator {
+    public override Type EvaluatorType {
+      get { return typeof(TSPEuclideanPathEvaluator); }
+    }
+
+    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
+      return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMoveGeoPathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMoveGeoPathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMoveGeoPathEvaluator.cs	(revision 4402)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator to evaluate inversion moves (2-opt).
+  /// </summary>
+  [Item("TSPInversionMoveGeoPathEvaluator", "Operator for evaluating an inversion move (2-opt) based on geo (world) distances.")]
+  [StorableClass]
+  public class TSPInversionMoveGeoPathEvaluator : TSPInversionMovePathEvaluator {
+    public override Type EvaluatorType {
+      get { return typeof(TSPGeoPathEvaluator); }
+    }
+
+    private const double PI = 3.141592;
+    private const double RADIUS = 6378.388;
+
+    /// <summary>
+    /// Calculates the distance between two points using the GEO distance metric (globe coordinates).
+    /// </summary>
+    /// <param name="x1">The x-coordinate of point 1.</param>
+    /// <param name="y1">The y-coordinate of point 1.</param>
+    /// <param name="x2">The x-coordinate of point 2.</param>
+    /// <param name="y2">The y-coordinate of point 2.</param>
+    /// <returns>The calculated distance.</returns>
+    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
+      double latitude1, longitude1, latitude2, longitude2;
+      double q1, q2, q3;
+      double length;
+
+      latitude1 = ConvertToRadian(x1);
+      longitude1 = ConvertToRadian(y1);
+      latitude2 = ConvertToRadian(x2);
+      longitude2 = ConvertToRadian(y2);
+
+      q1 = Math.Cos(longitude1 - longitude2);
+      q2 = Math.Cos(latitude1 - latitude2);
+      q3 = Math.Cos(latitude1 + latitude2);
+
+      length = (int)(RADIUS * Math.Acos(0.5 * ((1.0 + q1) * q2 - (1.0 - q1) * q3)) + 1.0);
+      return (length);
+    }
+
+    private double ConvertToRadian(double x) {
+      return PI * (Math.Truncate(x) + 5.0 * (x - Math.Truncate(x)) / 3.0) / 180.0;
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMovePathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMovePathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMovePathEvaluator.cs	(revision 4402)
@@ -0,0 +1,82 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator to evaluate inversion moves (2-opt).
+  /// </summary>
+  [Item("TSPInversionMovePathEvaluator", "Evaluates an inversion move (2-opt) by summing up the length of all added edges and subtracting the length of all deleted edges.")]
+  [StorableClass]
+  public abstract class TSPInversionMovePathEvaluator : TSPPathMoveEvaluator, IPermutationInversionMoveOperator {
+    public ILookupParameter<InversionMove> InversionMoveParameter {
+      get { return (ILookupParameter<InversionMove>)Parameters["InversionMove"]; }
+    }
+
+    public TSPInversionMovePathEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<InversionMove>("InversionMove", "The move to evaluate."));
+    }
+
+    protected override double EvaluateByCoordinates(Permutation permutation, DoubleMatrix coordinates) {
+      InversionMove move = InversionMoveParameter.ActualValue;
+      int edge1source = permutation.GetCircular(move.Index1 - 1);
+      int edge1target = permutation[move.Index1];
+      int edge2source = permutation[move.Index2];
+      int edge2target = permutation.GetCircular(move.Index2 + 1);
+      if (move.Index2 - move.Index1 >= permutation.Length - 2) return 0;
+      double moveQuality = 0;
+      // remove two edges
+      moveQuality -= CalculateDistance(coordinates[edge1source, 0], coordinates[edge1source, 1],
+            coordinates[edge1target, 0], coordinates[edge1target, 1]);
+      moveQuality -= CalculateDistance(coordinates[edge2source, 0], coordinates[edge2source, 1],
+        coordinates[edge2target, 0], coordinates[edge2target, 1]);
+      // add two edges
+      moveQuality += CalculateDistance(coordinates[edge1source, 0], coordinates[edge1source, 1],
+        coordinates[edge2source, 0], coordinates[edge2source, 1]);
+      moveQuality += CalculateDistance(coordinates[edge1target, 0], coordinates[edge1target, 1],
+        coordinates[edge2target, 0], coordinates[edge2target, 1]);
+      return moveQuality;
+    }
+
+    protected override double EvaluateByDistanceMatrix(Permutation permutation, DoubleMatrix distanceMatrix) {
+      InversionMove move = InversionMoveParameter.ActualValue;
+      int edge1source = permutation.GetCircular(move.Index1 - 1);
+      int edge1target = permutation[move.Index1];
+      int edge2source = permutation[move.Index2];
+      int edge2target = permutation.GetCircular(move.Index2 + 1);
+      if (move.Index2 - move.Index1 >= permutation.Length - 2) return 0;
+      double moveQuality = 0;
+      // remove two edges
+      moveQuality -= distanceMatrix[edge1source, edge1target];
+      moveQuality -= distanceMatrix[edge2source, edge2target];
+      // add two edges
+      moveQuality += distanceMatrix[edge1source, edge2source];
+      moveQuality += distanceMatrix[edge1target, edge2target];
+      return moveQuality;
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMoveRoundedEuclideanPathEvaluator.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMoveRoundedEuclideanPathEvaluator.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMoveRoundedEuclideanPathEvaluator.cs	(revision 4402)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator to evaluate inversion moves (2-opt).
+  /// </summary>
+  [Item("TSPInversionMoveRoundedEuclideanPathEvaluator", "Operator for evaluating an inversion move (2-opt) based on rounded euclidean distances.")]
+  [StorableClass]
+  public class TSPInversionMoveRoundedEuclideanPathEvaluator : TSPInversionMovePathEvaluator {
+    public override Type EvaluatorType {
+      get { return typeof(TSPRoundedEuclideanPathEvaluator); }
+    }
+
+    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
+      return Math.Round(Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/PathTSPTour.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/PathTSPTour.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/PathTSPTour.cs	(revision 4402)
@@ -0,0 +1,180 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// Represents a tour of a Traveling Salesman Problem given in path representation which can be visualized in the GUI.
+  /// </summary>
+  [Item("PathTSPTour", "Represents a tour of a Traveling Salesman Problem given in path representation which can be visualized in the GUI.")]
+  [StorableClass]
+  public sealed class PathTSPTour : Item {
+    public override Image ItemImage {
+      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Image; }
+    }
+
+    [Storable]
+    private DoubleMatrix coordinates;
+    public DoubleMatrix Coordinates {
+      get { return coordinates; }
+      set {
+        if (coordinates != value) {
+          if (coordinates != null) DeregisterCoordinatesEvents();
+          coordinates = value;
+          if (coordinates != null) RegisterCoordinatesEvents();
+          OnCoordinatesChanged();
+        }
+      }
+    }
+    [Storable]
+    private Permutation permutation;
+    public Permutation Permutation {
+      get { return permutation; }
+      set {
+        if (permutation != value) {
+          if (permutation != null) DeregisterPermutationEvents();
+          permutation = value;
+          if (permutation != null) RegisterPermutationEvents();
+          OnPermutationChanged();
+        }
+      }
+    }
+    [Storable]
+    private DoubleValue quality;
+    public DoubleValue Quality {
+      get { return quality; }
+      set {
+        if (quality != value) {
+          if (quality != null) DeregisterQualityEvents();
+          quality = value;
+          if (quality != null) RegisterQualityEvents();
+          OnQualityChanged();
+        }
+      }
+    }
+
+    public PathTSPTour() : base() { }
+    public PathTSPTour(DoubleMatrix coordinates)
+      : base() {
+      this.coordinates = coordinates;
+      Initialize();
+    }
+    public PathTSPTour(DoubleMatrix coordinates, Permutation permutation)
+      : base() {
+      this.coordinates = coordinates;
+      this.permutation = permutation;
+      Initialize();
+    }
+    public PathTSPTour(DoubleMatrix coordinates, Permutation permutation, DoubleValue quality)
+      : base() {
+      this.coordinates = coordinates;
+      this.permutation = permutation;
+      this.quality = quality;
+      Initialize();
+    }
+    [StorableConstructor]
+    private PathTSPTour(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      if (coordinates != null) RegisterCoordinatesEvents();
+      if (permutation != null) RegisterPermutationEvents();
+      if (quality != null) RegisterQualityEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      PathTSPTour clone = new PathTSPTour();
+      cloner.RegisterClonedObject(this, clone);
+      clone.coordinates = (DoubleMatrix)cloner.Clone(coordinates);
+      clone.permutation = (Permutation)cloner.Clone(permutation);
+      clone.quality = (DoubleValue)cloner.Clone(quality);
+      clone.Initialize();
+      return clone;
+    }
+
+    #region Events
+    public event EventHandler CoordinatesChanged;
+    private void OnCoordinatesChanged() {
+      var changed = CoordinatesChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+    public event EventHandler PermutationChanged;
+    private void OnPermutationChanged() {
+      var changed = PermutationChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+    public event EventHandler QualityChanged;
+    private void OnQualityChanged() {
+      var changed = QualityChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+
+    private void RegisterCoordinatesEvents() {
+      Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged);
+      Coordinates.Reset += new EventHandler(Coordinates_Reset);
+    }
+    private void DeregisterCoordinatesEvents() {
+      Coordinates.ItemChanged -= new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged);
+      Coordinates.Reset -= new EventHandler(Coordinates_Reset);
+    }
+    private void RegisterPermutationEvents() {
+      Permutation.ItemChanged += new EventHandler<EventArgs<int>>(Permutation_ItemChanged);
+      Permutation.Reset += new EventHandler(Permutation_Reset);
+    }
+    private void DeregisterPermutationEvents() {
+      Permutation.ItemChanged -= new EventHandler<EventArgs<int>>(Permutation_ItemChanged);
+      Permutation.Reset -= new EventHandler(Permutation_Reset);
+    }
+    private void RegisterQualityEvents() {
+      Quality.ValueChanged += new EventHandler(Quality_ValueChanged);
+    }
+    private void DeregisterQualityEvents() {
+      Quality.ValueChanged -= new EventHandler(Quality_ValueChanged);
+    }
+
+    private void Coordinates_ItemChanged(object sender, EventArgs<int, int> e) {
+      OnCoordinatesChanged();
+    }
+    private void Coordinates_Reset(object sender, EventArgs e) {
+      OnCoordinatesChanged();
+    }
+    private void Permutation_ItemChanged(object sender, EventArgs<int> e) {
+      OnPermutationChanged();
+    }
+    private void Permutation_Reset(object sender, EventArgs e) {
+      OnPermutationChanged();
+    }
+    private void Quality_ValueChanged(object sender, EventArgs e) {
+      OnQualityChanged();
+    }
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Properties/AssemblyInfo.frame
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Properties/AssemblyInfo.frame	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/Properties/AssemblyInfo.frame	(revision 4402)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.TravelingSalesman")]
+[assembly: AssemblyDescription("HeuristicLab Traveling Salesman Problem classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("3c4c7e0d-ad0b-4e9b-8182-cd7498c7e55d")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/ch130.opt.tour
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/ch130.opt.tour	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/ch130.opt.tour	(revision 4402)
@@ -0,0 +1,136 @@
+NAME : ch130.opt.tour
+COMMENT : Length 6110
+TYPE : TOUR
+DIMENSION : 130
+TOUR_SECTION
+1
+41
+39
+117
+112
+115
+28
+62
+105
+128
+16
+45
+5
+11
+76
+109
+61
+129
+124
+64
+69
+86
+88
+26
+7
+97
+70
+107
+127
+104
+43
+34
+17
+31
+27
+19
+100
+15
+29
+24
+116
+95
+79
+87
+12
+81
+103
+77
+94
+89
+110
+98
+68
+63
+48
+25
+113
+32
+36
+84
+119
+111
+123
+101
+82
+57
+9
+56
+65
+52
+75
+74
+99
+73
+92
+38
+106
+53
+120
+58
+49
+72
+91
+6
+102
+10
+14
+67
+13
+96
+122
+55
+60
+51
+42
+44
+93
+37
+22
+47
+40
+23
+33
+21
+126
+121
+78
+66
+85
+125
+90
+59
+30
+83
+3
+114
+108
+8
+18
+46
+80
+118
+20
+4
+35
+54
+2
+50
+130
+71
+-1
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/ch130.tsp
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/ch130.tsp	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/ch130.tsp	(revision 4402)
@@ -0,0 +1,137 @@
+NAME: ch130
+TYPE: TSP
+COMMENT: 130 city problem (Churritz)
+DIMENSION: 130
+EDGE_WEIGHT_TYPE: EUC_2D
+NODE_COORD_SECTION
+1 334.5909245845 161.7809319139
+2 397.6446634067 262.8165330708
+3 503.8741827107 172.8741151168
+4 444.0479403502 384.6491809647
+5 311.6137146746 2.0091699828
+6 662.8551011379 549.2301263653
+7 40.0979030612 187.2375430791
+8 526.8941409181 215.7079092185
+9 209.1887938487 691.0262291948
+10 683.2674131973 414.2096286906
+11 280.7494438748 5.9206392047
+12 252.7493090080 535.7430385019
+13 698.7850451923 348.4413729766
+14 678.7574678104 410.7256424438
+15 220.0041131179 409.1225812873
+16 355.1528556851 76.3912076444
+17 296.9724227786 313.1312792361
+18 504.5154071733 240.8866564499
+19 224.1079496785 358.4872228907
+20 470.6801296968 309.6259188406
+21 554.2530513223 279.4242466521
+22 567.6332684419 352.7162027273
+23 599.0532671093 361.0948690386
+24 240.5232959211 430.6036007844
+25 32.0825972787 345.8551009775
+26 91.0538736891 148.7213270256
+27 248.2179894723 343.9528017384
+28 488.8909044347 3.6122311393
+29 206.0467939820 437.7639406167
+30 575.8409415632 141.9670960195
+31 282.6089948164 329.4183805862
+32 27.6581484868 424.7684581747
+33 568.5737309870 287.0975660546
+34 269.4638933331 295.9464636385
+35 417.8004856811 341.2596589955
+36 32.1680938737 448.8998721172
+37 561.4775136009 357.3543930067
+38 342.9482167470 492.3321423839
+39 399.6752075383 156.8435035519
+40 571.7371050025 375.7575350833
+41 370.7559842751 151.9060751898
+42 509.7093253204 435.7975189314
+43 177.0206999750 295.6044772584
+44 526.1674198605 409.4859418161
+45 316.5725171854 65.6400108214
+46 469.2908100279 281.9891445025
+47 572.7630641427 373.3208821255
+48 29.5176994283 330.0382309000
+49 454.0082936692 537.2178547659
+50 416.1546762271 227.6133100741
+51 535.2514330806 471.0648643744
+52 265.4455533675 684.9987192464
+53 478.0542110167 509.6452028741
+54 370.4781203413 332.5390063041
+55 598.3479202004 446.8693279856
+56 201.1521139175 649.0260268945
+57 193.6925360026 680.2322840744
+58 448.5792598859 532.7934059740
+59 603.2853485624 134.4006473609
+60 543.0102490781 481.5168231148
+61 214.5750793346 43.6460117543
+62 426.3501451825 61.7285415996
+63 89.0447037063 277.1158385868
+64 84.4920100219 31.8474816424
+65 220.0468614154 623.0778103080
+66 688.4613313444 0.4702312726
+67 687.2857531630 373.5346236130
+68 75.4934933967 312.9175377486
+69 63.4170993511 23.7039309674
+70 97.9363495877 211.0910930878
+71 399.5255884970 170.8221968365
+72 456.3167017346 597.1937161677
+73 319.8855102422 626.8396604886
+74 295.9250894897 664.6291554845
+75 288.4868857235 667.7284070537
+76 268.3951858954 52.9010181645
+77 140.4709056068 513.5566720960
+78 689.8079027159 167.5947003748
+79 280.5784506848 458.7533546925
+80 453.3884433554 282.9082328989
+81 213.5704943432 525.8681817779
+82 133.6953004520 677.1757808026
+83 521.1658690522 132.8617086506
+84 30.2657946347 450.0754502986
+85 657.0199585283 39.7772908299
+86 6.9252241961 23.8749241575
+87 252.4286967767 535.1659364856
+88 42.8551682504 63.8232081774
+89 145.8999393902 399.5255884970
+90 638.4885715591 62.6262558472
+91 489.2756391122 665.3131282446
+92 361.2231139311 564.2347787901
+93 519.9475425732 347.9711417040
+94 129.3349741063 435.6692740389
+95 259.7172815016 454.6495181318
+96 676.3421890013 371.0979706551
+97 84.5133841706 183.3260738572
+98 77.7164048671 354.3833863300
+99 335.9802442534 660.6321896676
+100 264.3554717810 377.5743377274
+101 51.6826916855 676.0429509187
+102 692.1376849300 543.8010925819
+103 169.2191356800 547.8194325476
+104 194.0131482339 263.4791316822
+105 415.1928395332 78.9133571973
+106 415.0432204919 479.0801701569
+107 169.8389859939 245.6103433244
+108 525.0987124228 213.5063718969
+109 238.6851191283 33.4932910965
+110 116.2112467718 363.5742702940
+111 16.9283258126 656.5711014044
+112 434.3440768162 92.6996831431
+113 40.5253860363 424.6829615797
+114 530.4849979086 183.8390534273
+115 484.3595848990 49.2460387276
+116 263.6501248722 426.5852608187
+117 450.2891917862 126.3853415784
+118 441.7822805823 299.7724362653
+119 24.2169105375 500.3474481664
+120 503.7886861157 514.6895019799
+121 635.5389390312 200.9811207275
+122 614.5922732529 418.8691931188
+123 21.7161351334 660.9741760476
+124 143.8266469611 92.6996831431
+125 637.7191022040 54.2048412384
+126 566.5645610042 199.9551615873
+127 196.6849168280 221.8209157619
+128 384.9270448985 87.4630166986
+129 178.1107815614 104.6905805938
+130 403.2874386776 205.8971749407
+EOF
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/fl1400.tsp
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/fl1400.tsp	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/fl1400.tsp	(revision 4402)
@@ -0,0 +1,1407 @@
+NAME: fl1400
+COMMENT: Drilling problem (Reinelt)
+TYPE: TSP
+DIMENSION: 1400
+EDGE_WEIGHT_TYPE: EUC_2D
+NODE_COORD_SECTION
+1 2.10461e+03 1.96835e+03
+2 2.10461e+03 2.32264e+02
+3 2.95591e+02 1.96835e+03
+4 2.95591e+02 2.32264e+02
+5 1.02570e+03 1.97130e+03
+6 1.16167e+03 1.96539e+03
+7 1.19123e+03 1.95949e+03
+8 1.16759e+03 1.95949e+03
+9 1.09664e+03 1.95949e+03
+10 1.10256e+03 1.95358e+03
+11 1.09073e+03 1.95358e+03
+12 1.01979e+03 1.95358e+03
+13 1.23262e+03 1.94177e+03
+14 1.04344e+03 1.94177e+03
+15 1.23853e+03 1.93587e+03
+16 1.16759e+03 1.93587e+03
+17 1.13211e+03 1.93587e+03
+18 1.26809e+03 1.92996e+03
+19 1.24444e+03 1.92996e+03
+20 1.06708e+03 1.92996e+03
+21 1.17941e+03 1.92406e+03
+22 1.04935e+03 1.92406e+03
+23 1.03753e+03 1.92406e+03
+24 1.12620e+03 1.91815e+03
+25 1.09073e+03 1.91815e+03
+26 9.84319e+02 1.91815e+03
+27 1.32720e+03 1.90634e+03
+28 1.03161e+03 1.90634e+03
+29 9.96143e+02 1.90634e+03
+30 1.04935e+03 1.90044e+03
+31 1.18532e+03 1.89453e+03
+32 1.11438e+03 1.89453e+03
+33 1.31538e+03 1.88272e+03
+34 1.29173e+03 1.88272e+03
+35 1.07891e+03 1.88272e+03
+36 1.01388e+03 1.87682e+03
+37 1.73512e+03 1.74691e+03
+38 7.41934e+02 1.74691e+03
+39 1.72921e+03 1.74100e+03
+40 7.36022e+02 1.74100e+03
+41 1.52230e+03 1.72329e+03
+42 5.29108e+02 1.72329e+03
+43 1.18532e+03 1.64652e+03
+44 1.56959e+03 1.52252e+03
+45 5.76403e+02 1.52252e+03
+46 1.14985e+03 1.44575e+03
+47 6.17786e+02 1.44575e+03
+48 1.03161e+03 1.42213e+03
+49 1.10847e+03 1.41622e+03
+50 7.53758e+02 1.41622e+03
+51 1.03161e+03 1.41032e+03
+52 5.94138e+02 1.41032e+03
+53 7.59670e+02 1.39851e+03
+54 6.05962e+02 1.39851e+03
+55 7.53758e+02 1.27450e+03
+56 6.59169e+02 1.25088e+03
+57 1.26809e+03 1.24498e+03
+58 5.94138e+02 1.24498e+03
+59 6.11874e+02 1.22726e+03
+60 1.27991e+03 1.22136e+03
+61 6.59169e+02 1.15640e+03
+62 1.22670e+03 1.00287e+03
+63 1.14985e+03 9.96967e+02
+64 1.61097e+03 9.73347e+02
+65 1.03753e+03 8.02101e+02
+66 1.31538e+03 7.96196e+02
+67 1.11438e+03 7.96196e+02
+68 1.09073e+03 7.96196e+02
+69 1.27400e+03 7.90290e+02
+70 1.13211e+03 7.90290e+02
+71 1.10847e+03 7.90290e+02
+72 1.01388e+03 7.90290e+02
+73 1.26809e+03 7.84386e+02
+74 1.11438e+03 7.84386e+02
+75 1.03161e+03 7.84386e+02
+76 1.66418e+03 7.78481e+02
+77 1.23853e+03 7.78481e+02
+78 1.09664e+03 7.78481e+02
+79 1.04935e+03 7.78481e+02
+80 9.78407e+02 7.78481e+02
+81 1.23262e+03 7.72576e+02
+82 1.18532e+03 7.72576e+02
+83 1.07891e+03 7.72576e+02
+84 1.05526e+03 7.72576e+02
+85 1.01979e+03 7.72576e+02
+86 1.21488e+03 7.66670e+02
+87 1.19123e+03 7.66670e+02
+88 1.16759e+03 7.66670e+02
+89 1.08482e+03 7.66670e+02
+90 1.07300e+03 7.66670e+02
+91 1.23262e+03 7.60765e+02
+92 1.16167e+03 7.60765e+02
+93 1.26218e+03 7.54861e+02
+94 1.25035e+03 7.54861e+02
+95 1.17941e+03 7.54861e+02
+96 1.02570e+03 7.54861e+02
+97 1.26809e+03 7.48955e+02
+98 1.24444e+03 7.48955e+02
+99 1.17350e+03 7.48955e+02
+100 1.13211e+03 7.43050e+02
+101 1.12029e+03 7.43050e+02
+102 1.01979e+03 7.25335e+02
+103 9.96143e+02 7.25335e+02
+104 1.03753e+03 7.19430e+02
+105 1.00205e+03 7.19430e+02
+106 1.17350e+03 5.59994e+02
+107 1.61097e+03 5.48184e+02
+108 1.17350e+03 5.48184e+02
+109 1.22079e+03 5.36374e+02
+110 1.07300e+03 1.96539e+03
+111 1.04935e+03 1.96539e+03
+112 1.13803e+03 1.95949e+03
+113 1.11438e+03 1.95949e+03
+114 1.05526e+03 1.95949e+03
+115 1.73512e+03 1.95358e+03
+116 1.27400e+03 1.95358e+03
+117 1.25035e+03 1.95358e+03
+118 7.41934e+02 1.95358e+03
+119 1.06117e+03 1.94177e+03
+120 1.29173e+03 1.93587e+03
+121 1.21488e+03 1.92996e+03
+122 1.12029e+03 1.92996e+03
+123 1.09073e+03 1.92406e+03
+124 1.20306e+03 1.91815e+03
+125 1.20897e+03 1.91225e+03
+126 1.11438e+03 1.91225e+03
+127 1.22670e+03 1.90634e+03
+128 1.14394e+03 1.90634e+03
+129 1.29173e+03 1.90044e+03
+130 1.26809e+03 1.90044e+03
+131 1.30947e+03 1.89453e+03
+132 1.00205e+03 1.89453e+03
+133 9.78407e+02 1.88272e+03
+134 1.09073e+03 1.87682e+03
+135 1.56959e+03 1.87091e+03
+136 1.52230e+03 1.87091e+03
+137 1.15576e+03 1.87091e+03
+138 5.76403e+02 1.87091e+03
+139 5.29108e+02 1.87091e+03
+140 1.18532e+03 1.86501e+03
+141 1.09073e+03 1.86501e+03
+142 1.72921e+03 1.74691e+03
+143 7.36022e+02 1.74691e+03
+144 2.05436e+03 1.51661e+03
+145 1.16759e+03 1.51661e+03
+146 1.18532e+03 1.48708e+03
+147 3.10371e+02 1.48708e+03
+148 1.18532e+03 1.47528e+03
+149 6.11874e+02 1.42213e+03
+150 6.17786e+02 1.41622e+03
+151 5.40932e+02 1.41032e+03
+152 6.05962e+02 1.39260e+03
+153 5.82315e+02 1.39260e+03
+154 1.14985e+03 1.27450e+03
+155 7.59670e+02 1.27450e+03
+156 5.82315e+02 1.27450e+03
+157 1.03161e+03 1.22726e+03
+158 5.40932e+02 1.22136e+03
+159 1.26809e+03 1.15640e+03
+160 2.05436e+03 1.15050e+03
+161 1.16759e+03 1.15050e+03
+162 1.27991e+03 1.14459e+03
+163 1.18532e+03 1.05011e+03
+164 1.17350e+03 1.00287e+03
+165 1.66418e+03 9.96967e+02
+166 1.17941e+03 9.96967e+02
+167 1.32720e+03 8.02101e+02
+168 1.23262e+03 8.02101e+02
+169 1.09073e+03 8.02101e+02
+170 9.84319e+02 8.02101e+02
+171 1.17941e+03 7.96196e+02
+172 1.16759e+03 7.96196e+02
+173 1.08482e+03 7.96196e+02
+174 1.06117e+03 7.96196e+02
+175 1.23262e+03 7.90290e+02
+176 1.26218e+03 7.84386e+02
+177 1.15576e+03 7.84386e+02
+178 1.13211e+03 7.84386e+02
+179 1.04935e+03 7.84386e+02
+180 1.22079e+03 7.78481e+02
+181 1.13803e+03 7.78481e+02
+182 1.01979e+03 7.78481e+02
+183 1.20306e+03 7.72576e+02
+184 1.14985e+03 7.66670e+02
+185 1.11438e+03 7.66670e+02
+186 1.30947e+03 7.60765e+02
+187 1.14394e+03 7.60765e+02
+188 1.04935e+03 7.60765e+02
+189 1.20897e+03 7.54861e+02
+190 1.18532e+03 7.54861e+02
+191 1.12620e+03 7.54861e+02
+192 1.10256e+03 7.54861e+02
+193 1.09073e+03 7.54861e+02
+194 1.06708e+03 7.54861e+02
+195 1.03753e+03 7.48955e+02
+196 1.04344e+03 7.43050e+02
+197 1.03161e+03 7.43050e+02
+198 1.29173e+03 7.31240e+02
+199 1.23262e+03 7.31240e+02
+200 3.10371e+02 6.01329e+02
+201 1.22966e+03 1.94473e+03
+202 1.09960e+03 1.93292e+03
+203 1.20601e+03 1.92111e+03
+204 9.81363e+02 1.92111e+03
+205 1.14690e+03 1.90930e+03
+206 1.02866e+03 1.90930e+03
+207 1.07595e+03 1.88568e+03
+208 9.81363e+02 1.88568e+03
+209 2.05732e+03 1.51956e+03
+210 9.81363e+02 7.99148e+02
+211 9.81363e+02 7.75528e+02
+212 3.07415e+02 5.98377e+02
+213 1.16463e+03 1.96835e+03
+214 1.07004e+03 1.96835e+03
+215 1.05231e+03 1.96244e+03
+216 1.73217e+03 1.95654e+03
+217 1.27104e+03 1.95654e+03
+218 1.24740e+03 1.95654e+03
+219 1.02275e+03 1.95654e+03
+220 7.38978e+02 1.95654e+03
+221 1.04639e+03 1.94473e+03
+222 1.24740e+03 1.93292e+03
+223 1.16463e+03 1.93292e+03
+224 1.11733e+03 1.93292e+03
+225 1.07004e+03 1.93292e+03
+226 1.09960e+03 1.92701e+03
+227 1.09369e+03 1.92111e+03
+228 1.04639e+03 1.92111e+03
+229 1.22375e+03 1.90930e+03
+230 1.11733e+03 1.90930e+03
+231 9.99099e+02 1.90930e+03
+232 1.29469e+03 1.89748e+03
+233 1.27104e+03 1.89748e+03
+234 1.18828e+03 1.89748e+03
+235 9.99099e+02 1.89748e+03
+236 1.29469e+03 1.88568e+03
+237 1.56664e+03 1.87386e+03
+238 1.51934e+03 1.87386e+03
+239 1.09369e+03 1.87386e+03
+240 5.73447e+02 1.87386e+03
+241 5.26152e+02 1.87386e+03
+242 1.72625e+03 1.74986e+03
+243 7.33066e+02 1.74986e+03
+244 1.18828e+03 1.64947e+03
+245 1.16463e+03 1.51956e+03
+246 3.07415e+02 1.49004e+03
+247 6.08918e+02 1.42508e+03
+248 1.02866e+03 1.41918e+03
+249 6.20742e+02 1.41327e+03
+250 5.97094e+02 1.41327e+03
+251 5.37976e+02 1.41327e+03
+252 6.08918e+02 1.38965e+03
+253 1.15281e+03 1.27155e+03
+254 7.62626e+02 1.27155e+03
+255 7.50802e+02 1.27155e+03
+256 1.27104e+03 1.24793e+03
+257 1.28287e+03 1.22431e+03
+258 1.03457e+03 1.22431e+03
+259 6.56213e+02 1.15345e+03
+260 2.05732e+03 1.14755e+03
+261 1.18828e+03 1.04716e+03
+262 1.17054e+03 1.00583e+03
+263 1.66122e+03 9.99920e+02
+264 1.18237e+03 9.94014e+02
+265 1.61393e+03 9.76300e+02
+266 1.16463e+03 7.99148e+02
+267 1.09369e+03 7.99148e+02
+268 1.08186e+03 7.99148e+02
+269 1.03457e+03 7.99148e+02
+270 1.22966e+03 7.93243e+02
+271 1.27104e+03 7.87338e+02
+272 1.25922e+03 7.87338e+02
+273 1.12916e+03 7.87338e+02
+274 1.10551e+03 7.87338e+02
+275 1.03457e+03 7.87338e+02
+276 1.21784e+03 7.81433e+02
+277 1.05231e+03 7.81433e+02
+278 1.23557e+03 7.75528e+02
+279 1.18828e+03 7.75528e+02
+280 1.09369e+03 7.75528e+02
+281 1.02275e+03 7.75528e+02
+282 1.20601e+03 7.69623e+02
+283 1.07595e+03 7.69623e+02
+284 1.05231e+03 7.69623e+02
+285 1.23557e+03 7.63718e+02
+286 1.21193e+03 7.63718e+02
+287 1.18828e+03 7.63718e+02
+288 1.15281e+03 7.63718e+02
+289 1.11733e+03 7.63718e+02
+290 1.17645e+03 7.51908e+02
+291 1.12916e+03 7.51908e+02
+292 1.10551e+03 7.51908e+02
+293 1.03457e+03 7.51908e+02
+294 1.02275e+03 7.51908e+02
+295 1.17645e+03 5.62947e+02
+296 1.63167e+03 2.05102e+03
+297 1.63167e+03 2.03921e+03
+298 1.63167e+03 2.02740e+03
+299 1.61984e+03 2.05102e+03
+300 1.61984e+03 2.03921e+03
+301 1.61984e+03 2.02740e+03
+302 1.60802e+03 2.05102e+03
+303 1.60802e+03 2.03921e+03
+304 1.60802e+03 2.02740e+03
+305 1.59619e+03 2.05102e+03
+306 1.59619e+03 2.03921e+03
+307 1.59619e+03 2.02740e+03
+308 1.58437e+03 2.05102e+03
+309 1.58437e+03 2.03921e+03
+310 1.58437e+03 2.02740e+03
+311 1.57255e+03 2.05102e+03
+312 1.57255e+03 2.03921e+03
+313 1.57255e+03 2.02740e+03
+314 1.56072e+03 2.05102e+03
+315 1.56072e+03 2.03921e+03
+316 1.56072e+03 2.02740e+03
+317 1.54890e+03 2.05102e+03
+318 1.54890e+03 2.03921e+03
+319 1.54890e+03 2.02740e+03
+320 1.53708e+03 2.05102e+03
+321 1.53708e+03 2.03921e+03
+322 1.53708e+03 2.02740e+03
+323 1.52525e+03 2.05102e+03
+324 1.52525e+03 2.03921e+03
+325 1.52525e+03 2.02740e+03
+326 1.51343e+03 2.05102e+03
+327 1.51343e+03 2.03921e+03
+328 1.51343e+03 2.02740e+03
+329 1.50160e+03 2.05102e+03
+330 1.50160e+03 2.03921e+03
+331 1.50160e+03 2.02740e+03
+332 1.48978e+03 2.05102e+03
+333 1.48978e+03 2.03921e+03
+334 1.48978e+03 2.02740e+03
+335 1.62575e+03 2.04511e+03
+336 1.62575e+03 2.03330e+03
+337 1.61393e+03 2.04511e+03
+338 1.61393e+03 2.03330e+03
+339 1.60211e+03 2.04511e+03
+340 1.60211e+03 2.03330e+03
+341 1.59028e+03 2.04511e+03
+342 1.59028e+03 2.03330e+03
+343 1.57846e+03 2.04511e+03
+344 1.57846e+03 2.03330e+03
+345 1.56664e+03 2.04511e+03
+346 1.56664e+03 2.03330e+03
+347 1.55481e+03 2.04511e+03
+348 1.55481e+03 2.03330e+03
+349 1.54299e+03 2.04511e+03
+350 1.54299e+03 2.03330e+03
+351 1.53116e+03 2.04511e+03
+352 1.53116e+03 2.03330e+03
+353 1.51934e+03 2.04511e+03
+354 1.51934e+03 2.03330e+03
+355 1.50752e+03 2.04511e+03
+356 1.50752e+03 2.03330e+03
+357 1.49569e+03 2.04511e+03
+358 1.49569e+03 2.03330e+03
+359 1.62575e+03 2.05102e+03
+360 1.62575e+03 2.03921e+03
+361 1.62575e+03 2.02740e+03
+362 1.61393e+03 2.05102e+03
+363 1.61393e+03 2.03921e+03
+364 1.61393e+03 2.02740e+03
+365 1.60211e+03 2.05102e+03
+366 1.60211e+03 2.03921e+03
+367 1.60211e+03 2.02740e+03
+368 1.59028e+03 2.05102e+03
+369 1.59028e+03 2.03921e+03
+370 1.59028e+03 2.02740e+03
+371 1.57846e+03 2.05102e+03
+372 1.57846e+03 2.03921e+03
+373 1.57846e+03 2.02740e+03
+374 1.56664e+03 2.05102e+03
+375 1.56664e+03 2.03921e+03
+376 1.56664e+03 2.02740e+03
+377 1.55481e+03 2.05102e+03
+378 1.55481e+03 2.03921e+03
+379 1.55481e+03 2.02740e+03
+380 1.54299e+03 2.05102e+03
+381 1.54299e+03 2.03921e+03
+382 1.54299e+03 2.02740e+03
+383 1.53116e+03 2.05102e+03
+384 1.53116e+03 2.03921e+03
+385 1.53116e+03 2.02740e+03
+386 1.51934e+03 2.05102e+03
+387 1.51934e+03 2.03921e+03
+388 1.51934e+03 2.02740e+03
+389 1.50752e+03 2.05102e+03
+390 1.50752e+03 2.03921e+03
+391 1.50752e+03 2.02740e+03
+392 1.49569e+03 2.05102e+03
+393 1.49569e+03 2.03921e+03
+394 1.49569e+03 2.02740e+03
+395 1.63167e+03 2.04511e+03
+396 1.63167e+03 2.03330e+03
+397 1.61984e+03 2.04511e+03
+398 1.61984e+03 2.03330e+03
+399 1.60802e+03 2.04511e+03
+400 1.60802e+03 2.03330e+03
+401 1.59619e+03 2.04511e+03
+402 1.59619e+03 2.03330e+03
+403 1.58437e+03 2.04511e+03
+404 1.58437e+03 2.03330e+03
+405 1.57255e+03 2.04511e+03
+406 1.57255e+03 2.03330e+03
+407 1.56072e+03 2.04511e+03
+408 1.56072e+03 2.03330e+03
+409 1.54890e+03 2.04511e+03
+410 1.54890e+03 2.03330e+03
+411 1.53708e+03 2.04511e+03
+412 1.53708e+03 2.03330e+03
+413 1.52525e+03 2.04511e+03
+414 1.52525e+03 2.03330e+03
+415 1.51343e+03 2.04511e+03
+416 1.51343e+03 2.03330e+03
+417 1.50160e+03 2.04511e+03
+418 1.50160e+03 2.03330e+03
+419 1.48978e+03 2.04511e+03
+420 1.48978e+03 2.03330e+03
+421 1.62871e+03 2.04806e+03
+422 1.62871e+03 2.03625e+03
+423 1.61689e+03 2.04806e+03
+424 1.61689e+03 2.03625e+03
+425 1.60506e+03 2.04806e+03
+426 1.60506e+03 2.03625e+03
+427 1.59324e+03 2.04806e+03
+428 1.59324e+03 2.03625e+03
+429 1.58141e+03 2.04806e+03
+430 1.58141e+03 2.03625e+03
+431 1.56959e+03 2.04806e+03
+432 1.56959e+03 2.03625e+03
+433 1.55777e+03 2.04806e+03
+434 1.55777e+03 2.03625e+03
+435 1.54594e+03 2.04806e+03
+436 1.54594e+03 2.03625e+03
+437 1.53412e+03 2.04806e+03
+438 1.53412e+03 2.03625e+03
+439 1.52230e+03 2.04806e+03
+440 1.52230e+03 2.03625e+03
+441 1.51047e+03 2.04806e+03
+442 1.51047e+03 2.03625e+03
+443 1.49865e+03 2.04806e+03
+444 1.49865e+03 2.03625e+03
+445 1.62280e+03 2.04216e+03
+446 1.62280e+03 2.03035e+03
+447 1.61097e+03 2.04216e+03
+448 1.61097e+03 2.03035e+03
+449 1.59915e+03 2.04216e+03
+450 1.59915e+03 2.03035e+03
+451 1.58733e+03 2.04216e+03
+452 1.58733e+03 2.03035e+03
+453 1.57550e+03 2.04216e+03
+454 1.57550e+03 2.03035e+03
+455 1.56368e+03 2.04216e+03
+456 1.56368e+03 2.03035e+03
+457 1.55185e+03 2.04216e+03
+458 1.55185e+03 2.03035e+03
+459 1.54003e+03 2.04216e+03
+460 1.54003e+03 2.03035e+03
+461 1.52821e+03 2.04216e+03
+462 1.52821e+03 2.03035e+03
+463 1.51638e+03 2.04216e+03
+464 1.51638e+03 2.03035e+03
+465 1.50456e+03 2.04216e+03
+466 1.50456e+03 2.03035e+03
+467 1.49274e+03 2.04216e+03
+468 1.49274e+03 2.03035e+03
+469 1.62871e+03 2.04216e+03
+470 1.62871e+03 2.03035e+03
+471 1.61689e+03 2.04216e+03
+472 1.61689e+03 2.03035e+03
+473 1.60506e+03 2.04216e+03
+474 1.60506e+03 2.03035e+03
+475 1.59324e+03 2.04216e+03
+476 1.59324e+03 2.03035e+03
+477 1.58141e+03 2.04216e+03
+478 1.58141e+03 2.03035e+03
+479 1.56959e+03 2.04216e+03
+480 1.56959e+03 2.03035e+03
+481 1.55777e+03 2.04216e+03
+482 1.55777e+03 2.03035e+03
+483 1.54594e+03 2.04216e+03
+484 1.54594e+03 2.03035e+03
+485 1.53412e+03 2.04216e+03
+486 1.53412e+03 2.03035e+03
+487 1.52230e+03 2.04216e+03
+488 1.52230e+03 2.03035e+03
+489 1.51047e+03 2.04216e+03
+490 1.51047e+03 2.03035e+03
+491 1.49865e+03 2.04216e+03
+492 1.49865e+03 2.03035e+03
+493 1.62280e+03 2.04806e+03
+494 1.62280e+03 2.03625e+03
+495 1.61097e+03 2.04806e+03
+496 1.61097e+03 2.03625e+03
+497 1.59915e+03 2.04806e+03
+498 1.59915e+03 2.03625e+03
+499 1.58733e+03 2.04806e+03
+500 1.58733e+03 2.03625e+03
+501 1.57550e+03 2.04806e+03
+502 1.57550e+03 2.03625e+03
+503 1.56368e+03 2.04806e+03
+504 1.56368e+03 2.03625e+03
+505 1.55185e+03 2.04806e+03
+506 1.55185e+03 2.03625e+03
+507 1.54003e+03 2.04806e+03
+508 1.54003e+03 2.03625e+03
+509 1.52821e+03 2.04806e+03
+510 1.52821e+03 2.03625e+03
+511 1.51638e+03 2.04806e+03
+512 1.51638e+03 2.03625e+03
+513 1.50456e+03 2.04806e+03
+514 1.50456e+03 2.03625e+03
+515 1.49274e+03 2.04806e+03
+516 1.49274e+03 2.03625e+03
+517 6.50302e+02 2.05102e+03
+518 6.50302e+02 2.03921e+03
+519 6.50302e+02 2.02740e+03
+520 6.38478e+02 2.05102e+03
+521 6.38478e+02 2.03921e+03
+522 6.38478e+02 2.02740e+03
+523 6.26655e+02 2.05102e+03
+524 6.26655e+02 2.03921e+03
+525 6.26655e+02 2.02740e+03
+526 6.14831e+02 2.05102e+03
+527 6.14831e+02 2.03921e+03
+528 6.14831e+02 2.02740e+03
+529 6.03007e+02 2.05102e+03
+530 6.03007e+02 2.03921e+03
+531 6.03007e+02 2.02740e+03
+532 5.91184e+02 2.05102e+03
+533 5.91184e+02 2.03921e+03
+534 5.91184e+02 2.02740e+03
+535 5.79360e+02 2.05102e+03
+536 5.79360e+02 2.03921e+03
+537 5.79360e+02 2.02740e+03
+538 5.67537e+02 2.05102e+03
+539 5.67537e+02 2.03921e+03
+540 5.67537e+02 2.02740e+03
+541 5.55713e+02 2.05102e+03
+542 5.55713e+02 2.03921e+03
+543 5.55713e+02 2.02740e+03
+544 5.43889e+02 2.05102e+03
+545 5.43889e+02 2.03921e+03
+546 5.43889e+02 2.02740e+03
+547 5.32066e+02 2.05102e+03
+548 5.32066e+02 2.03921e+03
+549 5.32066e+02 2.02740e+03
+550 5.20242e+02 2.05102e+03
+551 5.20242e+02 2.03921e+03
+552 5.20242e+02 2.02740e+03
+553 5.08418e+02 2.05102e+03
+554 5.08418e+02 2.03921e+03
+555 5.08418e+02 2.02740e+03
+556 6.44390e+02 2.04511e+03
+557 6.44390e+02 2.03330e+03
+558 6.32566e+02 2.04511e+03
+559 6.32566e+02 2.03330e+03
+560 6.20743e+02 2.04511e+03
+561 6.20743e+02 2.03330e+03
+562 6.08919e+02 2.04511e+03
+563 6.08919e+02 2.03330e+03
+564 5.97096e+02 2.04511e+03
+565 5.97096e+02 2.03330e+03
+566 5.85272e+02 2.04511e+03
+567 5.85272e+02 2.03330e+03
+568 5.73448e+02 2.04511e+03
+569 5.73448e+02 2.03330e+03
+570 5.61625e+02 2.04511e+03
+571 5.61625e+02 2.03330e+03
+572 5.49801e+02 2.04511e+03
+573 5.49801e+02 2.03330e+03
+574 5.37977e+02 2.04511e+03
+575 5.37977e+02 2.03330e+03
+576 5.26153e+02 2.04511e+03
+577 5.26153e+02 2.03330e+03
+578 5.14330e+02 2.04511e+03
+579 5.14330e+02 2.03330e+03
+580 6.44390e+02 2.05102e+03
+581 6.44390e+02 2.03921e+03
+582 6.44390e+02 2.02740e+03
+583 6.32566e+02 2.05102e+03
+584 6.32566e+02 2.03921e+03
+585 6.32566e+02 2.02740e+03
+586 6.20743e+02 2.05102e+03
+587 6.20743e+02 2.03921e+03
+588 6.20743e+02 2.02740e+03
+589 6.08919e+02 2.05102e+03
+590 6.08919e+02 2.03921e+03
+591 6.08919e+02 2.02740e+03
+592 5.97096e+02 2.05102e+03
+593 5.97096e+02 2.03921e+03
+594 5.97096e+02 2.02740e+03
+595 5.85272e+02 2.05102e+03
+596 5.85272e+02 2.03921e+03
+597 5.85272e+02 2.02740e+03
+598 5.73448e+02 2.05102e+03
+599 5.73448e+02 2.03921e+03
+600 5.73448e+02 2.02740e+03
+601 5.61625e+02 2.05102e+03
+602 5.61625e+02 2.03921e+03
+603 5.61625e+02 2.02740e+03
+604 5.49801e+02 2.05102e+03
+605 5.49801e+02 2.03921e+03
+606 5.49801e+02 2.02740e+03
+607 5.37977e+02 2.05102e+03
+608 5.37977e+02 2.03921e+03
+609 5.37977e+02 2.02740e+03
+610 5.26153e+02 2.05102e+03
+611 5.26153e+02 2.03921e+03
+612 5.26153e+02 2.02740e+03
+613 5.14330e+02 2.05102e+03
+614 5.14330e+02 2.03921e+03
+615 5.14330e+02 2.02740e+03
+616 6.50302e+02 2.04511e+03
+617 6.50302e+02 2.03330e+03
+618 6.38478e+02 2.04511e+03
+619 6.38478e+02 2.03330e+03
+620 6.26655e+02 2.04511e+03
+621 6.26655e+02 2.03330e+03
+622 6.14831e+02 2.04511e+03
+623 6.14831e+02 2.03330e+03
+624 6.03007e+02 2.04511e+03
+625 6.03007e+02 2.03330e+03
+626 5.91184e+02 2.04511e+03
+627 5.91184e+02 2.03330e+03
+628 5.79360e+02 2.04511e+03
+629 5.79360e+02 2.03330e+03
+630 5.67537e+02 2.04511e+03
+631 5.67537e+02 2.03330e+03
+632 5.55713e+02 2.04511e+03
+633 5.55713e+02 2.03330e+03
+634 5.43889e+02 2.04511e+03
+635 5.43889e+02 2.03330e+03
+636 5.32066e+02 2.04511e+03
+637 5.32066e+02 2.03330e+03
+638 5.20242e+02 2.04511e+03
+639 5.20242e+02 2.03330e+03
+640 5.08418e+02 2.04511e+03
+641 5.08418e+02 2.03330e+03
+642 6.47346e+02 2.04806e+03
+643 6.47346e+02 2.03625e+03
+644 6.35522e+02 2.04806e+03
+645 6.35522e+02 2.03625e+03
+646 6.23699e+02 2.04806e+03
+647 6.23699e+02 2.03625e+03
+648 6.11875e+02 2.04806e+03
+649 6.11875e+02 2.03625e+03
+650 6.00051e+02 2.04806e+03
+651 6.00051e+02 2.03625e+03
+652 5.88228e+02 2.04806e+03
+653 5.88228e+02 2.03625e+03
+654 5.76404e+02 2.04806e+03
+655 5.76404e+02 2.03625e+03
+656 5.64581e+02 2.04806e+03
+657 5.64581e+02 2.03625e+03
+658 5.52757e+02 2.04806e+03
+659 5.52757e+02 2.03625e+03
+660 5.40933e+02 2.04806e+03
+661 5.40933e+02 2.03625e+03
+662 5.29109e+02 2.04806e+03
+663 5.29109e+02 2.03625e+03
+664 5.17286e+02 2.04806e+03
+665 5.17286e+02 2.03625e+03
+666 6.41434e+02 2.04216e+03
+667 6.41434e+02 2.03035e+03
+668 6.29611e+02 2.04216e+03
+669 6.29611e+02 2.03035e+03
+670 6.17787e+02 2.04216e+03
+671 6.17787e+02 2.03035e+03
+672 6.05963e+02 2.04216e+03
+673 6.05963e+02 2.03035e+03
+674 5.94140e+02 2.04216e+03
+675 5.94140e+02 2.03035e+03
+676 5.82316e+02 2.04216e+03
+677 5.82316e+02 2.03035e+03
+678 5.70492e+02 2.04216e+03
+679 5.70492e+02 2.03035e+03
+680 5.58669e+02 2.04216e+03
+681 5.58669e+02 2.03035e+03
+682 5.46845e+02 2.04216e+03
+683 5.46845e+02 2.03035e+03
+684 5.35022e+02 2.04216e+03
+685 5.35022e+02 2.03035e+03
+686 5.23198e+02 2.04216e+03
+687 5.23198e+02 2.03035e+03
+688 5.11374e+02 2.04216e+03
+689 5.11374e+02 2.03035e+03
+690 6.47346e+02 2.04216e+03
+691 6.47346e+02 2.03035e+03
+692 6.35522e+02 2.04216e+03
+693 6.35522e+02 2.03035e+03
+694 6.23699e+02 2.04216e+03
+695 6.23699e+02 2.03035e+03
+696 6.11875e+02 2.04216e+03
+697 6.11875e+02 2.03035e+03
+698 6.00051e+02 2.04216e+03
+699 6.00051e+02 2.03035e+03
+700 5.88228e+02 2.04216e+03
+701 5.88228e+02 2.03035e+03
+702 5.76404e+02 2.04216e+03
+703 5.76404e+02 2.03035e+03
+704 5.64581e+02 2.04216e+03
+705 5.64581e+02 2.03035e+03
+706 5.52757e+02 2.04216e+03
+707 5.52757e+02 2.03035e+03
+708 5.40933e+02 2.04216e+03
+709 5.40933e+02 2.03035e+03
+710 5.29109e+02 2.04216e+03
+711 5.29109e+02 2.03035e+03
+712 5.17286e+02 2.04216e+03
+713 5.17286e+02 2.03035e+03
+714 6.41434e+02 2.04806e+03
+715 6.41434e+02 2.03625e+03
+716 6.29611e+02 2.04806e+03
+717 6.29611e+02 2.03625e+03
+718 6.17787e+02 2.04806e+03
+719 6.17787e+02 2.03625e+03
+720 6.05963e+02 2.04806e+03
+721 6.05963e+02 2.03625e+03
+722 5.94140e+02 2.04806e+03
+723 5.94140e+02 2.03625e+03
+724 5.82316e+02 2.04806e+03
+725 5.82316e+02 2.03625e+03
+726 5.70492e+02 2.04806e+03
+727 5.70492e+02 2.03625e+03
+728 5.58669e+02 2.04806e+03
+729 5.58669e+02 2.03625e+03
+730 5.46845e+02 2.04806e+03
+731 5.46845e+02 2.03625e+03
+732 5.35022e+02 2.04806e+03
+733 5.35022e+02 2.03625e+03
+734 5.23198e+02 2.04806e+03
+735 5.23198e+02 2.03625e+03
+736 5.11374e+02 2.04806e+03
+737 5.11374e+02 2.03625e+03
+738 1.63167e+03 1.73215e+02
+739 1.63167e+03 1.61405e+02
+740 1.63167e+03 1.49595e+02
+741 1.61984e+03 1.73215e+02
+742 1.61984e+03 1.61405e+02
+743 1.61984e+03 1.49595e+02
+744 1.60802e+03 1.73215e+02
+745 1.60802e+03 1.61405e+02
+746 1.60802e+03 1.49595e+02
+747 1.59619e+03 1.73215e+02
+748 1.59619e+03 1.61405e+02
+749 1.59619e+03 1.49595e+02
+750 1.58437e+03 1.73215e+02
+751 1.58437e+03 1.61405e+02
+752 1.58437e+03 1.49595e+02
+753 1.57255e+03 1.73215e+02
+754 1.57255e+03 1.61405e+02
+755 1.57255e+03 1.49595e+02
+756 1.56072e+03 1.73215e+02
+757 1.56072e+03 1.61405e+02
+758 1.56072e+03 1.49595e+02
+759 1.54890e+03 1.73215e+02
+760 1.54890e+03 1.61405e+02
+761 1.54890e+03 1.49595e+02
+762 1.53708e+03 1.73215e+02
+763 1.53708e+03 1.61405e+02
+764 1.53708e+03 1.49595e+02
+765 1.52525e+03 1.73215e+02
+766 1.52525e+03 1.61405e+02
+767 1.52525e+03 1.49595e+02
+768 1.51343e+03 1.73215e+02
+769 1.51343e+03 1.61405e+02
+770 1.51343e+03 1.49595e+02
+771 1.50160e+03 1.73215e+02
+772 1.50160e+03 1.61405e+02
+773 1.50160e+03 1.49595e+02
+774 1.48978e+03 1.73215e+02
+775 1.48978e+03 1.61405e+02
+776 1.48978e+03 1.49595e+02
+777 1.62575e+03 1.67310e+02
+778 1.62575e+03 1.55500e+02
+779 1.61393e+03 1.67310e+02
+780 1.61393e+03 1.55500e+02
+781 1.60211e+03 1.67310e+02
+782 1.60211e+03 1.55500e+02
+783 1.59028e+03 1.67310e+02
+784 1.59028e+03 1.55500e+02
+785 1.57846e+03 1.67310e+02
+786 1.57846e+03 1.55500e+02
+787 1.56664e+03 1.67310e+02
+788 1.56664e+03 1.55500e+02
+789 1.55481e+03 1.67310e+02
+790 1.55481e+03 1.55500e+02
+791 1.54299e+03 1.67310e+02
+792 1.54299e+03 1.55500e+02
+793 1.53116e+03 1.67310e+02
+794 1.53116e+03 1.55500e+02
+795 1.51934e+03 1.67310e+02
+796 1.51934e+03 1.55500e+02
+797 1.50752e+03 1.67310e+02
+798 1.50752e+03 1.55500e+02
+799 1.49569e+03 1.67310e+02
+800 1.49569e+03 1.55500e+02
+801 1.62575e+03 1.73215e+02
+802 1.62575e+03 1.61405e+02
+803 1.62575e+03 1.49595e+02
+804 1.61393e+03 1.73215e+02
+805 1.61393e+03 1.61405e+02
+806 1.61393e+03 1.49595e+02
+807 1.60211e+03 1.73215e+02
+808 1.60211e+03 1.61405e+02
+809 1.60211e+03 1.49595e+02
+810 1.59028e+03 1.73215e+02
+811 1.59028e+03 1.61405e+02
+812 1.59028e+03 1.49595e+02
+813 1.57846e+03 1.73215e+02
+814 1.57846e+03 1.61405e+02
+815 1.57846e+03 1.49595e+02
+816 1.56664e+03 1.73215e+02
+817 1.56664e+03 1.61405e+02
+818 1.56664e+03 1.49595e+02
+819 1.55481e+03 1.73215e+02
+820 1.55481e+03 1.61405e+02
+821 1.55481e+03 1.49595e+02
+822 1.54299e+03 1.73215e+02
+823 1.54299e+03 1.61405e+02
+824 1.54299e+03 1.49595e+02
+825 1.53116e+03 1.73215e+02
+826 1.53116e+03 1.61405e+02
+827 1.53116e+03 1.49595e+02
+828 1.51934e+03 1.73215e+02
+829 1.51934e+03 1.61405e+02
+830 1.51934e+03 1.49595e+02
+831 1.50752e+03 1.73215e+02
+832 1.50752e+03 1.61405e+02
+833 1.50752e+03 1.49595e+02
+834 1.49569e+03 1.73215e+02
+835 1.49569e+03 1.61405e+02
+836 1.49569e+03 1.49595e+02
+837 1.63167e+03 1.67310e+02
+838 1.63167e+03 1.55500e+02
+839 1.61984e+03 1.67310e+02
+840 1.61984e+03 1.55500e+02
+841 1.60802e+03 1.67310e+02
+842 1.60802e+03 1.55500e+02
+843 1.59619e+03 1.67310e+02
+844 1.59619e+03 1.55500e+02
+845 1.58437e+03 1.67310e+02
+846 1.58437e+03 1.55500e+02
+847 1.57255e+03 1.67310e+02
+848 1.57255e+03 1.55500e+02
+849 1.56072e+03 1.67310e+02
+850 1.56072e+03 1.55500e+02
+851 1.54890e+03 1.67310e+02
+852 1.54890e+03 1.55500e+02
+853 1.53708e+03 1.67310e+02
+854 1.53708e+03 1.55500e+02
+855 1.52525e+03 1.67310e+02
+856 1.52525e+03 1.55500e+02
+857 1.51343e+03 1.67310e+02
+858 1.51343e+03 1.55500e+02
+859 1.50160e+03 1.67310e+02
+860 1.50160e+03 1.55500e+02
+861 1.48978e+03 1.67310e+02
+862 1.48978e+03 1.55500e+02
+863 1.62871e+03 1.70262e+02
+864 1.62871e+03 1.58452e+02
+865 1.61689e+03 1.70262e+02
+866 1.61689e+03 1.58452e+02
+867 1.60506e+03 1.70262e+02
+868 1.60506e+03 1.58452e+02
+869 1.59324e+03 1.70262e+02
+870 1.59324e+03 1.58452e+02
+871 1.58141e+03 1.70262e+02
+872 1.58141e+03 1.58452e+02
+873 1.56959e+03 1.70262e+02
+874 1.56959e+03 1.58452e+02
+875 1.55777e+03 1.70262e+02
+876 1.55777e+03 1.58452e+02
+877 1.54594e+03 1.70262e+02
+878 1.54594e+03 1.58452e+02
+879 1.53412e+03 1.70262e+02
+880 1.53412e+03 1.58452e+02
+881 1.52230e+03 1.70262e+02
+882 1.52230e+03 1.58452e+02
+883 1.51047e+03 1.70262e+02
+884 1.51047e+03 1.58452e+02
+885 1.49865e+03 1.70262e+02
+886 1.49865e+03 1.58452e+02
+887 1.62280e+03 1.64357e+02
+888 1.62280e+03 1.52547e+02
+889 1.61097e+03 1.64357e+02
+890 1.61097e+03 1.52547e+02
+891 1.59915e+03 1.64357e+02
+892 1.59915e+03 1.52547e+02
+893 1.58733e+03 1.64357e+02
+894 1.58733e+03 1.52547e+02
+895 1.57550e+03 1.64357e+02
+896 1.57550e+03 1.52547e+02
+897 1.56368e+03 1.64357e+02
+898 1.56368e+03 1.52547e+02
+899 1.55185e+03 1.64357e+02
+900 1.55185e+03 1.52547e+02
+901 1.54003e+03 1.64357e+02
+902 1.54003e+03 1.52547e+02
+903 1.52821e+03 1.64357e+02
+904 1.52821e+03 1.52547e+02
+905 1.51638e+03 1.64357e+02
+906 1.51638e+03 1.52547e+02
+907 1.50456e+03 1.64357e+02
+908 1.50456e+03 1.52547e+02
+909 1.49274e+03 1.64357e+02
+910 1.49274e+03 1.52547e+02
+911 1.62871e+03 1.64357e+02
+912 1.62871e+03 1.52547e+02
+913 1.61689e+03 1.64357e+02
+914 1.61689e+03 1.52547e+02
+915 1.60506e+03 1.64357e+02
+916 1.60506e+03 1.52547e+02
+917 1.59324e+03 1.64357e+02
+918 1.59324e+03 1.52547e+02
+919 1.58141e+03 1.64357e+02
+920 1.58141e+03 1.52547e+02
+921 1.56959e+03 1.64357e+02
+922 1.56959e+03 1.52547e+02
+923 1.55777e+03 1.64357e+02
+924 1.55777e+03 1.52547e+02
+925 1.54594e+03 1.64357e+02
+926 1.54594e+03 1.52547e+02
+927 1.53412e+03 1.64357e+02
+928 1.53412e+03 1.52547e+02
+929 1.52230e+03 1.64357e+02
+930 1.52230e+03 1.52547e+02
+931 1.51047e+03 1.64357e+02
+932 1.51047e+03 1.52547e+02
+933 1.49865e+03 1.64357e+02
+934 1.49865e+03 1.52547e+02
+935 1.62280e+03 1.70262e+02
+936 1.62280e+03 1.58452e+02
+937 1.61097e+03 1.70262e+02
+938 1.61097e+03 1.58452e+02
+939 1.59915e+03 1.70262e+02
+940 1.59915e+03 1.58452e+02
+941 1.58733e+03 1.70262e+02
+942 1.58733e+03 1.58452e+02
+943 1.57550e+03 1.70262e+02
+944 1.57550e+03 1.58452e+02
+945 1.56368e+03 1.70262e+02
+946 1.56368e+03 1.58452e+02
+947 1.55185e+03 1.70262e+02
+948 1.55185e+03 1.58452e+02
+949 1.54003e+03 1.70262e+02
+950 1.54003e+03 1.58452e+02
+951 1.52821e+03 1.70262e+02
+952 1.52821e+03 1.58452e+02
+953 1.51638e+03 1.70262e+02
+954 1.51638e+03 1.58452e+02
+955 1.50456e+03 1.70262e+02
+956 1.50456e+03 1.58452e+02
+957 1.49274e+03 1.70262e+02
+958 1.49274e+03 1.58452e+02
+959 6.50302e+02 1.73215e+02
+960 6.50302e+02 1.61405e+02
+961 6.50302e+02 1.49595e+02
+962 6.38478e+02 1.73215e+02
+963 6.38478e+02 1.61405e+02
+964 6.38478e+02 1.49595e+02
+965 6.26655e+02 1.73215e+02
+966 6.26655e+02 1.61405e+02
+967 6.26655e+02 1.49595e+02
+968 6.14831e+02 1.73215e+02
+969 6.14831e+02 1.61405e+02
+970 6.14831e+02 1.49595e+02
+971 6.03007e+02 1.73215e+02
+972 6.03007e+02 1.61405e+02
+973 6.03007e+02 1.49595e+02
+974 5.91184e+02 1.73215e+02
+975 5.91184e+02 1.61405e+02
+976 5.91184e+02 1.49595e+02
+977 5.79360e+02 1.73215e+02
+978 5.79360e+02 1.61405e+02
+979 5.79360e+02 1.49595e+02
+980 5.67537e+02 1.73215e+02
+981 5.67537e+02 1.61405e+02
+982 5.67537e+02 1.49595e+02
+983 5.55713e+02 1.73215e+02
+984 5.55713e+02 1.61405e+02
+985 5.55713e+02 1.49595e+02
+986 5.43889e+02 1.73215e+02
+987 5.43889e+02 1.61405e+02
+988 5.43889e+02 1.49595e+02
+989 5.32066e+02 1.73215e+02
+990 5.32066e+02 1.61405e+02
+991 5.32066e+02 1.49595e+02
+992 5.20242e+02 1.73215e+02
+993 5.20242e+02 1.61405e+02
+994 5.20242e+02 1.49595e+02
+995 5.08418e+02 1.73215e+02
+996 5.08418e+02 1.61405e+02
+997 5.08418e+02 1.49595e+02
+998 6.44390e+02 1.67310e+02
+999 6.44390e+02 1.55500e+02
+1000 6.32566e+02 1.67310e+02
+1001 6.32566e+02 1.55500e+02
+1002 6.20743e+02 1.67310e+02
+1003 6.20743e+02 1.55500e+02
+1004 6.08919e+02 1.67310e+02
+1005 6.08919e+02 1.55500e+02
+1006 5.97096e+02 1.67310e+02
+1007 5.97096e+02 1.55500e+02
+1008 5.85272e+02 1.67310e+02
+1009 5.85272e+02 1.55500e+02
+1010 5.73448e+02 1.67310e+02
+1011 5.73448e+02 1.55500e+02
+1012 5.61625e+02 1.67310e+02
+1013 5.61625e+02 1.55500e+02
+1014 5.49801e+02 1.67310e+02
+1015 5.49801e+02 1.55500e+02
+1016 5.37977e+02 1.67310e+02
+1017 5.37977e+02 1.55500e+02
+1018 5.26153e+02 1.67310e+02
+1019 5.26153e+02 1.55500e+02
+1020 5.14330e+02 1.67310e+02
+1021 5.14330e+02 1.55500e+02
+1022 6.44390e+02 1.73215e+02
+1023 6.44390e+02 1.61405e+02
+1024 6.44390e+02 1.49595e+02
+1025 6.32566e+02 1.73215e+02
+1026 6.32566e+02 1.61405e+02
+1027 6.32566e+02 1.49595e+02
+1028 6.20743e+02 1.73215e+02
+1029 6.20743e+02 1.61405e+02
+1030 6.20743e+02 1.49595e+02
+1031 6.08919e+02 1.73215e+02
+1032 6.08919e+02 1.61405e+02
+1033 6.08919e+02 1.49595e+02
+1034 5.97096e+02 1.73215e+02
+1035 5.97096e+02 1.61405e+02
+1036 5.97096e+02 1.49595e+02
+1037 5.85272e+02 1.73215e+02
+1038 5.85272e+02 1.61405e+02
+1039 5.85272e+02 1.49595e+02
+1040 5.73448e+02 1.73215e+02
+1041 5.73448e+02 1.61405e+02
+1042 5.73448e+02 1.49595e+02
+1043 5.61625e+02 1.73215e+02
+1044 5.61625e+02 1.61405e+02
+1045 5.61625e+02 1.49595e+02
+1046 5.49801e+02 1.73215e+02
+1047 5.49801e+02 1.61405e+02
+1048 5.49801e+02 1.49595e+02
+1049 5.37977e+02 1.73215e+02
+1050 5.37977e+02 1.61405e+02
+1051 5.37977e+02 1.49595e+02
+1052 5.26153e+02 1.73215e+02
+1053 5.26153e+02 1.61405e+02
+1054 5.26153e+02 1.49595e+02
+1055 5.14330e+02 1.73215e+02
+1056 5.14330e+02 1.61405e+02
+1057 5.14330e+02 1.49595e+02
+1058 6.50302e+02 1.67310e+02
+1059 6.50302e+02 1.55500e+02
+1060 6.38478e+02 1.67310e+02
+1061 6.38478e+02 1.55500e+02
+1062 6.26655e+02 1.67310e+02
+1063 6.26655e+02 1.55500e+02
+1064 6.14831e+02 1.67310e+02
+1065 6.14831e+02 1.55500e+02
+1066 6.03007e+02 1.67310e+02
+1067 6.03007e+02 1.55500e+02
+1068 5.91184e+02 1.67310e+02
+1069 5.91184e+02 1.55500e+02
+1070 5.79360e+02 1.67310e+02
+1071 5.79360e+02 1.55500e+02
+1072 5.67537e+02 1.67310e+02
+1073 5.67537e+02 1.55500e+02
+1074 5.55713e+02 1.67310e+02
+1075 5.55713e+02 1.55500e+02
+1076 5.43889e+02 1.67310e+02
+1077 5.43889e+02 1.55500e+02
+1078 5.32066e+02 1.67310e+02
+1079 5.32066e+02 1.55500e+02
+1080 5.20242e+02 1.67310e+02
+1081 5.20242e+02 1.55500e+02
+1082 5.08418e+02 1.67310e+02
+1083 5.08418e+02 1.55500e+02
+1084 6.47346e+02 1.70262e+02
+1085 6.47346e+02 1.58452e+02
+1086 6.35522e+02 1.70262e+02
+1087 6.35522e+02 1.58452e+02
+1088 6.23699e+02 1.70262e+02
+1089 6.23699e+02 1.58452e+02
+1090 6.11875e+02 1.70262e+02
+1091 6.11875e+02 1.58452e+02
+1092 6.00051e+02 1.70262e+02
+1093 6.00051e+02 1.58452e+02
+1094 5.88228e+02 1.70262e+02
+1095 5.88228e+02 1.58452e+02
+1096 5.76404e+02 1.70262e+02
+1097 5.76404e+02 1.58452e+02
+1098 5.64581e+02 1.70262e+02
+1099 5.64581e+02 1.58452e+02
+1100 5.52757e+02 1.70262e+02
+1101 5.52757e+02 1.58452e+02
+1102 5.40933e+02 1.70262e+02
+1103 5.40933e+02 1.58452e+02
+1104 5.29109e+02 1.70262e+02
+1105 5.29109e+02 1.58452e+02
+1106 5.17286e+02 1.70262e+02
+1107 5.17286e+02 1.58452e+02
+1108 6.41434e+02 1.64357e+02
+1109 6.41434e+02 1.52547e+02
+1110 6.29611e+02 1.64357e+02
+1111 6.29611e+02 1.52547e+02
+1112 6.17787e+02 1.64357e+02
+1113 6.17787e+02 1.52547e+02
+1114 6.05963e+02 1.64357e+02
+1115 6.05963e+02 1.52547e+02
+1116 5.94140e+02 1.64357e+02
+1117 5.94140e+02 1.52547e+02
+1118 5.82316e+02 1.64357e+02
+1119 5.82316e+02 1.52547e+02
+1120 5.70492e+02 1.64357e+02
+1121 5.70492e+02 1.52547e+02
+1122 5.58669e+02 1.64357e+02
+1123 5.58669e+02 1.52547e+02
+1124 5.46845e+02 1.64357e+02
+1125 5.46845e+02 1.52547e+02
+1126 5.35022e+02 1.64357e+02
+1127 5.35022e+02 1.52547e+02
+1128 5.23198e+02 1.64357e+02
+1129 5.23198e+02 1.52547e+02
+1130 5.11374e+02 1.64357e+02
+1131 5.11374e+02 1.52547e+02
+1132 6.47346e+02 1.64357e+02
+1133 6.47346e+02 1.52547e+02
+1134 6.35522e+02 1.64357e+02
+1135 6.35522e+02 1.52547e+02
+1136 6.23699e+02 1.64357e+02
+1137 6.23699e+02 1.52547e+02
+1138 6.11875e+02 1.64357e+02
+1139 6.11875e+02 1.52547e+02
+1140 6.00051e+02 1.64357e+02
+1141 6.00051e+02 1.52547e+02
+1142 5.88228e+02 1.64357e+02
+1143 5.88228e+02 1.52547e+02
+1144 5.76404e+02 1.64357e+02
+1145 5.76404e+02 1.52547e+02
+1146 5.64581e+02 1.64357e+02
+1147 5.64581e+02 1.52547e+02
+1148 5.52757e+02 1.64357e+02
+1149 5.52757e+02 1.52547e+02
+1150 5.40933e+02 1.64357e+02
+1151 5.40933e+02 1.52547e+02
+1152 5.29109e+02 1.64357e+02
+1153 5.29109e+02 1.52547e+02
+1154 5.17286e+02 1.64357e+02
+1155 5.17286e+02 1.52547e+02
+1156 6.41434e+02 1.70262e+02
+1157 6.41434e+02 1.58452e+02
+1158 6.29611e+02 1.70262e+02
+1159 6.29611e+02 1.58452e+02
+1160 6.17787e+02 1.70262e+02
+1161 6.17787e+02 1.58452e+02
+1162 6.05963e+02 1.70262e+02
+1163 6.05963e+02 1.58452e+02
+1164 5.94140e+02 1.70262e+02
+1165 5.94140e+02 1.58452e+02
+1166 5.82316e+02 1.70262e+02
+1167 5.82316e+02 1.58452e+02
+1168 5.70492e+02 1.70262e+02
+1169 5.70492e+02 1.58452e+02
+1170 5.58669e+02 1.70262e+02
+1171 5.58669e+02 1.58452e+02
+1172 5.46845e+02 1.70262e+02
+1173 5.46845e+02 1.58452e+02
+1174 5.35022e+02 1.70262e+02
+1175 5.35022e+02 1.58452e+02
+1176 5.23198e+02 1.70262e+02
+1177 5.23198e+02 1.58452e+02
+1178 5.11374e+02 1.70262e+02
+1179 5.11374e+02 1.58452e+02
+1180 1.88883e+03 2.04806e+03
+1181 1.87701e+03 2.04806e+03
+1182 1.85336e+03 2.04806e+03
+1183 1.84154e+03 2.04806e+03
+1184 1.82971e+03 2.04806e+03
+1185 1.78242e+03 2.04806e+03
+1186 1.74695e+03 2.04806e+03
+1187 1.72330e+03 2.04806e+03
+1188 1.71147e+03 2.04806e+03
+1189 1.67600e+03 2.04806e+03
+1190 1.65236e+03 2.04806e+03
+1191 9.07466e+02 2.04806e+03
+1192 8.95642e+02 2.04806e+03
+1193 8.71994e+02 2.04806e+03
+1194 8.60171e+02 2.04806e+03
+1195 8.48347e+02 2.04806e+03
+1196 8.01053e+02 2.04806e+03
+1197 7.65581e+02 2.04806e+03
+1198 7.41934e+02 2.04806e+03
+1199 7.30111e+02 2.04806e+03
+1200 6.94640e+02 2.04806e+03
+1201 6.70992e+02 2.04806e+03
+1202 1.87109e+03 2.04216e+03
+1203 1.80015e+03 2.04216e+03
+1204 1.77651e+03 2.04216e+03
+1205 1.75286e+03 2.04216e+03
+1206 8.89730e+02 2.04216e+03
+1207 8.18788e+02 2.04216e+03
+1208 7.95141e+02 2.04216e+03
+1209 7.71494e+02 2.04216e+03
+1210 1.87701e+03 2.03625e+03
+1211 1.85336e+03 2.03625e+03
+1212 1.84154e+03 2.03625e+03
+1213 1.74695e+03 2.03625e+03
+1214 1.72330e+03 2.03625e+03
+1215 1.69965e+03 2.03625e+03
+1216 8.95642e+02 2.03625e+03
+1217 8.71994e+02 2.03625e+03
+1218 8.60171e+02 2.03625e+03
+1219 7.65581e+02 2.03625e+03
+1220 7.41934e+02 2.03625e+03
+1221 7.18287e+02 2.03625e+03
+1222 1.89474e+03 2.03035e+03
+1223 1.87109e+03 2.03035e+03
+1224 1.85927e+03 2.03035e+03
+1225 1.82380e+03 2.03035e+03
+1226 1.81198e+03 2.03035e+03
+1227 1.80015e+03 2.03035e+03
+1228 1.77651e+03 2.03035e+03
+1229 1.76468e+03 2.03035e+03
+1230 1.75286e+03 2.03035e+03
+1231 9.13377e+02 2.03035e+03
+1232 8.89730e+02 2.03035e+03
+1233 8.77906e+02 2.03035e+03
+1234 8.42435e+02 2.03035e+03
+1235 8.30612e+02 2.03035e+03
+1236 8.18788e+02 2.03035e+03
+1237 7.95141e+02 2.03035e+03
+1238 7.83317e+02 2.03035e+03
+1239 7.71494e+02 2.03035e+03
+1240 1.88883e+03 1.70261e+02
+1241 1.87701e+03 1.70261e+02
+1242 1.85336e+03 1.70261e+02
+1243 1.84154e+03 1.70261e+02
+1244 1.82971e+03 1.70261e+02
+1245 1.78242e+03 1.70261e+02
+1246 1.74695e+03 1.70261e+02
+1247 1.72330e+03 1.70261e+02
+1248 1.71147e+03 1.70261e+02
+1249 1.67600e+03 1.70261e+02
+1250 1.65236e+03 1.70261e+02
+1251 9.07466e+02 1.70261e+02
+1252 8.95642e+02 1.70261e+02
+1253 8.71994e+02 1.70261e+02
+1254 8.60171e+02 1.70261e+02
+1255 8.48347e+02 1.70261e+02
+1256 8.01053e+02 1.70261e+02
+1257 7.65581e+02 1.70261e+02
+1258 7.41934e+02 1.70261e+02
+1259 7.30111e+02 1.70261e+02
+1260 6.94640e+02 1.70261e+02
+1261 6.70992e+02 1.70261e+02
+1262 1.87109e+03 1.64357e+02
+1263 1.80015e+03 1.64357e+02
+1264 1.77651e+03 1.64357e+02
+1265 1.75286e+03 1.64357e+02
+1266 8.89730e+02 1.64357e+02
+1267 8.18788e+02 1.64357e+02
+1268 7.95141e+02 1.64357e+02
+1269 7.71494e+02 1.64357e+02
+1270 1.87701e+03 1.58451e+02
+1271 1.85336e+03 1.58451e+02
+1272 1.84154e+03 1.58451e+02
+1273 1.74695e+03 1.58451e+02
+1274 1.72330e+03 1.58451e+02
+1275 1.69965e+03 1.58451e+02
+1276 8.95642e+02 1.58451e+02
+1277 8.71994e+02 1.58451e+02
+1278 8.60171e+02 1.58451e+02
+1279 7.65581e+02 1.58451e+02
+1280 7.41934e+02 1.58451e+02
+1281 7.18287e+02 1.58451e+02
+1282 1.89474e+03 1.52546e+02
+1283 1.87109e+03 1.52546e+02
+1284 1.85927e+03 1.52546e+02
+1285 1.82380e+03 1.52546e+02
+1286 1.81198e+03 1.52546e+02
+1287 1.80015e+03 1.52546e+02
+1288 1.77651e+03 1.52546e+02
+1289 1.76468e+03 1.52546e+02
+1290 1.75286e+03 1.52546e+02
+1291 9.13377e+02 1.52546e+02
+1292 8.89730e+02 1.52546e+02
+1293 8.77906e+02 1.52546e+02
+1294 8.42435e+02 1.52546e+02
+1295 8.30612e+02 1.52546e+02
+1296 8.18788e+02 1.52546e+02
+1297 7.95141e+02 1.52546e+02
+1298 7.83317e+02 1.52546e+02
+1299 7.71494e+02 1.52546e+02
+1300 1.89474e+03 2.04806e+03
+1301 1.88292e+03 2.04806e+03
+1302 1.85927e+03 2.04806e+03
+1303 1.81198e+03 2.04806e+03
+1304 1.76468e+03 2.04806e+03
+1305 1.67009e+03 2.04806e+03
+1306 9.13377e+02 2.04806e+03
+1307 9.01554e+02 2.04806e+03
+1308 8.77906e+02 2.04806e+03
+1309 8.30612e+02 2.04806e+03
+1310 7.83317e+02 2.04806e+03
+1311 6.88728e+02 2.04806e+03
+1312 1.88883e+03 2.04216e+03
+1313 1.82971e+03 2.04216e+03
+1314 1.73512e+03 2.04216e+03
+1315 1.69965e+03 2.04216e+03
+1316 1.67600e+03 2.04216e+03
+1317 9.07466e+02 2.04216e+03
+1318 8.48347e+02 2.04216e+03
+1319 7.53758e+02 2.04216e+03
+1320 7.18287e+02 2.04216e+03
+1321 6.94640e+02 2.04216e+03
+1322 1.88292e+03 2.03625e+03
+1323 1.82380e+03 2.03625e+03
+1324 1.67009e+03 2.03625e+03
+1325 9.01554e+02 2.03625e+03
+1326 8.42435e+02 2.03625e+03
+1327 6.88728e+02 2.03625e+03
+1328 1.78242e+03 2.03035e+03
+1329 1.73512e+03 2.03035e+03
+1330 1.71147e+03 2.03035e+03
+1331 1.65236e+03 2.03035e+03
+1332 8.01053e+02 2.03035e+03
+1333 7.53758e+02 2.03035e+03
+1334 7.30111e+02 2.03035e+03
+1335 6.70992e+02 2.03035e+03
+1336 1.89474e+03 1.70261e+02
+1337 1.88292e+03 1.70261e+02
+1338 1.85927e+03 1.70261e+02
+1339 1.81198e+03 1.70261e+02
+1340 1.76468e+03 1.70261e+02
+1341 1.67009e+03 1.70261e+02
+1342 9.13377e+02 1.70261e+02
+1343 9.01554e+02 1.70261e+02
+1344 8.77906e+02 1.70261e+02
+1345 8.30612e+02 1.70261e+02
+1346 7.83317e+02 1.70261e+02
+1347 6.88728e+02 1.70261e+02
+1348 1.88883e+03 1.64357e+02
+1349 1.82971e+03 1.64357e+02
+1350 1.73512e+03 1.64357e+02
+1351 1.69965e+03 1.64357e+02
+1352 1.67600e+03 1.64357e+02
+1353 9.07466e+02 1.64357e+02
+1354 8.48347e+02 1.64357e+02
+1355 7.53758e+02 1.64357e+02
+1356 7.18287e+02 1.64357e+02
+1357 6.94640e+02 1.64357e+02
+1358 1.88292e+03 1.58451e+02
+1359 1.82380e+03 1.58451e+02
+1360 1.67009e+03 1.58451e+02
+1361 9.01554e+02 1.58451e+02
+1362 8.42435e+02 1.58451e+02
+1363 6.88728e+02 1.58451e+02
+1364 1.78242e+03 1.52546e+02
+1365 1.73512e+03 1.52546e+02
+1366 1.71147e+03 1.52546e+02
+1367 1.65236e+03 1.52546e+02
+1368 8.01053e+02 1.52546e+02
+1369 7.53758e+02 1.52546e+02
+1370 7.30111e+02 1.52546e+02
+1371 6.70992e+02 1.52546e+02
+1372 1.89179e+03 2.05102e+03
+1373 1.67896e+03 2.05102e+03
+1374 9.10422e+02 2.05102e+03
+1375 6.97596e+02 2.05102e+03
+1376 1.73217e+03 2.04511e+03
+1377 7.50802e+02 2.04511e+03
+1378 1.89179e+03 2.03921e+03
+1379 1.67896e+03 2.03921e+03
+1380 9.10422e+02 2.03921e+03
+1381 6.97596e+02 2.03921e+03
+1382 1.83858e+03 2.03330e+03
+1383 8.57215e+02 2.03330e+03
+1384 1.78537e+03 2.02740e+03
+1385 8.04009e+02 2.02740e+03
+1386 1.89179e+03 1.73214e+02
+1387 1.67896e+03 1.73214e+02
+1388 9.10422e+02 1.73214e+02
+1389 6.97596e+02 1.73214e+02
+1390 1.73217e+03 1.67309e+02
+1391 7.50802e+02 1.67309e+02
+1392 1.89179e+03 1.61404e+02
+1393 1.67896e+03 1.61404e+02
+1394 9.10422e+02 1.61404e+02
+1395 6.97596e+02 1.61404e+02
+1396 1.83858e+03 1.55499e+02
+1397 8.57215e+02 1.55499e+02
+1398 1.78537e+03 1.49594e+02
+1399 8.04009e+02 1.49594e+02
+1400 0.00000e+00 0.00000e+00
+EOF
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/gr666.opt.tour
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/gr666.opt.tour	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/gr666.opt.tour	(revision 4402)
@@ -0,0 +1,673 @@
+NAME : gr666.opt.tour
+TYPE : TOUR
+COMMENT : Optimal solution of gr666 (294358)
+DIMENSION : 666
+TOUR_SECTION
+1
+465
+464
+463
+462
+451
+450
+449
+448
+452
+453
+454
+456
+457
+458
+459
+460
+520
+461
+521
+522
+525
+526
+515
+524
+516
+523
+517
+518
+519
+493
+492
+491
+490
+494
+495
+496
+497
+498
+436
+500
+499
+502
+501
+156
+155
+158
+157
+159
+161
+162
+163
+186
+185
+184
+149
+183
+182
+171
+172
+173
+167
+139
+168
+169
+170
+174
+175
+176
+177
+178
+179
+180
+181
+187
+188
+190
+189
+193
+191
+192
+196
+194
+195
+207
+208
+217
+218
+219
+220
+221
+229
+228
+227
+225
+226
+216
+223
+224
+222
+212
+213
+211
+210
+209
+197
+198
+199
+200
+201
+202
+204
+205
+206
+214
+215
+230
+231
+233
+232
+234
+203
+165
+166
+508
+509
+506
+507
+164
+160
+504
+505
+503
+514
+513
+512
+511
+510
+527
+528
+529
+530
+536
+537
+538
+539
+548
+551
+554
+555
+557
+558
+559
+556
+552
+549
+553
+550
+547
+562
+563
+564
+566
+565
+574
+568
+567
+569
+570
+571
+572
+573
+575
+578
+576
+577
+579
+580
+581
+582
+583
+584
+585
+587
+588
+589
+590
+591
+586
+640
+648
+641
+642
+643
+644
+645
+646
+647
+639
+638
+657
+658
+659
+636
+637
+594
+593
+592
+595
+596
+597
+598
+600
+601
+609
+599
+608
+610
+611
+612
+635
+634
+633
+623
+632
+631
+630
+628
+629
+627
+626
+625
+624
+485
+483
+484
+482
+620
+486
+622
+621
+619
+618
+614
+616
+617
+615
+613
+604
+603
+605
+606
+607
+602
+561
+560
+546
+545
+544
+540
+541
+543
+542
+535
+534
+533
+532
+531
+473
+472
+471
+470
+474
+469
+466
+467
+468
+475
+476
+477
+478
+481
+480
+479
+2
+3
+4
+5
+6
+19
+20
+8
+7
+10
+9
+12
+11
+30
+31
+32
+33
+39
+40
+41
+36
+35
+34
+27
+25
+21
+22
+23
+24
+26
+28
+29
+53
+54
+55
+56
+57
+58
+62
+59
+60
+61
+63
+64
+65
+66
+67
+68
+69
+70
+71
+93
+665
+664
+662
+663
+661
+660
+654
+653
+655
+656
+652
+651
+650
+649
+666
+108
+109
+111
+110
+107
+106
+116
+115
+114
+113
+112
+119
+120
+121
+122
+123
+124
+125
+128
+129
+130
+131
+132
+133
+134
+135
+136
+84
+85
+86
+137
+138
+127
+126
+118
+117
+105
+104
+103
+102
+101
+100
+99
+98
+97
+95
+96
+94
+92
+91
+90
+72
+89
+88
+83
+87
+82
+81
+80
+79
+78
+77
+76
+75
+52
+74
+73
+51
+50
+45
+44
+38
+37
+42
+13
+43
+49
+48
+47
+46
+14
+15
+16
+17
+18
+235
+141
+140
+142
+143
+144
+145
+146
+239
+240
+241
+242
+238
+236
+237
+250
+248
+247
+246
+249
+254
+255
+253
+245
+252
+251
+244
+243
+147
+148
+150
+380
+259
+376
+372
+371
+258
+257
+256
+263
+262
+261
+260
+267
+266
+265
+264
+285
+303
+304
+305
+306
+307
+298
+297
+299
+300
+296
+295
+294
+293
+292
+291
+288
+289
+286
+290
+287
+268
+269
+270
+277
+278
+276
+279
+280
+281
+283
+282
+284
+333
+345
+344
+343
+342
+341
+340
+339
+338
+337
+275
+274
+352
+272
+271
+361
+362
+363
+365
+364
+273
+357
+358
+354
+353
+355
+356
+347
+346
+334
+329
+330
+331
+327
+326
+328
+322
+332
+390
+336
+335
+348
+349
+350
+351
+402
+401
+359
+360
+366
+367
+368
+370
+420
+418
+419
+375
+374
+373
+377
+378
+379
+381
+382
+383
+384
+385
+386
+387
+389
+388
+151
+152
+153
+154
+435
+488
+434
+433
+431
+432
+428
+427
+425
+426
+424
+421
+422
+423
+411
+410
+409
+407
+405
+369
+404
+403
+398
+399
+394
+397
+393
+392
+391
+442
+396
+395
+400
+445
+406
+408
+412
+414
+415
+416
+417
+429
+430
+487
+489
+455
+447
+413
+446
+444
+443
+441
+440
+316
+439
+438
+437
+311
+312
+313
+314
+315
+324
+325
+323
+321
+320
+317
+318
+319
+301
+302
+308
+309
+310
+-1
+EOF
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/gr666.tsp
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/gr666.tsp	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIB Sample Problems/gr666.tsp	(revision 4402)
@@ -0,0 +1,674 @@
+NAME: gr666
+TYPE: TSP
+COMMENT: 666 cities around the world (Groetschel)
+DIMENSION: 666
+EDGE_WEIGHT_TYPE: GEO
+DISPLAY_DATA_TYPE: COORD_DISPLAY
+NODE_COORD_SECTION
+0001 90.00 0.00
+0002 71.17 -156.47
+0003 64.51 -147.43
+0004 61.13 -149.53
+0005 58.20 -134.27
+0006 49.16 -123.07
+0007 53.33 -113.28
+0008 51.03 -114.05
+0009 50.25 -104.39
+0010 52.07 -106.38
+0011 49.53 -97.09
+0012 58.46 -94.10
+0013 43.39 -79.23
+0014 45.25 -75.42
+0015 45.31 -73.34
+0016 46.49 -71.14
+0017 44.39 -63.36
+0018 47.34 -52.43
+0019 47.36 -122.20
+0020 47.40 -117.23
+0021 38.35 -121.30
+0022 37.48 -122.24
+0023 34.03 -118.15
+0024 32.43 -117.09
+0025 40.46 -111.53
+0026 33.27 -112.05
+0027 39.43 -105.01
+0028 35.05 -106.40
+0029 31.45 -106.29
+0030 46.47 -92.06
+0031 44.59 -93.13
+0032 41.16 -95.57
+0033 39.07 -94.39
+0034 35.28 -97.32
+0035 32.47 -96.48
+0036 29.46 -95.22
+0037 43.02 -87.55
+0038 41.53 -87.38
+0039 38.39 -90.25
+0040 35.08 -90.03
+0041 29.58 -90.07
+0042 42.20 -83.03
+0043 40.26 -80.00
+0044 39.06 -84.31
+0045 33.45 -84.23
+0046 42.21 -71.04
+0047 40.43 -74.01
+0048 39.57 -75.07
+0049 38.54 -77.01
+0050 30.20 -81.40
+0051 25.46 -80.12
+0052 25.05 -77.21
+0053 28.38 -106.05
+0054 25.33 -103.26
+0055 25.40 -100.19
+0056 22.13 -97.51
+0057 22.09 -100.59
+0058 20.40 -103.20
+0059 19.24 -99.09
+0060 19.03 -98.12
+0061 19.20 -96.40
+0062 16.51 -99.55
+0063 17.03 -96.43
+0064 17.59 -92.55
+0065 20.58 -89.37
+0066 17.30 -88.12
+0067 14.38 -90.31
+0068 13.42 -89.12
+0069 14.06 -87.13
+0070 12.09 -86.17
+0071 9.56 -84.05
+0072 8.58 -79.32
+0073 23.08 -82.22
+0074 22.24 -79.58
+0075 20.01 -75.49
+0076 18.00 -76.48
+0077 18.32 -72.20
+0078 18.28 -69.54
+0079 18.28 -66.07
+0080 14.36 -61.05
+0081 13.06 -59.37
+0082 10.39 -61.31
+0083 12.06 -68.56
+0084 4.56 -52.20
+0085 5.50 -55.10
+0086 6.48 -58.10
+0087 10.30 -66.56
+0088 10.40 -71.37
+0089 10.59 -74.48
+0090 6.15 -75.35
+0091 4.36 -74.05
+0092 3.27 -76.31
+0093 -0.56 -91.01
+0094 -0.13 -78.30
+0095 -1.40 -78.38
+0096 -2.10 -79.50
+0097 -3.46 -73.15
+0098 -8.07 -79.02
+0099 -12.03 -77.03
+0100 -13.31 -71.59
+0101 -16.24 -71.33
+0102 -16.30 -68.09
+0103 -17.48 -63.10
+0104 -19.35 -65.45
+0105 -23.39 -70.24
+0106 -33.27 -70.40
+0107 -36.50 -73.03
+0108 -53.09 -70.55
+0109 -51.42 -57.51
+0110 -38.43 -62.17
+0111 -38.00 -57.33
+0112 -34.50 -56.12
+0113 -34.36 -58.27
+0114 -32.57 -60.40
+0115 -31.24 -64.11
+0116 -32.53 -68.49
+0117 -26.49 -65.13
+0118 -25.16 -57.40
+0119 -30.04 -51.11
+0120 -27.35 -48.34
+0121 -25.25 -49.15
+0122 -23.32 -46.37
+0123 -22.54 -43.14
+0124 -20.23 -43.30
+0125 -19.55 -43.56
+0126 -20.27 -54.37
+0127 -15.35 -56.05
+0128 -16.40 -49.16
+0129 -15.47 -47.55
+0130 -12.59 -38.31
+0131 -8.03 -34.54
+0132 -5.47 -35.13
+0133 -3.43 -38.30
+0134 -5.05 -42.49
+0135 -2.31 -44.16
+0136 -1.27 -48.29
+0137 -3.08 -60.01
+0138 -8.46 -63.54
+0139 14.55 -23.31
+0140 28.06 -15.24
+0141 32.38 -16.54
+0142 31.38 -8.00
+0143 33.39 -7.35
+0144 34.02 -6.51
+0145 34.05 -4.57
+0146 35.48 -5.45
+0147 35.43 -0.43
+0148 36.47 3.03
+0149 22.56 5.30
+0150 36.22 6.37
+0151 36.48 10.11
+0152 34.44 10.46
+0153 32.54 13.11
+0154 32.07 20.04
+0155 31.12 29.54
+0156 31.16 32.18
+0157 29.58 32.33
+0158 30.03 31.15
+0159 24.05 32.53
+0160 19.37 37.14
+0161 15.36 32.32
+0162 13.11 30.13
+0163 13.38 25.21
+0164 15.20 38.53
+0165 9.00 38.50
+0166 11.36 43.09
+0167 18.06 -15.57
+0168 14.40 -17.26
+0169 13.28 -16.39
+0170 11.51 -15.35
+0171 16.46 -3.01
+0172 12.39 -8.00
+0173 10.23 -9.18
+0174 9.31 -13.43
+0175 8.30 -13.15
+0176 6.18 -10.47
+0177 5.19 -4.02
+0178 6.41 -1.35
+0179 5.33 -0.13
+0180 6.08 1.13
+0181 6.29 2.37
+0182 12.22 -1.31
+0183 13.31 2.07
+0184 12.00 8.30
+0185 11.51 13.10
+0186 12.07 15.03
+0187 6.27 3.24
+0188 6.27 7.27
+0189 0.20 6.44
+0190 3.45 8.47
+0191 3.52 11.31
+0192 4.22 18.35
+0193 0.23 9.27
+0194 -4.16 15.17
+0195 -4.18 15.18
+0196 0.04 18.16
+0197 -5.54 22.25
+0198 0.30 25.12
+0199 -3.23 29.22
+0200 -1.57 30.04
+0201 0.19 32.25
+0202 -1.17 36.49
+0203 2.01 45.20
+0204 -4.03 39.40
+0205 -6.10 39.11
+0206 -6.48 39.17
+0207 -8.48 13.14
+0208 -12.44 15.47
+0209 -11.40 27.28
+0210 -12.49 28.13
+0211 -15.25 28.17
+0212 -20.09 28.36
+0213 -17.50 31.03
+0214 -15.47 35.00
+0215 -19.49 34.52
+0216 -25.58 32.35
+0217 -15.57 -5.42
+0218 -37.15 -12.30
+0219 -22.59 14.31
+0220 -22.34 17.06
+0221 -26.38 15.10
+0222 -24.45 25.55
+0223 -25.45 28.10
+0224 -26.15 28.00
+0225 -29.12 26.07
+0226 -29.55 30.56
+0227 -33.00 27.55
+0228 -33.58 25.40
+0229 -33.55 18.22
+0230 -23.21 43.40
+0231 -18.55 47.31
+0232 -12.16 49.17
+0233 -20.10 57.30
+0234 -4.38 55.27
+0235 37.44 -25.40
+0236 38.43 -9.08
+0237 41.11 -8.36
+0238 37.23 -5.59
+0239 36.32 -6.18
+0240 36.43 -4.25
+0241 37.13 -3.41
+0242 37.53 -4.46
+0243 38.21 -0.29
+0244 39.28 -0.22
+0245 41.23 2.11
+0246 41.38 -0.53
+0247 40.24 -3.41
+0248 41.39 -4.43
+0249 43.15 -2.58
+0250 43.22 -8.23
+0251 38.54 1.26
+0252 39.34 2.39
+0253 42.30 1.31
+0254 44.50 -0.34
+0255 43.36 1.26
+0256 43.18 5.24
+0257 43.42 7.15
+0258 43.42 7.23
+0259 42.42 9.27
+0260 45.50 1.16
+0261 45.26 4.24
+0262 45.45 4.51
+0263 45.10 5.43
+0264 48.24 -4.29
+0265 48.05 -1.41
+0266 47.13 -1.33
+0267 47.23 0.41
+0268 49.30 0.08
+0269 48.52 2.20
+0270 49.15 4.02
+0271 47.19 5.01
+0272 48.41 6.12
+0273 48.35 7.45
+0274 49.36 6.09
+0275 50.38 5.34
+0276 50.50 4.20
+0277 50.38 3.04
+0278 51.03 3.43
+0279 51.13 4.25
+0280 51.26 5.28
+0281 51.55 4.28
+0282 52.22 4.54
+0283 52.05 5.08
+0284 53.13 6.33
+0285 50.23 -4.10
+0286 50.43 -1.54
+0287 50.50 -0.08
+0288 51.29 -3.13
+0289 51.27 -2.35
+0290 51.30 -0.10
+0291 52.30 -1.50
+0292 53.25 -2.55
+0293 53.30 -2.15
+0294 53.23 -1.30
+0295 53.50 -1.35
+0296 54.59 -1.35
+0297 55.57 -3.13
+0298 55.53 -4.15
+0299 56.28 -3.00
+0300 57.10 -2.04
+0301 60.09 -1.09
+0302 62.01 -6.46
+0303 51.54 -8.28
+0304 52.40 -8.38
+0305 53.20 -6.15
+0306 54.35 -5.55
+0307 55.00 -7.19
+0308 64.09 -21.51
+0309 64.11 -51.44
+0310 76.34 -68.47
+0311 70.40 23.42
+0312 68.26 17.25
+0313 65.01 25.28
+0314 61.30 23.45
+0315 60.27 22.17
+0316 60.10 24.58
+0317 63.25 10.25
+0318 60.23 5.20
+0319 58.58 5.45
+0320 59.55 10.45
+0321 57.43 11.58
+0322 55.36 13.00
+0323 58.25 15.37
+0324 59.20 18.03
+0325 57.38 18.18
+0326 56.09 10.13
+0327 55.24 10.23
+0328 55.40 12.35
+0329 53.04 8.49
+0330 53.33 9.59
+0331 54.20 10.08
+0332 54.05 12.07
+0333 51.57 7.37
+0334 52.24 9.44
+0335 52.07 11.38
+0336 52.31 13.24
+0337 50.47 6.05
+0338 50.44 7.05
+0339 50.56 6.59
+0340 51.12 6.47
+0341 51.17 7.17
+0342 51.28 7.01
+0343 51.28 7.13
+0344 51.32 7.13
+0345 51.31 7.28
+0346 51.19 9.29
+0347 50.58 11.01
+0348 51.29 11.58
+0349 51.19 12.20
+0350 50.50 12.55
+0351 51.03 13.44
+0352 49.14 6.59
+0353 50.07 8.40
+0354 49.25 8.43
+0355 49.48 9.56
+0356 49.27 11.04
+0357 49.03 8.24
+0358 48.46 9.11
+0359 49.01 12.06
+0360 48.08 11.34
+0361 46.12 6.09
+0362 46.31 6.38
+0363 46.57 7.26
+0364 47.33 7.35
+0365 47.23 8.32
+0366 47.16 11.24
+0367 47.48 13.02
+0368 48.18 14.18
+0369 48.13 16.20
+0370 47.05 15.27
+0371 45.03 7.40
+0372 45.28 9.12
+0373 45.27 11.00
+0374 45.27 12.21
+0375 45.40 13.46
+0376 44.25 8.57
+0377 44.29 11.20
+0378 43.46 11.15
+0379 43.55 12.28
+0380 39.20 9.00
+0381 41.54 12.29
+0382 40.51 14.17
+0383 41.27 15.34
+0384 41.07 16.52
+0385 40.28 17.15
+0386 38.11 15.33
+0387 37.30 15.06
+0388 38.07 13.21
+0389 35.54 14.31
+0390 53.24 14.32
+0391 54.23 18.40
+0392 53.08 18.00
+0393 52.25 16.55
+0394 51.46 19.30
+0395 52.15 21.00
+0396 53.09 23.09
+0397 51.06 17.00
+0398 50.16 19.00
+0399 50.03 19.58
+0400 51.15 22.35
+0401 49.45 13.23
+0402 50.05 14.26
+0403 49.50 18.17
+0404 49.12 16.37
+0405 48.09 17.07
+0406 48.43 21.15
+0407 47.30 19.05
+0408 47.32 21.38
+0409 46.05 18.13
+0410 46.15 20.09
+0411 45.45 21.13
+0412 46.47 23.36
+0413 47.10 27.35
+0414 45.48 24.09
+0415 45.39 25.37
+0416 44.26 26.06
+0417 44.11 28.39
+0418 46.03 14.31
+0419 45.20 14.27
+0420 45.48 15.58
+0421 43.31 16.27
+0422 43.52 18.25
+0423 44.50 20.30
+0424 42.38 18.07
+0425 41.59 21.26
+0426 41.20 19.50
+0427 42.41 23.19
+0428 42.09 24.45
+0429 43.13 27.55
+0430 42.30 27.28
+0431 39.36 19.56
+0432 40.38 22.56
+0433 38.15 21.44
+0434 37.58 23.43
+0435 35.20 25.09
+0436 35.10 33.22
+0437 68.58 33.05
+0438 64.34 40.32
+0439 59.55 30.15
+0440 59.25 24.45
+0441 56.57 24.06
+0442 54.43 20.30
+0443 54.41 25.19
+0444 53.54 27.34
+0445 49.50 24.00
+0446 50.26 30.31
+0447 46.28 30.44
+0448 55.45 37.35
+0449 56.20 44.00
+0450 55.45 49.08
+0451 53.12 50.09
+0452 51.40 39.10
+0453 50.00 36.15
+0454 48.27 34.59
+0455 44.36 33.32
+0456 47.14 39.42
+0457 48.44 44.25
+0458 46.21 48.03
+0459 41.43 44.49
+0460 40.11 44.30
+0461 40.23 49.51
+0462 58.00 56.15
+0463 56.51 60.36
+0464 67.27 63.58
+0465 69.20 88.06
+0466 55.00 73.24
+0467 55.02 82.55
+0468 56.01 92.50
+0469 49.50 73.10
+0470 43.15 76.57
+0471 41.20 69.18
+0472 39.40 66.48
+0473 38.35 68.48
+0474 43.48 87.35
+0475 52.16 104.20
+0476 47.55 106.53
+0477 52.03 113.30
+0478 62.13 129.49
+0479 64.45 177.29
+0480 53.01 158.39
+0481 59.34 150.48
+0482 50.17 127.32
+0483 50.35 137.02
+0484 48.27 135.06
+0485 46.58 142.42
+0486 43.10 131.56
+0487 41.01 28.58
+0488 38.25 27.09
+0489 39.56 32.52
+0490 38.43 35.30
+0491 39.45 37.02
+0492 39.55 41.17
+0493 37.55 40.14
+0494 37.01 35.18
+0495 36.12 37.10
+0496 34.44 36.43
+0497 33.30 36.18
+0498 33.53 35.30
+0499 31.57 35.56
+0500 32.50 35.00
+0501 32.04 34.46
+0502 31.46 35.14
+0503 24.28 39.36
+0504 21.30 39.12
+0505 21.27 39.49
+0506 15.23 44.12
+0507 14.48 42.57
+0508 12.45 45.12
+0509 14.32 49.08
+0510 23.37 58.35
+0511 25.18 55.18
+0512 25.17 51.32
+0513 26.13 50.35
+0514 24.38 46.43
+0515 29.20 47.59
+0516 30.30 47.47
+0517 33.21 44.25
+0518 35.28 44.28
+0519 36.20 43.08
+0520 38.05 46.18
+0521 37.16 49.36
+0522 35.40 51.26
+0523 34.19 47.04
+0524 30.20 48.16
+0525 32.40 51.38
+0526 29.36 52.32
+0527 30.17 57.05
+0528 36.18 59.36
+0529 34.20 62.12
+0530 31.32 65.30
+0531 34.31 69.12
+0532 33.36 73.04
+0533 31.35 74.18
+0534 31.25 73.05
+0535 30.11 71.29
+0536 30.12 67.00
+0537 27.42 68.52
+0538 25.22 68.22
+0539 24.52 67.03
+0540 30.19 78.02
+0541 28.40 77.13
+0542 26.17 73.02
+0543 26.55 75.49
+0544 26.28 80.21
+0545 25.20 83.00
+0546 25.36 85.07
+0547 22.32 88.22
+0548 23.02 72.37
+0549 21.09 79.06
+0550 20.30 85.50
+0551 18.58 72.50
+0552 17.23 78.29
+0553 17.42 83.18
+0554 15.21 75.10
+0555 12.59 77.35
+0556 13.05 80.17
+0557 10.49 78.41
+0558 9.56 78.07
+0559 6.56 79.51
+0560 27.43 85.19
+0561 27.28 89.39
+0562 23.43 90.25
+0563 22.20 91.50
+0564 22.00 96.05
+0565 16.47 96.10
+0566 18.47 98.59
+0567 19.52 102.08
+0568 17.58 102.36
+0569 21.02 105.51
+0570 16.28 107.36
+0571 16.04 108.13
+0572 10.45 106.40
+0573 11.33 104.55
+0574 13.45 100.31
+0575 5.25 100.20
+0576 3.10 101.42
+0577 1.17 103.51
+0578 3.35 98.40
+0579 -0.57 100.21
+0580 -2.55 104.45
+0581 -6.10 106.48
+0582 -6.54 107.36
+0583 -7.48 110.22
+0584 -7.15 112.45
+0585 -8.39 115.13
+0586 -10.10 123.35
+0587 -3.20 114.35
+0588 1.33 110.20
+0589 4.56 114.55
+0590 -0.30 117.09
+0591 -5.07 119.24
+0592 1.29 124.51
+0593 -3.43 128.12
+0594 -5.40 132.45
+0595 7.04 125.36
+0596 10.18 123.54
+0597 10.42 122.34
+0598 14.35 121.00
+0599 22.17 114.09
+0600 22.38 120.17
+0601 25.03 121.30
+0602 29.40 91.09
+0603 36.03 103.41
+0604 34.15 108.52
+0605 30.39 104.04
+0606 29.39 106.34
+0607 25.05 102.40
+0608 23.06 113.16
+0609 26.06 119.17
+0610 30.36 114.17
+0611 32.03 118.47
+0612 31.14 121.28
+0613 34.48 113.39
+0614 36.06 120.19
+0615 37.55 112.30
+0616 39.08 117.12
+0617 39.55 116.25
+0618 38.53 121.35
+0619 41.48 123.27
+0620 45.45 126.41
+0621 39.01 125.45
+0622 37.33 126.58
+0623 35.06 129.03
+0624 43.03 141.21
+0625 39.43 140.07
+0626 38.15 140.53
+0627 35.42 139.46
+0628 35.10 136.55
+0629 36.34 136.39
+0630 35.00 135.45
+0631 34.40 135.30
+0632 34.24 132.27
+0633 32.48 129.55
+0634 31.36 130.33
+0635 26.13 127.40
+0636 13.28 144.47
+0637 -2.32 140.42
+0638 -4.12 152.12
+0639 -9.30 147.10
+0640 -12.28 130.50
+0641 -31.56 115.50
+0642 -34.55 138.35
+0643 -37.49 144.58
+0644 -42.53 147.19
+0645 -33.52 151.13
+0646 -27.28 153.02
+0647 -19.16 146.48
+0648 -23.42 133.53
+0649 -45.52 170.30
+0650 -43.32 172.38
+0651 -41.18 174.47
+0652 -36.52 174.46
+0653 -21.08 -175.12
+0654 -14.16 -170.42
+0655 -18.08 178.25
+0656 -22.16 166.27
+0657 -9.26 159.57
+0658 -0.32 166.55
+0659 11.35 165.23
+0660 21.19 -157.52
+0661 1.52 -157.20
+0662 -9.45 -139.00
+0663 -17.32 -149.34
+0664 -25.04 -130.06
+0665 -27.07 -109.22
+0666 -90.00 0.00
+EOF
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIBParser.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIBParser.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIBParser.cs	(revision 4402)
@@ -0,0 +1,235 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Globalization;
+using System.IO;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// Parses a *.tsp file in TSPLIB format and extracts its information about a TSP.
+  /// </summary>
+  public class TSPLIBParser {
+    #region Inner Enum TSPLIBEdgeWeightType
+    public enum TSPLIBEdgeWeightType {
+      UNDEFINED,
+      EUC_2D,
+      GEO
+    }
+    #endregion
+
+    private const int EOF = 0;
+    private const int NAME = 1;
+    private const int TYPE = 2;
+    private const int COMMENT = 3;
+    private const int DIM = 4;
+    private const int WEIGHTTYPE = 5;
+    private const int NODETYPE = 6;
+    private const int NODESECTION = 7;
+
+    private StreamReader source;
+
+    private string name;
+    /// <summary>
+    /// Gets the name of the parsed TSP.
+    /// </summary>
+    public string Name {
+      get { return name; }
+    }
+    private string comment;
+    /// <summary>
+    /// Gets the comment of the parsed TSP.
+    /// </summary>
+    public string Comment {
+      get { return comment; }
+    }
+    private double[,] vertices;
+    /// <summary>
+    /// Gets the vertices of the parsed TSP.
+    /// </summary>
+    public double[,] Vertices {
+      get { return vertices; }
+    }
+    private TSPLIBEdgeWeightType weightType;
+    /// <summary>
+    /// Gets the weight type of the parsed TSP.
+    /// </summary>
+    public TSPLIBEdgeWeightType WeightType {
+      get { return weightType; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="TSPLIBParser"/> with the given <paramref name="path"/>.
+    /// </summary>
+    /// <exception cref="ArgumentException">Thrown if the input file is not a TSPLIB TSP file (*.tsp)
+    /// </exception>
+    /// <param name="path">The path where the TSP is stored.</param>
+    public TSPLIBParser(String path) {
+      if (!path.EndsWith(".tsp"))
+        throw new ArgumentException("Input file has to be a TSPLIB TSP file (*.tsp).");
+
+      source = new StreamReader(path);
+      name = path;
+      comment = string.Empty;
+      vertices = null;
+      weightType = TSPLIBEdgeWeightType.UNDEFINED;
+    }
+
+    /// <summary>
+    /// Reads the TSPLIB TSP file and parses the elements.
+    /// </summary>
+    /// <exception cref="InvalidDataException">Thrown if the file has an invalid format or contains invalid data.</exception>
+    public void Parse() {
+      int section = -1;
+      string str = null;
+      bool typeIsChecked = false;
+      bool weightTypeIsChecked = false;
+
+      do {
+        str = source.ReadLine();
+        section = GetSection(str);
+
+        if (section != -1) {
+          switch (section) {
+            case NAME:
+              ReadName(str);
+              break;
+            case TYPE:
+              CheckType(str);
+              typeIsChecked = true;
+              break;
+            case COMMENT:
+              ReadComment(str);
+              break;
+            case DIM:
+              InitVerticesArray(str);
+              break;
+            case WEIGHTTYPE:
+              ReadWeightType(str);
+              weightTypeIsChecked = true;
+              break;
+            case NODETYPE:
+              CheckNodeType(str);
+              break;
+            case NODESECTION:
+              ReadVertices();
+              break;
+          }
+        }
+      } while (!((section == EOF) || (str == null)));
+
+      if (!(typeIsChecked && weightTypeIsChecked))
+        throw new InvalidDataException("Input file does not contain type or edge weight type information.");
+    }
+
+    private int GetSection(string str) {
+      if (str == null)
+        return EOF;
+
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      if (tokens.Length == 0)
+        return -1;
+
+      string token = tokens[0].Trim();
+      if (token.Equals("eof", StringComparison.OrdinalIgnoreCase))
+        return EOF;
+      if (token.Equals("name", StringComparison.OrdinalIgnoreCase))
+        return NAME;
+      if (token.Equals("type", StringComparison.OrdinalIgnoreCase))
+        return TYPE;
+      if (token.Equals("comment", StringComparison.OrdinalIgnoreCase))
+        return COMMENT;
+      if (token.Equals("dimension", StringComparison.OrdinalIgnoreCase))
+        return DIM;
+      if (token.Equals("edge_weight_type", StringComparison.OrdinalIgnoreCase))
+        return WEIGHTTYPE;
+      if (token.Equals("node_coord_type", StringComparison.OrdinalIgnoreCase))
+        return NODETYPE;
+      if (token.Equals("node_coord_section", StringComparison.OrdinalIgnoreCase))
+        return NODESECTION;
+
+      return -1;
+    }
+
+    private void ReadName(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      name = tokens[tokens.Length - 1].Trim();
+    }
+
+    private void CheckType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+
+      string type = tokens[tokens.Length - 1].Trim();
+      if (!type.Equals("tsp", StringComparison.OrdinalIgnoreCase))
+        throw new InvalidDataException("Input file type is not \"TSP\"");
+    }
+
+    private void ReadComment(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      comment = tokens[tokens.Length - 1].Trim();
+    }
+
+    private void InitVerticesArray(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string dimension = tokens[tokens.Length - 1].Trim();
+
+      int dim = Int32.Parse(dimension);
+      vertices = new double[dim, 2];
+    }
+
+    private void ReadWeightType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string type = tokens[tokens.Length - 1].Trim();
+
+      if (type.Equals("euc_2d", StringComparison.OrdinalIgnoreCase))
+        weightType = TSPLIBEdgeWeightType.EUC_2D;
+      else if (type.Equals("geo", StringComparison.OrdinalIgnoreCase))
+        weightType = TSPLIBEdgeWeightType.GEO;
+      else
+        throw new InvalidDataException("Input file contains an unsupported edge weight type (only \"EUC_2D\" and \"GEO\" are supported).");
+    }
+
+    private void CheckNodeType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string type = tokens[tokens.Length - 1].Trim();
+
+      if (!type.Equals("twod_coords", StringComparison.OrdinalIgnoreCase))
+        throw new InvalidDataException("Input file contains an unsupported node coordinates type (only \"TWOD_COORDS\" is supported).");
+    }
+
+    private void ReadVertices() {
+      if (vertices == null)
+        throw new InvalidDataException("Input file does not contain dimension information.");
+
+      for (int i = 0; i < (vertices.Length / 2); i++) {
+        string str = source.ReadLine();
+        string[] tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+        if (tokens.Length != 3)
+          throw new InvalidDataException("Input file contains invalid node coordinates.");
+
+        CultureInfo culture = new CultureInfo("en-US");
+        vertices[i, 0] = double.Parse(tokens[1], culture.NumberFormat);
+        vertices[i, 1] = double.Parse(tokens[2], culture.NumberFormat);
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIBTourParser.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIBTourParser.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TSPLIBTourParser.cs	(revision 4402)
@@ -0,0 +1,180 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Globalization;
+using System.IO;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// Parses a *.opt.tour file in TSPLIB format and extracts its information about an optimal tour of a TSP.
+  /// </summary>
+  public class TSPLIBTourParser {
+    private const int EOF = 0;
+    private const int NAME = 1;
+    private const int TYPE = 2;
+    private const int COMMENT = 3;
+    private const int DIM = 4;
+    private const int TOURSECTION = 5;
+
+    private StreamReader source;
+
+    private string name;
+    /// <summary>
+    /// Gets the name of the parsed tour.
+    /// </summary>
+    public string Name {
+      get { return name; }
+    }
+    private string comment;
+    /// <summary>
+    /// Gets the comment of the parsed tour.
+    /// </summary>
+    public string Comment {
+      get { return comment; }
+    }
+    private int[] tour;
+    /// <summary>
+    /// Gets the parsed tour.
+    /// </summary>
+    public int[] Tour {
+      get { return tour; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="TSPLIBTourParser"/> with the given <paramref name="path"/>.
+    /// </summary>
+    /// <exception cref="ArgumentException">Thrown if the input file is not a TSPLIB optimal tour file (*.opt.tour)
+    /// </exception>
+    /// <param name="path">The path where the optimal tour is stored.</param>
+    public TSPLIBTourParser(String path) {
+      if (!path.EndsWith(".opt.tour"))
+        throw new ArgumentException("Input file has to be a TSPLIB optimal tour file (*.opt.tour).");
+
+      source = new StreamReader(path);
+      name = path;
+      comment = string.Empty;
+      tour = null;
+    }
+
+    /// <summary>
+    /// Reads the TSPLIB optimal tour file and parses its elements.
+    /// </summary>
+    /// <exception cref="InvalidDataException">Thrown if the file has an invalid format or contains invalid data.</exception>
+    public void Parse() {
+      int section = -1;
+      string str = null;
+      bool typeIsChecked = false;
+
+      do {
+        str = source.ReadLine();
+        section = GetSection(str);
+
+        if (section != -1) {
+          switch (section) {
+            case NAME:
+              ReadName(str);
+              break;
+            case TYPE:
+              CheckType(str);
+              typeIsChecked = true;
+              break;
+            case COMMENT:
+              ReadComment(str);
+              break;
+            case DIM:
+              InitTour(str);
+              break;
+            case TOURSECTION:
+              ReadTour();
+              break;
+          }
+        }
+      } while (!((section == EOF) || (str == null)));
+
+      if (!typeIsChecked)
+        throw new InvalidDataException("Input file does not contain type information.");
+    }
+
+    private int GetSection(string str) {
+      if (str == null)
+        return EOF;
+
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      if (tokens.Length == 0)
+        return -1;
+
+      string token = tokens[0].Trim();
+      if (token.Equals("eof", StringComparison.OrdinalIgnoreCase))
+        return EOF;
+      if (token.Equals("name", StringComparison.OrdinalIgnoreCase))
+        return NAME;
+      if (token.Equals("type", StringComparison.OrdinalIgnoreCase))
+        return TYPE;
+      if (token.Equals("comment", StringComparison.OrdinalIgnoreCase))
+        return COMMENT;
+      if (token.Equals("dimension", StringComparison.OrdinalIgnoreCase))
+        return DIM;
+      if (token.Equals("tour_section", StringComparison.OrdinalIgnoreCase))
+        return TOURSECTION;
+
+      return -1;
+    }
+
+    private void ReadName(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      name = tokens[tokens.Length - 1].Trim();
+    }
+
+    private void CheckType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+
+      string type = tokens[tokens.Length - 1].Trim();
+      if (!type.Equals("tour", StringComparison.OrdinalIgnoreCase))
+        throw new InvalidDataException("Input data format is not \"TOUR\"");
+    }
+
+    private void ReadComment(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      comment = tokens[tokens.Length - 1].Trim();
+    }
+
+    private void InitTour(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string dimension = tokens[tokens.Length - 1].Trim();
+
+      int dim = Int32.Parse(dimension);
+      tour = new int[dim];
+    }
+
+    private void ReadTour() {
+      if (tour == null)
+        throw new InvalidDataException("Input file does not contain dimension information.");
+
+      for (int i = 0; i < (tour.Length); i++) {
+        string str = source.ReadLine();
+
+        CultureInfo culture = new CultureInfo("en-US");
+        tour[i] = int.Parse(str, culture.NumberFormat) - 1;
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 4402)
@@ -0,0 +1,381 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  [Item("Traveling Salesman Problem", "Represents a symmetric Traveling Salesman Problem.")]
+  [Creatable("Problems")]
+  [StorableClass]
+  public sealed class TravelingSalesmanProblem : ParameterizedNamedItem, ISingleObjectiveProblem {
+    public override Image ItemImage {
+      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Type; }
+    }
+
+    #region Parameter Properties
+    public ValueParameter<BoolValue> MaximizationParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    IParameter ISingleObjectiveProblem.MaximizationParameter {
+      get { return MaximizationParameter; }
+    }
+    public ValueParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (ValueParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    }
+    public OptionalValueParameter<DoubleMatrix> DistanceMatrixParameter {
+      get { return (OptionalValueParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
+    }
+    public ValueParameter<BoolValue> UseDistanceMatrixParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
+    }
+    public ValueParameter<IPermutationCreator> SolutionCreatorParameter {
+      get { return (ValueParameter<IPermutationCreator>)Parameters["SolutionCreator"]; }
+    }
+    IParameter IProblem.SolutionCreatorParameter {
+      get { return SolutionCreatorParameter; }
+    }
+    public ValueParameter<ITSPEvaluator> EvaluatorParameter {
+      get { return (ValueParameter<ITSPEvaluator>)Parameters["Evaluator"]; }
+    }
+    IParameter IProblem.EvaluatorParameter {
+      get { return EvaluatorParameter; }
+    }
+    public OptionalValueParameter<DoubleValue> BestKnownQualityParameter {
+      get { return (OptionalValueParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
+    }
+    IParameter ISingleObjectiveProblem.BestKnownQualityParameter {
+      get { return BestKnownQualityParameter; }
+    }
+    public OptionalValueParameter<Permutation> BestKnownSolutionParameter {
+      get { return (OptionalValueParameter<Permutation>)Parameters["BestKnownSolution"]; }
+    }
+    #endregion
+
+    #region Properties
+    public DoubleMatrix Coordinates {
+      get { return CoordinatesParameter.Value; }
+      set { CoordinatesParameter.Value = value; }
+    }
+    public DoubleMatrix DistanceMatrix {
+      get { return DistanceMatrixParameter.Value; }
+      set { DistanceMatrixParameter.Value = value; }
+    }
+    public BoolValue UseDistanceMatrix {
+      get { return UseDistanceMatrixParameter.Value; }
+      set { UseDistanceMatrixParameter.Value = value; }
+    }
+    public IPermutationCreator SolutionCreator {
+      get { return SolutionCreatorParameter.Value; }
+      set { SolutionCreatorParameter.Value = value; }
+    }
+    ISolutionCreator IProblem.SolutionCreator {
+      get { return SolutionCreatorParameter.Value; }
+    }
+    public ITSPEvaluator Evaluator {
+      get { return EvaluatorParameter.Value; }
+      set { EvaluatorParameter.Value = value; }
+    }
+    ISingleObjectiveEvaluator ISingleObjectiveProblem.Evaluator {
+      get { return EvaluatorParameter.Value; }
+    }
+    IEvaluator IProblem.Evaluator {
+      get { return EvaluatorParameter.Value; }
+    }
+    public DoubleValue BestKnownQuality {
+      get { return BestKnownQualityParameter.Value; }
+      set { BestKnownQualityParameter.Value = value; }
+    }
+    public Permutation BestKnownSolution {
+      get { return BestKnownSolutionParameter.Value; }
+      set { BestKnownSolutionParameter.Value = value; }
+    }
+    public IEnumerable<IOperator> Operators {
+      get { return operators; }
+    }
+    private BestTSPSolutionAnalyzer BestTSPSolutionAnalyzer {
+      get { return operators.OfType<BestTSPSolutionAnalyzer>().FirstOrDefault(); }
+    }
+    #endregion
+
+    [Storable]
+    private List<IOperator> operators;
+
+    [StorableConstructor]
+    private TravelingSalesmanProblem(bool deserializing) : base(deserializing) { }
+    public TravelingSalesmanProblem()
+      : base() {
+      RandomPermutationCreator creator = new RandomPermutationCreator();
+      TSPRoundedEuclideanPathEvaluator evaluator = new TSPRoundedEuclideanPathEvaluator();
+
+      Parameters.Add(new ValueParameter<BoolValue>("Maximization", "Set to false as the Traveling Salesman Problem is a minimization problem.", new BoolValue(false)));
+      Parameters.Add(new ValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities."));
+      Parameters.Add(new OptionalValueParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false.", new BoolValue(true)));
+      Parameters.Add(new ValueParameter<IPermutationCreator>("SolutionCreator", "The operator which should be used to create new TSP solutions.", creator));
+      Parameters.Add(new ValueParameter<ITSPEvaluator>("Evaluator", "The operator which should be used to evaluate TSP solutions.", evaluator));
+      Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this TSP instance."));
+      Parameters.Add(new OptionalValueParameter<Permutation>("BestKnownSolution", "The best known solution of this TSP instance."));
+
+      Coordinates = new DoubleMatrix(new double[,] {
+        { 100, 100 }, { 100, 200 }, { 100, 300 }, { 100, 400 },
+        { 200, 100 }, { 200, 200 }, { 200, 300 }, { 200, 400 },
+        { 300, 100 }, { 300, 200 }, { 300, 300 }, { 300, 400 },
+        { 400, 100 }, { 400, 200 }, { 400, 300 }, { 400, 400 }
+      });
+
+      creator.PermutationParameter.ActualName = "TSPTour";
+      evaluator.QualityParameter.ActualName = "TSPTourLength";
+      ParameterizeSolutionCreator();
+      ParameterizeEvaluator();
+
+      InitializeOperators();
+      AttachEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      TravelingSalesmanProblem clone = (TravelingSalesmanProblem)base.Clone(cloner);
+      clone.operators = operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
+      clone.DistanceMatrixParameter.Value = DistanceMatrixParameter.Value;
+      clone.AttachEventHandlers();
+      return clone;
+    }
+
+    #region Events
+    public event EventHandler SolutionCreatorChanged;
+    private void OnSolutionCreatorChanged() {
+      EventHandler handler = SolutionCreatorChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler EvaluatorChanged;
+    private void OnEvaluatorChanged() {
+      EventHandler handler = EvaluatorChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler OperatorsChanged;
+    private void OnOperatorsChanged() {
+      EventHandler handler = OperatorsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler Reset;
+    private void OnReset() {
+      EventHandler handler = Reset;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    private void CoordinatesParameter_ValueChanged(object sender, EventArgs e) {
+      Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged);
+      Coordinates.Reset += new EventHandler(Coordinates_Reset);
+      ParameterizeSolutionCreator();
+      ClearDistanceMatrix();
+    }
+    private void Coordinates_ItemChanged(object sender, EventArgs<int, int> e) {
+      ClearDistanceMatrix();
+    }
+    private void Coordinates_Reset(object sender, EventArgs e) {
+      ParameterizeSolutionCreator();
+      ClearDistanceMatrix();
+    }
+    private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
+      SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
+      ParameterizeSolutionCreator();
+      ParameterizeEvaluator();
+      ParameterizeAnalyzer();
+      ParameterizeOperators();
+      OnSolutionCreatorChanged();
+    }
+    private void SolutionCreator_PermutationParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeEvaluator();
+      ParameterizeAnalyzer();
+      ParameterizeOperators();
+    }
+    private void EvaluatorParameter_ValueChanged(object sender, EventArgs e) {
+      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      ParameterizeEvaluator();
+      UpdateMoveEvaluators();
+      ParameterizeAnalyzer();
+      ClearDistanceMatrix();
+      OnEvaluatorChanged();
+    }
+    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeAnalyzer();
+    }
+    private void MoveGenerator_InversionMoveParameter_ActualNameChanged(object sender, EventArgs e) {
+      string name = ((ILookupParameter<InversionMove>)sender).ActualName;
+      foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>()) {
+        op.InversionMoveParameter.ActualName = name;
+      }
+    }
+    private void MoveGenerator_TranslocationMoveParameter_ActualNameChanged(object sender, EventArgs e) {
+      string name = ((ILookupParameter<TranslocationMove>)sender).ActualName;
+      foreach (IPermutationTranslocationMoveOperator op in Operators.OfType<IPermutationTranslocationMoveOperator>()) {
+        op.TranslocationMoveParameter.ActualName = name;
+      }
+    }
+    #endregion
+
+    #region Helpers
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserializationHook() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code (remove with 3.4)
+      if (operators == null) InitializeOperators();
+      #endregion
+      AttachEventHandlers();
+    }
+
+    private void AttachEventHandlers() {
+      CoordinatesParameter.ValueChanged += new EventHandler(CoordinatesParameter_ValueChanged);
+      Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged);
+      Coordinates.Reset += new EventHandler(Coordinates_Reset);
+      SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
+      SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
+      EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
+      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+    }
+
+    private void InitializeOperators() {
+      operators = new List<IOperator>();
+      operators.Add(new BestTSPSolutionAnalyzer());
+      ParameterizeAnalyzer();
+      operators.AddRange(ApplicationManager.Manager.GetInstances<IPermutationOperator>().Cast<IOperator>());
+      ParameterizeOperators();
+      UpdateMoveEvaluators();
+      InitializeMoveGenerators();
+    }
+    private void InitializeMoveGenerators() {
+      foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>()) {
+        if (op is IMoveGenerator) {
+          op.InversionMoveParameter.ActualNameChanged += new EventHandler(MoveGenerator_InversionMoveParameter_ActualNameChanged);
+        }
+      }
+      foreach (IPermutationTranslocationMoveOperator op in Operators.OfType<IPermutationTranslocationMoveOperator>()) {
+        if (op is IMoveGenerator) {
+          op.TranslocationMoveParameter.ActualNameChanged += new EventHandler(MoveGenerator_TranslocationMoveParameter_ActualNameChanged);
+        }
+      }
+    }
+    private void UpdateMoveEvaluators() {
+      operators.RemoveAll(x => x is ISingleObjectiveMoveEvaluator);
+      foreach (ITSPPathMoveEvaluator op in ApplicationManager.Manager.GetInstances<ITSPPathMoveEvaluator>())
+        if (op.EvaluatorType == Evaluator.GetType()) {
+          operators.Add(op);
+        }
+      ParameterizeOperators();
+      OnOperatorsChanged();
+    }
+    private void ParameterizeSolutionCreator() {
+      SolutionCreator.LengthParameter.Value = new IntValue(Coordinates.Rows);
+      SolutionCreator.PermutationTypeParameter.Value = new PermutationType(PermutationTypes.RelativeUndirected);
+    }
+    private void ParameterizeEvaluator() {
+      if (Evaluator is ITSPPathEvaluator)
+        ((ITSPPathEvaluator)Evaluator).PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+      if (Evaluator is ITSPCoordinatesPathEvaluator) {
+        ITSPCoordinatesPathEvaluator evaluator = (ITSPCoordinatesPathEvaluator)Evaluator;
+        evaluator.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        evaluator.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
+        evaluator.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
+      }
+    }
+    private void ParameterizeAnalyzer() {
+      BestTSPSolutionAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+      BestTSPSolutionAnalyzer.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+      BestTSPSolutionAnalyzer.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+      BestTSPSolutionAnalyzer.ResultsParameter.ActualName = "Results";
+      BestTSPSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
+      BestTSPSolutionAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
+      BestTSPSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
+    }
+    private void ParameterizeOperators() {
+      foreach (IPermutationCrossover op in Operators.OfType<IPermutationCrossover>()) {
+        op.ParentsParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+        op.ChildParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+      }
+      foreach (IPermutationManipulator op in Operators.OfType<IPermutationManipulator>()) {
+        op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+      }
+      foreach (IPermutationMoveOperator op in Operators.OfType<IPermutationMoveOperator>()) {
+        op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+      }
+      foreach (ITSPPathMoveEvaluator op in Operators.OfType<ITSPPathMoveEvaluator>()) {
+        op.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        op.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
+        op.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
+        op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+        op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+      }
+      string inversionMove = Operators.OfType<IMoveGenerator>().OfType<IPermutationInversionMoveOperator>().First().InversionMoveParameter.ActualName;
+      foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>())
+        op.InversionMoveParameter.ActualName = inversionMove;
+      string translocationMove = Operators.OfType<IMoveGenerator>().OfType<IPermutationTranslocationMoveOperator>().First().TranslocationMoveParameter.ActualName;
+      foreach (IPermutationTranslocationMoveOperator op in Operators.OfType<IPermutationTranslocationMoveOperator>())
+        op.TranslocationMoveParameter.ActualName = translocationMove;
+    }
+
+    private void ClearDistanceMatrix() {
+      DistanceMatrixParameter.Value = null;
+    }
+    #endregion
+
+    public void ImportFromTSPLIB(string tspFileName, string optimalTourFileName) {
+      TSPLIBParser tspParser = new TSPLIBParser(tspFileName);
+      tspParser.Parse();
+      Name = tspParser.Name + " TSP (imported from TSPLIB)";
+      if (!string.IsNullOrEmpty(tspParser.Comment)) Description = tspParser.Comment;
+      Coordinates = new DoubleMatrix(tspParser.Vertices);
+      if (tspParser.WeightType == TSPLIBParser.TSPLIBEdgeWeightType.EUC_2D) {
+        TSPRoundedEuclideanPathEvaluator evaluator = new TSPRoundedEuclideanPathEvaluator();
+        evaluator.QualityParameter.ActualName = "TSPTourLength";
+        Evaluator = evaluator;
+      } else if (tspParser.WeightType == TSPLIBParser.TSPLIBEdgeWeightType.GEO) {
+        TSPGeoPathEvaluator evaluator = new TSPGeoPathEvaluator();
+        evaluator.QualityParameter.ActualName = "TSPTourLength";
+        Evaluator = evaluator;
+      }
+      BestKnownQuality = null;
+      BestKnownSolution = null;
+
+      if (!string.IsNullOrEmpty(optimalTourFileName)) {
+        TSPLIBTourParser tourParser = new TSPLIBTourParser(optimalTourFileName);
+        tourParser.Parse();
+        if (tourParser.Tour.Length != Coordinates.Rows) throw new InvalidDataException("Length of optimal tour is not equal to number of cities.");
+        BestKnownSolution = new Permutation(PermutationTypes.RelativeUndirected, tourParser.Tour);
+      }
+      OnReset();
+    }
+    public void ImportFromTSPLIB(string tspFileName, string optimalTourFileName, double bestKnownQuality) {
+      ImportFromTSPLIB(tspFileName, optimalTourFileName);
+      BestKnownQuality = new DoubleValue(bestKnownQuality);
+    }
+  }
+}
Index: /branches/HeuristicLab.DiversityAnalysis/PreBuildEvent.cmd
===================================================================
--- /branches/HeuristicLab.DiversityAnalysis/PreBuildEvent.cmd	(revision 4402)
+++ /branches/HeuristicLab.DiversityAnalysis/PreBuildEvent.cmd	(revision 4402)
@@ -0,0 +1,1 @@
+SubWCRev "%ProjectDir%\" "%ProjectDir%\Properties\AssemblyInfo.frame" "%ProjectDir%\Properties\AssemblyInfo.cs"
