Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/ConvexHullMeasures.cs
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/ConvexHullMeasures.cs	(revision 10274)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/ConvexHullMeasures.cs	(revision 10275)
@@ -90,5 +90,5 @@
     }
 
-    public static double[] CalculateCentroid(List<double[]> convexHull) {
+    public static double[] CalculateCentroids(List<double[]> convexHull) {
       int n = convexHull.Count;
       int dim = convexHull.First().Length;
@@ -132,5 +132,6 @@
       double ca = c.EuclideanDistance(a);
 
-      return Math.Acos((ab * ab + bc * bc - ca * ca) / (2 * ab * bc));
+      //return degrees
+      return Math.Acos((ab * ab + bc * bc - ca * ca) / (2 * ab * bc)) * 180.0 / Math.PI;
     }
 
@@ -145,4 +146,19 @@
       return thetas;
     }
+
+    public static double CalculateMaxDiameter(List<double[]> convexHull) {
+      double maxDist = double.MinValue;
+
+      for (int i = 0; i < convexHull.Count; i++) {
+        for (int j = 0; j < convexHull.Count; j++) {
+          if (i != j) {
+            double dist = convexHull[i].EuclideanDistance(convexHull[j]);
+            if (dist > maxDist)
+              maxDist = dist;
+          }
+        }
+      }
+      return maxDist;
+    }
   }
 }
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers-3.3.csproj
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers-3.3.csproj	(revision 10274)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers-3.3.csproj	(revision 10275)
@@ -93,4 +93,9 @@
       <Private>False</Private>
     </Reference>
+    <Reference Include="HeuristicLab.Problems.TestFunctions-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.TestFunctions-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Problems.TravelingSalesman-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/Plugin.cs.frame	(revision 10274)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/Plugin.cs.frame	(revision 10275)
@@ -33,4 +33,5 @@
   [PluginDependency("HeuristicLab.Encodings.RealVectorEncoding", "3.3")]
   [PluginDependency("HeuristicLab.Problems.TravelingSalesman", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.TestFunctions", "3.3")]
   [PluginDependency("HeuristicLab.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/RunCollectionModifiers/RealVectorConvexHullModifier.cs
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/RunCollectionModifiers/RealVectorConvexHullModifier.cs	(revision 10274)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/RunCollectionModifiers/RealVectorConvexHullModifier.cs	(revision 10275)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -28,5 +29,7 @@
 using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.TestFunctions;
 
 namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
@@ -35,9 +38,18 @@
   public class RealVectorConvexHullModifier : ParameterizedNamedItem, IRunCollectionModifier {
     private const string SolutionCacheResultName = "SolutionCache";
+    private const string CentroidMovementDistancesName = "Centroid Movement Distances";
+    private const string CentroidMotionName = "Centroid Motion";
+    private const string BestSolutionName = "Best Solution";
+
+    public IValueParameter<DoubleArray> BestSolutionParameter {
+      get { return (ValueParameter<DoubleArray>)Parameters[BestSolutionName]; }
+    }
 
     [StorableConstructor]
     protected RealVectorConvexHullModifier(bool deserializing) : base(deserializing) { }
     protected RealVectorConvexHullModifier(RealVectorConvexHullModifier original, Cloner cloner) : base(original, cloner) { }
-    public RealVectorConvexHullModifier() { }
+    public RealVectorConvexHullModifier() {
+      Parameters.Add(new ValueParameter<DoubleArray>(BestSolutionName, new DoubleArray()));
+    }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new RealVectorConvexHullModifier(this, cloner);
@@ -51,14 +63,27 @@
         if (solutionCache == null) continue;
 
+        List<double[]> centroidList = new List<double[]>();
+        var bestSolution = run.Results["Best Solution"] as SingleObjectiveTestFunctionSolution;
+        //var bestKnownSolution = ConvertRealVectorToVertexArray(bestSolution.BestKnownRealVector);
+        var bestKnownSolution = BestSolutionParameter.Value;
+
         DataTable volDataTable = new DataTable("Convex hull volume over generations");
         DataTable nrOfPointsTable = new DataTable("Nr. of points of convex hull");
+        DataTable centroidDistancesTable = new DataTable(CentroidMovementDistancesName);
+        DataTable centroidMotionTable = new DataTable(CentroidMotionName);
         DoubleValue overallVolume = new DoubleValue();
 
         DataRow dtVolumeRow = new DataRow("Volume");
         DataRow dtNrPointsRow = new DataRow("Nr. of points");
+        DataRow dtCentroidDistances = new DataRow("Distances");
+        DataRow dtCentroidMotion = new DataRow("Motion");
+        DataRow dtCentroidDistanceFromOptimum = new DataRow("Distance from optimum");
+        centroidMotionTable.Rows.Add(dtCentroidMotion);
+        centroidDistancesTable.Rows.Add(dtCentroidDistances);
+        centroidDistancesTable.Rows.Add(dtCentroidDistanceFromOptimum);
         volDataTable.Rows.Add(dtVolumeRow);
         nrOfPointsTable.Rows.Add(dtNrPointsRow);
 
-        List<double[]> curHull = null;
+        List<double[]> completeHull = null;
         var sols = solutionCache.GetSolutionsFromGeneration(i);
         while (sols.Count != 0) {
@@ -72,10 +97,12 @@
           }
           dtNrPointsRow.Values.Add(convexHull.Count);
+          centroidList.Add(ConvexHullMeasures.CalculateCentroids(convexHull));
 
-          if (curHull == null) {
-            curHull = convexHull;
+          //incrementally build complete convex hull
+          if (completeHull == null) {
+            completeHull = convexHull;
           } else {
-            var newPHull = curHull.Union(convexHull).ToArray();
-            curHull = LPHull.Calculate(newPHull);
+            var newPHull = completeHull.Union(convexHull).ToArray();
+            completeHull = LPHull.Calculate(newPHull);
           }
 
@@ -83,14 +110,49 @@
         }
 
-        if (curHull != null && curHull.Any() && curHull.First().Length < curHull.Count) {
-          overallVolume.Value = ConvexHullMeasures.CalculateVolume(curHull);
+        if (completeHull != null && completeHull.Any() && completeHull.First().Length < completeHull.Count) {
+          overallVolume.Value = ConvexHullMeasures.CalculateVolume(completeHull);
         } else {
           overallVolume.Value = double.NaN;
         }
 
+        CalculateMovementDistances(dtCentroidDistances, centroidList, run);
+        CalculateMotionMeasures(dtCentroidMotion, centroidList, run);
+        CalculateCentroidDistanceFromOptimum(dtCentroidDistanceFromOptimum, centroidList, bestKnownSolution.ToArray());
+
         run.Results["Overall volume"] = overallVolume;
+        run.Results["Overall diameter"] = new DoubleValue(ConvexHullMeasures.CalculateMaxDiameter(completeHull));
         run.Results["Convex hull volume"] = volDataTable;
         run.Results["Nr. of points on convex hull"] = nrOfPointsTable;
+        run.Results[CentroidMovementDistancesName] = centroidDistancesTable;
+        run.Results[CentroidMotionName] = centroidMotionTable;
       }
+    }
+
+    private void CalculateCentroidDistanceFromOptimum(DataRow row, List<double[]> centroidList, double[] bestKnownSolution) {
+      foreach (var centroid in centroidList) {
+        double distance = centroid.EuclideanDistance(bestKnownSolution);
+        row.Values.Add(distance);
+      }
+    }
+
+    private void CalculateMovementDistances(DataRow row, List<double[]> centroidList, IRun run) {
+      var distances = ConvexHullMeasures.CalculateMovementDistances(centroidList);
+      foreach (var distance in distances) {
+        row.Values.Add(distance);
+      }
+      run.Results["Centroid Movement Distance Avg."] = new DoubleValue(distances.Average());
+      run.Results["Centroid Movement Distance Std.Dev."] = new DoubleValue(distances.StandardDeviation());
+      run.Results["Centroid Movement Distance Sum"] = new DoubleValue(distances.Sum());
+      run.Results["Centroid Movement Overall Distance"] = new DoubleValue(ConvexHullMeasures.CalculateOverallMovementDistances(centroidList));
+    }
+
+    private void CalculateMotionMeasures(DataRow row, List<double[]> centroidList, IRun run) {
+      var motions = ConvexHullMeasures.CalculateCentroidsMotion(centroidList).Select(y => Math.Abs(y)).ToList();
+      foreach (var motion in motions) {
+        row.Values.Add(motion);
+      }
+      run.Results["Centroid Motion Avg."] = new DoubleValue(motions.Average());
+      run.Results["Centroid Motion Std.Dev."] = new DoubleValue(motions.StandardDeviation());
+      run.Results["Centroid Motion Sum"] = new DoubleValue(motions.Sum());
     }
 
