Index: /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 17337)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 17338)
@@ -160,4 +160,5 @@
     <Compile Include="MultiObjective\CrowdingCalculator.cs" />
     <Compile Include="MultiObjective\DominationCalculator.cs" />
+    <Compile Include="MultiObjective\GenerationalDistanceCalculator.cs" />
     <Compile Include="MultiObjective\HypervolumeCalculator.cs" />
     <Compile Include="Results\IResultParameter.cs" />
Index: anches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/Multi-objective/CrowdingTest.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/Multi-objective/CrowdingTest.cs	(revision 17337)
+++ 	(revision )
@@ -1,141 +1,0 @@
-﻿//#region License Information
-///* HeuristicLab
-// * Copyright (C) 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 Microsoft.VisualStudio.TestTools.UnitTesting;
-//using HeuristicLab.Optimization;
-
-//namespace HeuristicLab.Analysis.Tests {
-//  [TestClass]
-//  public class CrowdingTest {
-
-//    [TestMethod]
-//    [ExpectedException(typeof(ArgumentException))]
-//    [TestCategory("Analysis.MultiObjective")]
-//    [TestProperty("Time", "short")]
-//    public void CrowdingTestEmptyFront() {
-//      double[][] front = { };
-
-//      CrowdingCalculator.CalculateCrowding(front);
-//    }
-
-//    [TestMethod]
-//    [TestCategory("Analysis.MultiObjective")]
-//    [TestProperty("Time", "short")]
-//    public void CrowdingTestSamePoint() {
-
-//      double[] point = new double[2];
-//      point[0] = 0.5;
-//      point[1] = 0.5;
-
-//      double[] point1 = new double[2];
-//      point1[0] = 0.5;
-//      point1[1] = 0.5;
-//      double[][] front = { point, point1 };
-//      double dist = Crowding.Calculate(front, new double[,] { { 0, 1 }, { 0, 1 } });
-//      Assert.AreEqual(double.PositiveInfinity, dist);
-//    }
-
-//    [TestMethod]
-//    [TestCategory("Analysis.MultiObjective")]
-//    [TestProperty("Time", "short")]
-//    public void CrowdingTestSinglePoint() {
-//      double[] point = new double[2];
-//      point[0] = 0;
-//      point[1] = 0;
-//      double[][] front = { point };
-//      double dist = Crowding.Calculate(front, new double[,] { { 0, 1 }, { 0, 1 } });
-//      Assert.AreEqual(double.PositiveInfinity, dist);
-//    }
-
-//    [TestMethod]
-//    [TestCategory("Analysis.MultiObjective")]
-//    [TestProperty("Time", "short")]
-//    public void CrowdingTestDiagonal() {
-//      double[] point = new double[2];
-//      point[0] = 0;
-//      point[1] = 0;
-//      double[] point1 = new double[2];
-//      point1[0] = 0.5;
-//      point1[1] = 0.5;
-
-//      double[] point2 = new double[2];
-//      point2[0] = 1;
-//      point2[1] = 1;
-//      double[][] front = { point, point1, point2 };
-//      double dist = Crowding.Calculate(front, new double[,] { { 0, 1 }, { 0, 1 } });
-//      Assert.AreEqual(2, dist);
-//    }
-
-//    [TestMethod]
-//    [TestCategory("Analysis.MultiObjective")]
-//    [TestProperty("Time", "short")]
-//    public void CrowdingTestDiamond() {
-//      double[] point = new double[2];
-//      point[0] = 0;
-//      point[1] = 0;
-//      double[] point1 = new double[2];
-//      point1[0] = 1;
-//      point1[1] = 1.5;
-
-//      double[] point2 = new double[2];
-//      point2[0] = 3;
-//      point2[1] = 0.5;
-//      double[] point3 = new double[2];
-//      point3[0] = 4;
-//      point3[1] = 2;
-//      double[][] front = { point, point1, point2, point3 };
-//      double dist = Crowding.Calculate(front, new double[,] { { 0, 4 }, { 0, 2 } });
-//      Assert.AreEqual(1.5, dist);
-//    }
-
-//    /// <summary> 
-//    /// deltoid with 4 points of the 1-unit-square and the northeastern point at 4,4
-//    /// 
-//    /// </summary>
-//    [TestMethod]
-//    [TestCategory("Analysis.MultiObjective")]
-//    [TestProperty("Time", "short")]
-//    public void CrowdingTestDeltoid() {
-//      double[] point = new double[2];
-//      point[0] = 0;
-//      point[1] = 0;
-//      double[] point1 = new double[2];
-//      point1[0] = 0.00000001;         //points should not be exactly equal because sorting behavior could change result
-//      point1[1] = 1.00000001;
-
-//      double[] point2 = new double[2];
-//      point2[0] = 1;
-//      point2[1] = 0;
-//      double[] point3 = new double[2];
-//      point3[0] = 4;
-//      point3[1] = 4;
-
-
-//      double[][] front = { point, point1, point2, point3, };
-//      double dist = Crowding.Calculate(front, new double[,] { { 0, 4 }, { 0, 4 } });
-//      Assert.AreEqual(1.25, dist);
-//    }
-
-
-//  }
-
-
-//}
Index: anches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/Multi-objective/FastHyperVolumeTests.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/Multi-objective/FastHyperVolumeTests.cs	(revision 17337)
+++ 	(revision )
@@ -1,116 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 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;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-
-namespace HeuristicLab.Analysis.MultiObjective.Tests {
-  [TestClass]
-  public class FastHypervolumeTest {
-    /// <summary>
-    ///  /*
-    /// +-----+
-    /// |     |
-    /// |  x  |
-    /// |     |
-    /// +-----+
-    /// 
-    /// box between(0,0,0) and(1,1,1) with singular point pareto front at(0.5,0.5,0.5)
-    /// Hypervolume should be 0.125;  
-    /// 
-    /// </summary>
-    [TestMethod]
-    [TestCategory("Analysis.MultiObjective")]
-    [TestProperty("Time", "short")]
-    public void FastHypervolumeTestSinglePoint() {
-      double[] point = new double[] { 0.5, 0.5, 0.5 };
-      double[][] front = { point };
-      double[] referencePoint = new double[] { 1, 1, 1 };
-      double hv = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, new bool[3]);
-      Assert.AreEqual(0.125, hv);
-    }
-
-    /// <summary>
-    ///  /*
-    /// +-----+
-    /// | x   |
-    /// |     |
-    /// |     |
-    /// +-----+
-    /// 
-    /// box between(0,0) and(1,1) with singular point Pareto front at a random Location
-    /// Sum of the Hypervolume to each of the corners should be 1;  
-    /// 
-    /// </summary>
-    [TestMethod]
-    [TestCategory("Analysis.MultiObjective")]
-    [TestProperty("Time", "short")]
-    public void FastHypervolumeTestRandomSinglePoint() {
-      //Front with a single Point
-      double[] point = new double[3];
-      var r = new System.Random();
-
-      point[0] = r.NextDouble();
-      point[1] = r.NextDouble();
-      point[2] = r.NextDouble();
-      double[][] front = { point };
-
-      double[] referencePoint = new double[3];
-
-      //Northeast
-      referencePoint[0] = 1;
-      referencePoint[1] = 1;
-      referencePoint[2] = 1;
-      double hv = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, new bool[3]);
-      double hv2 = 1;
-      foreach (double d in point) {
-        hv2 *= Math.Abs(d - 1);
-      }
-      Assert.AreEqual(hv2, hv);
-    }
-
-    /// <summary>
-    ///  /*
-    /// x-----+
-    /// |     |
-    /// |  X  |
-    /// |     |
-    /// +-----x
-    /// 
-    /// box between(0,0,0) and(1,1,1) with three point (Pareto) front at (1,0,0), (0.5,0.5,0)  and (0,1,0) 
-    /// Hypervolume should be 0.25
-    /// </summary>
-    [TestMethod]
-    [TestCategory("Analysis.MultiObjective")]
-    [TestProperty("Time", "short")]
-    public void FastHypervolumeTestDiagonalPoint() {
-      //Front with three points
-      double[] point1 = new double[] { 1, 0, 0 };
-      double[] point2 = new double[] { 0, 1, 0 };
-      double[] point3 = new double[] { 0.5, 0.5, 0 };
-      double[][] front = { point1, point2, point3 };
-
-      double[] referencePoint = new double[] { 1, 1, 1 };
-      double hv = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, new bool[3]);
-      Assert.AreEqual(0.5, hv);
-    }
-  }
-}
Index: anches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/Multi-objective/HyperVolumeTests.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/Multi-objective/HyperVolumeTests.cs	(revision 17337)
+++ 	(revision )
@@ -1,290 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 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.Linq;
-using HeuristicLab.Optimization;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-
-namespace HeuristicLab.Analysis.MultiObjective.Tests {
-  [TestClass]
-  public class HypervolumeTest {
-
-    /// <summary>
-    ///  /*
-    /// +-----+
-    /// |     |
-    /// |  x  |
-    /// |     |
-    /// +-----+
-    /// 
-    /// box between(0,0) and(1,1) with singular point Pareto front at(0.5,0.5)
-    /// Hypervolume to each of the corners should be 0.25;  
-    /// 
-    /// </summary>
-    [TestMethod]
-    [TestCategory("Analysis.MultiObjective")]
-    [TestProperty("Time", "short")]
-    public void HypervolumeTestSinglePoint() {
-
-      //Front with a single Point
-      double[] point = new double[2];
-      point[0] = 0.5;
-      point[1] = 0.5;
-      double[][] front = { point };
-
-      double[] referencePoint = new double[2];
-      bool[] maximization;
-
-      //Northeast
-      maximization = new bool[] { false, false };
-      referencePoint[0] = 1;
-      referencePoint[1] = 1;
-      double ne = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-      Assert.AreEqual(0.25, ne);
-
-      //NorthWest
-      maximization = new bool[] { true, false };
-      referencePoint[0] = 0;
-      referencePoint[1] = 1;
-      double nw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-      Assert.AreEqual(0.25, nw);
-
-      //SouthWest
-      maximization = new bool[] { true, true };
-      referencePoint[0] = 0;
-      referencePoint[1] = 0;
-      double sw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-      Assert.AreEqual(0.25, sw);
-
-      //SouthEast
-      maximization = new bool[] { false, true };
-      referencePoint[0] = 1;
-      referencePoint[1] = 0;
-      double se = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-      Assert.AreEqual(0.25, se);
-
-
-    }
-
-    /// <summary>
-    ///  /*
-    /// +-----+
-    /// | x   |
-    /// |     |
-    /// |     |
-    /// +-----+
-    /// 
-    /// box between(0,0) and(1,1) with singular point Pareto front at a random Location
-    /// Sum of the Hypervolume to each of the corners should be 1;  
-    /// 
-    /// </summary>
-    [TestMethod]
-    [TestCategory("Analysis.MultiObjective")]
-    [TestProperty("Time", "short")]
-    public void HypervolumeTestRandomSinglePoint() {
-      //Front with a single Point
-      double[] point = new double[2];
-      var r = new System.Random();
-
-      point[0] = r.NextDouble();
-      point[1] = r.NextDouble();
-      double[][] front = { point };
-
-      double[] referencePoint = new double[2];
-      bool[] maximization;
-
-      //Northeast
-      maximization = new bool[] { false, false };
-      referencePoint[0] = 1;
-      referencePoint[1] = 1;
-      double ne = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-
-      //NorthWest
-      maximization = new bool[] { true, false };
-      referencePoint[0] = 0;
-      referencePoint[1] = 1;
-      double nw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-
-      //SouthWest
-      maximization = new bool[] { true, true };
-      referencePoint[0] = 0;
-      referencePoint[1] = 0;
-      double sw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-
-      //SouthEast
-      maximization = new bool[] { false, true };
-      referencePoint[0] = 1;
-      referencePoint[1] = 0;
-      double se = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-      Assert.AreEqual(1.0, ne + se + nw + sw, 1e8);
-    }
-
-    /// <summary>
-    ///  /*
-    /// x-----+
-    /// |     |
-    /// |  X  |
-    /// |     |
-    /// +-----x
-    /// 
-    /// box between(0,0) and(1,1) with three point (Pareto) front at (1,0), (0.5,0.5)  and (0,1) 
-    /// Hypervolume to (1,0) and (0,1) of the corners should be 1 (dominated Points need to be removed beforehand and   
-    /// Hypervolume to (0,0) and (1,1) of the corners should be 0.25
-    /// </summary>
-    [TestMethod]
-    [TestCategory("Analysis.MultiObjective")]
-    [TestProperty("Time", "short")]
-    public void HypervolumeTestDiagonalPoint() {
-      //Front with three points
-      double[] point1 = new double[2];
-      point1[0] = 0;
-      point1[1] = 1;
-      double[] point2 = new double[2];
-      point2[0] = 1;
-      point2[1] = 0;
-      double[] point3 = new double[2];
-      point3[0] = 0.5;
-      point3[1] = 0.5;
-      double[][] front = { point1, point2, point3 };
-
-      double[] referencePoint = new double[2];
-      bool[] maximization;
-
-      //Northeast
-      maximization = new bool[] { false, false };
-      referencePoint[0] = 1;
-      referencePoint[1] = 1;
-      double ne = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-      Assert.AreEqual(0.25, ne);
-
-      //NorthWest
-      maximization = new bool[] { true, false };
-      referencePoint[0] = 0;
-      referencePoint[1] = 1;
-      var nonDominatedFront = DominationCalculator.CalculateBestParetoFront(front, front, maximization, false).Select(i => i.Item2).ToList();
-      double nw = HypervolumeCalculator.CalculateHypervolume(nonDominatedFront, referencePoint, maximization);
-      Assert.AreEqual(1, nw);
-
-      //SouthWest
-      maximization = new bool[] { true, true };
-      referencePoint[0] = 0;
-      referencePoint[1] = 0;
-      double sw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-      Assert.AreEqual(0.25, sw);
-
-      //SouthEast
-      maximization = new bool[] { false, true };
-      referencePoint[0] = 1;
-      referencePoint[1] = 0;
-      nonDominatedFront = DominationCalculator.CalculateBestParetoFront(front, front, maximization, false).Select(i => i.Item2).ToList();
-      double se = HypervolumeCalculator.CalculateHypervolume(nonDominatedFront, referencePoint, maximization);
-      Assert.AreEqual(1, se);
-
-    }
-
-    [TestMethod()]
-    [ExpectedException(typeof(ArgumentException))]
-    [TestCategory("Analysis.MultiObjective")]
-    [TestProperty("Time", "short")]
-    public void HypervolumeTestReferencePointViolationNE() {
-      //Front with a single Point
-      double[] point = new double[2];
-      point[0] = 0.5;
-      point[1] = 0.5;
-      double[][] front = { point };
-
-      double[] referencePoint = new double[2];
-      bool[] maximization;
-
-      //Northeast
-      maximization = new bool[] { true, true };
-      referencePoint[0] = 1;
-      referencePoint[1] = 1;
-      double ne = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-    }
-
-    [TestMethod()]
-    [ExpectedException(typeof(ArgumentException))]
-    [TestCategory("Analysis.MultiObjective")]
-    [TestProperty("Time", "short")]
-    public void HypervolumeTestReferencePointViolationNW() {
-      //Front with a single Point
-      double[] point = new double[2];
-      point[0] = 0.5;
-      point[1] = 0.5;
-      double[][] front = { point };
-
-      double[] referencePoint = new double[2];
-      bool[] maximization;
-
-      //NorthWest
-      maximization = new bool[] { false, true };
-      referencePoint[0] = 0;
-      referencePoint[1] = 1;
-      double nw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-      Assert.AreEqual(0.25, nw);
-    }
-
-    [TestMethod()]
-    [ExpectedException(typeof(ArgumentException))]
-    [TestCategory("Analysis.MultiObjective")]
-    [TestProperty("Time", "short")]
-    public void HypervolumeTestReferencePointViolationSW() {
-      //Front with a single Point
-      double[] point = new double[2];
-      point[0] = 0.5;
-      point[1] = 0.5;
-      double[][] front = { point };
-
-      double[] referencePoint = new double[2];
-      bool[] maximization;
-
-      //SouthWest
-      maximization = new bool[] { false, false };
-      referencePoint[0] = 0;
-      referencePoint[1] = 0;
-      double sw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-      Assert.AreEqual(0.25, sw);
-    }
-
-    [TestMethod()]
-    [ExpectedException(typeof(ArgumentException))]
-    [TestCategory("Analysis.MultiObjective")]
-    [TestProperty("Time", "short")]
-    public void HypervolumeTestReferencePointViolationSE() {
-      //Front with a single Point
-      double[] point = new double[2];
-      point[0] = 0.5;
-      point[1] = 0.5;
-      double[][] front = { point };
-
-      double[] referencePoint = new double[2];
-      bool[] maximization;
-
-      //SouthEast
-      maximization = new bool[] { true, false };
-      referencePoint[0] = 1;
-      referencePoint[1] = 0;
-      double se = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
-      Assert.AreEqual(0.25, se);
-    }
-  }
-}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Optimization-3.3/Multi-objective/CrowdingTest.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Optimization-3.3/Multi-objective/CrowdingTest.cs	(revision 17338)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Optimization-3.3/Multi-objective/CrowdingTest.cs	(revision 17338)
@@ -0,0 +1,141 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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 Microsoft.VisualStudio.TestTools.UnitTesting;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Optimization.Tests {
+  [TestClass]
+  public class CrowdingTest {
+
+    [TestMethod]
+    [ExpectedException(typeof(ArgumentException))]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void CrowdingTestEmptyFront() {
+      double[][] front = { };
+
+      CrowdingCalculator.CalculateCrowding(front);
+    }
+
+    [TestMethod]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void CrowdingTestSamePoint() {
+
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+
+      double[] point1 = new double[2];
+      point1[0] = 0.5;
+      point1[1] = 0.5;
+      double[][] front = { point, point1 };
+      double dist = CrowdingCalculator.CalculateCrowding(front);
+      Assert.AreEqual(double.PositiveInfinity, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void CrowdingTestSinglePoint() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[][] front = { point };
+      double dist = CrowdingCalculator.CalculateCrowding(front);
+      Assert.AreEqual(double.PositiveInfinity, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void CrowdingTestDiagonal() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 0.5;
+      point1[1] = 0.5;
+
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 1;
+      double[][] front = { point, point1, point2 };
+      double dist = CrowdingCalculator.CalculateCrowding(front);
+      Assert.AreEqual(2, dist);
+    }
+
+    [TestMethod]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void CrowdingTestDiamond() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 1;
+      point1[1] = 1.5;
+
+      double[] point2 = new double[2];
+      point2[0] = 3;
+      point2[1] = 0.5;
+      double[] point3 = new double[2];
+      point3[0] = 4;
+      point3[1] = 2;
+      double[][] front = { point, point1, point2, point3 };
+      double dist = CrowdingCalculator.CalculateCrowding(front);
+      Assert.AreEqual(1.5, dist);
+    }
+
+    /// <summary> 
+    /// deltoid with 4 points of the 1-unit-square and the northeastern point at 4,4
+    /// 
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void CrowdingTestDeltoid() {
+      double[] point = new double[2];
+      point[0] = 0;
+      point[1] = 0;
+      double[] point1 = new double[2];
+      point1[0] = 0.00000001;         //points should not be exactly equal because sorting behavior could change result
+      point1[1] = 1.00000001;
+
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 0;
+      double[] point3 = new double[2];
+      point3[0] = 4;
+      point3[1] = 4;
+
+
+      double[][] front = { point, point1, point2, point3, };
+      double dist = CrowdingCalculator.CalculateCrowding(front);
+      Assert.AreEqual(1.25, dist);
+    }
+
+
+  }
+
+
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Optimization-3.3/Multi-objective/FastHyperVolumeTests.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Optimization-3.3/Multi-objective/FastHyperVolumeTests.cs	(revision 17338)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Optimization-3.3/Multi-objective/FastHyperVolumeTests.cs	(revision 17338)
@@ -0,0 +1,116 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Optimization.Tests {
+  [TestClass]
+  public class FastHypervolumeTest {
+    /// <summary>
+    ///  /*
+    /// +-----+
+    /// |     |
+    /// |  x  |
+    /// |     |
+    /// +-----+
+    /// 
+    /// box between(0,0,0) and(1,1,1) with singular point pareto front at(0.5,0.5,0.5)
+    /// Hypervolume should be 0.125;  
+    /// 
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void FastHypervolumeTestSinglePoint() {
+      double[] point = new double[] { 0.5, 0.5, 0.5 };
+      double[][] front = { point };
+      double[] referencePoint = new double[] { 1, 1, 1 };
+      double hv = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, new bool[3]);
+      Assert.AreEqual(0.125, hv);
+    }
+
+    /// <summary>
+    ///  /*
+    /// +-----+
+    /// | x   |
+    /// |     |
+    /// |     |
+    /// +-----+
+    /// 
+    /// box between(0,0) and(1,1) with singular point Pareto front at a random Location
+    /// Sum of the Hypervolume to each of the corners should be 1;  
+    /// 
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void FastHypervolumeTestRandomSinglePoint() {
+      //Front with a single Point
+      double[] point = new double[3];
+      var r = new System.Random();
+
+      point[0] = r.NextDouble();
+      point[1] = r.NextDouble();
+      point[2] = r.NextDouble();
+      double[][] front = { point };
+
+      double[] referencePoint = new double[3];
+
+      //Northeast
+      referencePoint[0] = 1;
+      referencePoint[1] = 1;
+      referencePoint[2] = 1;
+      double hv = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, new bool[3]);
+      double hv2 = 1;
+      foreach (double d in point) {
+        hv2 *= Math.Abs(d - 1);
+      }
+      Assert.AreEqual(hv2, hv);
+    }
+
+    /// <summary>
+    ///  /*
+    /// x-----+
+    /// |     |
+    /// |  X  |
+    /// |     |
+    /// +-----x
+    /// 
+    /// box between(0,0,0) and(1,1,1) with three point (Pareto) front at (1,0,0), (0.5,0.5,0)  and (0,1,0) 
+    /// Hypervolume should be 0.25
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void FastHypervolumeTestDiagonalPoint() {
+      //Front with three points
+      double[] point1 = new double[] { 1, 0, 0 };
+      double[] point2 = new double[] { 0, 1, 0 };
+      double[] point3 = new double[] { 0.5, 0.5, 0 };
+      double[][] front = { point1, point2, point3 };
+
+      double[] referencePoint = new double[] { 1, 1, 1 };
+      double hv = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, new bool[3]);
+      Assert.AreEqual(0.5, hv);
+    }
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Optimization-3.3/Multi-objective/HyperVolumeTests.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Optimization-3.3/Multi-objective/HyperVolumeTests.cs	(revision 17338)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Optimization-3.3/Multi-objective/HyperVolumeTests.cs	(revision 17338)
@@ -0,0 +1,287 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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.Linq;
+using HeuristicLab.Optimization;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Optimization.Tests {
+  [TestClass]
+  public class HypervolumeTest {
+
+    /// <summary>
+    ///  /*
+    /// +-----+
+    /// |     |
+    /// |  x  |
+    /// |     |
+    /// +-----+
+    /// 
+    /// box between(0,0) and(1,1) with singular point Pareto front at(0.5,0.5)
+    /// Hypervolume to each of the corners should be 0.25;  
+    /// 
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestSinglePoint() {
+
+      //Front with a single Point
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //Northeast
+      maximization = new bool[] { false, false };
+      referencePoint[0] = 1;
+      referencePoint[1] = 1;
+      double ne = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, ne);
+
+      //NorthWest
+      maximization = new bool[] { true, false };
+      referencePoint[0] = 0;
+      referencePoint[1] = 1;
+      double nw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, nw);
+
+      //SouthWest
+      maximization = new bool[] { true, true };
+      referencePoint[0] = 0;
+      referencePoint[1] = 0;
+      double sw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, sw);
+
+      //SouthEast
+      maximization = new bool[] { false, true };
+      referencePoint[0] = 1;
+      referencePoint[1] = 0;
+      double se = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, se);
+
+
+    }
+
+    /// <summary>
+    ///  /*
+    /// +-----+
+    /// | x   |
+    /// |     |
+    /// |     |
+    /// +-----+
+    /// 
+    /// box between(0,0) and(1,1) with singular point Pareto front at a random Location
+    /// Sum of the Hypervolume to each of the corners should be 1;  
+    /// 
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestRandomSinglePoint() {
+      //Front with a single Point
+      double[] point = new double[2];
+      var r = new System.Random();
+
+      point[0] = r.NextDouble();
+      point[1] = r.NextDouble();
+      double[][] front = { point };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //Northeast
+      maximization = new bool[] { false, false };
+      referencePoint[0] = 1;
+      referencePoint[1] = 1;
+      double ne = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+
+      //NorthWest
+      maximization = new bool[] { true, false };
+      referencePoint[0] = 0;
+      referencePoint[1] = 1;
+      double nw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+
+      //SouthWest
+      maximization = new bool[] { true, true };
+      referencePoint[0] = 0;
+      referencePoint[1] = 0;
+      double sw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+
+      //SouthEast
+      maximization = new bool[] { false, true };
+      referencePoint[0] = 1;
+      referencePoint[1] = 0;
+      double se = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+      Assert.AreEqual(1.0, ne + se + nw + sw, 1e8);
+    }
+
+    /// <summary>
+    ///  /*
+    /// x-----+
+    /// |     |
+    /// |  X  |
+    /// |     |
+    /// +-----x
+    /// 
+    /// box between(0,0) and(1,1) with three point (Pareto) front at (1,0), (0.5,0.5)  and (0,1) 
+    /// Hypervolume to (1,0) and (0,1) of the corners should be 1 (dominated Points need to be removed beforehand and   
+    /// Hypervolume to (0,0) and (1,1) of the corners should be 0.25
+    /// </summary>
+    [TestMethod]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestDiagonalPoint() {
+      //Front with three points
+      double[] point1 = new double[2];
+      point1[0] = 0;
+      point1[1] = 1;
+      double[] point2 = new double[2];
+      point2[0] = 1;
+      point2[1] = 0;
+      double[] point3 = new double[2];
+      point3[0] = 0.5;
+      point3[1] = 0.5;
+      double[][] front = { point1, point2, point3 };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //Northeast
+      maximization = new bool[] { false, false };
+      referencePoint[0] = 1;
+      referencePoint[1] = 1;
+      double ne = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, ne);
+
+      //NorthWest
+      maximization = new bool[] { true, false };
+      referencePoint[0] = 0;
+      referencePoint[1] = 1;
+      var nonDominatedFront = DominationCalculator.CalculateBestParetoFront(front, front, maximization, false).Select(i => i.Item2).ToList();
+      double nw = HypervolumeCalculator.CalculateHypervolume(nonDominatedFront, referencePoint, maximization);
+      Assert.AreEqual(1, nw);
+
+      //SouthWest
+      maximization = new bool[] { true, true };
+      referencePoint[0] = 0;
+      referencePoint[1] = 0;
+      double sw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+      Assert.AreEqual(0.25, sw);
+
+      //SouthEast
+      maximization = new bool[] { false, true };
+      referencePoint[0] = 1;
+      referencePoint[1] = 0;
+      nonDominatedFront = DominationCalculator.CalculateBestParetoFront(front, front, maximization, false).Select(i => i.Item2).ToList();
+      double se = HypervolumeCalculator.CalculateHypervolume(nonDominatedFront, referencePoint, maximization);
+      Assert.AreEqual(1, se);
+
+    }
+
+    [TestMethod()]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestReferencePointViolationNE() {
+      //Front with a single Point
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //Northeast
+      maximization = new bool[] { true, true };
+      referencePoint[0] = 1;
+      referencePoint[1] = 1;
+      double ne = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+      Assert.AreEqual(0, ne);
+    }
+
+    [TestMethod()]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestReferencePointViolationNW() {
+      //Front with a single Point
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //NorthWest
+      maximization = new bool[] { false, true };
+      referencePoint[0] = 0;
+      referencePoint[1] = 1;
+      double nw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+      Assert.AreEqual(0, nw);
+    }
+
+    [TestMethod()]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestReferencePointViolationSW() {
+      //Front with a single Point
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //SouthWest
+      maximization = new bool[] { false, false };
+      referencePoint[0] = 0;
+      referencePoint[1] = 0;
+      double sw = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+      Assert.AreEqual(0, sw);
+    }
+
+    [TestMethod()]
+    [TestCategory("Optimization.MultiObjective")]
+    [TestProperty("Time", "short")]
+    public void HypervolumeTestReferencePointViolationSE() {
+      //Front with a single Point
+      double[] point = new double[2];
+      point[0] = 0.5;
+      point[1] = 0.5;
+      double[][] front = { point };
+
+      double[] referencePoint = new double[2];
+      bool[] maximization;
+
+      //SouthEast
+      maximization = new bool[] { true, false };
+      referencePoint[0] = 1;
+      referencePoint[1] = 0;
+      double se = HypervolumeCalculator.CalculateHypervolume(front, referencePoint, maximization);
+      Assert.AreEqual(0, se);
+    }
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Tests.csproj
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 17337)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 17338)
@@ -510,4 +510,5 @@
     <Compile Include="HeuristicLab.Analysis-3.3\EffectSizeUnitTests.cs" />
     <Compile Include="HeuristicLab.Analysis-3.3\KruskalWallisUnitTests.cs" />
+    <Compile Include="HeuristicLab.Analysis-3.3\Multi-objective\SpacingTest.cs" />
     <Compile Include="HeuristicLab.Analysis-3.3\MultidimensionalScalingTest.cs" />
     <Compile Include="HeuristicLab.Collections-3.3\BidirectionalDictionaryTest.cs" />
@@ -590,4 +591,7 @@
     <Compile Include="HeuristicLab.IGraph\IGraphWrappersMatrixTest.cs" />
     <Compile Include="HeuristicLab.IGraph\IGraphWrappersVectorTest.cs" />
+    <Compile Include="HeuristicLab.Optimization-3.3\Multi-objective\CrowdingTest.cs" />
+    <Compile Include="HeuristicLab.Optimization-3.3\Multi-objective\FastHyperVolumeTests.cs" />
+    <Compile Include="HeuristicLab.Optimization-3.3\Multi-objective\HyperVolumeTests.cs" />
     <Compile Include="HeuristicLab.Persistence-3.3\StorableAttributeTests.cs" />
     <Compile Include="HeuristicLab.Persistence-3.3\UseCases.cs" />
@@ -636,10 +640,6 @@
     <Compile Include="HeuristicLab.Problems.TestFunctions-3.3\SumSquaresEvaluatorTest.cs" />
     <Compile Include="HeuristicLab.Problems.TestFunctions-3.3\ZakharovEvaluatorTest.cs" />
-    <Compile Include="HeuristicLab.Analysis-3.3\Multi-objective\CrowdingTest.cs" />
-    <Compile Include="HeuristicLab.Analysis-3.3\Multi-objective\FastHyperVolumeTests.cs" />
     <Compile Include="HeuristicLab.Analysis-3.3\Multi-objective\GenerationalDistanceTest.cs" />
-    <Compile Include="HeuristicLab.Analysis-3.3\Multi-objective\HyperVolumeTests.cs" />
     <Compile Include="HeuristicLab.Analysis-3.3\Multi-objective\InvertedGenerationalDistanceTest.cs" />
-    <Compile Include="HeuristicLab.Analysis-3.3\Multi-objective\SpacingTest.cs" />
     <Compile Include="HeuristicLab.Problems.TravelingSalesman-3.3\TSPMoveEvaluatorTest.cs" />
     <Compile Include="HeuristicLab.Problems.LinearAssignment-3.3\LinearAssignmentProblemSolverTest.cs" />
@@ -716,4 +716,5 @@
     </EmbeddedResource>
   </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
