Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/Build.cmd
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/Build.cmd	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/Build.cmd	(revision 15691)
@@ -0,0 +1,94 @@
+@ECHO OFF
+
+SET CLEANBEFOREBUILD=1
+
+SET SELECTED=
+SET CONFIGURATION=
+SET PLATFORM=
+
+IF "%~1"=="" GOTO :prompt_solution
+
+SET SELECTED=%1
+IF NOT EXIST %SELECTED% (
+  ECHO Solution file %SELECTED% could not be found.
+  GOTO :end
+)
+ECHO Building solution %SELECTED% ...
+GOTO :config_selection
+
+:prompt_solution
+SET /A COUNT=0
+FOR /F "tokens=*" %%A IN ('dir /B *.sln') DO (
+  CALL :forloopbody "%%A"
+)
+
+IF "%COUNT%"=="1" (
+  SET SELECTED=%SOLUTIONS.1%
+  ECHO Building %SOLUTIONS.1% as it is the only solution that was found ...
+  GOTO :config_selection
+)
+
+ECHO Found the following solutions:
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO ECHO %%A = %%B
+ECHO.
+SET /P SOLUTIONINDEX=Which solution to build? Type the number: 
+
+SET SELECTED=""
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO (
+  IF "%%A"=="%SOLUTIONINDEX%" SET SELECTED=%%B
+)
+
+IF %SELECTED%=="" GOTO :eof
+
+:config_selection
+IF "%~2"==""  GOTO :prompt_config
+
+SET CONFIGURATION=%~2
+ECHO Building configuration %CONFIGURATION% ...
+GOTO :platform_selection
+
+:prompt_config
+SET /P CONFIGURATION=Which configuration to build [Debug]: 
+IF "%CONFIGURATION%"=="" SET CONFIGURATION=Debug
+
+:platform_selection
+IF "%~3"=="" GOTO :prompt_platform
+  
+SET PLATFORM=%~3
+ECHO Building platform %PLATFORM% ...
+GOTO :main
+
+:prompt_platform
+SET /P PLATFORM=Which platform to build [Any CPU]: 
+IF "%PLATFORM%"=="" SET PLATFORM=Any CPU
+
+:main
+REM First find the path to the msbuild.exe by performing a registry query
+FOR /F "tokens=1,3 delims=	 " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0"') DO (
+  IF "%%A"=="MSBuildToolsPath" SET MSBUILDPATH=%%B)
+
+REM Then execute msbuild to clean and build the solution
+REM Disable that msbuild creates a cache file of the solution
+SET MSBuildUseNoSolutionCache=1
+REM Run msbuild to clean and then build
+IF "%CLEANBEFOREBUILD%"=="1" (
+  ECHO Cleaning ...
+  %MSBUILDPATH%msbuild.exe %SELECTED% /target:Clean /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+)
+ECHO Building ...
+%MSBUILDPATH%msbuild.exe %SELECTED% /target:Build /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+
+ECHO.
+ECHO DONE.
+
+:end
+
+PAUSE
+
+GOTO :eof
+
+REM This workaround is necessary so that COUNT gets reevaluated
+:forloopbody
+SET /A COUNT+=1
+SET SOLUTIONS.%COUNT%=%1
+GOTO :eof
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/DistanceCalcualtors/VRPDistanceCalculator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/DistanceCalcualtors/VRPDistanceCalculator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/DistanceCalcualtors/VRPDistanceCalculator.cs	(revision 15691)
@@ -0,0 +1,82 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.DistanceCalculators.VRP {
+
+  [Item("VRPDistanceCalculator", "Calculates the distance of two VRP solution candidates.")]
+  [StorableClass]
+  public class VRPDistanceCalculator : NamedItem, IItemDistanceCalculator {
+
+    #region Properties
+
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+    public static new Image StaticItemImage { get { return VSImageLibrary.Function; } }
+
+    #endregion
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected VRPDistanceCalculator(bool deserializing) : base(deserializing) { }
+
+    protected VRPDistanceCalculator(VRPDistanceCalculator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public VRPDistanceCalculator() {
+      name = ItemName;
+      description = ItemDescription;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new VRPDistanceCalculator(this, cloner);
+    }
+
+    #endregion
+
+    #region IItemDistanceCalculator Members
+
+    public Type ItemType {
+      get { return typeof(Permutation); }
+    }
+
+    public double Distance(IItem x, IItem y) {
+      var a = GetEdgeSet((IVRPEncoding)x);
+      var b = GetEdgeSet((IVRPEncoding)y);
+      var aCount = a.Count;
+      a.IntersectWith(b);
+      return Math.Max(aCount, b.Count) - a.Count;
+    }
+
+    private HashSet<Point> GetEdgeSet(IVRPEncoding vrpSolution) {
+      HashSet<Point> edges = new HashSet<Point>();
+      foreach (var tour in vrpSolution.GetTours()) {
+        if (tour.Stops.Count > 0) {
+          edges.Add(CreateUndirectedEdge(0, tour.Stops[0]));
+          for (int i = 0; i < tour.Stops.Count - 1; i++) {
+            edges.Add(CreateUndirectedEdge(tour.Stops[i], tour.Stops[i + 1]));
+          }
+          edges.Add(CreateUndirectedEdge(tour.Stops.Last(), 0));
+        }
+      }
+      return edges;
+    }
+
+    private Point CreateUndirectedEdge(int x, int y) {
+      return new Point(Math.Min(x, y), Math.Max(x, y));
+    }
+
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/HeuristicLab.Analysis.FitnessLandscape.VRP.csproj
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/HeuristicLab.Analysis.FitnessLandscape.VRP.csproj	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/HeuristicLab.Analysis.FitnessLandscape.VRP.csproj	(revision 15691)
@@ -0,0 +1,184 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Analysis.FitnessLandscape.VRP</RootNamespace>
+    <AssemblyName>HeuristicLab.Analysis.FitnessLandscape.VRP-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Analysis.FitnessLandscape.VRP.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Analysis.FitnessLandscape.VRP.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Analysis.FitnessLandscape.VRP.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Analysis.FitnessLandscape.VRP.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86" />
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3">
+      <HintPath>..\..\..\trunk\bin\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" />
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86" />
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86" />
+    <Reference Include="HeuristicLab.Problems.VehicleRouting-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Problems.VehicleRouting-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DistanceCalcualtors\VRPDistanceCalculator.cs" />
+    <Compile Include="HeuristicLabAnalysisFitnessLandscapeVRPPlugin.cs" />
+    <Compile Include="Manipulators\OrOptManipulator.cs" />
+    <Compile Include="Manipulators\ExchangeManipulator.cs" />
+    <Compile Include="Manipulators\RelocateManipulator.cs" />
+    <Compile Include="Manipulators\TwoOptManipulator.cs" />
+    <Compile Include="Manipulators\TwoOptStarManipulator.cs" />
+    <Compile Include="MultiTrajectory\PreassignedVRPSolutionCreator.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Analysis.FitnessLandscape\HeuristicLab.Analysis.FitnessLandscape.csproj">
+      <Project>{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}</Project>
+      <Name>HeuristicLab.Analysis.FitnessLandscape</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="HeuristicLabAnalysisFitnessLandscapeVRPPlugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\Properties\AssemblyInfo.cs.frame" "%25ProjectDir%25\Properties\AssemblyInfo.cs"
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\HeuristicLabAnalysisFitnessLandscapeVRPPlugin.cs.frame" "%25ProjectDir%25\HeuristicLabAnalysisFitnessLandscapeVRPPlugin.cs"</PreBuildEvent>
+  </PropertyGroup>
+  <!-- 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>
+  -->
+</Project>
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/HeuristicLabAnalysisFitnessLandscapeVRPPlugin.cs.frame
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/HeuristicLabAnalysisFitnessLandscapeVRPPlugin.cs.frame	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/HeuristicLabAnalysisFitnessLandscapeVRPPlugin.cs.frame	(revision 15691)
@@ -0,0 +1,40 @@
+﻿#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.Analysis.FitnessLandscape.VRP {
+
+  [Plugin("HeuristicLab.Analysis.FitnessLandscape.VRP", "3.3.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Analysis.FitnessLandscape.VRP-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Analysis.FitnessLandscape", "3.3")]
+  [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.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]  
+  [PluginDependency("HeuristicLab.Problems.VehicleRouting", "3.4")]
+  public class HeuristicLabAnalysisFitnessLandscapeVRPPlugin : PluginBase { }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/ExchangeManipulator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/ExchangeManipulator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/ExchangeManipulator.cs	(revision 15691)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.Encodings;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.VRP {
+  [Item("ExchangeManipulator", "Exchange manipulation")]
+  [StorableClass]
+  public sealed class ExchangeManipulator : PotvinManipulator {
+    [StorableConstructor]
+    private ExchangeManipulator(bool deserializing) : base(deserializing) { }
+    private ExchangeManipulator(ExchangeManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExchangeManipulator(this, cloner);
+    }
+    public ExchangeManipulator()
+      : base() {
+    }
+
+    public static void Apply(IRandom random, PotvinEncoding individual, IVRPProblemInstance problemInstance, bool allowInfeasible) {
+      bool feasible;
+      int count = 0;
+
+      do {
+        feasible = true;
+        if (individual.Tours.Count > 1) {
+          int tour1Idx = random.Next(individual.Tours.Count);
+          int tour2Idx = random.Next(individual.Tours.Count - 1);
+          if (tour2Idx >= tour1Idx)
+            tour2Idx++;
+
+          Tour tour1 = individual.Tours[tour1Idx];
+          Tour tour2 = individual.Tours[tour2Idx];
+
+          int index1 = random.Next(tour1.Stops.Count);
+          int city1 = tour1.Stops[index1];
+
+          int index2 = random.Next(tour2.Stops.Count);
+          int city2 = tour2.Stops[index2];
+
+          bool originalFeasible = problemInstance.TourFeasible(tour1, individual) &&
+                                  problemInstance.TourFeasible(tour2, individual);
+
+          tour1.Stops[index1] = city2;
+          tour2.Stops[index2] = city1;
+
+          if (!allowInfeasible && originalFeasible) {
+            feasible = problemInstance.TourFeasible(tour1, individual) &&
+                       problemInstance.TourFeasible(tour2, individual);
+            if (!feasible) {
+              tour1.Stops[index1] = city1;
+              tour2.Stops[index2] = city2;
+            }
+          }
+        }
+      } while (!feasible && count++ < 100);
+    }
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+      Apply(random, individual, ProblemInstance, allowInfeasible);
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/OrOptManipulator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/OrOptManipulator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/OrOptManipulator.cs	(revision 15691)
@@ -0,0 +1,99 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.Encodings;
+using HeuristicLab.Problems.VehicleRouting;
+using System;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.VRP {
+  [Item("OrOptManipulator", "Or opt manipulation")]
+  [StorableClass]
+  public sealed class OrOptManipulator : PotvinManipulator {
+    [StorableConstructor]
+    private OrOptManipulator(bool deserializing) : base(deserializing) { }
+    private OrOptManipulator(OrOptManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OrOptManipulator(this, cloner);
+    }
+    public OrOptManipulator()
+      : base() {
+    }
+
+    public static void Apply(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance, bool allowInfeasible) {
+      List<Tour> tours = individual.Tours.FindAll(t => t.Stops.Count >= 2);
+      if (tours.Count == 0) return;
+      bool feasible;
+      int count = 0;
+
+      do {
+        feasible = true;
+        int tourIdx = random.Next(tours.Count);
+        Tour tour = tours[tourIdx];
+
+        int segmentStart = random.Next(tour.Stops.Count);
+        int segmentLength;
+        if (segmentStart == 0) {
+          segmentLength = 1 + random.Next(tour.Stops.Count - 1);
+        }
+        else {
+          segmentLength = 1 + random.Next(tour.Stops.Count - segmentStart);
+        }
+
+        bool originalFeasible = instance.TourFeasible(tour, individual);
+
+        List<int> segment = tour.Stops.GetRange(segmentStart, segmentLength);
+        tour.Stops.RemoveRange(segmentStart, segmentLength);
+        int newPos;
+        if (tour.Stops.Count == 1)
+          newPos = 0;
+        else
+          newPos = random.Next(tour.Stops.Count - 1);
+
+        if (newPos >= segmentStart)
+          newPos++;
+        tour.Stops.InsertRange(newPos, segment);
+
+        if (!allowInfeasible && originalFeasible) {
+          feasible = instance.TourFeasible(tour, individual);
+          if (!feasible) {
+            tour.Stops.RemoveRange(newPos, segment.Count);
+            tour.Stops.InsertRange(segmentStart, segment);
+          }
+        }
+      } while (!feasible && count++ < 100);
+    }
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+      Apply(random, individual, ProblemInstance, allowInfeasible);
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/RelocateManipulator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/RelocateManipulator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/RelocateManipulator.cs	(revision 15691)
@@ -0,0 +1,101 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.Encodings;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.VRP {
+  [Item("RelocateManipulator", "Relocate manipulation")]
+  [StorableClass]
+  public sealed class RelocateManipulator : PotvinManipulator {
+    [StorableConstructor]
+    private RelocateManipulator(bool deserializing) : base(deserializing) { }
+    private RelocateManipulator(RelocateManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RelocateManipulator(this, cloner);
+    }
+    public RelocateManipulator()
+      : base() {
+    }
+
+    public static void Apply(IRandom random, PotvinEncoding individual, IVRPProblemInstance problemInstance, bool allowInfeasible) {
+      bool feasible;
+      int count = 0;
+
+      do {
+        feasible = true;
+
+        int cities = individual.Cities;
+        int city = 1 + random.Next(cities);
+        Tour originalTour = individual.Tours.Find(t => t.Stops.Contains(city));
+        //consider creating new route
+        individual.Tours.Add(new Tour());
+
+        int position = 1 + random.Next(cities + individual.Tours.Count - 1);
+        if (position >= city) {
+          position++;
+        }
+
+        var originalFeasible = problemInstance.TourFeasible(originalTour, individual);
+
+        int originalPosition = originalTour.Stops.IndexOf(city);
+        originalTour.Stops.RemoveAt(originalPosition);
+
+        Tour insertionTour;
+        int insertionPosition;
+        if (position <= cities) {
+          insertionTour = individual.Tours.Find(t => t.Stops.Contains(position));
+          insertionPosition = insertionTour.Stops.IndexOf(position) + 1;
+        } else { // additional insertion positions at beginning of tours
+          insertionTour = individual.Tours[position - cities - 1];
+          insertionPosition = 0;
+        }
+        originalFeasible &= problemInstance.TourFeasible(insertionTour, individual);
+        insertionTour.Stops.Insert(insertionPosition, city);
+
+        if (!allowInfeasible && originalFeasible) {
+          feasible = problemInstance.TourFeasible(insertionTour, individual) &&
+                     problemInstance.TourFeasible(originalTour, individual);
+          if (!feasible) {
+            insertionTour.Stops.RemoveAt(insertionPosition);
+            originalTour.Stops.Insert(originalPosition, city);
+          }
+        }
+        individual.Tours.RemoveAll(t => t.Stops.Count == 0);
+      } while (!feasible && count++ < 100);
+    }
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+      Apply(random, individual, ProblemInstance, allowInfeasible);
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/TwoOptManipulator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/TwoOptManipulator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/TwoOptManipulator.cs	(revision 15691)
@@ -0,0 +1,100 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.Encodings;
+using HeuristicLab.Problems.VehicleRouting;
+using System;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.VRP {
+  [Item("TwoOptManipulator", "Two opt manipulation")]
+  [StorableClass]
+  public sealed class TwoOptManipulator : PotvinManipulator {
+    [StorableConstructor]
+    private TwoOptManipulator(bool deserializing) : base(deserializing) { }
+    private TwoOptManipulator(TwoOptManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TwoOptManipulator(this, cloner);
+    }
+    public TwoOptManipulator()
+      : base() {
+    }
+
+    public static void Apply(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance, bool allowInfeasible) {
+      List<Tour> tours = individual.Tours.FindAll(t => t.Stops.Count >= 2);
+      if (tours.Count == 0) return;
+
+      bool feasible;
+      int count = 0;
+
+      do {
+        feasible = true;
+        int tourIdx = random.Next(tours.Count);
+        Tour tour = tours[tourIdx];
+
+        int first;
+        int length;
+        if (tour.Stops.Count == 2) {
+          first = 0;
+          length = 2;
+        } else {
+          first = random.Next(tour.Stops.Count - 1);
+          if (first == tour.Stops.Count - 2) {
+            length = tour.Stops.Count - first;
+          } else {
+            length = random.Next(tour.Stops.Count - first - 1) + 2;
+          }
+        }
+
+        var originalFeasible = instance.TourFeasible(tour, individual);
+
+        var segment = tour.Stops.GetRange(first, length);
+        tour.Stops.RemoveRange(first, length);
+        segment.Reverse();
+        tour.Stops.InsertRange(first, segment);
+
+        if (!allowInfeasible && originalFeasible) {
+          feasible = instance.TourFeasible(tour, individual);
+          if (!feasible) {
+            tour.Stops.RemoveRange(first, length);
+            segment.Reverse();
+            tour.Stops.InsertRange(first, segment);
+          }
+        }
+
+      } while(!feasible && count++ < 100);
+    }
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+      Apply(random, individual, ProblemInstance, allowInfeasible);
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/TwoOptStarManipulator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/TwoOptStarManipulator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Manipulators/TwoOptStarManipulator.cs	(revision 15691)
@@ -0,0 +1,108 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.Encodings;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.VRP {
+  [Item("TwoOptStarManipulator", "Two opt star manipulation")]
+  [StorableClass]
+  public sealed class TwoOptStarManipulator : PotvinManipulator {
+    [StorableConstructor]
+    private TwoOptStarManipulator(bool deserializing) : base(deserializing) { }
+    private TwoOptStarManipulator(TwoOptStarManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TwoOptStarManipulator(this, cloner);
+    }
+    public TwoOptStarManipulator()
+      : base() {
+    }
+
+    public static void Apply(IRandom random, PotvinEncoding individual, IVRPProblemInstance problemInstance, bool allowInfeasible) {
+      bool feasible;
+      int count = 0;
+
+      //consider creating new tour
+      individual.Tours.Add(new Tour());
+
+      do {
+        feasible = true;
+
+        int route1Idx = random.Next(individual.Tours.Count);
+        int route2Idx = random.Next(individual.Tours.Count - 1);
+        if (route2Idx >= route1Idx)
+          route2Idx++;
+
+        Tour route1 = individual.Tours[route1Idx];
+        Tour route2 = individual.Tours[route2Idx];
+
+        int x1 = random.Next(route1.Stops.Count + 1);
+        int x2 = random.Next(route2.Stops.Count + 1);
+
+        var originalFeasible =
+          problemInstance.TourFeasible(route1, individual) &&
+          problemInstance.TourFeasible(route2, individual);
+
+       SwapSegments(x1, route1, x2, route2);
+
+       if (!allowInfeasible && originalFeasible) {
+         feasible = problemInstance.TourFeasible(route1, individual) &&
+                    problemInstance.TourFeasible(route2, individual);
+         if (!feasible) SwapSegments(x1, route1, x2, route2);
+       }
+      } while (!feasible && count++ < 100);
+
+      individual.Tours.RemoveAll(t => t.Stops.Count == 0);
+    }
+
+    private static void SwapSegments(int x1, Tour route1, int x2, Tour route2) {
+      int count = route1.Stops.Count - x1;
+      List<int> segmentX1 = new List<int>();
+      if (count > 0) {
+        segmentX1 = route1.Stops.GetRange(x1, count);
+        route1.Stops.RemoveRange(x1, count);
+      }
+      count = route2.Stops.Count - x2;
+      List<int> segmentX2 = new List<int>();
+      if (count > 0) {
+        segmentX2 = route2.Stops.GetRange(x2, count);
+        route2.Stops.RemoveRange(x2, count);
+      }
+      route1.Stops.AddRange(segmentX2);
+      route2.Stops.AddRange(segmentX1);
+    }
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+      Apply(random, individual, ProblemInstance, allowInfeasible);
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/MultiTrajectory/PreassignedVRPSolutionCreator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/MultiTrajectory/PreassignedVRPSolutionCreator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/MultiTrajectory/PreassignedVRPSolutionCreator.cs	(revision 15691)
@@ -0,0 +1,44 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.MultiTrajectory.VRP {
+
+  [StorableClass]
+  public class PreassignedVRPSolutionCreator : PreassignedSolutionCreator, IVRPCreator {
+
+
+    [StorableConstructor]
+    protected PreassignedVRPSolutionCreator(bool deserializing) : base(deserializing) { }
+    protected PreassignedVRPSolutionCreator(PreassignedVRPSolutionCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public PreassignedVRPSolutionCreator() {
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The created VRP tour."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance."));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PreassignedVRPSolutionCreator(this, cloner);
+    }
+
+    public override void Create(IScope scope) {
+      VRPToursParameter.ActualValue = (IVRPEncoding)scope.Variables[VRPToursParameter.ActualName].Value;
+    }
+
+
+    #region IVRPCreator Members
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    #endregion
+
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Properties/AssemblyInfo.cs.frame
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Properties/AssemblyInfo.cs.frame	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.VRP/Properties/AssemblyInfo.cs.frame	(revision 15691)
@@ -0,0 +1,37 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+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.NK")]
+[assembly: AssemblyDescription("NK Fitness Lanscape Analysis Test Problem")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2011 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("baadd0f7-fd6f-4b02-9e3c-dd526fba630a")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.3000")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/BitmapItemView.Designer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/BitmapItemView.Designer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/BitmapItemView.Designer.cs	(revision 15691)
@@ -0,0 +1,87 @@
+﻿namespace HeuristicLab.Analysis.FitnessLandscape.BoxChart {
+  partial class BitmapItemView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.pictureBox = new System.Windows.Forms.PictureBox();
+      this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.contextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.pictureBox.ContextMenuStrip = this.contextMenuStrip;
+      this.pictureBox.Location = new System.Drawing.Point(3, 3);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(144, 144);
+      this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
+      this.pictureBox.TabIndex = 0;
+      this.pictureBox.TabStop = false;
+      // 
+      // contextMenuStrip
+      // 
+      this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.saveToolStripMenuItem});
+      this.contextMenuStrip.Name = "contextMenuStrip";
+      this.contextMenuStrip.Size = new System.Drawing.Size(108, 26);
+      // 
+      // saveToolStripMenuItem
+      // 
+      this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
+      this.saveToolStripMenuItem.Size = new System.Drawing.Size(107, 22);
+      this.saveToolStripMenuItem.Text = "Save...";
+      this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.FileName = "bitmap.png";
+      this.saveFileDialog.Filter = "PNG Files|*.png|EMF Files|*.emf|GIF Files|*.gif|TIFF Files|*.tif|JPEG Files|*.jpg" +
+    "|All Files|*.*";
+      // 
+      // BitmapItemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.pictureBox);
+      this.Name = "BitmapItemView";
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.contextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.PictureBox pictureBox;
+    private System.Windows.Forms.ContextMenuStrip contextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
+    private System.Windows.Forms.SaveFileDialog saveFileDialog;
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/BitmapItemView.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/BitmapItemView.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/BitmapItemView.cs	(revision 15691)
@@ -0,0 +1,69 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Analysis.FitnessLandscape.BoxCharts;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.BoxChart {
+
+  [View("BitmapItemView")]
+  [Content(typeof(BitmapItem), IsDefaultView = true)]
+  public sealed partial class BitmapItemView : ItemView {
+
+    public new BitmapItem Content {
+      get { return (BitmapItem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public BitmapItemView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ImageChanged -= new EventHandler(Content_ImageChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ImageChanged += new EventHandler(Content_ImageChanged);
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      saveToolStripMenuItem.Enabled = Content != null && Content.Image != null;
+    }
+
+    #region Event Handlers (Content)
+    private void Content_ImageChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ImageChanged), sender, e);
+      else
+        pictureBox.Image = Content.Image;
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        pictureBox.Image = null;
+      } else {
+        pictureBox.Image = Content.Image;
+      }
+    }
+
+    private void saveToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (Content != null && Content.Image != null) {
+        if (saveFileDialog.ShowDialog(ParentForm) == DialogResult.OK) {
+          Content.Save(saveFileDialog.FileName);
+        }
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/BitmapItemView.resx
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/BitmapItemView.resx	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/BitmapItemView.resx	(revision 15691)
@@ -0,0 +1,126 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>166, 17</value>
+  </metadata>
+</root>
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/ColorValueView.Designer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/ColorValueView.Designer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/ColorValueView.Designer.cs	(revision 15691)
@@ -0,0 +1,730 @@
+﻿namespace HeuristicLab.Analysis.FitnessLandscape.BoxChart {
+  partial class ColorValueView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.Windows.Forms.GroupBox hsvBox;
+      System.Windows.Forms.Label hueLabel;
+      System.Windows.Forms.Label saturationLabel;
+      System.Windows.Forms.Label brightnessLabel;
+      System.Windows.Forms.GroupBox pickerBox;
+      System.Windows.Forms.GroupBox colorBox;
+      System.Windows.Forms.GroupBox rgbBox;
+      System.Windows.Forms.Label label1;
+      System.Windows.Forms.Label label2;
+      System.Windows.Forms.Label label3;
+      this.hueScrollBar = new System.Windows.Forms.HScrollBar();
+      this.hueUpDown = new System.Windows.Forms.NumericUpDown();
+      this.saturationScrollBar = new System.Windows.Forms.HScrollBar();
+      this.saturationUpDown = new System.Windows.Forms.NumericUpDown();
+      this.brightnessScrollBar = new System.Windows.Forms.HScrollBar();
+      this.brightnessUpDown = new System.Windows.Forms.NumericUpDown();
+      this.colorWheelPanel = new System.Windows.Forms.Panel();
+      this.brightnessPanel = new System.Windows.Forms.Panel();
+      this.colorPanel = new System.Windows.Forms.Panel();
+      this.redScrollBar = new System.Windows.Forms.HScrollBar();
+      this.redUpDown = new System.Windows.Forms.NumericUpDown();
+      this.greenScrollBar = new System.Windows.Forms.HScrollBar();
+      this.greenUpDown = new System.Windows.Forms.NumericUpDown();
+      this.blueScrollBar = new System.Windows.Forms.HScrollBar();
+      this.blueUpDown = new System.Windows.Forms.NumericUpDown();
+      this.colorDialog = new System.Windows.Forms.ColorDialog();
+      this.defaultColors = new System.Windows.Forms.GroupBox();
+      this.panel2 = new System.Windows.Forms.Panel();
+      this.panel1 = new System.Windows.Forms.Panel();
+      this.panel3 = new System.Windows.Forms.Panel();
+      this.panel4 = new System.Windows.Forms.Panel();
+      this.panel5 = new System.Windows.Forms.Panel();
+      this.panel6 = new System.Windows.Forms.Panel();
+      this.panel7 = new System.Windows.Forms.Panel();
+      this.panel8 = new System.Windows.Forms.Panel();
+      this.panel9 = new System.Windows.Forms.Panel();
+      this.panel10 = new System.Windows.Forms.Panel();
+      this.panel11 = new System.Windows.Forms.Panel();
+      this.panel12 = new System.Windows.Forms.Panel();
+      this.panel13 = new System.Windows.Forms.Panel();
+      this.panel14 = new System.Windows.Forms.Panel();
+      this.panel15 = new System.Windows.Forms.Panel();
+      this.panel16 = new System.Windows.Forms.Panel();
+      this.panel17 = new System.Windows.Forms.Panel();
+      this.panel18 = new System.Windows.Forms.Panel();
+      this.panel19 = new System.Windows.Forms.Panel();
+      this.panel20 = new System.Windows.Forms.Panel();
+      this.panel21 = new System.Windows.Forms.Panel();
+      this.panel22 = new System.Windows.Forms.Panel();
+      this.panel23 = new System.Windows.Forms.Panel();
+      this.panel24 = new System.Windows.Forms.Panel();
+      hsvBox = new System.Windows.Forms.GroupBox();
+      hueLabel = new System.Windows.Forms.Label();
+      saturationLabel = new System.Windows.Forms.Label();
+      brightnessLabel = new System.Windows.Forms.Label();
+      pickerBox = new System.Windows.Forms.GroupBox();
+      colorBox = new System.Windows.Forms.GroupBox();
+      rgbBox = new System.Windows.Forms.GroupBox();
+      label1 = new System.Windows.Forms.Label();
+      label2 = new System.Windows.Forms.Label();
+      label3 = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      hsvBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.hueUpDown)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.saturationUpDown)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.brightnessUpDown)).BeginInit();
+      pickerBox.SuspendLayout();
+      colorBox.SuspendLayout();
+      rgbBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.redUpDown)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.greenUpDown)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.blueUpDown)).BeginInit();
+      this.defaultColors.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(310, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(374, 3);
+      // 
+      // hsvBox
+      // 
+      hsvBox.Controls.Add(this.hueScrollBar);
+      hsvBox.Controls.Add(this.hueUpDown);
+      hsvBox.Controls.Add(hueLabel);
+      hsvBox.Controls.Add(saturationLabel);
+      hsvBox.Controls.Add(brightnessLabel);
+      hsvBox.Controls.Add(this.saturationScrollBar);
+      hsvBox.Controls.Add(this.saturationUpDown);
+      hsvBox.Controls.Add(this.brightnessScrollBar);
+      hsvBox.Controls.Add(this.brightnessUpDown);
+      hsvBox.Location = new System.Drawing.Point(3, 313);
+      hsvBox.Name = "hsvBox";
+      hsvBox.Size = new System.Drawing.Size(378, 100);
+      hsvBox.TabIndex = 26;
+      hsvBox.TabStop = false;
+      hsvBox.Text = "HSV";
+      // 
+      // hueScrollBar
+      // 
+      this.hueScrollBar.Location = new System.Drawing.Point(79, 21);
+      this.hueScrollBar.Maximum = 360;
+      this.hueScrollBar.Name = "hueScrollBar";
+      this.hueScrollBar.Size = new System.Drawing.Size(244, 17);
+      this.hueScrollBar.TabIndex = 16;
+      this.hueScrollBar.ValueChanged += new System.EventHandler(this.hueScrollBar_ValueChanged);
+      // 
+      // hueUpDown
+      // 
+      this.hueUpDown.Location = new System.Drawing.Point(326, 19);
+      this.hueUpDown.Maximum = new decimal(new int[] {
+            360,
+            0,
+            0,
+            0});
+      this.hueUpDown.Name = "hueUpDown";
+      this.hueUpDown.Size = new System.Drawing.Size(44, 20);
+      this.hueUpDown.TabIndex = 20;
+      this.hueUpDown.ValueChanged += new System.EventHandler(this.hueUpDown_ValueChanged);
+      // 
+      // hueLabel
+      // 
+      hueLabel.AutoSize = true;
+      hueLabel.Location = new System.Drawing.Point(6, 21);
+      hueLabel.Name = "hueLabel";
+      hueLabel.Size = new System.Drawing.Size(30, 13);
+      hueLabel.TabIndex = 17;
+      hueLabel.Text = "Hue:";
+      // 
+      // saturationLabel
+      // 
+      saturationLabel.AutoSize = true;
+      saturationLabel.Location = new System.Drawing.Point(6, 47);
+      saturationLabel.Name = "saturationLabel";
+      saturationLabel.Size = new System.Drawing.Size(58, 13);
+      saturationLabel.TabIndex = 18;
+      saturationLabel.Text = "Saturation:";
+      // 
+      // brightnessLabel
+      // 
+      brightnessLabel.AutoSize = true;
+      brightnessLabel.Location = new System.Drawing.Point(6, 73);
+      brightnessLabel.Name = "brightnessLabel";
+      brightnessLabel.Size = new System.Drawing.Size(59, 13);
+      brightnessLabel.TabIndex = 19;
+      brightnessLabel.Text = "Brightness:";
+      // 
+      // saturationScrollBar
+      // 
+      this.saturationScrollBar.Location = new System.Drawing.Point(79, 47);
+      this.saturationScrollBar.Name = "saturationScrollBar";
+      this.saturationScrollBar.Size = new System.Drawing.Size(244, 17);
+      this.saturationScrollBar.TabIndex = 21;
+      this.saturationScrollBar.ValueChanged += new System.EventHandler(this.saturationScrollBar_ValueChanged);
+      // 
+      // saturationUpDown
+      // 
+      this.saturationUpDown.Location = new System.Drawing.Point(326, 45);
+      this.saturationUpDown.Name = "saturationUpDown";
+      this.saturationUpDown.Size = new System.Drawing.Size(44, 20);
+      this.saturationUpDown.TabIndex = 22;
+      this.saturationUpDown.ValueChanged += new System.EventHandler(this.saturationUpDown_ValueChanged);
+      // 
+      // brightnessScrollBar
+      // 
+      this.brightnessScrollBar.Location = new System.Drawing.Point(79, 73);
+      this.brightnessScrollBar.Name = "brightnessScrollBar";
+      this.brightnessScrollBar.Size = new System.Drawing.Size(244, 17);
+      this.brightnessScrollBar.TabIndex = 23;
+      this.brightnessScrollBar.ValueChanged += new System.EventHandler(this.brightnessScrollBar_ValueChanged);
+      // 
+      // brightnessUpDown
+      // 
+      this.brightnessUpDown.Location = new System.Drawing.Point(326, 71);
+      this.brightnessUpDown.Name = "brightnessUpDown";
+      this.brightnessUpDown.Size = new System.Drawing.Size(44, 20);
+      this.brightnessUpDown.TabIndex = 24;
+      this.brightnessUpDown.ValueChanged += new System.EventHandler(this.brightnessUpDown_ValueChanged);
+      // 
+      // pickerBox
+      // 
+      pickerBox.Controls.Add(this.colorWheelPanel);
+      pickerBox.Controls.Add(this.brightnessPanel);
+      pickerBox.Location = new System.Drawing.Point(3, 26);
+      pickerBox.Name = "pickerBox";
+      pickerBox.Size = new System.Drawing.Size(294, 281);
+      pickerBox.TabIndex = 27;
+      pickerBox.TabStop = false;
+      pickerBox.Text = "Color Picker";
+      // 
+      // colorWheelPanel
+      // 
+      this.colorWheelPanel.Location = new System.Drawing.Point(6, 19);
+      this.colorWheelPanel.Name = "colorWheelPanel";
+      this.colorWheelPanel.Size = new System.Drawing.Size(256, 256);
+      this.colorWheelPanel.TabIndex = 3;
+      this.colorWheelPanel.Paint += new System.Windows.Forms.PaintEventHandler(this.colorWheelPanel_Paint);
+      this.colorWheelPanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.colorWheelPanel_MouseDown);
+      this.colorWheelPanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.colorWheelPanel_MouseMove);
+      // 
+      // brightnessPanel
+      // 
+      this.brightnessPanel.Location = new System.Drawing.Point(268, 19);
+      this.brightnessPanel.Name = "brightnessPanel";
+      this.brightnessPanel.Size = new System.Drawing.Size(20, 256);
+      this.brightnessPanel.TabIndex = 4;
+      this.brightnessPanel.Paint += new System.Windows.Forms.PaintEventHandler(this.brightnessPanel_Paint);
+      this.brightnessPanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.brightnessPanel_MouseDown);
+      this.brightnessPanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.brightnessPanel_MouseMove);
+      // 
+      // colorBox
+      // 
+      colorBox.Controls.Add(this.colorPanel);
+      colorBox.Location = new System.Drawing.Point(303, 247);
+      colorBox.Name = "colorBox";
+      colorBox.Size = new System.Drawing.Size(78, 60);
+      colorBox.TabIndex = 28;
+      colorBox.TabStop = false;
+      colorBox.Text = "Selected";
+      // 
+      // colorPanel
+      // 
+      this.colorPanel.Location = new System.Drawing.Point(6, 19);
+      this.colorPanel.Name = "colorPanel";
+      this.colorPanel.Size = new System.Drawing.Size(64, 32);
+      this.colorPanel.TabIndex = 5;
+      this.colorPanel.Paint += new System.Windows.Forms.PaintEventHandler(this.colorPanel_Paint);
+      this.colorPanel.DoubleClick += new System.EventHandler(this.colorPanel_DoubleClick);
+      // 
+      // rgbBox
+      // 
+      rgbBox.Controls.Add(this.redScrollBar);
+      rgbBox.Controls.Add(this.redUpDown);
+      rgbBox.Controls.Add(label1);
+      rgbBox.Controls.Add(label2);
+      rgbBox.Controls.Add(label3);
+      rgbBox.Controls.Add(this.greenScrollBar);
+      rgbBox.Controls.Add(this.greenUpDown);
+      rgbBox.Controls.Add(this.blueScrollBar);
+      rgbBox.Controls.Add(this.blueUpDown);
+      rgbBox.Location = new System.Drawing.Point(3, 419);
+      rgbBox.Name = "rgbBox";
+      rgbBox.Size = new System.Drawing.Size(378, 102);
+      rgbBox.TabIndex = 27;
+      rgbBox.TabStop = false;
+      rgbBox.Text = "RGB";
+      // 
+      // redScrollBar
+      // 
+      this.redScrollBar.Location = new System.Drawing.Point(79, 21);
+      this.redScrollBar.Maximum = 255;
+      this.redScrollBar.Name = "redScrollBar";
+      this.redScrollBar.Size = new System.Drawing.Size(244, 17);
+      this.redScrollBar.TabIndex = 16;
+      this.redScrollBar.ValueChanged += new System.EventHandler(this.redScrollBar_ValueChanged);
+      // 
+      // redUpDown
+      // 
+      this.redUpDown.Location = new System.Drawing.Point(326, 19);
+      this.redUpDown.Maximum = new decimal(new int[] {
+            255,
+            0,
+            0,
+            0});
+      this.redUpDown.Name = "redUpDown";
+      this.redUpDown.Size = new System.Drawing.Size(44, 20);
+      this.redUpDown.TabIndex = 20;
+      this.redUpDown.ValueChanged += new System.EventHandler(this.redUpDown_ValueChanged);
+      // 
+      // label1
+      // 
+      label1.AutoSize = true;
+      label1.Location = new System.Drawing.Point(6, 21);
+      label1.Name = "label1";
+      label1.Size = new System.Drawing.Size(30, 13);
+      label1.TabIndex = 17;
+      label1.Text = "Red:";
+      // 
+      // label2
+      // 
+      label2.AutoSize = true;
+      label2.Location = new System.Drawing.Point(6, 47);
+      label2.Name = "label2";
+      label2.Size = new System.Drawing.Size(39, 13);
+      label2.TabIndex = 18;
+      label2.Text = "Green:";
+      // 
+      // label3
+      // 
+      label3.AutoSize = true;
+      label3.Location = new System.Drawing.Point(6, 73);
+      label3.Name = "label3";
+      label3.Size = new System.Drawing.Size(31, 13);
+      label3.TabIndex = 19;
+      label3.Text = "Blue:";
+      // 
+      // greenScrollBar
+      // 
+      this.greenScrollBar.Location = new System.Drawing.Point(79, 47);
+      this.greenScrollBar.Maximum = 255;
+      this.greenScrollBar.Name = "greenScrollBar";
+      this.greenScrollBar.Size = new System.Drawing.Size(244, 17);
+      this.greenScrollBar.TabIndex = 21;
+      this.greenScrollBar.ValueChanged += new System.EventHandler(this.greenScrollBar_ValueChanged);
+      // 
+      // greenUpDown
+      // 
+      this.greenUpDown.Location = new System.Drawing.Point(326, 45);
+      this.greenUpDown.Maximum = new decimal(new int[] {
+            255,
+            0,
+            0,
+            0});
+      this.greenUpDown.Name = "greenUpDown";
+      this.greenUpDown.Size = new System.Drawing.Size(44, 20);
+      this.greenUpDown.TabIndex = 22;
+      this.greenUpDown.ValueChanged += new System.EventHandler(this.greenUpDown_ValueChanged);
+      // 
+      // blueScrollBar
+      // 
+      this.blueScrollBar.Location = new System.Drawing.Point(79, 73);
+      this.blueScrollBar.Maximum = 255;
+      this.blueScrollBar.Name = "blueScrollBar";
+      this.blueScrollBar.Size = new System.Drawing.Size(244, 17);
+      this.blueScrollBar.TabIndex = 23;
+      this.blueScrollBar.ValueChanged += new System.EventHandler(this.blueScrollBar_ValueChanged);
+      // 
+      // blueUpDown
+      // 
+      this.blueUpDown.Location = new System.Drawing.Point(326, 71);
+      this.blueUpDown.Maximum = new decimal(new int[] {
+            255,
+            0,
+            0,
+            0});
+      this.blueUpDown.Name = "blueUpDown";
+      this.blueUpDown.Size = new System.Drawing.Size(44, 20);
+      this.blueUpDown.TabIndex = 24;
+      this.blueUpDown.ValueChanged += new System.EventHandler(this.blueUpDown_ValueChanged);
+      // 
+      // colorDialog
+      // 
+      this.colorDialog.AnyColor = true;
+      // 
+      // defaultColors
+      // 
+      this.defaultColors.Controls.Add(this.panel13);
+      this.defaultColors.Controls.Add(this.panel7);
+      this.defaultColors.Controls.Add(this.panel14);
+      this.defaultColors.Controls.Add(this.panel4);
+      this.defaultColors.Controls.Add(this.panel15);
+      this.defaultColors.Controls.Add(this.panel8);
+      this.defaultColors.Controls.Add(this.panel16);
+      this.defaultColors.Controls.Add(this.panel5);
+      this.defaultColors.Controls.Add(this.panel17);
+      this.defaultColors.Controls.Add(this.panel9);
+      this.defaultColors.Controls.Add(this.panel18);
+      this.defaultColors.Controls.Add(this.panel3);
+      this.defaultColors.Controls.Add(this.panel19);
+      this.defaultColors.Controls.Add(this.panel10);
+      this.defaultColors.Controls.Add(this.panel20);
+      this.defaultColors.Controls.Add(this.panel6);
+      this.defaultColors.Controls.Add(this.panel21);
+      this.defaultColors.Controls.Add(this.panel11);
+      this.defaultColors.Controls.Add(this.panel22);
+      this.defaultColors.Controls.Add(this.panel2);
+      this.defaultColors.Controls.Add(this.panel23);
+      this.defaultColors.Controls.Add(this.panel12);
+      this.defaultColors.Controls.Add(this.panel24);
+      this.defaultColors.Controls.Add(this.panel1);
+      this.defaultColors.Location = new System.Drawing.Point(304, 27);
+      this.defaultColors.Name = "defaultColors";
+      this.defaultColors.Size = new System.Drawing.Size(77, 214);
+      this.defaultColors.TabIndex = 29;
+      this.defaultColors.TabStop = false;
+      this.defaultColors.Text = "Standard";
+      // 
+      // panel2
+      // 
+      this.panel2.BackColor = System.Drawing.Color.Silver;
+      this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel2.Location = new System.Drawing.Point(30, 20);
+      this.panel2.Name = "panel2";
+      this.panel2.Size = new System.Drawing.Size(17, 17);
+      this.panel2.TabIndex = 1;
+      this.panel2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel1
+      // 
+      this.panel1.BackColor = System.Drawing.Color.White;
+      this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel1.Location = new System.Drawing.Point(7, 20);
+      this.panel1.Name = "panel1";
+      this.panel1.Size = new System.Drawing.Size(17, 17);
+      this.panel1.TabIndex = 0;
+      this.panel1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel3
+      // 
+      this.panel3.BackColor = System.Drawing.Color.Black;
+      this.panel3.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel3.Location = new System.Drawing.Point(53, 20);
+      this.panel3.Name = "panel3";
+      this.panel3.Size = new System.Drawing.Size(17, 17);
+      this.panel3.TabIndex = 2;
+      this.panel3.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel4
+      // 
+      this.panel4.BackColor = System.Drawing.Color.Maroon;
+      this.panel4.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel4.Location = new System.Drawing.Point(53, 43);
+      this.panel4.Name = "panel4";
+      this.panel4.Size = new System.Drawing.Size(17, 17);
+      this.panel4.TabIndex = 5;
+      this.panel4.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel5
+      // 
+      this.panel5.BackColor = System.Drawing.Color.Red;
+      this.panel5.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel5.Location = new System.Drawing.Point(30, 43);
+      this.panel5.Name = "panel5";
+      this.panel5.Size = new System.Drawing.Size(17, 17);
+      this.panel5.TabIndex = 4;
+      this.panel5.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel6
+      // 
+      this.panel6.BackColor = System.Drawing.Color.Pink;
+      this.panel6.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel6.Location = new System.Drawing.Point(7, 43);
+      this.panel6.Name = "panel6";
+      this.panel6.Size = new System.Drawing.Size(17, 17);
+      this.panel6.TabIndex = 3;
+      this.panel6.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel7
+      // 
+      this.panel7.BackColor = System.Drawing.Color.Olive;
+      this.panel7.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel7.Location = new System.Drawing.Point(53, 89);
+      this.panel7.Name = "panel7";
+      this.panel7.Size = new System.Drawing.Size(17, 17);
+      this.panel7.TabIndex = 11;
+      this.panel7.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel8
+      // 
+      this.panel8.BackColor = System.Drawing.Color.Yellow;
+      this.panel8.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel8.Location = new System.Drawing.Point(30, 89);
+      this.panel8.Name = "panel8";
+      this.panel8.Size = new System.Drawing.Size(17, 17);
+      this.panel8.TabIndex = 10;
+      this.panel8.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel9
+      // 
+      this.panel9.BackColor = System.Drawing.Color.Sienna;
+      this.panel9.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel9.Location = new System.Drawing.Point(53, 66);
+      this.panel9.Name = "panel9";
+      this.panel9.Size = new System.Drawing.Size(17, 17);
+      this.panel9.TabIndex = 8;
+      this.panel9.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel10
+      // 
+      this.panel10.BackColor = System.Drawing.Color.LightYellow;
+      this.panel10.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel10.Location = new System.Drawing.Point(7, 89);
+      this.panel10.Name = "panel10";
+      this.panel10.Size = new System.Drawing.Size(17, 17);
+      this.panel10.TabIndex = 9;
+      this.panel10.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel11
+      // 
+      this.panel11.BackColor = System.Drawing.Color.Orange;
+      this.panel11.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel11.Location = new System.Drawing.Point(30, 66);
+      this.panel11.Name = "panel11";
+      this.panel11.Size = new System.Drawing.Size(17, 17);
+      this.panel11.TabIndex = 7;
+      this.panel11.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel12
+      // 
+      this.panel12.BackColor = System.Drawing.Color.PeachPuff;
+      this.panel12.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel12.Location = new System.Drawing.Point(7, 66);
+      this.panel12.Name = "panel12";
+      this.panel12.Size = new System.Drawing.Size(17, 17);
+      this.panel12.TabIndex = 6;
+      this.panel12.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel13
+      // 
+      this.panel13.BackColor = System.Drawing.Color.Purple;
+      this.panel13.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel13.Location = new System.Drawing.Point(53, 181);
+      this.panel13.Name = "panel13";
+      this.panel13.Size = new System.Drawing.Size(17, 17);
+      this.panel13.TabIndex = 23;
+      this.panel13.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel14
+      // 
+      this.panel14.BackColor = System.Drawing.Color.Teal;
+      this.panel14.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel14.Location = new System.Drawing.Point(53, 135);
+      this.panel14.Name = "panel14";
+      this.panel14.Size = new System.Drawing.Size(17, 17);
+      this.panel14.TabIndex = 17;
+      this.panel14.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel15
+      // 
+      this.panel15.BackColor = System.Drawing.Color.Fuchsia;
+      this.panel15.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel15.Location = new System.Drawing.Point(30, 181);
+      this.panel15.Name = "panel15";
+      this.panel15.Size = new System.Drawing.Size(17, 17);
+      this.panel15.TabIndex = 22;
+      this.panel15.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel16
+      // 
+      this.panel16.BackColor = System.Drawing.Color.Cyan;
+      this.panel16.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel16.Location = new System.Drawing.Point(30, 135);
+      this.panel16.Name = "panel16";
+      this.panel16.Size = new System.Drawing.Size(17, 17);
+      this.panel16.TabIndex = 16;
+      this.panel16.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel17
+      // 
+      this.panel17.BackColor = System.Drawing.Color.Navy;
+      this.panel17.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel17.Location = new System.Drawing.Point(53, 158);
+      this.panel17.Name = "panel17";
+      this.panel17.Size = new System.Drawing.Size(17, 17);
+      this.panel17.TabIndex = 20;
+      this.panel17.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel18
+      // 
+      this.panel18.BackColor = System.Drawing.Color.Green;
+      this.panel18.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel18.Location = new System.Drawing.Point(53, 112);
+      this.panel18.Name = "panel18";
+      this.panel18.Size = new System.Drawing.Size(17, 17);
+      this.panel18.TabIndex = 14;
+      this.panel18.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel19
+      // 
+      this.panel19.BackColor = System.Drawing.Color.Violet;
+      this.panel19.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel19.Location = new System.Drawing.Point(7, 181);
+      this.panel19.Name = "panel19";
+      this.panel19.Size = new System.Drawing.Size(17, 17);
+      this.panel19.TabIndex = 21;
+      this.panel19.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel20
+      // 
+      this.panel20.BackColor = System.Drawing.Color.LightCyan;
+      this.panel20.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel20.Location = new System.Drawing.Point(7, 135);
+      this.panel20.Name = "panel20";
+      this.panel20.Size = new System.Drawing.Size(17, 17);
+      this.panel20.TabIndex = 15;
+      this.panel20.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel21
+      // 
+      this.panel21.BackColor = System.Drawing.Color.Blue;
+      this.panel21.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel21.Location = new System.Drawing.Point(30, 158);
+      this.panel21.Name = "panel21";
+      this.panel21.Size = new System.Drawing.Size(17, 17);
+      this.panel21.TabIndex = 19;
+      this.panel21.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel22
+      // 
+      this.panel22.BackColor = System.Drawing.Color.Lime;
+      this.panel22.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel22.Location = new System.Drawing.Point(30, 112);
+      this.panel22.Name = "panel22";
+      this.panel22.Size = new System.Drawing.Size(17, 17);
+      this.panel22.TabIndex = 13;
+      this.panel22.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel23
+      // 
+      this.panel23.BackColor = System.Drawing.Color.LightBlue;
+      this.panel23.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel23.Location = new System.Drawing.Point(7, 158);
+      this.panel23.Name = "panel23";
+      this.panel23.Size = new System.Drawing.Size(17, 17);
+      this.panel23.TabIndex = 18;
+      this.panel23.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // panel24
+      // 
+      this.panel24.BackColor = System.Drawing.Color.PaleGreen;
+      this.panel24.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.panel24.Location = new System.Drawing.Point(7, 112);
+      this.panel24.Name = "panel24";
+      this.panel24.Size = new System.Drawing.Size(17, 17);
+      this.panel24.TabIndex = 12;
+      this.panel24.MouseClick += new System.Windows.Forms.MouseEventHandler(this.defaultColorPanel_MouseClick);
+      // 
+      // ColorValueView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.defaultColors);
+      this.Controls.Add(rgbBox);
+      this.Controls.Add(colorBox);
+      this.Controls.Add(pickerBox);
+      this.Controls.Add(hsvBox);
+      this.Name = "ColorValueView";
+      this.Size = new System.Drawing.Size(393, 535);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(hsvBox, 0);
+      this.Controls.SetChildIndex(pickerBox, 0);
+      this.Controls.SetChildIndex(colorBox, 0);
+      this.Controls.SetChildIndex(rgbBox, 0);
+      this.Controls.SetChildIndex(this.defaultColors, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      hsvBox.ResumeLayout(false);
+      hsvBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.hueUpDown)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.saturationUpDown)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.brightnessUpDown)).EndInit();
+      pickerBox.ResumeLayout(false);
+      colorBox.ResumeLayout(false);
+      rgbBox.ResumeLayout(false);
+      rgbBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.redUpDown)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.greenUpDown)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.blueUpDown)).EndInit();
+      this.defaultColors.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Panel colorWheelPanel;
+    private System.Windows.Forms.Panel brightnessPanel;
+    private System.Windows.Forms.Panel colorPanel;
+    private System.Windows.Forms.HScrollBar hueScrollBar;
+    private System.Windows.Forms.NumericUpDown hueUpDown;
+    private System.Windows.Forms.HScrollBar saturationScrollBar;
+    private System.Windows.Forms.NumericUpDown saturationUpDown;
+    private System.Windows.Forms.HScrollBar brightnessScrollBar;
+    private System.Windows.Forms.NumericUpDown brightnessUpDown;
+    private System.Windows.Forms.HScrollBar redScrollBar;
+    private System.Windows.Forms.NumericUpDown redUpDown;
+    private System.Windows.Forms.HScrollBar greenScrollBar;
+    private System.Windows.Forms.NumericUpDown greenUpDown;
+    private System.Windows.Forms.HScrollBar blueScrollBar;
+    private System.Windows.Forms.NumericUpDown blueUpDown;
+    private System.Windows.Forms.ColorDialog colorDialog;
+    private System.Windows.Forms.GroupBox defaultColors;
+    private System.Windows.Forms.Panel panel1;
+    private System.Windows.Forms.Panel panel2;
+    private System.Windows.Forms.Panel panel13;
+    private System.Windows.Forms.Panel panel7;
+    private System.Windows.Forms.Panel panel14;
+    private System.Windows.Forms.Panel panel4;
+    private System.Windows.Forms.Panel panel15;
+    private System.Windows.Forms.Panel panel8;
+    private System.Windows.Forms.Panel panel16;
+    private System.Windows.Forms.Panel panel5;
+    private System.Windows.Forms.Panel panel17;
+    private System.Windows.Forms.Panel panel9;
+    private System.Windows.Forms.Panel panel18;
+    private System.Windows.Forms.Panel panel3;
+    private System.Windows.Forms.Panel panel19;
+    private System.Windows.Forms.Panel panel10;
+    private System.Windows.Forms.Panel panel20;
+    private System.Windows.Forms.Panel panel6;
+    private System.Windows.Forms.Panel panel21;
+    private System.Windows.Forms.Panel panel11;
+    private System.Windows.Forms.Panel panel22;
+    private System.Windows.Forms.Panel panel23;
+    private System.Windows.Forms.Panel panel12;
+    private System.Windows.Forms.Panel panel24;
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/ColorValueView.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/ColorValueView.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/ColorValueView.cs	(revision 15691)
@@ -0,0 +1,312 @@
+﻿using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Drawing.Drawing2D;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.BoxChart {
+
+  [View("ColorValue View")]
+  [Content(typeof(ColorValue), IsDefaultView = true)]
+  public sealed partial class ColorValueView : NamedItemView {
+
+    private Bitmap colorWheel;
+    private const int RADIUS = 128;
+    private const int COLOR_COUNT = 128;
+
+    public new ColorValue Content {
+      get { return (ColorValue)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ColorValueView() {
+      InitializeComponent();
+      InitializeColorWheel();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ColorChanged -= Content_ColorChanged;
+      base.DeregisterContentEvents();
+    }
+
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ColorChanged += Content_ColorChanged;
+    }
+
+    #region Event Handlers (Content)
+    private void Content_ColorChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_ColorChanged), sender, e);
+      } else {
+        UpdateControls();
+        colorWheelPanel.Invalidate();
+        colorPanel.Invalidate();
+        brightnessPanel.Invalidate();
+      }
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      Update(() => {
+        UpdateControls();
+        colorWheelPanel.Invalidate();
+        colorPanel.Invalidate();
+        brightnessPanel.Invalidate();
+      });
+    }
+
+    private void UpdateControls() {
+      if (Content == null) {
+        hueScrollBar.Value = 0;
+        saturationScrollBar.Value = 0;
+        brightnessScrollBar.Value = 0;
+        hueUpDown.Value = 0;
+        saturationUpDown.Value = 0;
+        brightnessUpDown.Value = 0;
+        redScrollBar.Value = 0;
+        greenScrollBar.Value = 0;
+        blueScrollBar.Value = 0;
+        redUpDown.Value = 0;
+        greenUpDown.Value = 0;
+        blueUpDown.Value = 0;
+      }
+      else {
+        hueScrollBar.Value = (int)Math.Round(Content.H);
+        saturationScrollBar.Value = (int)Math.Round(Content.S*100);
+        brightnessScrollBar.Value = (int)Math.Round(Content.V*100);
+        hueUpDown.Value = (decimal)Math.Round(Content.H);
+        saturationUpDown.Value = (decimal)Math.Round(Content.S*100);
+        brightnessUpDown.Value = (decimal)Math.Round(Content.V*100);
+        redScrollBar.Value = Content.R;
+        greenScrollBar.Value = Content.G;
+        blueScrollBar.Value = Content.B;
+        redUpDown.Value = Content.R;
+        greenUpDown.Value = Content.G;
+        blueUpDown.Value = Content.B;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      hueScrollBar.Enabled =
+        saturationScrollBar.Enabled = 
+        brightnessScrollBar.Enabled =
+        redScrollBar.Enabled =
+        greenScrollBar.Enabled = 
+        blueScrollBar.Enabled =
+        hueUpDown.Enabled = 
+        saturationUpDown.Enabled =
+        brightnessUpDown.Enabled =
+        redUpDown.Enabled =
+        greenUpDown.Enabled =
+        blueUpDown.Enabled =
+          Content != null;
+    }
+
+    private static Color GetFullColor(ColorValue c) {
+      return new ColorValue(c.H, c.S, 1).Color;
+    }
+
+    private static Point GetColorPoint(ColorValue c, int size) {
+      return GetPoint(c.H, c.S*size/2, new Point(size/2, size/2));
+    }
+
+    #region Event Handlers (child controls)
+    private void colorWheelPanel_Paint(object sender, PaintEventArgs e) {
+      e.Graphics.DrawImage(colorWheel, 0, 0, colorWheelPanel.Width, colorWheelPanel.Height);
+      if (Content != null)
+        DrawColorPointer(e.Graphics,
+          GetColorPoint(Content, Math.Min(colorWheelPanel.Width, colorWheelPanel.Height)));
+    }
+
+    private void brightnessPanel_Paint(object sender, PaintEventArgs e) {
+      if (Content != null) {
+        var bar = brightnessPanel.ClientRectangle;
+        bar.Width -= 10;
+        using (var lgb = new LinearGradientBrush(bar, GetFullColor(Content), Color.Black, LinearGradientMode.Vertical)) {
+          e.Graphics.FillRectangle(lgb, bar);
+        }
+        DrawBrighnessPointer(e.Graphics, new Point(bar.Width-9, (int)Math.Round((1.0-Content.V)*bar.Height)));
+      }
+    }
+
+    private void colorPanel_Paint(object sender, PaintEventArgs e) {
+      if (Content != null) {
+        using (var b = new SolidBrush(Content.Color)) {
+          e.Graphics.FillRectangle(b, 0, 0, colorPanel.Width, colorPanel.Height);
+        }
+      }
+    }
+
+    private bool updateInProgress = false;
+    private void Update(Action thunk) {
+      if (!updateInProgress) {
+        updateInProgress = true;
+        thunk();
+        updateInProgress = false;
+      }
+    }
+
+    private void hueScrollBar_ValueChanged(object sender, EventArgs e) {
+      Update(() => Content.H = hueScrollBar.Value);
+    }
+
+    private void saturationScrollBar_ValueChanged(object sender, EventArgs e) {
+      Update(() => Content.S = saturationScrollBar.Value/100.0);
+    }
+
+    private void brightnessScrollBar_ValueChanged(object sender, EventArgs e) {
+      Update(() => Content.V = brightnessScrollBar.Value/100.0);
+    }
+
+    private void redScrollBar_ValueChanged(object sender, EventArgs e) {
+      Update(() => Content.R = redScrollBar.Value);
+    }
+
+    private void greenScrollBar_ValueChanged(object sender, EventArgs e) {
+      Update(() => Content.G = greenScrollBar.Value);
+    }
+
+    private void blueScrollBar_ValueChanged(object sender, EventArgs e) {
+      Update(() => Content.B = blueScrollBar.Value);
+    }
+
+    private void hueUpDown_ValueChanged(object sender, EventArgs e) {
+      Update(() => Content.H = (double)hueUpDown.Value);
+    }
+
+    private void saturationUpDown_ValueChanged(object sender, EventArgs e) {
+      Update(() => Content.S = (double)saturationUpDown.Value/100.0);
+    }
+
+    private void brightnessUpDown_ValueChanged(object sender, EventArgs e) {
+      Update(() => Content.V = (double)brightnessUpDown.Value/100.0);
+    }
+
+    private void redUpDown_ValueChanged(object sender, EventArgs e) {
+      Update(() => Content.R = (int)redUpDown.Value);
+    }
+
+    private void greenUpDown_ValueChanged(object sender, EventArgs e) {
+      Update(() => Content.G = (int)greenUpDown.Value);
+    }
+
+    private void blueUpDown_ValueChanged(object sender, EventArgs e) {
+      Update(() => Content.B = (int)blueUpDown.Value);
+    }
+
+    private void colorWheelPanel_MouseDown(object sender, MouseEventArgs e) {
+      Update(() => SetColorWheel(e.Location));
+    }
+
+    private void colorWheelPanel_MouseMove(object sender, MouseEventArgs e) {
+      if (e.Button == MouseButtons.Left)
+        Update(() => SetColorWheel(e.Location));
+    }
+
+    private void brightnessPanel_MouseDown(object sender, MouseEventArgs e) {
+      Update(() => SetBrightness(e.Location));
+    }
+
+    private void brightnessPanel_MouseMove(object sender, MouseEventArgs e) {
+      if (e.Button == MouseButtons.Left) {
+        Update(() => SetBrightness(e.Location));
+      }
+    }
+
+    private void colorPanel_DoubleClick(object sender, EventArgs e) {
+      colorDialog.Color = Content.Color;
+      if (colorDialog.ShowDialog() == DialogResult.OK) {
+        Update(() => Content.Color = colorDialog.Color);
+      }
+    }
+    private void defaultColorPanel_MouseClick(object sender, MouseEventArgs e) {
+      if (Content != null)
+        Update(() => Content.Color = ((Panel)sender).BackColor);
+    }
+    #endregion
+
+    #region Auxiliary Functions
+    private void DrawColorPointer(Graphics g, Point p) {
+      g.DrawRectangle(Pens.Black, p.X - 3, p.Y - 3, 6, 6);
+    }
+
+    private void DrawBrighnessPointer(Graphics g, Point p) {
+      g.FillPolygon(Brushes.Black, new[] {
+        p,
+        new Point(p.X + 10, p.Y + 5), 
+        new Point(p.X + 10, p.Y - 5)});
+    }
+
+    private void InitializeColorWheel() {
+      colorWheel = new Bitmap(256, 256);
+      using (var brush = new PathGradientBrush(GetPoints(RADIUS, new Point(RADIUS, RADIUS))) {
+        CenterColor = Color.White,
+        CenterPoint = new PointF(RADIUS, RADIUS),
+        SurroundColors = GetColors()
+      }) {
+        using (var g = Graphics.FromImage(colorWheel)) {
+          g.FillEllipse(brush, 0, 0, colorWheelPanel.Width, colorWheel.Height);
+        }
+      }
+      SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+      SetStyle(ControlStyles.UserPaint, true);
+      SetStyle(ControlStyles.DoubleBuffer, true);
+    }
+
+    private static Point[] GetPoints(double radius, Point center) {
+      var points = new Point[COLOR_COUNT];
+      for (int i = 0; i<COLOR_COUNT; i++) {
+        points[i] = GetPoint(i*360.0/COLOR_COUNT, radius, center);
+      }
+      return points;
+    }
+
+    private static Point GetPoint(double degrees, double radius, Point center) {
+      var rad = degrees*Math.PI/180;
+      return new Point(
+        (int)Math.Round(center.X + radius * Math.Cos(rad)),
+        (int)Math.Round(center.Y + radius * Math.Sin(rad)));
+    }
+
+    private Color[] GetColors() {
+      var colors = new Color[COLOR_COUNT];
+      for (int i = 0; i<COLOR_COUNT; i++) {
+        colors[i] = new ColorValue(i*360.0/COLOR_COUNT, 1d, 1d).Color;
+      }
+      return colors;
+    }
+
+    private void SetColorWheel(Point p) {
+      if (Content == null) return;
+      var x = p.X - colorWheelPanel.Width/2f;
+      var y = p.Y - colorWheelPanel.Height/2f;
+      Content.S = Math.Min(1, Math.Max(0, Math.Sqrt(sqr(x) + sqr(y))/(colorWheelPanel.Width/2f)));
+      var angle = Math.Atan2(y, x)*180/Math.PI;
+      if (angle < 0) angle += 360;
+      Content.H = Math.Min(360, Math.Max(0, angle));
+    }
+
+    private void SetBrightness(Point p) {
+      if (Content != null)
+        Content.V = Math.Max(0, Math.Min(1, 1 - 1.0*p.Y/brightnessPanel.Height));
+    }
+
+    private static double sqr(double x) { return x*x; }
+    #endregion
+
+
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/ColorValueView.resx
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/ColorValueView.resx	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/BoxChart/ColorValueView.resx	(revision 15691)
@@ -0,0 +1,180 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="hsvBox.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="hueLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="saturationLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="brightnessLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="hueLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="saturationLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="brightnessLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="pickerBox.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="colorBox.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="rgbBox.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="label1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="label2.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="label3.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="label1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="label2.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="label3.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="colorDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>230, 17</value>
+  </metadata>
+</root>
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/EngineAlgorithm/EngineAlgorithmOperatorView.Designer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/EngineAlgorithm/EngineAlgorithmOperatorView.Designer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/EngineAlgorithm/EngineAlgorithmOperatorView.Designer.cs	(revision 15691)
@@ -0,0 +1,142 @@
+﻿using HeuristicLab.Operators.Views;
+namespace HeuristicLab.Operators {
+  partial class EngineAlgorithmOperatorView : AlgorithmOperatorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.algorithmTabPage = new System.Windows.Forms.TabPage();
+      this.algorithmViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.openAlgorithmButton = new System.Windows.Forms.Button();
+      this.newAlgorithmButton = new System.Windows.Forms.Button();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.tabControl.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.operatorGraphTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.algorithmTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.algorithmTabPage);
+      this.tabControl.Controls.SetChildIndex(this.operatorGraphTabPage, 0);
+      this.tabControl.Controls.SetChildIndex(this.parametersTabPage, 0);
+      this.tabControl.Controls.SetChildIndex(this.algorithmTabPage, 0);
+      // 
+      // breakpointCheckBox
+      // 
+      this.toolTip.SetToolTip(this.breakpointCheckBox, "Check if an engine should stop execution each time after this operator has been p" +
+        "rocessed.");
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // algorithmTabPage
+      // 
+      this.algorithmTabPage.Controls.Add(this.algorithmViewHost);
+      this.algorithmTabPage.Controls.Add(this.openAlgorithmButton);
+      this.algorithmTabPage.Controls.Add(this.newAlgorithmButton);
+      this.algorithmTabPage.Location = new System.Drawing.Point(4, 22);
+      this.algorithmTabPage.Name = "algorithmTabPage";
+      this.algorithmTabPage.Size = new System.Drawing.Size(478, 384);
+      this.algorithmTabPage.TabIndex = 2;
+      this.algorithmTabPage.Text = "Algorithm";
+      this.algorithmTabPage.UseVisualStyleBackColor = true;
+      this.algorithmTabPage.DragDrop += new System.Windows.Forms.DragEventHandler(this.algorithmTabPage_DragDrop);
+      this.algorithmTabPage.DragEnter += new System.Windows.Forms.DragEventHandler(this.algorithmTabPage_DragEnterOver);
+      this.algorithmTabPage.DragOver += new System.Windows.Forms.DragEventHandler(this.algorithmTabPage_DragEnterOver);
+      // 
+      // algorithmViewHost
+      // 
+      this.algorithmViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.algorithmViewHost.Caption = "Algorithm View";
+      this.algorithmViewHost.Content = null;
+      this.algorithmViewHost.Enabled = false;
+      this.algorithmViewHost.Location = new System.Drawing.Point(3, 34);
+      this.algorithmViewHost.Name = "algorithmViewHost";
+      this.algorithmViewHost.ReadOnly = false;
+      this.algorithmViewHost.Size = new System.Drawing.Size(472, 347);
+      this.algorithmViewHost.TabIndex = 3;
+      this.algorithmViewHost.ViewsLabelVisible = true;
+      this.algorithmViewHost.ViewType = null;
+      // 
+      // openAlgorithmButton
+      // 
+      this.openAlgorithmButton.Location = new System.Drawing.Point(35, 4);
+      this.openAlgorithmButton.Name = "openAlgorithmButton";
+      this.openAlgorithmButton.Size = new System.Drawing.Size(24, 24);
+      this.openAlgorithmButton.TabIndex = 2;
+      this.openAlgorithmButton.Text = "";
+      this.openAlgorithmButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Open;
+      this.toolTip.SetToolTip(this.openAlgorithmButton, "Open Algorithm");
+      this.openAlgorithmButton.UseVisualStyleBackColor = true;
+      this.openAlgorithmButton.Click += new System.EventHandler(this.openAlgorithmButton_Click);
+      // 
+      // newAlgorithmButton
+      // 
+      this.newAlgorithmButton.Location = new System.Drawing.Point(4, 4);
+      this.newAlgorithmButton.Name = "newAlgorithmButton";
+      this.newAlgorithmButton.Size = new System.Drawing.Size(24, 24);
+      this.newAlgorithmButton.TabIndex = 1;
+      this.newAlgorithmButton.Text = "";
+      this.newAlgorithmButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.NewDocument;
+      this.toolTip.SetToolTip(this.newAlgorithmButton, "New Algorithm");
+      this.newAlgorithmButton.UseVisualStyleBackColor = true;
+      this.newAlgorithmButton.Click += new System.EventHandler(this.newAlgorithmButton_Click);
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "hl";
+      this.openFileDialog.FileName = "Algorithm";
+      this.openFileDialog.Filter = "HeuristicLab Files|*.hl|All Files|*.*";
+      this.openFileDialog.Title = "Open Algorithm";
+      // 
+      // EngineAlgorithmOperatorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "EngineAlgorithmOperatorView";
+      this.tabControl.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.operatorGraphTabPage.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.algorithmTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabPage algorithmTabPage;
+    private MainForm.WindowsForms.ViewHost algorithmViewHost;
+    private System.Windows.Forms.Button openAlgorithmButton;
+    private System.Windows.Forms.Button newAlgorithmButton;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/EngineAlgorithm/EngineAlgorithmOperatorView.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/EngineAlgorithm/EngineAlgorithmOperatorView.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/EngineAlgorithm/EngineAlgorithmOperatorView.cs	(revision 15691)
@@ -0,0 +1,127 @@
+﻿using System;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Operators.Views;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Operators {
+
+  [View("EngineAlgorithmOperator View")]
+  [Content(typeof(EngineAlgorithmOperator), IsDefaultView = true)]
+  public sealed partial class EngineAlgorithmOperatorView : AlgorithmOperatorView {
+
+    private TypeSelectorDialog algorithmTypeSelectorDialog;
+
+    public new EngineAlgorithmOperator Content {
+      get { return (EngineAlgorithmOperator)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public EngineAlgorithmOperatorView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.AlgorithmChanged -= new EventHandler(Content_AlgorithmChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.AlgorithmChanged += new EventHandler(Content_AlgorithmChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        algorithmViewHost.Content = null;
+      } else {
+        algorithmViewHost.Content = Content.Algorithm;
+      }
+    }
+
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+
+    #region Event Handlers (Content)
+    void Content_AlgorithmChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_AlgorithmChanged), sender, e);
+      } else {
+        algorithmViewHost.Content = Content.Algorithm;
+      }
+    }
+    #endregion
+
+    #region Event Handlers (child controls)
+    private void algorithmTabPage_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        EngineAlgorithm algorithm = e.Data.GetData("Value") as EngineAlgorithm;
+        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy)
+          algorithm = (EngineAlgorithm)algorithm.Clone();
+        Content.Algorithm = algorithm;
+      }
+    }
+
+    private void algorithmTabPage_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      Type type = e.Data.GetData("Type") as Type;
+      if ((type != null) && (typeof(EngineAlgorithm).IsAssignableFrom(type))) {
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
+        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
+        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+      }
+    }
+
+    private void newAlgorithmButton_Click(object sender, System.EventArgs e) {
+      if (algorithmTypeSelectorDialog == null) {
+        algorithmTypeSelectorDialog = new TypeSelectorDialog();
+        algorithmTypeSelectorDialog.Caption = "Select Algorithm";
+        algorithmTypeSelectorDialog.TypeSelector.Caption = "Available Algorithm";
+        algorithmTypeSelectorDialog.TypeSelector.Configure(typeof(EngineAlgorithm), false, true);
+      }
+      if (algorithmTypeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          Content.Algorithm = (EngineAlgorithm)algorithmTypeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        } catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+
+    private void openAlgorithmButton_Click(object sender, System.EventArgs e) {
+      openFileDialog.Title = "Open Algorithm";
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = false;
+        algorithmViewHost.Enabled = false;
+
+        ContentManager.LoadAsync(openFileDialog.FileName, delegate(IStorableContent content, Exception error) {
+          try {
+            if (error != null) throw error;
+            EngineAlgorithm algorithm = content as EngineAlgorithm;
+            if (algorithm == null)
+              Invoke(new Action(() =>
+                MessageBox.Show(this, "The selected file does not contain an engine algorithm.", "Invalid File", MessageBoxButtons.OK, MessageBoxIcon.Error)));
+            else
+              Content.Algorithm = algorithm;
+          } catch (Exception ex) {
+            Invoke(new Action(() => ErrorHandling.ShowErrorDialog(this, ex)));
+          } finally {
+            Invoke(new Action(delegate() {
+              algorithmViewHost.Enabled = true;
+              newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = true;
+            }));
+          }
+        });
+      }
+    }
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapControl.Designer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapControl.Designer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapControl.Designer.cs	(revision 15691)
@@ -0,0 +1,37 @@
+﻿namespace HeuristicLab.Analysis.FitnessLandscape.FDC {
+  partial class HeatMapControl {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.SuspendLayout();
+      // 
+      // HeatMapControl
+      // 
+      this.Resize += new System.EventHandler(this.HeatMapControl_Resize);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapControl.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapControl.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapControl.cs	(revision 15691)
@@ -0,0 +1,209 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.FDC {
+  public partial class HeatMapControl : Control {
+
+    public const int N_BINS = 50;
+
+    public HeatMapControl() {
+      InitializeComponent();
+    }
+
+    private List<PointF> points = new List<PointF>();
+
+    public void AddPoints(IEnumerable<PointF> points) {
+      this.points.AddRange(points);
+      ForceUpdate();
+    }
+
+    public void Clear() {
+      points.Clear();
+      ForceUpdate();
+    }
+
+    private Bitmap bitmap = null;
+
+    protected override void OnPaint(PaintEventArgs pe) {
+      if (bitmap != null)
+        pe.Graphics.DrawImage(bitmap, new Rectangle(0, 0, Width, Height));
+      base.OnPaint(pe);
+    }
+
+    public static RectangleF CreateBounds(IEnumerable<PointF> points, BackgroundWorker worker, DoWorkEventArgs a) {
+      if (points.Count() == 0)
+        return new RectangleF(0, 0, 1, 1);
+      double minX = points.Select(p => p.X).Min();
+      if (worker.CancellationPending) {
+        a.Cancel = true;
+        return new RectangleF(0, 0, 1, 1);
+      }
+      double maxX = points.Select(p => p.X).Max();
+      if (worker.CancellationPending) {
+        a.Cancel = true;
+        return new RectangleF(0, 0, 1, 1);
+      }
+      double minY = points.Select(p => p.Y).Min();
+      if (worker.CancellationPending) {
+        a.Cancel = true;
+        return new RectangleF(0, 0, 1, 1);
+      }
+      double maxY = points.Select(p => p.Y).Max();
+      if (worker.CancellationPending) {
+        a.Cancel = true;
+        return new RectangleF(0, 0, 1, 1);
+      }
+      return new RectangleF((float)minX, (float)minY, (float)(maxX - minX), (float)(maxY - minY));
+    }
+
+    public static double[,] CreateHeapMap(IEnumerable<PointF> points, int hBins, int vBins, BackgroundWorker worker, DoWorkEventArgs a) {
+      RectangleF bounds = CreateBounds(points, worker, a);
+      MatrixBuffer<int> countMap = new MatrixBuffer<int>(hBins, vBins);
+      foreach (PointF p in points) {
+        if (worker.CancellationPending) {
+          a.Cancel = true;
+          return null;
+        }
+        int x = (int)Math.Round((hBins - 1) * (p.X - bounds.X) / bounds.Width);
+        int y = (int)Math.Round((vBins - 1) * (p.Y - bounds.Y) / bounds.Height);
+        countMap[x, y] += 1;
+      }
+      int maxCount = countMap.Max();
+      double[,] heatMap = new double[hBins, vBins];
+      if (maxCount > 0) {
+        for (int x = 0; x < hBins; x++) {
+          for (int y = 0; y < vBins; y++) {
+            if (worker.CancellationPending) {
+              a.Cancel = true;
+              return null;
+            }
+            heatMap[x, y] = 1.0 * countMap[x, y] / maxCount;
+          }
+        }
+      }
+      return heatMap;
+    }
+
+    private static Bitmap CreateBitmap(IEnumerable<PointF> points, int width, int height, BackgroundWorker worker, DoWorkEventArgs a) {
+      ColorGradient gradient = new ColorGradient();
+      gradient[0.0] = Color.Blue;
+      gradient[0.5] = Color.Green;
+      gradient[1.0] = Color.Red;
+      var heatMap = CreateHeapMap(points, N_BINS, N_BINS, worker, a);
+      double binWidth = 1.0 * width / N_BINS;
+      double binHeight = 1.0 * height / N_BINS;
+      if (worker.CancellationPending) {
+        a.Cancel = true;
+        return new Bitmap(1, 1);
+      }
+      Bitmap bitmap = new Bitmap(width, height);
+      using (Graphics g = Graphics.FromImage(bitmap)) {
+        for (int x = 0; x < heatMap.GetLength(0); x++) {
+          for (int y = 0; y < heatMap.GetLength(1); y++) {
+            if (worker.CancellationPending) {
+              a.Cancel = true;
+              break;
+            }
+            using (Brush b = new SolidBrush(gradient[heatMap[x, y]])) {
+              g.FillRectangle(b, (float)(x * binWidth), (float)(y * binHeight), (float)binWidth, (float)binHeight);
+            }
+          }
+        }
+        g.Flush();
+      }
+      return bitmap;
+    }
+
+    private void HeatMapControl_Resize(object sender, EventArgs e) {
+      if (bitmap == null || bitmap.Width < Width || bitmap.Height < bitmap.Height)
+        ForceUpdate();
+    }
+
+    BackgroundWorker worker;
+    object workerLock = new object();
+
+    public void ForceUpdate() {
+      lock (workerLock) {
+        if (worker != null)
+          worker.CancelAsync();
+        worker = new BackgroundWorker() {
+          WorkerSupportsCancellation = true
+        };
+        Bitmap bitmap = null;
+        IEnumerable<PointF> points = this.points.ToList();
+        int width, height;
+        width = height = Math.Min(Width, Height);
+        worker.DoWork += (s, a) => {
+          bitmap = CreateBitmap(points, width, height, worker, a);
+        };
+        worker.RunWorkerCompleted += (s, a) => {
+          if (!a.Cancelled) {
+            SetBitmap(bitmap);
+            lock (workerLock) {
+              this.worker = null;
+            }
+          }
+        };
+        worker.RunWorkerAsync();
+      }
+    }
+
+    private void SetBitmap(Bitmap bitmap) {
+      if (InvokeRequired) {
+        Invoke(new Action<Bitmap>(SetBitmap));
+      } else {
+        this.bitmap = bitmap;
+        Invalidate();
+      }
+    }
+
+  }
+
+  public class MatrixBuffer<T> : IEnumerable<T> {
+
+    private T[,] matrix;
+
+    public MatrixBuffer(int x, int y) {
+      matrix = new T[x, y];
+    }
+
+    public T this[int x, int y] {
+      get {
+        if (IsInside(x, y))
+          return matrix[x, y];
+        else
+          return default(T);
+      }
+      set {
+        if (IsInside(x, y))
+          matrix[x, y] = value;
+      }
+    }
+
+    public bool IsInside(int x, int y) {
+      return x >= 0 && x < matrix.GetLength(0) && y >= 0 && y < matrix.GetLength(1);
+    }
+
+
+    #region IEnumerable<T> Members
+
+    public IEnumerator<T> GetEnumerator() {
+      foreach (T e in matrix)
+        yield return e;
+    }
+
+    #endregion
+
+    #region IEnumerable Members
+
+    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
+      return matrix.GetEnumerator();
+    }
+
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapControl.resx
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapControl.resx	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapControl.resx	(revision 15691)
@@ -0,0 +1,123 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+</root>
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapView.Designer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapView.Designer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapView.Designer.cs	(revision 15691)
@@ -0,0 +1,82 @@
+﻿namespace HeuristicLab.Analysis.FitnessLandscape.FDC {
+  partial class HeatMapView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.groupBox = new System.Windows.Forms.GroupBox();
+      this.heatMapControl = new HeuristicLab.Analysis.FitnessLandscape.FDC.HeatMapControl();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.groupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(370, 20);
+      // 
+      // groupBox
+      // 
+      this.groupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupBox.Controls.Add(this.heatMapControl);
+      this.groupBox.Location = new System.Drawing.Point(6, 52);
+      this.groupBox.Name = "groupBox";
+      this.groupBox.Size = new System.Drawing.Size(433, 236);
+      this.groupBox.TabIndex = 6;
+      this.groupBox.TabStop = false;
+      this.groupBox.Text = "Heat Map";
+      // 
+      // heatMapControl
+      // 
+      this.heatMapControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.heatMapControl.Location = new System.Drawing.Point(3, 16);
+      this.heatMapControl.Name = "heatMapControl";
+      this.heatMapControl.Size = new System.Drawing.Size(427, 217);
+      this.heatMapControl.TabIndex = 0;
+      this.heatMapControl.Text = "heatMapControl1";
+      // 
+      // HeatMapView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.groupBox);
+      this.Name = "HeatMapView";
+      this.Size = new System.Drawing.Size(442, 291);
+      this.Controls.SetChildIndex(this.groupBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.groupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox groupBox;
+    private HeatMapControl heatMapControl;
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapView.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapView.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapView.cs	(revision 15691)
@@ -0,0 +1,35 @@
+﻿using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.FDC {
+
+  [View("HeatMap View")]
+  [Content(typeof(HeatMap), true)]
+  public partial class HeatMapView : NamedItemView {
+
+    public new HeatMap Content {
+      get { return (HeatMap)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public HeatMapView() {
+      InitializeComponent();
+      OnContentChanged();
+    }
+
+    protected override void OnContentChanged() {
+      if (Content != null)
+        heatMapControl.AddPoints(Content.Points);
+      base.OnContentChanged();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapView.resx
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapView.resx	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/HeatMapView.resx	(revision 15691)
@@ -0,0 +1,126 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/ScatterPlotView.Designer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/ScatterPlotView.Designer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/ScatterPlotView.Designer.cs	(revision 15691)
@@ -0,0 +1,156 @@
+﻿#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
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+  partial class ScatterPlotView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+      System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
+      System.Windows.Forms.DataVisualization.Charting.Title title1 = new System.Windows.Forms.DataVisualization.Charting.Title();
+      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+      this.label1 = new System.Windows.Forms.Label();
+      this.correlationLabel = new System.Windows.Forms.Label();
+      this.calcPearsonButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(596, 20);
+      // 
+      // chart
+      // 
+      this.chart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      chartArea1.Name = "ChartArea1";
+      this.chart.ChartAreas.Add(chartArea1);
+      this.chart.Location = new System.Drawing.Point(3, 52);
+      this.chart.Name = "chart";
+      series1.ChartArea = "ChartArea1";
+      series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.FastPoint;
+      series1.EmptyPointStyle.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.LeftRight;
+      series1.MarkerSize = 3;
+      series1.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
+      series1.Name = "Series1";
+      this.chart.Series.Add(series1);
+      this.chart.Size = new System.Drawing.Size(662, 349);
+      this.chart.TabIndex = 5;
+      title1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      title1.Name = "Title1";
+      title1.Text = "Chart";
+      this.chart.Titles.Add(title1);
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.Filter = "PNG Files|*.png|All files|*.*";
+      this.saveFileDialog.Title = "Save File";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 36);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(160, 13);
+      this.label1.TabIndex = 6;
+      this.label1.Text = "Pearson\'s correlation coefficient:";
+      // 
+      // correlationLabel
+      // 
+      this.correlationLabel.AutoSize = true;
+      this.correlationLabel.Location = new System.Drawing.Point(169, 36);
+      this.correlationLabel.Name = "correlationLabel";
+      this.correlationLabel.Size = new System.Drawing.Size(10, 13);
+      this.correlationLabel.TabIndex = 7;
+      this.correlationLabel.Text = "-";
+      // 
+      // calcPearsonButton
+      // 
+      this.calcPearsonButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.calcPearsonButton.Location = new System.Drawing.Point(571, 23);
+      this.calcPearsonButton.Name = "calcPearsonButton";
+      this.calcPearsonButton.Size = new System.Drawing.Size(83, 23);
+      this.calcPearsonButton.TabIndex = 8;
+      this.calcPearsonButton.Text = "Calc Pearson";
+      this.calcPearsonButton.UseVisualStyleBackColor = true;
+      this.calcPearsonButton.Click += new System.EventHandler(this.calcPearsonButton_Click);
+      // 
+      // ScatterPlotView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.chart);
+      this.Controls.Add(this.calcPearsonButton);
+      this.Controls.Add(this.correlationLabel);
+      this.Controls.Add(this.label1);
+      this.Name = "ScatterPlotView";
+      this.Size = new System.Drawing.Size(668, 404);
+      this.DragDrop += new System.Windows.Forms.DragEventHandler(this.ScatterPlotView_DragDrop);
+      this.DragEnter += new System.Windows.Forms.DragEventHandler(this.ScatterPlotView_DragEnter);
+      this.Controls.SetChildIndex(this.label1, 0);
+      this.Controls.SetChildIndex(this.correlationLabel, 0);
+      this.Controls.SetChildIndex(this.calcPearsonButton, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.chart, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart chart;
+    private System.Windows.Forms.SaveFileDialog saveFileDialog;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label correlationLabel;
+    private System.Windows.Forms.Button calcPearsonButton;
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/ScatterPlotView.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/ScatterPlotView.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/ScatterPlotView.cs	(revision 15691)
@@ -0,0 +1,136 @@
+﻿#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.Linq;
+using System.Windows.Forms;
+using System.Windows.Forms.DataVisualization.Charting;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [View("ScatterPlot View")]
+  [Content(typeof(ScatterPlot), true)]
+  public partial class ScatterPlotView : NamedItemView {
+
+
+    public new ScatterPlot Content {
+      get { return (ScatterPlot)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ScatterPlotView() {
+      InitializeComponent();
+      chart.CustomizeAllChartAreas();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null)
+        UpdateBitmap();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.PixelsChanged += new EventHandler<PointsEventArgs>(Content_PixelChanged);
+      Content.AxisNameChanged += new EventHandler(Content_AxisNameChanged);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.PixelsChanged -= new EventHandler<PointsEventArgs>(Content_PixelChanged);
+      Content.AxisNameChanged += new EventHandler(Content_AxisNameChanged);
+      base.DeregisterContentEvents();
+    }
+
+    void Content_AxisNameChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_AxisNameChanged), sender, e);
+      } else {
+        chart.ChartAreas[0].Axes[0].Title = Content.XAxisName;
+        chart.ChartAreas[0].Axes[1].Title = Content.YAxisName;
+      }
+    }
+
+    void Content_PixelChanged(object sender, PointsEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<PointsEventArgs>(Content_PixelChanged), sender, e);
+      else
+        AddPixels(e.NewPoints);
+    }
+
+    void Content_AreaChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_AreaChanged), sender, e);
+      else
+        UpdateBitmap();
+    }
+
+    private void AddPixels(IEnumerable<PointF> points) {
+      foreach (var p in points)
+        chart.Series[0].Points.AddXY(p.X, p.Y);
+    }
+
+    private void ConfigureChart() {
+      chart.ChartAreas[0].Axes[0].Title = Content.XAxisName;
+      chart.ChartAreas[0].Axes[1].Title = Content.YAxisName;
+      chart.Titles.Clear();
+      Title t = chart.Titles.Add(Content.Name);
+      t.Font = new System.Drawing.Font(t.Font.FontFamily, 10, FontStyle.Bold);
+    }
+
+    private void UpdateBitmap() {
+      chart.Series.Clear();
+      var series1 = new Series("Series1") {
+        ChartArea = "ChartArea1",
+        ChartType = SeriesChartType.FastPoint,
+        EmptyPointStyle = {BackGradientStyle = GradientStyle.LeftRight},
+        MarkerSize = 3,
+        MarkerStyle = MarkerStyle.Circle,
+      };
+      chart.Series.Add(series1);
+      ConfigureChart();
+      var points = Content.Points.ToArray();
+      correlationLabel.Text = alglib.basestat.pearsoncorrelation(points.Select(x => (double)x.X).ToArray(), points.Select(x => (double)x.Y).ToArray(), points.Length).ToString();
+      foreach (var p in points) {
+        chart.Series[0].Points.AddXY(p.X, p.Y);
+      }
+    }
+
+    private void ScatterPlotView_DragEnter(object sender, DragEventArgs e) {
+      if (e.Data.GetDataPresent("HeuristicLab"))
+        e.Effect = DragDropEffects.Copy;
+      else e.Effect = DragDropEffects.None;
+    }
+
+    private void ScatterPlotView_DragDrop(object sender, DragEventArgs e) {
+      ConfigureChart();
+      ScatterPlot sp = (ScatterPlot)e.Data.GetData("HeuristicLab");
+      AddPixels(sp.Points);
+    }
+
+    private void calcPearsonButton_Click(object sender, EventArgs e) {
+      correlationLabel.Text = alglib.basestat.pearsoncorrelation(chart.Series[0].Points.Select(x => x.XValue).ToArray(), chart.Series[0].Points.Select(x => x.YValues[0]).ToArray(), chart.Series[0].Points.Count).ToString();
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/ScatterPlotView.resx
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/ScatterPlotView.resx	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/FDC/ScatterPlotView.resx	(revision 15691)
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>230, 17</value>
+  </metadata>
+</root>
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/HeuristicLab.Analysis.FitnessLandscape.Views.csproj
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/HeuristicLab.Analysis.FitnessLandscape.Views.csproj	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/HeuristicLab.Analysis.FitnessLandscape.Views.csproj	(revision 15691)
@@ -0,0 +1,278 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{09F27845-A5B0-476E-901E-9D61576C8581}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Analysis.FitnessLandscape.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Analysis.FitnessLandscape.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Analysis.FitnessLandscape.Views.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Analysis.FitnessLandscape.Views.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Analysis.FitnessLandscape.Views.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Analysis.FitnessLandscape.Views.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="ALGLIB-3.7.0, Version=3.7.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\..\trunk\bin\ALGLIB-3.7.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators.Views-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Operators.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters.Views-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Parameters.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Visualization.ChartControlsExtensions-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Visualization.ChartControlsExtensions-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="BoxChart\BitmapItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BoxChart\BitmapItemView.Designer.cs">
+      <DependentUpon>BitmapItemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="BoxChart\ColorValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BoxChart\ColorValueView.Designer.cs">
+      <DependentUpon>ColorValueView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EngineAlgorithm\EngineAlgorithmOperatorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EngineAlgorithm\EngineAlgorithmOperatorView.Designer.cs">
+      <DependentUpon>EngineAlgorithmOperatorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FDC\HeatMapControl.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="FDC\HeatMapControl.Designer.cs">
+      <DependentUpon>HeatMapControl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FDC\HeatMapView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FDC\HeatMapView.Designer.cs">
+      <DependentUpon>HeatMapView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FDC\ScatterPlotView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FDC\ScatterPlotView.Designer.cs">
+      <DependentUpon>ScatterPlotView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLabAnalysisFitnessLandscapeViewsPlugin.cs" />
+    <Compile Include="MultiTrajectory\MultiTrajectoryView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MultiTrajectory\MultiTrajectoryView.Designer.cs">
+      <DependentUpon>MultiTrajectoryView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ScopePathLookupParameterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScopePathLookupParameterView.Designer.cs">
+      <DependentUpon>ScopePathLookupParameterView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="BoxChart\BitmapItemView.resx">
+      <DependentUpon>BitmapItemView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="BoxChart\ColorValueView.resx">
+      <DependentUpon>ColorValueView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="FDC\HeatMapControl.resx">
+      <DependentUpon>HeatMapControl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="FDC\HeatMapView.resx">
+      <DependentUpon>HeatMapView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="FDC\ScatterPlotView.resx">
+      <DependentUpon>ScatterPlotView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="MultiTrajectory\MultiTrajectoryView.resx">
+      <DependentUpon>MultiTrajectoryView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="HeuristicLabAnalysisFitnessLandscapeViewsPlugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Analysis.FitnessLandscape\HeuristicLab.Analysis.FitnessLandscape.csproj">
+      <Project>{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}</Project>
+      <Name>HeuristicLab.Analysis.FitnessLandscape</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\Properties\AssemblyInfo.cs.frame" "%25ProjectDir%25\Properties\AssemblyInfo.cs"
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\HeuristicLabAnalysisFitnessLandscapeViewsPlugin.cs.frame" "%25ProjectDir%25\HeuristicLabAnalysisFitnessLandscapeViewsPlugin.cs"</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+set Platform=$(PlatformName)
+set Configuration=$(ConfigurationName)</PostBuildEvent>
+  </PropertyGroup>
+  <!-- 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>
+  -->
+</Project>
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/HeuristicLabAnalysisFitnessLandscapeViewsPlugin.cs.frame
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/HeuristicLabAnalysisFitnessLandscapeViewsPlugin.cs.frame	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/HeuristicLabAnalysisFitnessLandscapeViewsPlugin.cs.frame	(revision 15691)
@@ -0,0 +1,44 @@
+﻿#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.Analysis.FitnessLandscape {
+
+  [Plugin("HeuristicLab.Analysis.FitnessLandscape.Views", "3.3.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Analysis.FitnessLandscape.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.7")]
+  [PluginDependency("HeuristicLab.Analysis.FitnessLandscape", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Operators.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Visualization.ChartControlsExtensions", "3.3")]
+  public class HeuristicLabAnalysisFitnessLandscapeViewsPlugin : PluginBase { }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/MultiTrajectory/MultiTrajectoryView.Designer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/MultiTrajectory/MultiTrajectoryView.Designer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/MultiTrajectory/MultiTrajectoryView.Designer.cs	(revision 15691)
@@ -0,0 +1,385 @@
+﻿namespace HeuristicLab.Analysis.FitnessLandscape.MultiTrajectory {
+  partial class MultiTrajectoryAnalysisView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MultiTrajectoryAnalysisView));
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.parametersTabPage = new System.Windows.Forms.TabPage();
+      this.parametersView = new HeuristicLab.Core.Views.ParameterCollectionView();
+      this.sampleGenerationTabPage = new System.Windows.Forms.TabPage();
+      this.sampleGenerationAlgorithmViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.openSampleGenerationAlgorithmButton = new System.Windows.Forms.Button();
+      this.newSampleGenerationAlgorithmButton = new System.Windows.Forms.Button();
+      this.algorithmTabPage = new System.Windows.Forms.TabPage();
+      this.openAlgorithmButton = new System.Windows.Forms.Button();
+      this.newAlgorithmButton = new System.Windows.Forms.Button();
+      this.algorithmViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.runsTabPage = new System.Windows.Forms.TabPage();
+      this.runCollectionView = new HeuristicLab.Optimization.Views.RunCollectionView();
+      this.resultsTabPage = new System.Windows.Forms.TabPage();
+      this.resultCollectionView = new HeuristicLab.Optimization.Views.ResultCollectionView();
+      this.startButton = new System.Windows.Forms.Button();
+      this.pauseButton = new System.Windows.Forms.Button();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.prepareButton = new System.Windows.Forms.Button();
+      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+      this.executionTimeLabel = new System.Windows.Forms.Label();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.sampleGenerationTabPage.SuspendLayout();
+      this.algorithmTabPage.SuspendLayout();
+      this.runsTabPage.SuspendLayout();
+      this.resultsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(489, 20);
+      // 
+      // tabControl
+      // 
+      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabControl.Controls.Add(this.parametersTabPage);
+      this.tabControl.Controls.Add(this.sampleGenerationTabPage);
+      this.tabControl.Controls.Add(this.algorithmTabPage);
+      this.tabControl.Controls.Add(this.runsTabPage);
+      this.tabControl.Controls.Add(this.resultsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 26);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(561, 357);
+      this.tabControl.TabIndex = 4;
+      this.tabControl.DragDrop += new System.Windows.Forms.DragEventHandler(this.algorithmTabPage_DragDrop);
+      this.tabControl.DragEnter += new System.Windows.Forms.DragEventHandler(this.algorithmTabPage_DragEnterOver);
+      this.tabControl.DragOver += new System.Windows.Forms.DragEventHandler(this.algorithmTabPage_DragEnterOver);
+      // 
+      // parametersTabPage
+      // 
+      this.parametersTabPage.Controls.Add(this.parametersView);
+      this.parametersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.parametersTabPage.Name = "parametersTabPage";
+      this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.parametersTabPage.Size = new System.Drawing.Size(553, 331);
+      this.parametersTabPage.TabIndex = 0;
+      this.parametersTabPage.Text = "Parameters";
+      this.parametersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // parametersView
+      // 
+      this.parametersView.AllowEditingOfHiddenParameters = true;
+      this.parametersView.Caption = "ParameterCollection View";
+      this.parametersView.Content = null;
+      this.parametersView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.parametersView.Location = new System.Drawing.Point(3, 3);
+      this.parametersView.Name = "parametersView";
+      this.parametersView.ReadOnly = false;
+      this.parametersView.Size = new System.Drawing.Size(547, 325);
+      this.parametersView.TabIndex = 0;
+      // 
+      // sampleGenerationTabPage
+      // 
+      this.sampleGenerationTabPage.AllowDrop = true;
+      this.sampleGenerationTabPage.Controls.Add(this.sampleGenerationAlgorithmViewHost);
+      this.sampleGenerationTabPage.Controls.Add(this.openSampleGenerationAlgorithmButton);
+      this.sampleGenerationTabPage.Controls.Add(this.newSampleGenerationAlgorithmButton);
+      this.sampleGenerationTabPage.Location = new System.Drawing.Point(4, 22);
+      this.sampleGenerationTabPage.Name = "sampleGenerationTabPage";
+      this.sampleGenerationTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.sampleGenerationTabPage.Size = new System.Drawing.Size(553, 331);
+      this.sampleGenerationTabPage.TabIndex = 1;
+      this.sampleGenerationTabPage.Text = "Sample Generation";
+      this.sampleGenerationTabPage.UseVisualStyleBackColor = true;
+      this.sampleGenerationTabPage.DragDrop += new System.Windows.Forms.DragEventHandler(this.algorithmTabPage_DragDrop);
+      this.sampleGenerationTabPage.DragEnter += new System.Windows.Forms.DragEventHandler(this.algorithmTabPage_DragEnterOver);
+      this.sampleGenerationTabPage.DragOver += new System.Windows.Forms.DragEventHandler(this.algorithmTabPage_DragEnterOver);
+      // 
+      // sampleGenerationAlgorithmViewHost
+      // 
+      this.sampleGenerationAlgorithmViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.sampleGenerationAlgorithmViewHost.Caption = "Algorithm View";
+      this.sampleGenerationAlgorithmViewHost.Content = null;
+      this.sampleGenerationAlgorithmViewHost.Enabled = false;
+      this.sampleGenerationAlgorithmViewHost.Location = new System.Drawing.Point(6, 36);
+      this.sampleGenerationAlgorithmViewHost.Name = "sampleGenerationAlgorithmViewHost";
+      this.sampleGenerationAlgorithmViewHost.ReadOnly = false;
+      this.sampleGenerationAlgorithmViewHost.Size = new System.Drawing.Size(541, 286);
+      this.sampleGenerationAlgorithmViewHost.TabIndex = 0;
+      this.sampleGenerationAlgorithmViewHost.ViewsLabelVisible = true;
+      this.sampleGenerationAlgorithmViewHost.ViewType = null;
+      // 
+      // openSampleGenerationAlgorithmButton
+      // 
+      this.openSampleGenerationAlgorithmButton.Image = ((System.Drawing.Image)(resources.GetObject("openSampleGenerationAlgorithmButton.Image")));
+      this.openSampleGenerationAlgorithmButton.Location = new System.Drawing.Point(36, 6);
+      this.openSampleGenerationAlgorithmButton.Name = "openSampleGenerationAlgorithmButton";
+      this.openSampleGenerationAlgorithmButton.Size = new System.Drawing.Size(24, 24);
+      this.openSampleGenerationAlgorithmButton.TabIndex = 5;
+      this.openSampleGenerationAlgorithmButton.UseVisualStyleBackColor = true;
+      this.openSampleGenerationAlgorithmButton.Click += new System.EventHandler(this.openSampleGenerationAlgorithmButton_Click);
+      // 
+      // newSampleGenerationAlgorithmButton
+      // 
+      this.newSampleGenerationAlgorithmButton.Image = ((System.Drawing.Image)(resources.GetObject("newSampleGenerationAlgorithmButton.Image")));
+      this.newSampleGenerationAlgorithmButton.Location = new System.Drawing.Point(6, 6);
+      this.newSampleGenerationAlgorithmButton.Name = "newSampleGenerationAlgorithmButton";
+      this.newSampleGenerationAlgorithmButton.Size = new System.Drawing.Size(24, 24);
+      this.newSampleGenerationAlgorithmButton.TabIndex = 5;
+      this.newSampleGenerationAlgorithmButton.UseVisualStyleBackColor = true;
+      this.newSampleGenerationAlgorithmButton.Click += new System.EventHandler(this.newSampleGenerationAlgorithmButton_Click);
+      // 
+      // algorithmTabPage
+      // 
+      this.algorithmTabPage.AllowDrop = true;
+      this.algorithmTabPage.Controls.Add(this.openAlgorithmButton);
+      this.algorithmTabPage.Controls.Add(this.newAlgorithmButton);
+      this.algorithmTabPage.Controls.Add(this.algorithmViewHost);
+      this.algorithmTabPage.Location = new System.Drawing.Point(4, 22);
+      this.algorithmTabPage.Name = "algorithmTabPage";
+      this.algorithmTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.algorithmTabPage.Size = new System.Drawing.Size(553, 331);
+      this.algorithmTabPage.TabIndex = 2;
+      this.algorithmTabPage.Text = "Algorithm";
+      this.algorithmTabPage.UseVisualStyleBackColor = true;
+      this.algorithmTabPage.DragDrop += new System.Windows.Forms.DragEventHandler(this.algorithmTabPage_DragDrop);
+      this.algorithmTabPage.DragEnter += new System.Windows.Forms.DragEventHandler(this.algorithmTabPage_DragEnterOver);
+      this.algorithmTabPage.DragOver += new System.Windows.Forms.DragEventHandler(this.algorithmTabPage_DragEnterOver);
+      // 
+      // openAlgorithmButton
+      // 
+      this.openAlgorithmButton.Image = ((System.Drawing.Image)(resources.GetObject("openAlgorithmButton.Image")));
+      this.openAlgorithmButton.Location = new System.Drawing.Point(36, 6);
+      this.openAlgorithmButton.Name = "openAlgorithmButton";
+      this.openAlgorithmButton.Size = new System.Drawing.Size(24, 24);
+      this.openAlgorithmButton.TabIndex = 7;
+      this.openAlgorithmButton.UseVisualStyleBackColor = true;
+      this.openAlgorithmButton.Click += new System.EventHandler(this.openAlgorithmButton_Click);
+      // 
+      // newAlgorithmButton
+      // 
+      this.newAlgorithmButton.Image = ((System.Drawing.Image)(resources.GetObject("newAlgorithmButton.Image")));
+      this.newAlgorithmButton.Location = new System.Drawing.Point(6, 6);
+      this.newAlgorithmButton.Name = "newAlgorithmButton";
+      this.newAlgorithmButton.Size = new System.Drawing.Size(24, 24);
+      this.newAlgorithmButton.TabIndex = 6;
+      this.newAlgorithmButton.UseVisualStyleBackColor = true;
+      this.newAlgorithmButton.Click += new System.EventHandler(this.newAlgorithmButton_Click);
+      // 
+      // algorithmViewHost
+      // 
+      this.algorithmViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.algorithmViewHost.Caption = "Algorithm View";
+      this.algorithmViewHost.Content = null;
+      this.algorithmViewHost.Enabled = false;
+      this.algorithmViewHost.Location = new System.Drawing.Point(6, 36);
+      this.algorithmViewHost.Name = "algorithmViewHost";
+      this.algorithmViewHost.ReadOnly = false;
+      this.algorithmViewHost.Size = new System.Drawing.Size(541, 286);
+      this.algorithmViewHost.TabIndex = 0;
+      this.algorithmViewHost.ViewsLabelVisible = true;
+      this.algorithmViewHost.ViewType = null;
+      // 
+      // runsTabPage
+      // 
+      this.runsTabPage.Controls.Add(this.runCollectionView);
+      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.runsTabPage.Name = "runsTabPage";
+      this.runsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.runsTabPage.Size = new System.Drawing.Size(553, 331);
+      this.runsTabPage.TabIndex = 3;
+      this.runsTabPage.Text = "Runs";
+      this.runsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // runCollectionView
+      // 
+      this.runCollectionView.Caption = "RunCollection View";
+      this.runCollectionView.Content = null;
+      this.runCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.runCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.runCollectionView.Name = "runCollectionView";
+      this.runCollectionView.ReadOnly = false;
+      this.runCollectionView.Size = new System.Drawing.Size(547, 325);
+      this.runCollectionView.TabIndex = 0;
+      // 
+      // resultsTabPage
+      // 
+      this.resultsTabPage.Controls.Add(this.resultCollectionView);
+      this.resultsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.resultsTabPage.Name = "resultsTabPage";
+      this.resultsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.resultsTabPage.Size = new System.Drawing.Size(553, 331);
+      this.resultsTabPage.TabIndex = 4;
+      this.resultsTabPage.Text = "Results";
+      this.resultsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // resultCollectionView
+      // 
+      this.resultCollectionView.Caption = "ResultCollection View";
+      this.resultCollectionView.Content = null;
+      this.resultCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.resultCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.resultCollectionView.Name = "resultCollectionView";
+      this.resultCollectionView.ReadOnly = true;
+      this.resultCollectionView.Size = new System.Drawing.Size(547, 325);
+      this.resultCollectionView.TabIndex = 0;
+      // 
+      // startButton
+      // 
+      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.startButton.Image = ((System.Drawing.Image)(resources.GetObject("startButton.Image")));
+      this.startButton.Location = new System.Drawing.Point(3, 389);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(24, 24);
+      this.startButton.TabIndex = 5;
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.startButton_Click);
+      // 
+      // pauseButton
+      // 
+      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.pauseButton.Image = ((System.Drawing.Image)(resources.GetObject("pauseButton.Image")));
+      this.pauseButton.Location = new System.Drawing.Point(33, 389);
+      this.pauseButton.Name = "pauseButton";
+      this.pauseButton.Size = new System.Drawing.Size(24, 24);
+      this.pauseButton.TabIndex = 5;
+      this.pauseButton.UseVisualStyleBackColor = true;
+      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Image = ((System.Drawing.Image)(resources.GetObject("stopButton.Image")));
+      this.stopButton.Location = new System.Drawing.Point(63, 389);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(24, 24);
+      this.stopButton.TabIndex = 5;
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // prepareButton
+      // 
+      this.prepareButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.prepareButton.Image = ((System.Drawing.Image)(resources.GetObject("prepareButton.Image")));
+      this.prepareButton.Location = new System.Drawing.Point(93, 389);
+      this.prepareButton.Name = "prepareButton";
+      this.prepareButton.Size = new System.Drawing.Size(24, 24);
+      this.prepareButton.TabIndex = 5;
+      this.prepareButton.UseVisualStyleBackColor = true;
+      this.prepareButton.Click += new System.EventHandler(this.prepareButton_Click);
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeTextBox.Location = new System.Drawing.Point(419, 392);
+      this.executionTimeTextBox.Name = "executionTimeTextBox";
+      this.executionTimeTextBox.ReadOnly = true;
+      this.executionTimeTextBox.Size = new System.Drawing.Size(139, 20);
+      this.executionTimeTextBox.TabIndex = 6;
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeLabel.AutoSize = true;
+      this.executionTimeLabel.Location = new System.Drawing.Point(333, 395);
+      this.executionTimeLabel.Name = "executionTimeLabel";
+      this.executionTimeLabel.Size = new System.Drawing.Size(80, 13);
+      this.executionTimeLabel.TabIndex = 7;
+      this.executionTimeLabel.Text = "ExecutionTime:";
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.FileName = "Algorithm";
+      this.openFileDialog.Filter = "HeuristicLab Files|*.hl|All Files|*.*";
+      // 
+      // MultiTrajectoryAnalysisView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.startButton);
+      this.Controls.Add(this.pauseButton);
+      this.Controls.Add(this.stopButton);
+      this.Controls.Add(this.prepareButton);
+      this.Controls.Add(this.executionTimeTextBox);
+      this.Controls.Add(this.executionTimeLabel);
+      this.Controls.Add(this.tabControl);
+      this.Name = "MultiTrajectoryAnalysisView";
+      this.Size = new System.Drawing.Size(561, 416);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.executionTimeLabel, 0);
+      this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
+      this.Controls.SetChildIndex(this.prepareButton, 0);
+      this.Controls.SetChildIndex(this.stopButton, 0);
+      this.Controls.SetChildIndex(this.pauseButton, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.startButton, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.sampleGenerationTabPage.ResumeLayout(false);
+      this.algorithmTabPage.ResumeLayout(false);
+      this.runsTabPage.ResumeLayout(false);
+      this.resultsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage parametersTabPage;
+    private System.Windows.Forms.TabPage sampleGenerationTabPage;
+    private System.Windows.Forms.TabPage algorithmTabPage;
+    private System.Windows.Forms.TabPage runsTabPage;
+    private System.Windows.Forms.TabPage resultsTabPage;
+    private HeuristicLab.Core.Views.ParameterCollectionView parametersView;
+    private System.Windows.Forms.Button startButton;
+    private System.Windows.Forms.Button pauseButton;
+    private System.Windows.Forms.Button stopButton;
+    private System.Windows.Forms.Button prepareButton;
+    private System.Windows.Forms.TextBox executionTimeTextBox;
+    private System.Windows.Forms.Label executionTimeLabel;
+    private HeuristicLab.MainForm.WindowsForms.ViewHost sampleGenerationAlgorithmViewHost;
+    private HeuristicLab.MainForm.WindowsForms.ViewHost algorithmViewHost;
+    private HeuristicLab.Optimization.Views.RunCollectionView runCollectionView;
+    private HeuristicLab.Optimization.Views.ResultCollectionView resultCollectionView;
+    private System.Windows.Forms.Button newSampleGenerationAlgorithmButton;
+    private System.Windows.Forms.Button openSampleGenerationAlgorithmButton;
+    private System.Windows.Forms.Button openAlgorithmButton;
+    private System.Windows.Forms.Button newAlgorithmButton;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/MultiTrajectory/MultiTrajectoryView.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/MultiTrajectory/MultiTrajectoryView.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/MultiTrajectory/MultiTrajectoryView.cs	(revision 15691)
@@ -0,0 +1,211 @@
+﻿using System;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.MultiTrajectory {
+
+
+  [View("MultiTrajectoryView")]
+  [Content(typeof(MultiTrajectoryAnalysis), IsDefaultView = true)]
+  public sealed partial class MultiTrajectoryAnalysisView : NamedItemView {
+
+    private TypeSelectorDialog algorithmTypeSelectorDialog;
+
+    public new MultiTrajectoryAnalysis Content {
+      get { return (MultiTrajectoryAnalysis)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MultiTrajectoryAnalysisView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.AlgorithmChanged -= Content_AlgorithmChanged;
+      Content.SampleGenerationAlgorithmChanged -= Content_SampleGenerationAlgorithmChanged;
+      Content.ExecutionStateChanged -= Content_ExecutionStateChanged;
+      Content.ExecutionTimeChanged -= Content_ExecutionTimeChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.AlgorithmChanged += Content_AlgorithmChanged;
+      Content.SampleGenerationAlgorithmChanged += Content_SampleGenerationAlgorithmChanged;
+      Content.ExecutionStateChanged += Content_ExecutionStateChanged;
+      Content.ExecutionTimeChanged += Content_ExecutionTimeChanged;
+    }
+
+    #region Event Handlers (Content)
+    void Content_AlgorithmChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_AlgorithmChanged), sender, e);
+      } else {
+        algorithmViewHost.Content = Content.Algorithm;
+        SetEnabledStateOfControls();
+      }
+    }
+    void Content_SampleGenerationAlgorithmChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_SampleGenerationAlgorithmChanged), sender, e);
+      } else {
+        sampleGenerationAlgorithmViewHost.Content = Content.SampleGenerationAlgorithm;
+        SetEnabledStateOfControls();
+      }
+    }
+    void Content_ExecutionStateChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
+      } else {
+        SetEnabledStateOfControls();
+      }
+    }
+    void Content_ExecutionTimeChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
+      } else {
+        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
+      }
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        parametersView.Content = null;
+        sampleGenerationAlgorithmViewHost.Content = null;
+        algorithmViewHost.Content = null;
+        runCollectionView.Content = null;
+        resultCollectionView.Content = null;
+        executionTimeTextBox.Text = "--:--";
+      } else {
+        parametersView.Content = Content.Parameters;
+        sampleGenerationAlgorithmViewHost.Content = Content.SampleGenerationAlgorithm;
+        algorithmViewHost.Content = Content.Algorithm;
+        runCollectionView.Content = Content.Runs;
+        resultCollectionView.Content = Content.Results.AsReadOnly();
+        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      parametersView.Enabled = Content != null && !ReadOnly;
+      startButton.Enabled = Content != null && !ReadOnly && Content.ExecutionState != ExecutionState.Started && Content.ExecutionState != ExecutionState.Stopped;
+      pauseButton.Enabled = Content != null && !ReadOnly && Content.ExecutionState == ExecutionState.Started;
+      stopButton.Enabled = Content != null && !ReadOnly && Content.ExecutionState != ExecutionState.Prepared && Content.ExecutionState != ExecutionState.Stopped;
+      prepareButton.Enabled = Content != null && !ReadOnly && Content.ExecutionState != ExecutionState.Paused && Content.ExecutionState != ExecutionState.Started;
+    }
+
+
+    #region Event Handlers (child controls)
+    private void newAlgorithmButton_Click(object sender, System.EventArgs e) {
+      try {
+        IAlgorithm algorithm = SelectAlgorithm();
+        if (algorithm != null)
+          Content.Algorithm = algorithm;
+      } catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, ex);
+      }
+    }
+    private void openAlgorithmButton_Click(object sender, System.EventArgs e) {
+      LoadAlgorithm(
+        () => { newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = algorithmViewHost.Enabled = false; },
+        (alg) => { Content.Algorithm = alg; },
+        () => { newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = algorithmViewHost.Enabled = true; });
+    }
+    private void newSampleGenerationAlgorithmButton_Click(object sender, System.EventArgs e) {
+      try {
+        IAlgorithm algorithm = SelectAlgorithm();
+        if (algorithm != null)
+          Content.SampleGenerationAlgorithm = algorithm;
+      } catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, ex);
+      }
+    }
+    private void openSampleGenerationAlgorithmButton_Click(object sender, System.EventArgs e) {
+      LoadAlgorithm(
+        () => { newSampleGenerationAlgorithmButton.Enabled = openSampleGenerationAlgorithmButton.Enabled = sampleGenerationAlgorithmViewHost.Enabled = false; },
+        (alg) => { Content.SampleGenerationAlgorithm = alg; },
+        () => { newSampleGenerationAlgorithmButton.Enabled = openSampleGenerationAlgorithmButton.Enabled = sampleGenerationAlgorithmViewHost.Enabled = true; });
+    }
+    private void startButton_Click(object sender, System.EventArgs e) {
+      Content.StartAsync();
+    }
+    private void pauseButton_Click(object sender, System.EventArgs e) {
+      Content.Pause();
+    }
+    private void stopButton_Click(object sender, System.EventArgs e) {
+      Content.Stop();
+    }
+    private void prepareButton_Click(object sender, System.EventArgs e) {
+      Content.Prepare();
+    }
+    private void algorithmTabPage_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;      
+      if (!ReadOnly && e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IAlgorithm) {
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
+        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
+        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+      }
+    }
+    private void algorithmTabPage_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IAlgorithm algorithm = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IAlgorithm;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) algorithm = (IAlgorithm)algorithm.Clone();
+        if (sender == algorithmTabPage)
+          Content.Algorithm = algorithm;
+        if (sender == sampleGenerationTabPage)
+          Content.SampleGenerationAlgorithm = algorithm;
+      }
+    }
+    #endregion
+
+    #region Auxiliary Functions
+    private IAlgorithm SelectAlgorithm() {
+      if (algorithmTypeSelectorDialog == null) {
+        algorithmTypeSelectorDialog = new TypeSelectorDialog();
+        algorithmTypeSelectorDialog.Caption = "Select Algorithm";
+        algorithmTypeSelectorDialog.TypeSelector.Caption = "Available Algorithms";
+        algorithmTypeSelectorDialog.TypeSelector.Configure(typeof(IAlgorithm), false, false);
+      }
+      if (algorithmTypeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        return (IAlgorithm)algorithmTypeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+      }
+      return null;
+    }
+    private void LoadAlgorithm(Action pre, Action<IAlgorithm> set, Action post) {
+      openFileDialog.Title = "Open Algorithm";
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        if (InvokeRequired) {
+          Invoke(pre);
+        } else {
+          pre();
+        }
+        ContentManager.LoadAsync(openFileDialog.FileName, delegate(IStorableContent content, Exception error) {
+          try {
+            if (error != null) throw error;
+            IAlgorithm algorithm = content as IAlgorithm;
+            if (algorithm == null)
+              Invoke(new Action(() =>
+                MessageBox.Show(this, "The selected file does not contain an algorithm.", "Invalid File", MessageBoxButtons.OK, MessageBoxIcon.Error)));
+            else
+              set(algorithm);
+          } catch (Exception ex) {
+            Invoke(new Action(() => ErrorHandling.ShowErrorDialog(this, ex)));
+          } finally {
+            Invoke(post);
+          }
+        });
+      }
+    }
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/MultiTrajectory/MultiTrajectoryView.resx
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/MultiTrajectory/MultiTrajectoryView.resx	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/MultiTrajectory/MultiTrajectoryView.resx	(revision 15691)
@@ -0,0 +1,240 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="openSampleGenerationAlgorithmButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALDgAA
+        Cw4BQL7hQQAAAn9JREFUOE+lk2tI01EYxhf0oU8WqVEIRpaIBWJgSPUhROmippS3QkkTylsXDMW8ts3b
+        1G06daVibuqaOq0sxbBCKBSJ0PJCialZUFSKqaGSt1//TbIsww8deOBwznl+5zkv71kHiP5rGAFrKb1Q
+        5ypR6bmaVU6m2kCiXJv007Om2XgwJEaNT4QiyDi/GF9mKRVgsWkav+CYQkR1utwAQfypphqZ4l/JIhOL
+        jvtGKfCOyDMB6O/WMjNea9L3MT1zIxoM5QrqdWnS1SA+kUq8w1V4hhUgqq1QMj1WtcK88KmIud5oqsqy
+        qCzOQFMopSQvhRvyBApkcQLzV91E1docpr9ol29eFMz0J0Bv2Kr6C3CrVMa3jyWm2EZzc12OSQ8M2TTo
+        ZdytzMCgSUVfIqFcfY2bqiSKlQmoc+JNaUSVJRlMvsvHGHuoVUx9lZKFIQkMp63UW2FtMBH6YuBVFF01
+        /lwO9aoQadSpTAxkwXs596oVtD+ULx36/Qkvg6HDl/k2D2YeufCmwoELZ45MCIA9olKVmK+vJQy3JVOv
+        l7M4KIae8CVAV6hgPMV8uxczLYeZbDrIaN1eJBG2nHazyDN1cZEymdHueG7rcuh8KiTpixYA56AziMVn
+        J5h9coyp5kOM1TvxudqejvRNBHrY4GRnZmcCqLMT6GlJ4Y4uGwZS4IUQ97kfs62eTD12YbzBmRGDAx+0
+        u+iVmyMO24njbqvG5VbOz4yjtjyL3vuRdOSKltUuX0+LbAON0o3UJFmiibPi+pXtBLrvWHR2tHZfBuSm
+        xZIrPk9mfAiJlwKMleWsvxsnj+7H9YAD+xxssbexwnqbBVs2m7HV3GxlI631E9fa/wGRpaRpa3TTbQAA
+        AABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="newSampleGenerationAlgorithmButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALDgAA
+        Cw4BQL7hQQAAAaJJREFUOE+Nkk1LAkEYx5egU9Sla9AX6NKhLlH3IujSoXtBn0EI+gB5qVBIKyIMtEDo
+        BUIhK6qDSUj4gqYloilmvqa5rrr/Zlx3dkU0B/48z87O/zfzPDMcAE7SOg8sB2AkqYdIXIoAK4LyX17X
+        HiVzYPhC0NBUB1yR6Jfy5lx59rQXRAKEhl6Y4YhMnXOSmUDywRlYHV5YbG6YLp1UW2pgEyBoSdARbdNP
+        OszSSQxEZnkO2D+7w/TCWhtEOoGfqyE5KmKnVf/HIHBLcn4SiI21oGQPkw32J68M0VKvBKgvulgJdEey
+        O+sJNhlg9/i6aZalAEpz98xwQADhAaWJ2GOAWr0BCpFBCoCeIjOxgdCIHlYCiI8DGQ1QMjKzKIooVwSk
+        MuUmYGp+lf5rlcDeArhD6wMzqZOqUEe2UEE0WegNMFgcHYB6Q0SxXEUiXcJbNNsboD+xdwAqfA3p3C8i
+        n3l4QuneAFqfetDG5X94xFJFBCIZuHzJ/gHqxoVjObwGv/DojvcPUDfO9/4NpyeBm+dofwD5vrvFrtco
+        3zFd8J/oO/gDpYIVhUFyWDsAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="openAlgorithmButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALDQAA
+        Cw0B7QfALAAAAn9JREFUOE+lk2tI01EYxhf0oU8WqVEIRpaIBWJgSPUhROmippS3QkkTylsXDMW8ts3b
+        1G06daVibuqaOq0sxbBCKBSJ0PJCialZUFSKqaGSt1//TbIsww8deOBwznl+5zkv71kHiP5rGAFrKb1Q
+        5ypR6bmaVU6m2kCiXJv007Om2XgwJEaNT4QiyDi/GF9mKRVgsWkav+CYQkR1utwAQfypphqZ4l/JIhOL
+        jvtGKfCOyDMB6O/WMjNea9L3MT1zIxoM5QrqdWnS1SA+kUq8w1V4hhUgqq1QMj1WtcK88KmIud5oqsqy
+        qCzOQFMopSQvhRvyBApkcQLzV91E1docpr9ol29eFMz0J0Bv2Kr6C3CrVMa3jyWm2EZzc12OSQ8M2TTo
+        ZdytzMCgSUVfIqFcfY2bqiSKlQmoc+JNaUSVJRlMvsvHGHuoVUx9lZKFIQkMp63UW2FtMBH6YuBVFF01
+        /lwO9aoQadSpTAxkwXs596oVtD+ULx36/Qkvg6HDl/k2D2YeufCmwoELZ45MCIA9olKVmK+vJQy3JVOv
+        l7M4KIae8CVAV6hgPMV8uxczLYeZbDrIaN1eJBG2nHazyDN1cZEymdHueG7rcuh8KiTpixYA56AziMVn
+        J5h9coyp5kOM1TvxudqejvRNBHrY4GRnZmcCqLMT6GlJ4Y4uGwZS4IUQ97kfs62eTD12YbzBmRGDAx+0
+        u+iVmyMO24njbqvG5VbOz4yjtjyL3vuRdOSKltUuX0+LbAON0o3UJFmiibPi+pXtBLrvWHR2tHZfBuSm
+        xZIrPk9mfAiJlwKMleWsvxsnj+7H9YAD+xxssbexwnqbBVs2m7HV3GxlI631E9fa/wGRpaRpa3TTbQAA
+        AABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="newAlgorithmButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALDQAA
+        Cw0B7QfALAAAAaJJREFUOE+Nkk1LAkEYx5egU9Sla9AX6NKhLlH3IujSoXtBn0EI+gB5qVBIKyIMtEDo
+        BUIhK6qDSUj4gqYloilmvqa5rrr/Zlx3dkU0B/48z87O/zfzPDMcAE7SOg8sB2AkqYdIXIoAK4LyX17X
+        HiVzYPhC0NBUB1yR6Jfy5lx59rQXRAKEhl6Y4YhMnXOSmUDywRlYHV5YbG6YLp1UW2pgEyBoSdARbdNP
+        OszSSQxEZnkO2D+7w/TCWhtEOoGfqyE5KmKnVf/HIHBLcn4SiI21oGQPkw32J68M0VKvBKgvulgJdEey
+        O+sJNhlg9/i6aZalAEpz98xwQADhAaWJ2GOAWr0BCpFBCoCeIjOxgdCIHlYCiI8DGQ1QMjKzKIooVwSk
+        MuUmYGp+lf5rlcDeArhD6wMzqZOqUEe2UEE0WegNMFgcHYB6Q0SxXEUiXcJbNNsboD+xdwAqfA3p3C8i
+        n3l4QuneAFqfetDG5X94xFJFBCIZuHzJ/gHqxoVjObwGv/DojvcPUDfO9/4NpyeBm+dofwD5vrvFrtco
+        3zFd8J/oO/gDpYIVhUFyWDsAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="startButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCwAA
+        CwsBbQSEtwAAALZJREFUOE9j/P//PwNFAGQAOi7bn+2GTRybGIZmkKKEGRH/iTUEpwGWZfpEGYLVgKgp
+        Qf833Fr8nxhDsBoQPMEbZDtRhmA1wKfLGWwACEctCsDrEqwGODZb/M/YEAvWbNus/1+nWOG/RBo3iFZD
+        jwmsBpjX6KFo5k9gwaoZnIawxa1eqTLcZnyacRqgki8FdjYhzTgNkM4QJEozTgNEkjlx+pmoQMQW2rjy
+        BtZAJDYj4fQCKQYAAPmEmBfWSTCRAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="pauseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCwAA
+        CwsBbQSEtwAAAMZJREFUOE9j/P//PwNFAGQAJZgizWDXU2I7VgN6N//937Xh1/+8qY8+gRSg89EtxHAB
+        SPPVh3/+64auAqr9z4DOJ2hA29pv/289/f1f1W8R2AB0PkEDGld8/n/54e//cm6zwAag8wkaULv4/f8T
+        13//F7ObBDYAnU/QgIp5r/7vvvDzP79ZN9gAdD5BA0pmP/+//uTP/5wGrWAD0PkEDSiY/vj/gj2f/7Pq
+        NIINQOcTNAAU/2y6TXAD0PkEDSA1ZVI/KZPqAgBmE8VVB/UQsAAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="stopButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCwAA
+        CwsBbQSEtwAAAXJJREFUOE+tkj1IQmEYhWsoaIi2xmhpiYSgKFoiCMLJJYSEJiEI0mgIyqjA6vaLUKIU
+        iZlJKKUoWEbZDzVYCYlQYVxcNDIoRND8ud7idD83C27g7YNvPM8573nfcgBlgh4BCPmCxIX0Qtx/ATTu
+        Lyy78ph3ZKC2pTBlSWB86w2jhleMrD9jWB9N/jQsSkDEj5FPPERZ+J7yOL5j4PYzsPsYGL1piKR7nL64
+        syIAcaZfWPhptiC0XeWw4clgzZ3CgiWMBskOP4DEvo+wOAkw2L3IQccJKVsSE6Z3KDRB1PVs8gPIzDch
+        Fo5rzvkoi8V9Io5DqYtBOnaO2k4tP4AU5g0yMJ/lsOr6gMqUwKA2BtlcGOKhA9S0rfADSNvOWwa6wzSm
+        LXEo9JyYoiFRBdA9YEdVM8UPIKvaPk1h1hyCUhOAbPKSc3aiS25Fe58BFU1qfgDZc4fcg5Z+Fxp7ragX
+        GwtzV7cuoVI08zeglKv831MuJcE3MLnHrIkIZqEAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="prepareButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCwAA
+        CwsBbQSEtwAAAYNJREFUOE9j/P//PwNFAGQAJZgizWDXI9veu/nvfxhuW/vtf+OKz/9rF7//XzHv1f+S
+        2c//F0x//L901mOgFoSrUQzo2vDr/6aT3/6vPPTl/4I9n/5ffvDzf+/ad/+bl74BG5I3/cV/3dBVuA0A
+        2bri4Jf/83Z9+n/ryS+Qwv8NS978L5378n/O1Of/k3qf/Vf1W4TbAJCT5+z49P/hyx9gzSBQMvvl/6wp
+        z/8n9D79H9b6+L+c2yzcBoD8e/PRZ7hmZMaxy2/+e9U+/C9mNwm3ASB/Ni978//UlZdwvdGdT/4HNj0C
+        8x1K7//nN+vGbQAopMuBhuRMe/5/55G7YE0BDY/+u1U9ALPN8u7+5zRoxW0AKJqygf5NBPo3vO3x/znr
+        Lvx3rbj/36b4HtgAvYxb/1l1GnEbAIrjuJ6n/0NbHv33qXv436n8/n/rwnv/TbLvgA1QTyLCAMukbf9B
+        2Dhmw3+t4OX/FTzmggOO16TzP5tuE34XAC0hOWmTrAHdEooNAABnu83WrybVqwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>230, 17</value>
+  </metadata>
+</root>
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/Properties/AssemblyInfo.cs.frame
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/Properties/AssemblyInfo.cs.frame	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/Properties/AssemblyInfo.cs.frame	(revision 15691)
@@ -0,0 +1,37 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+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.Analysis.FitnessLandscape.Views")]
+[assembly: AssemblyDescription("HeuristicLab views for fitness landscape analysis.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2011 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("1135d78b-bc03-4403-9884-e4dcfc3f102f")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.3000")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/ScopePathLookupParameterView.Designer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/ScopePathLookupParameterView.Designer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/ScopePathLookupParameterView.Designer.cs	(revision 15691)
@@ -0,0 +1,145 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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
+
+namespace HeuristicLab.Parameters.Views {
+  partial class ScopePathLookupParameterView<T> {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.pathTextBox = new System.Windows.Forms.TextBox();
+      this.pathLabel = new System.Windows.Forms.Label();
+      this.actualNameTextBox = new System.Windows.Forms.TextBox();
+      this.actualNameLabel = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.Location = new System.Drawing.Point(3, 81);
+      this.dataTypeLabel.TabIndex = 6;
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Location = new System.Drawing.Point(80, 78);
+      this.dataTypeTextBox.Size = new System.Drawing.Size(306, 20);
+      this.dataTypeTextBox.TabIndex = 7;
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(80, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(306, 20);
+      // 
+      // pathTextBox
+      // 
+      this.pathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.errorProvider.SetIconAlignment(this.pathTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.pathTextBox, 2);
+      this.pathTextBox.Location = new System.Drawing.Point(80, 104);
+      this.pathTextBox.Name = "pathTextBox";
+      this.pathTextBox.Size = new System.Drawing.Size(306, 20);
+      this.pathTextBox.TabIndex = 9;
+      this.pathTextBox.Validated += new System.EventHandler(this.pathTextBox_Validated);
+      this.pathTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.pathTextBox_KeyDown);
+      this.pathTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.pathTextBox_Validating);
+      // 
+      // pathLabel
+      // 
+      this.pathLabel.AutoSize = true;
+      this.pathLabel.Location = new System.Drawing.Point(3, 107);
+      this.pathLabel.Name = "pathLabel";
+      this.pathLabel.Size = new System.Drawing.Size(39, 13);
+      this.pathLabel.TabIndex = 8;
+      this.pathLabel.Text = "&Path:";
+      // 
+      // actualNameTextBox
+      // 
+      this.actualNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.actualNameTextBox.Location = new System.Drawing.Point(80, 26);
+      this.actualNameTextBox.Name = "actualNameTextBox";
+      this.actualNameTextBox.Size = new System.Drawing.Size(306, 20);
+      this.actualNameTextBox.TabIndex = 3;
+      this.actualNameTextBox.Validated += new System.EventHandler(this.actualNameTextBox_Validated);
+      // 
+      // actualNameLabel
+      // 
+      this.actualNameLabel.AutoSize = true;
+      this.actualNameLabel.Location = new System.Drawing.Point(3, 29);
+      this.actualNameLabel.Name = "actualNameLabel";
+      this.actualNameLabel.Size = new System.Drawing.Size(71, 13);
+      this.actualNameLabel.TabIndex = 2;
+      this.actualNameLabel.Text = "&Actual Name:";
+      // 
+      // ScopePathLookupParameterView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.actualNameTextBox);
+      this.Controls.Add(this.pathTextBox);
+      this.Controls.Add(this.pathLabel);
+      this.Controls.Add(this.actualNameLabel);
+      this.Name = "ScopePathLookupParameterView";
+      this.Size = new System.Drawing.Size(386, 132);
+      this.Controls.SetChildIndex(this.actualNameLabel, 0);      
+      this.Controls.SetChildIndex(this.dataTypeTextBox, 0);
+      this.Controls.SetChildIndex(this.pathLabel, 0);
+      this.Controls.SetChildIndex(this.pathTextBox, 0);
+      this.Controls.SetChildIndex(this.actualNameTextBox, 0);      
+      this.Controls.SetChildIndex(this.dataTypeLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TextBox pathTextBox;
+    protected System.Windows.Forms.Label pathLabel;
+    protected System.Windows.Forms.TextBox actualNameTextBox;
+    protected System.Windows.Forms.Label actualNameLabel;
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/ScopePathLookupParameterView.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/ScopePathLookupParameterView.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.Views/ScopePathLookupParameterView.cs	(revision 15691)
@@ -0,0 +1,127 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Parameters.Views {
+  /// <summary>
+  /// The visual representation of a <see cref="Parameter"/>.
+  /// </summary>
+  [View("ScopePathLookupParameter View")]
+  [Content(typeof(ScopePathLookupParameter<>), true)]
+  public partial class ScopePathLookupParameterView<T> : ParameterView where T : class, IItem {
+    /// <summary>
+    /// Gets or sets the variable to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public new ScopePathLookupParameter<T> Content {
+      get { return (ScopePathLookupParameter<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableView"/> with caption "Variable".
+    /// </summary>
+    public ScopePathLookupParameterView() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="IVariable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void DeregisterContentEvents() {
+      Content.ActualNameChanged -= new EventHandler(Content_ActualNameChanged);
+      Content.PathChanged -= new EventHandler(Content_PathChanged);
+      base.DeregisterContentEvents();
+    }
+
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="IVariable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ActualNameChanged += new EventHandler(Content_ActualNameChanged);
+      Content.PathChanged += new EventHandler(Content_PathChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        actualNameTextBox.Text = string.Empty;
+        pathTextBox.Text = string.Empty;
+      } else {
+        actualNameTextBox.Text = Content.ActualName;
+        pathTextBox.Text = Content.Path;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      actualNameTextBox.Enabled = Content != null;
+      actualNameTextBox.ReadOnly = ReadOnly;
+      pathTextBox.Enabled = Content != null;
+      pathTextBox.ReadOnly = ReadOnly;
+    }
+
+    protected virtual void Content_ActualNameChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ActualNameChanged), sender, e);
+      else
+        actualNameTextBox.Text = Content.ActualName;
+    }
+    protected virtual void Content_PathChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_PathChanged), sender, e);
+      else
+        pathTextBox.Text = Content.Path;
+    }
+
+    protected virtual void actualNameTextBox_Validated(object sender, EventArgs e) {
+      Content.ActualName = actualNameTextBox.Text;
+    }
+    protected virtual void pathTextBox_KeyDown(object sender, KeyEventArgs e) {
+      if ((e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return))
+        pathLabel.Focus();  // set focus on label to validate data
+      if (e.KeyCode == Keys.Escape) {
+        pathTextBox.Text = Content.Path;
+        pathLabel.Focus();  // set focus on label to validate data
+      }
+    }
+    protected virtual void pathTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
+      if (!ScopePathLookupParameter<T>.ValidPathRegex.IsMatch(pathTextBox.Text)) {
+        e.Cancel = true;
+        errorProvider.SetError(pathTextBox, "Invalid Path");
+        pathTextBox.SelectAll();
+      }
+    }
+    protected virtual void pathTextBox_Validated(object sender, EventArgs e) {
+      Content.Path = pathTextBox.Text;
+      errorProvider.SetError(pathTextBox, string.Empty);
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.sln
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.sln	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.sln	(revision 15691)
@@ -0,0 +1,76 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.31101.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Analysis.FitnessLandscape", "HeuristicLab.Analysis.FitnessLandscape\HeuristicLab.Analysis.FitnessLandscape.csproj", "{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Analysis.FitnessLandscape.Views", "HeuristicLab.Analysis.FitnessLandscape.Views\HeuristicLab.Analysis.FitnessLandscape.Views.csproj", "{09F27845-A5B0-476E-901E-9D61576C8581}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Analysis.FitnessLandscape.VRP", "HeuristicLab.Analysis.FitnessLandscape.VRP\HeuristicLab.Analysis.FitnessLandscape.VRP.csproj", "{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VRPProblemAnalyzer", "VRPProblemAnalyzer\VRPProblemAnalyzer.csproj", "{683C29F1-9A43-4998-B58A-C477B86B7A64}"
+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
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Debug|x64.ActiveCfg = Debug|x64
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Debug|x64.Build.0 = Debug|x64
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Debug|x86.ActiveCfg = Debug|x86
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Debug|x86.Build.0 = Debug|x86
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Release|x64.ActiveCfg = Release|x64
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Release|x64.Build.0 = Release|x64
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Release|x86.ActiveCfg = Release|x86
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Release|x86.Build.0 = Release|x86
+		{09F27845-A5B0-476E-901E-9D61576C8581}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{09F27845-A5B0-476E-901E-9D61576C8581}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{09F27845-A5B0-476E-901E-9D61576C8581}.Debug|x64.ActiveCfg = Debug|x64
+		{09F27845-A5B0-476E-901E-9D61576C8581}.Debug|x64.Build.0 = Debug|x64
+		{09F27845-A5B0-476E-901E-9D61576C8581}.Debug|x86.ActiveCfg = Debug|x86
+		{09F27845-A5B0-476E-901E-9D61576C8581}.Debug|x86.Build.0 = Debug|x86
+		{09F27845-A5B0-476E-901E-9D61576C8581}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{09F27845-A5B0-476E-901E-9D61576C8581}.Release|Any CPU.Build.0 = Release|Any CPU
+		{09F27845-A5B0-476E-901E-9D61576C8581}.Release|x64.ActiveCfg = Release|x64
+		{09F27845-A5B0-476E-901E-9D61576C8581}.Release|x64.Build.0 = Release|x64
+		{09F27845-A5B0-476E-901E-9D61576C8581}.Release|x86.ActiveCfg = Release|x86
+		{09F27845-A5B0-476E-901E-9D61576C8581}.Release|x86.Build.0 = Release|x86
+		{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}.Debug|x64.ActiveCfg = Debug|x64
+		{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}.Debug|x64.Build.0 = Debug|x64
+		{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}.Debug|x86.ActiveCfg = Debug|x86
+		{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}.Debug|x86.Build.0 = Debug|x86
+		{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}.Release|Any CPU.Build.0 = Release|Any CPU
+		{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}.Release|x64.ActiveCfg = Release|x64
+		{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}.Release|x64.Build.0 = Release|x64
+		{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}.Release|x86.ActiveCfg = Release|x86
+		{67CDB1E2-B0EE-4986-92AD-F320EBAF9088}.Release|x86.Build.0 = Release|x86
+		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Debug|x64.ActiveCfg = Debug|x64
+		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Debug|x64.Build.0 = Debug|x64
+		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Debug|x86.ActiveCfg = Debug|x86
+		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Debug|x86.Build.0 = Debug|x86
+		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Release|Any CPU.Build.0 = Release|Any CPU
+		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Release|x64.ActiveCfg = Release|x64
+		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Release|x64.Build.0 = Release|x64
+		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Release|x86.ActiveCfg = Release|x86
+		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/EvolvabilityAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/EvolvabilityAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/EvolvabilityAnalyzer.cs	(revision 15691)
@@ -0,0 +1,98 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Algorithms {
+
+  [Item("EvolvabilityAnalyzer", "Analyzes and consolidates repeated (very short) trails to evolvability metrics.")]
+  [StorableClass]
+  public class EvolvabilityAnalyzer : SingleSuccessorOperator, IRepeatsAnalyzer {
+
+    #region Parameters
+    public ScopeTreeLookupParameter<DoubleValue> FinalQualitiesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["FinalQualities"]; }
+    }
+    public LookupParameter<DoubleValue> BaseQualityParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["BaseQuality"]; }
+    }
+    public LookupParameter<DoubleValue> E_a_Parameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["E_a"]; }
+    }
+    public LookupParameter<DoubleValue> E_b_Parameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["E_b"]; }
+    }
+    public LookupParameter<DoubleValue> E_c_Parameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["E_c"]; }
+    }
+    public LookupParameter<DoubleValue> E_d_Parameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["E_d"]; }
+    }
+    public LookupParameter<DoubleValue> ExpectedAbsoluteQualityDeltaParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["ExpectedAbsoluteQualityDelta"]; }
+    }
+    public LookupParameter<DoubleValue> ExpectedRelativeQualityDeltaParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["ExpectedRelativeQualityDelta"]; }
+    }    
+    public LookupParameter<ResultCollection> ResultsParameter {
+      get { return (LookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected EvolvabilityAnalyzer(bool deserializing) : base(deserializing) { }
+    protected EvolvabilityAnalyzer(EvolvabilityAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public EvolvabilityAnalyzer() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("FinalQualities", "Quality values of the end of the trails."));
+      Parameters.Add(new LookupParameter<DoubleValue>("BaseQuality", "Initial quality value."));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("E_a", "Probability of non-deleterious mutation."));
+      Parameters.Add(new LookupParameter<DoubleValue>("E_b", "Average expected offspring fitness."));
+      Parameters.Add(new LookupParameter<DoubleValue>("E_c", "90th percentile offspring fitness."));
+      Parameters.Add(new LookupParameter<DoubleValue>("E_d", "10th percentile offspring fitness."));
+      Parameters.Add(new LookupParameter<DoubleValue>("ExpectedAbsoluteQualityDelta", "Expected absolute quality delta."));
+      Parameters.Add(new LookupParameter<DoubleValue>("ExpectedRelativeQualityDelta", "Expected relative quality delta."));
+
+      Parameters.Add(new LookupParameter<ResultCollection>("Results", "The collection of all results of this algorithm"));
+      FinalQualitiesParameter.Depth = 2;
+      FinalQualitiesParameter.ActualName = "Quality";
+      BaseQualityParameter.ActualName = "Quality";      
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvolvabilityAnalyzer(this, cloner);
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      double baseQuality = BaseQualityParameter.ActualValue.Value;
+      var finalQualities = FinalQualitiesParameter.ActualValue.Select(v => v.Value).ToList();
+      E_a_Parameter.ActualValue = new DoubleValue(1.0 * finalQualities.Count(fq => fq >= baseQuality) / finalQualities.Count);
+      if (finalQualities.Count > 0) {
+        DistributionAnalyzer a = new DistributionAnalyzer(finalQualities);
+        double mean = a.Mean;
+        E_b_Parameter.ActualValue = new DoubleValue(mean);
+        E_c_Parameter.ActualValue = new DoubleValue(a[0.9]);
+        E_d_Parameter.ActualValue = new DoubleValue(a[0.1]);
+        ExpectedAbsoluteQualityDeltaParameter.ActualValue = new DoubleValue(mean - baseQuality);
+        ExpectedRelativeQualityDeltaParameter.ActualValue = new DoubleValue((mean - baseQuality)/baseQuality);
+        var results = ResultsParameter.ActualValue;
+        results.Add(new Result("Base Quality", (DoubleValue)BaseQualityParameter.ActualValue.Clone()));
+        results.Add(new Result("E_a", (DoubleValue)E_a_Parameter.ActualValue.Clone()));
+        results.Add(new Result("E_b", (DoubleValue)E_b_Parameter.ActualValue.Clone()));
+        results.Add(new Result("E_c", (DoubleValue)E_c_Parameter.ActualValue.Clone()));
+        results.Add(new Result("E_d", (DoubleValue)E_d_Parameter.ActualValue.Clone()));
+        results.Add(new Result("Expected Absolute Quality Delta", (DoubleValue)ExpectedAbsoluteQualityDeltaParameter.ActualValue.Clone()));
+        results.Add(new Result("Expected Relative Quality Delta", (DoubleValue)ExpectedRelativeQualityDeltaParameter.ActualValue.Clone()));
+      }      
+      return base.Apply();
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/LocalAnalysis.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/LocalAnalysis.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/LocalAnalysis.cs	(revision 15691)
@@ -0,0 +1,278 @@
+﻿#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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+  [Item("Local Analysis", "A local analysis algorithm.")]
+  [Creatable("Algorithms")]
+  [StorableClass]
+  public sealed class LocalAnalysis : HeuristicOptimizationEngineAlgorithm, IStorableContent {
+    public string Filename { get; set; }
+
+    #region Problem Properties
+    public override Type ProblemType {
+      get { return typeof(ISingleObjectiveHeuristicOptimizationProblem); }
+    }
+    public new ISingleObjectiveHeuristicOptimizationProblem Problem {
+      get { return (ISingleObjectiveHeuristicOptimizationProblem)base.Problem; }
+      set { base.Problem = value; }
+    }
+    #endregion
+
+    #region Parameter Properties
+    private ValueParameter<IntValue> SeedParameter {
+      get { return (ValueParameter<IntValue>)Parameters["Seed"]; }
+    }
+    private ValueParameter<BoolValue> SetSeedRandomlyParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
+    }
+    public IConstrainedValueParameter<IManipulator> MutatorParameter {
+      get { return (IConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; }
+    }
+    public IConstrainedValueParameter<ISelector> SelectorParameter {
+      get { return (IConstrainedValueParameter<ISelector>)Parameters["Selector"]; }
+    }
+    private ValueParameter<IntValue> MaximumIterationsParameter {
+      get { return (ValueParameter<IntValue>)Parameters["MaximumIterations"]; }
+    }
+    private ValueParameter<IntValue> SampleSizeParameter {
+      get { return (ValueParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+    private ValueParameter<MultiAnalyzer> AnalyzerParameter {
+      get { return (ValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
+    }
+    #endregion
+
+    #region Properties
+    private RandomCreator RandomCreator {
+      get { return (RandomCreator)OperatorGraph.InitialOperator; }
+    }
+    private SolutionsCreator SolutionsCreator {
+      get { return (SolutionsCreator)RandomCreator.Successor; }
+    }
+    private LocalAnalysisMainLoop MainLoop {
+      get { return (LocalAnalysisMainLoop)SolutionsCreator.Successor; }
+    }
+    [Storable]
+    private BestAverageWorstQualityAnalyzer qualityAnalyzer;
+    [Storable]
+    private QualityTrailMultiAnalyzer qualityTrailAnalyzer;
+    #endregion
+
+    [StorableConstructor]
+    private LocalAnalysis(bool deserializing) : base(deserializing) { }
+    private LocalAnalysis(LocalAnalysis original, Cloner cloner)
+      : base(original, cloner) {
+      qualityAnalyzer = (BestAverageWorstQualityAnalyzer)cloner.Clone(original.qualityAnalyzer);
+      qualityTrailAnalyzer = (QualityTrailMultiAnalyzer)cloner.Clone(original.qualityTrailAnalyzer);
+      Initialize();
+    }
+    public LocalAnalysis()
+      : base() {
+      Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
+      Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
+      Parameters.Add(new ConstrainedValueParameter<IManipulator>("Mutator", "Mutation operator."));
+      Parameters.Add(new ConstrainedValueParameter<ISelector>("Selector", "Selection operator."));
+      Parameters.Add(new ValueParameter<IntValue>("MaximumIterations", "The maximum number of generations which should be processed.", new IntValue(10000)));
+      Parameters.Add(new ValueParameter<IntValue>("SampleSize", "Number of moves that MultiMoveGenerators should create. This is ignored for Exhaustive- and SingleMoveGenerators.", new IntValue(1)));
+      Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze the solution and moves.", new MultiAnalyzer()));
+
+      RandomCreator randomCreator = new RandomCreator();
+      SolutionsCreator solutionsCreator = new SolutionsCreator();
+      LocalAnalysisMainLoop laMainLoop = new LocalAnalysisMainLoop();
+      OperatorGraph.InitialOperator = randomCreator;
+
+      randomCreator.RandomParameter.ActualName = "Random";
+      randomCreator.SeedParameter.ActualName = SeedParameter.Name;
+      randomCreator.SeedParameter.Value = null;
+      randomCreator.SetSeedRandomlyParameter.ActualName = SetSeedRandomlyParameter.Name;
+      randomCreator.SetSeedRandomlyParameter.Value = null;
+      randomCreator.Successor = solutionsCreator;
+
+      solutionsCreator.NumberOfSolutions = new IntValue(1);
+      solutionsCreator.Successor = laMainLoop;
+
+      laMainLoop.MutatorParameter.ActualName = MutatorParameter.Name;
+      laMainLoop.SelectorParameter.ActualName = SelectorParameter.Name;
+      laMainLoop.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name;
+      laMainLoop.RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName;
+      laMainLoop.ResultsParameter.ActualName = "Results";
+      laMainLoop.AnalyzerParameter.ActualName = AnalyzerParameter.Name;
+
+      qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
+      qualityTrailAnalyzer = new QualityTrailMultiAnalyzer();
+      ParameterizeAnalyzers();
+      UpdateAnalyzers();
+
+      Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LocalAnalysis(this, cloner);
+    }
+
+    public override void Prepare() {
+      if (Problem != null)
+        base.Prepare();
+    }
+
+    #region Events
+    protected override void OnProblemChanged() {
+      ParameterizeStochasticOperator(Problem.SolutionCreator);
+      ParameterizeStochasticOperator(Problem.Evaluator);
+      foreach (IOperator op in Problem.Operators.OfType<IOperator>()) ParameterizeStochasticOperator(op);
+      ParameterizeSolutionsCreator();
+      ParameterizeMainLoop();
+      UpdateMutators();
+      UpdateSelectors();
+      UpdateAnalyzers();
+      ParameterizeSelector();
+      ParameterizeAnalyzers();
+      ParameterizeIterationBasedOperators();
+      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      base.OnProblemChanged();
+    }
+    protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) {
+      ParameterizeStochasticOperator(Problem.SolutionCreator);
+      ParameterizeSolutionsCreator();
+      base.Problem_SolutionCreatorChanged(sender, e);
+    }
+    protected override void Problem_EvaluatorChanged(object sender, EventArgs e) {
+      ParameterizeStochasticOperator(Problem.Evaluator);
+      ParameterizeSolutionsCreator();
+      ParameterizeMainLoop();
+      ParameterizeSelector();
+      ParameterizeAnalyzers();
+      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      base.Problem_EvaluatorChanged(sender, e);
+    }
+    protected override void Problem_OperatorsChanged(object sender, EventArgs e) {
+      foreach (IOperator op in Problem.Operators.OfType<IOperator>()) ParameterizeStochasticOperator(op);
+      UpdateMutators();
+      UpdateSelectors();
+      UpdateAnalyzers();
+      ParameterizeMainLoop();
+      ParameterizeSelector();
+      ParameterizeAnalyzers();
+      ParameterizeIterationBasedOperators();
+      base.Problem_OperatorsChanged(sender, e);
+    }
+    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeMainLoop();
+      ParameterizeSelector();
+    }
+    private void MutatorParameter_ValueChanged(object sender, EventArgs e) {
+      ParameterizeMainLoop();
+      ParameterizeSelector();
+      ParameterizeAnalyzers();
+    }
+    #endregion
+
+    #region Helpers
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      if (Problem != null) {
+        Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      }
+      MutatorParameter.ValueChanged += MutatorParameter_ValueChanged;
+    }
+    private void UpdateSelectors() {
+      SelectorParameter.ValidValues.Clear();
+      foreach (var s in ApplicationManager.Manager.GetInstances<ISelector>())
+        SelectorParameter.ValidValues.Add(s);
+    }
+    private void UpdateMutators() {
+      MutatorParameter.ValidValues.Clear();
+      foreach (var m in Problem.Operators.OfType<IManipulator>()) {
+        MutatorParameter.ValidValues.Add(m);
+      }
+    }
+    private void UpdateAnalyzers() {
+      AnalyzerParameter.Value.Operators.Clear();
+      if (Problem != null) {
+        foreach (IAnalyzer analyzer in Problem.Operators.OfType<IAnalyzer>()) {
+          foreach (IScopeTreeLookupParameter param in analyzer.Parameters.OfType<IScopeTreeLookupParameter>())
+            param.Depth = 0;
+          AnalyzerParameter.Value.Operators.Add(analyzer);
+        }
+      }
+      AnalyzerParameter.Value.Operators.Add(qualityAnalyzer);
+      AnalyzerParameter.Value.Operators.Add(qualityTrailAnalyzer);
+    }
+    private void ParameterizeSolutionsCreator() {
+      SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
+      SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
+    }
+    private void ParameterizeMainLoop() {
+      MainLoop.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
+      MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
+      MainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
+    }
+    private void ParameterizeStochasticOperator(IOperator op) {
+      if (op is IStochasticOperator)
+        ((IStochasticOperator)op).RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName;
+    }
+    private void ParameterizeSelector() {
+      if (Problem != null) {
+        foreach (var op in SelectorParameter.ValidValues) {
+          op.NumberOfSelectedSubScopesParameter.Value = new IntValue(1);
+          op.CopySelected = new BoolValue(false);
+          ISingleObjectiveSelector sos = op as ISingleObjectiveSelector;
+          if (sos != null) {
+            sos.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
+            sos.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
+          }
+          IStochasticOperator so = op as IStochasticOperator;
+          if (so != null) {
+            so.RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName;
+          }
+        }
+      }
+    }
+    private void ParameterizeAnalyzers() {
+      qualityAnalyzer.ResultsParameter.ActualName = "Results";
+      if (Problem != null) {
+        qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
+        qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
+      }
+    }
+    private void ParameterizeIterationBasedOperators() {
+      if (Problem != null) {
+        foreach (IIterationBasedOperator op in Problem.Operators.OfType<IIterationBasedOperator>()) {
+          op.IterationsParameter.ActualName = "Iterations";
+          op.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name;
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/LocalAnalysisMainLoop.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/LocalAnalysisMainLoop.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/LocalAnalysisMainLoop.cs	(revision 15691)
@@ -0,0 +1,236 @@
+﻿#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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+  /// <summary>
+  /// An operator which represents a local search.
+  /// </summary>
+  [Item("LocalAnalysisMainLoop", "An operator which represents the main loop of a best improvement local search (if only a single move is generated in each iteration it is a first improvement local search).")]
+  [StorableClass]
+  public class LocalAnalysisMainLoop : AlgorithmOperator {
+
+    #region Parameter properties
+    public ValueLookupParameter<IRandom> RandomParameter {
+      get { return (ValueLookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (ValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestKnownQualityParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
+    }
+    public LookupParameter<DoubleValue> QualityParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ValueLookupParameter<IntValue> MaximumIterationsParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["MaximumIterations"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public ValueLookupParameter<IOperator> MutatorParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["Mutator"]; }
+    }
+    public ValueLookupParameter<IOperator> SelectorParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["Selector"]; }
+    }
+    public ValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+    public ValueLookupParameter<IOperator> AnalyzerParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["Analyzer"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected LocalAnalysisMainLoop(bool deserializing) : base(deserializing) { }
+    protected LocalAnalysisMainLoop(LocalAnalysisMainLoop original, Cloner cloner) : base(original, cloner) { }
+    public LocalAnalysisMainLoop()
+      : base() {
+      Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LocalAnalysisMainLoop(this, cloner);
+    }
+
+    private void Initialize() {
+      #region Create parameters
+      Parameters.Add(new ValueLookupParameter<IRandom>("Random", "A pseudo random number generator."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, otherwise false."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The value which represents the quality of a solution."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestKnownQuality", "The best known quality value found so far."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("MaximumIterations", "The maximum number of generations which should be processed."));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The variable collection where results should be stored."));
+
+      Parameters.Add(new ValueLookupParameter<IOperator>("Mutator", "Mutation Operator."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Selector", "The operator that selects how to continue."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "Number of mutation samples."));
+
+      Parameters.Add(new ValueLookupParameter<IOperator>("Analyzer", "The operator used to analyze the solution and moves."));
+      #endregion
+
+      #region Create operators
+      VariableCreator variableCreator = new VariableCreator();
+      SubScopesProcessor subScopesProcessor0 = new SubScopesProcessor();
+      Assigner bestQualityInitializer = new Assigner();
+      Placeholder analyzer1 = new Placeholder();
+      ResultsCollector resultsCollector1 = new ResultsCollector();
+      LeftSelector leftSelector = new LeftSelector();
+      SubScopesProcessor mainProcessor = new SubScopesProcessor();
+      UniformSubScopesProcessor mutationProcessor = new UniformSubScopesProcessor();
+      Placeholder mutator = new Placeholder();
+      Placeholder evaluator = new Placeholder();
+      IntCounter evaluatedMovesCounter = new IntCounter();
+      Placeholder selector = new Placeholder();
+      SubScopesProcessor moveMakingProcessor = new SubScopesProcessor();
+      UniformSubScopesProcessor selectedMoveMakingProcessor = new UniformSubScopesProcessor();
+      QualityComparator qualityComparator = new QualityComparator();
+      ConditionalBranch improvesQualityBranch = new ConditionalBranch();
+      Assigner bestQualityUpdater = new Assigner();
+      Placeholder analyzer2 = new Placeholder();
+      RightReducer rightReducer = new RightReducer();
+      RightReducer rightReducer2 = new RightReducer();
+      IntCounter iterationsCounter = new IntCounter();
+      Comparator iterationsComparator = new Comparator();
+      ResultsCollector resultsCollector2 = new ResultsCollector();
+      ConditionalBranch iterationsTermination = new ConditionalBranch();
+
+      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Iterations", new IntValue(0)));
+      variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>("BestQuality", new DoubleValue(0)));
+      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("EvaluatedMoves", new IntValue(0)));
+
+      bestQualityInitializer.Name = "Initialize BestQuality";
+      bestQualityInitializer.LeftSideParameter.ActualName = "BestQuality";
+      bestQualityInitializer.RightSideParameter.ActualName = QualityParameter.ActualName;
+
+      analyzer1.Name = "Analyzer (placeholder)";
+      analyzer1.OperatorParameter.ActualName = AnalyzerParameter.Name;
+
+      resultsCollector1.CopyValue = new BoolValue(false);
+      resultsCollector1.CollectedValues.Add(new LookupParameter<IntValue>("Iterations"));
+      resultsCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
+      resultsCollector1.CollectedValues.Add(new LookupParameter<IntValue>("Evaluated Moves", null, "EvaluatedMoves"));
+      resultsCollector1.ResultsParameter.ActualName = ResultsParameter.Name;
+
+      leftSelector.CopySelected = new BoolValue(true);
+      leftSelector.NumberOfSelectedSubScopesParameter.ActualName = SampleSizeParameter.Name;
+
+      mutationProcessor.Parallel = new BoolValue(true);
+
+      mutator.Name = "(Mutator)";
+      mutator.OperatorParameter.ActualName = MutatorParameter.Name;
+
+      evaluator.Name = "(Evaluator)";
+      evaluator.OperatorParameter.ActualName = "Evaluator";
+
+      evaluatedMovesCounter.Name = "EvaluatedMoves++";
+      evaluatedMovesCounter.ValueParameter.ActualName = "EvaluatedMoves";
+      evaluatedMovesCounter.Increment = new IntValue(1);
+
+      selector.Name = "Selector (placeholder)";
+      selector.OperatorParameter.ActualName = SelectorParameter.Name;
+
+      qualityComparator.LeftSideParameter.ActualName = QualityParameter.Name;
+      qualityComparator.RightSideParameter.ActualName = "BestQuality";
+      qualityComparator.ResultParameter.ActualName = "IsBetter";
+
+      improvesQualityBranch.ConditionParameter.ActualName = "IsBetter";
+
+      bestQualityUpdater.Name = "Update BestQuality";
+      bestQualityUpdater.LeftSideParameter.ActualName = "BestQuality";
+      bestQualityUpdater.RightSideParameter.ActualName = QualityParameter.Name;
+
+      analyzer2.Name = "Analyzer (placeholder)";
+      analyzer2.OperatorParameter.ActualName = AnalyzerParameter.Name;
+
+      iterationsCounter.Name = "Iterations Counter";
+      iterationsCounter.Increment = new IntValue(1);
+      iterationsCounter.ValueParameter.ActualName = "Iterations";
+
+      iterationsComparator.Name = "Iterations >= MaximumIterations";
+      iterationsComparator.Comparison = new Comparison(ComparisonType.GreaterOrEqual);
+      iterationsComparator.LeftSideParameter.ActualName = "Iterations";
+      iterationsComparator.RightSideParameter.ActualName = MaximumIterationsParameter.Name;
+      iterationsComparator.ResultParameter.ActualName = "Terminate";
+
+      resultsCollector2.CopyValue = new BoolValue(false);
+      resultsCollector2.CollectedValues.Add(new LookupParameter<IntValue>("Evaluated Moves", null, "EvaluatedMoves"));
+      resultsCollector2.ResultsParameter.ActualName = ResultsParameter.Name;
+
+      iterationsTermination.Name = "Iterations Termination Condition";
+      iterationsTermination.ConditionParameter.ActualName = "Terminate";
+      #endregion
+
+      #region Create operator graph
+      OperatorGraph.InitialOperator = variableCreator;
+      variableCreator.Successor = subScopesProcessor0;
+      subScopesProcessor0.Operators.Add(bestQualityInitializer);
+      subScopesProcessor0.Successor = resultsCollector1;
+      bestQualityInitializer.Successor = analyzer1;
+      analyzer1.Successor = null;
+      resultsCollector1.Successor = leftSelector;
+      leftSelector.Successor = mainProcessor;
+      mainProcessor.Operators.Add(new EmptyOperator());
+      mainProcessor.Operators.Add(mutationProcessor);
+      mainProcessor.Successor = rightReducer2;
+      mutationProcessor.Operator = mutator;
+      mutationProcessor.Successor = selector;
+      mutator.Successor = evaluator;
+      evaluator.Successor = evaluatedMovesCounter;
+      evaluatedMovesCounter.Successor = null;
+      selector.Successor = moveMakingProcessor;
+      moveMakingProcessor.Operators.Add(new EmptyOperator());
+      moveMakingProcessor.Operators.Add(selectedMoveMakingProcessor);
+      moveMakingProcessor.Successor = rightReducer;
+      selectedMoveMakingProcessor.Operator = qualityComparator;
+      selectedMoveMakingProcessor.Successor = null;
+      qualityComparator.Successor = improvesQualityBranch;
+      improvesQualityBranch.TrueBranch = bestQualityUpdater;
+      improvesQualityBranch.FalseBranch = null;
+      improvesQualityBranch.Successor = analyzer2;
+      bestQualityUpdater.Successor = null;
+      analyzer2.Successor = null;
+      rightReducer.Successor = null;
+      rightReducer2.Successor = iterationsCounter;
+      iterationsCounter.Successor = iterationsComparator;
+      iterationsComparator.Successor = resultsCollector2;
+      resultsCollector2.Successor = iterationsTermination;
+      iterationsTermination.TrueBranch = null;
+      iterationsTermination.FalseBranch = leftSelector;
+      #endregion
+    }
+
+    public override IOperation Apply() {
+      return base.Apply();
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatMultiAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatMultiAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatMultiAnalyzer.cs	(revision 15691)
@@ -0,0 +1,67 @@
+﻿#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.Analysis.FitnessLandscape.Algorithms;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("RepeatMultiAnalyzer", "A collection of analyzers for consolidating repeats.")]
+  [StorableClass]
+  public class RepeatMultiAnalyzer : CheckedMultiOperator<IRepeatsAnalyzer>, IAnalyzer {
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    [StorableConstructor]
+    protected RepeatMultiAnalyzer(bool deserializing) : base(deserializing) { }
+    protected RepeatMultiAnalyzer(RepeatMultiAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public RepeatMultiAnalyzer()
+      : base() {
+
+      foreach (var analyzer in ApplicationManager.Manager.GetInstances<IRepeatsAnalyzer>())
+        Operators.Add(analyzer);
+
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RepeatMultiAnalyzer(this, cloner);
+    }
+
+    public override IOperation InstrumentedApply() {
+      OperationCollection next = new OperationCollection();
+      foreach (IndexedItem<IRepeatsAnalyzer> item in Operators.CheckedItems)
+        next.Add(ExecutionContext.CreateOperation(item.Value));
+      next.Add(base.InstrumentedApply());
+      return next;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedInformationAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedInformationAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedInformationAnalyzer.cs	(revision 15691)
@@ -0,0 +1,164 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Algorithms {
+
+  [Item("RepeatedInformationAnalyzer", "Analyzes and consolidates repeated information analyses.")]
+  [StorableClass]
+  public class RepeatedInformationAnalyzer : SingleSuccessorOperator, IRepeatsAnalyzer {
+
+    #region Parameters
+    public ScopeTreeLookupParameter<InformationAnalysisTable> InformationsParameter {
+      get { return (ScopeTreeLookupParameter<InformationAnalysisTable>)Parameters["Information"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> InformationContentValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["InformationContentValue"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> PartialInformationContentValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["PartialInformationContentValue"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> DensityBasinInformationValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["DensityBasinInformationValue"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> InformationStabilityValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["InformationStabilityValue"]; }
+    }
+    public ScopeTreeLookupParameter<IntValue> RegularityValuesParameter {
+      get { return (ScopeTreeLookupParameter<IntValue>)Parameters["RegularityValue"]; }
+    }
+
+    public LookupParameter<ResultCollection> ResultsParameter {
+      get { return (LookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected RepeatedInformationAnalyzer(bool deserializing) : base(deserializing) { }
+    protected RepeatedInformationAnalyzer(RepeatedInformationAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public RepeatedInformationAnalyzer() {
+      Parameters.Add(new ScopeTreeLookupParameter<InformationAnalysisTable>("Information", "A data table that information theoretic fitness landscape characteristics"));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("InformationContentValue", "The information content H(0) at eps = 0"));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("PartialInformationContentValue", "Partial information content M(0) at eps = 0"));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("DensityBasinInformationValue", "Density Basin Information h(0) at eps = 0"));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("InformationStabilityValue", "Information Stability Value"));
+      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("RegularityValue", "The number of different quality differences"));
+      Parameters.Add(new LookupParameter<ResultCollection>("Results", "The collection of all results of this algorithm"));
+      InformationsParameter.Depth = 2;
+      InformationContentValuesParameter.Depth = 2;
+      PartialInformationContentValuesParameter.Depth = 2;
+      DensityBasinInformationValuesParameter.Depth = 2;
+      InformationStabilityValuesParameter.Depth = 2;
+      RegularityValuesParameter.Depth = 2;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RepeatedInformationAnalyzer(this, cloner);
+    }
+    #endregion
+
+    private class Entry : IComparable<Entry> {
+
+      public double InformationContent { get; private set; }
+      public double PartialInformationContent { get; private set; }
+      public double DensityBasinInformation { get; private set; }
+      public double Epsilon { get; private set; }
+
+      public Entry(double epsilon, double informationContent, double partialInformationContent, double densityBasinInformation) {
+        Epsilon = epsilon;
+        InformationContent = informationContent;
+        PartialInformationContent = partialInformationContent;
+        DensityBasinInformation = densityBasinInformation;
+      }
+
+      public int CompareTo(Entry other) {
+        return Epsilon.CompareTo(other.Epsilon);
+      }
+
+      public override bool Equals(object obj) {
+        Entry e = obj as Entry;
+        if (e == null)
+          throw new NotSupportedException();
+        return this.Epsilon == e.Epsilon;
+      }
+
+      public override int GetHashCode() {
+        return Epsilon.GetHashCode();
+      }
+
+    }
+
+    public override IOperation Apply() {      
+      ResultCollection results = ResultsParameter.ActualValue;      
+      var informationTables = InformationsParameter.ActualValue.ToList();
+      List<Entry> entries = new List<Entry>();
+      foreach (var t in informationTables) {
+        var values = t.Rows["Quality Delta"].Values;
+        var info = t.Rows["Information Content"].Values;
+        var partInfo = t.Rows["Partial Information Content"].Values;
+        var densBas = t.Rows["Density Basin Information"].Values;
+        var eps = t.Rows["Quality Delta"].Values;
+        for (int i = 0; i < info.Count; i++) {
+          entries.Add(new Entry(eps[i], info[i], partInfo[i], densBas[i]));
+        }
+      }
+      entries.Sort();
+      double informationSum = 0;
+      double partialInformationSum = 0;
+      double densityBasinSum = 0;
+      double epsilonSum = 0;
+      DataRow informationRow = new DataRow("Information Content");
+      DataRow partialInformationRow = new DataRow("Partial Information Content");
+      DataRow densityBasinRow = new DataRow("Density Basin Information");
+      DataRow epsilonRow = new DataRow("Quality Delta");
+      epsilonRow.VisualProperties.SecondYAxis = true;
+      int n = 0;
+      foreach (var entry in entries) {
+        informationSum += entry.InformationContent;
+        partialInformationSum += entry.PartialInformationContent;
+        densityBasinSum += entry.DensityBasinInformation;
+        epsilonSum += entry.Epsilon;
+        n++;
+        if (n == informationTables.Count) {
+          informationRow.Values.Add(informationSum/n); informationSum = 0;
+          partialInformationRow.Values.Add(partialInformationSum/n); partialInformationSum = 0;
+          densityBasinRow.Values.Add(densityBasinSum/n); densityBasinSum = 0;
+          epsilonRow.Values.Add(epsilonSum/n); epsilonSum = 0;
+          n = 0;
+        }
+      }
+      if (n > 0) {
+        informationRow.Values.Add(informationSum / n);
+        partialInformationRow.Values.Add(partialInformationSum / n);
+        densityBasinRow.Values.Add(densityBasinSum / n);
+        epsilonRow.Values.Add(epsilonSum / n);
+      }
+      InformationAnalysisTable table = new InformationAnalysisTable("Avg. Information Analysis");
+      table.Rows.Add(informationRow);
+      table.Rows.Add(partialInformationRow);
+      table.Rows.Add(densityBasinRow);
+      table.Rows.Add(epsilonRow);      
+      results.Remove("Information");
+      results.Add(new Result("Information", table));
+
+      results.Remove("InformationContentValue");
+      results.Remove("PartialInformationContentValue");
+      results.Remove("DensityBasinInformationValue");
+      results.Remove("InformationStabilityValue");
+      results.Add(new Result("InformationContentValue", new DoubleValue(InformationContentValuesParameter.ActualValue.Select(v => v.Value).Average())));
+      results.Add(new Result("PartialInformationContentValue", new DoubleValue(PartialInformationContentValuesParameter.ActualValue.Select(v => v.Value).Average())));
+      results.Add(new Result("DensityBasinInformationValue", new DoubleValue(DensityBasinInformationValuesParameter.ActualValue.Select(v => v.Value).Average())));
+      results.Add(new Result("InformationStabilityValue", new DoubleValue(InformationStabilityValuesParameter.ActualValue.Select(v => v.Value).Average())));
+
+      return base.Apply();
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedLocalAnalysis.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedLocalAnalysis.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedLocalAnalysis.cs	(revision 15691)
@@ -0,0 +1,320 @@
+﻿#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.Linq;
+using HeuristicLab.Analysis.FitnessLandscape.Algorithms;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+  [Item("Repeated Local Analysis", "A local analysis algorithm restarted several times.")]
+  [Creatable("Algorithms")]
+  [StorableClass]
+  public sealed class RepeatedLocalAnalysis : HeuristicOptimizationEngineAlgorithm, IStorableContent {
+    public string Filename { get; set; }
+
+    #region Problem Properties
+    public override Type ProblemType {
+      get { return typeof(ISingleObjectiveHeuristicOptimizationProblem); }
+    }
+    public new ISingleObjectiveHeuristicOptimizationProblem Problem {
+      get { return (ISingleObjectiveHeuristicOptimizationProblem)base.Problem; }
+      set { base.Problem = value; }
+    }
+    #endregion
+
+    #region Parameter Properties
+    private ValueParameter<IntValue> SeedParameter {
+      get { return (ValueParameter<IntValue>)Parameters["Seed"]; }
+    }
+    private ValueParameter<BoolValue> SetSeedRandomlyParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
+    }
+    public IConstrainedValueParameter<IManipulator> MutatorParameter {
+      get { return (IConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; }
+    }
+    public IConstrainedValueParameter<ISelector> SelectorParameter {
+      get { return (IConstrainedValueParameter<ISelector>)Parameters["Selector"]; }
+    }
+    private ValueParameter<IntValue> MaximumIterationsParameter {
+      get { return (ValueParameter<IntValue>)Parameters["MaximumIterations"]; }
+    }
+    private ValueParameter<IntValue> SampleSizeParameter {
+      get { return (ValueParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+    private ValueParameter<MultiAnalyzer> AnalyzerParameter {
+      get { return (ValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
+    }
+    public ValueLookupParameter<IntValue> RepeatsParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["Repeats"]; }
+    }
+    public ValueParameter<RepeatMultiAnalyzer> RepeatAnalyzerParameter {
+      get { return (ValueParameter<RepeatMultiAnalyzer>)Parameters["RepeatAnalyzer"]; }
+    }
+    #endregion
+
+    #region Properties
+    private RandomCreator RandomCreator {
+      get { return (RandomCreator)OperatorGraph.InitialOperator; }
+    }
+    private SolutionsCreator SolutionsCreator {
+      get { return (SolutionsCreator)RandomCreator.Successor; }
+    }
+    private ScopeDuplicator ScopeDuplicator {
+      get { return (ScopeDuplicator)SolutionsCreator.Successor; }
+    }
+    private UniformSubScopesProcessor UniformSubscopesProcessor {
+      get { return (UniformSubScopesProcessor)ScopeDuplicator.Successor; }
+    }
+    private LocalAnalysisMainLoop MainLoop {
+      get { return (LocalAnalysisMainLoop)UniformSubscopesProcessor.Operator; }
+    }
+
+    [Storable]
+    private BestAverageWorstQualityAnalyzer qualityAnalyzer;
+    [Storable]
+    private QualityTrailMultiAnalyzer qualityTrailAnalyzer;
+    [Storable]
+    private RepeatMultiAnalyzer repeatMultiAnalyzer;
+    #endregion
+
+    [StorableConstructor]
+    private RepeatedLocalAnalysis(bool deserializing) : base(deserializing) { }
+    private RepeatedLocalAnalysis(RepeatedLocalAnalysis original, Cloner cloner)
+      : base(original, cloner) {
+      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
+      qualityTrailAnalyzer = cloner.Clone(original.qualityTrailAnalyzer);
+      repeatMultiAnalyzer = cloner.Clone(original.repeatMultiAnalyzer);
+      Initialize();
+    }
+    public RepeatedLocalAnalysis()
+      : base() {
+      Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
+      Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
+      Parameters.Add(new ConstrainedValueParameter<IManipulator>("Mutator", "Mutation operator."));
+      Parameters.Add(new ConstrainedValueParameter<ISelector>("Selector", "Selection operator."));
+      Parameters.Add(new ValueParameter<IntValue>("MaximumIterations", "The maximum number of generations which should be processed.", new IntValue(10000)));
+      Parameters.Add(new ValueParameter<IntValue>("SampleSize", "Number of moves that MultiMoveGenerators should create. This is ignored for Exhaustive- and SingleMoveGenerators.", new IntValue(1)));
+      Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze the solution and moves.", new MultiAnalyzer()));
+      Parameters.Add(new ValueLookupParameter<IntValue>("Repeats", "The number of runs of the local analysis from the same starting point.", new IntValue(1)));
+      Parameters.Add(new ValueParameter<RepeatMultiAnalyzer>("RepeatAnalyzer", "Consolidating analyzer for repeats.", new RepeatMultiAnalyzer()));
+
+      RandomCreator randomCreator = new RandomCreator();
+      SolutionsCreator solutionsCreator = new SolutionsCreator();
+      ScopeDuplicator scopeDulicator = new ScopeDuplicator();
+      UniformSubScopesProcessor uniformSubScopesProcessor = new UniformSubScopesProcessor();
+      LocalAnalysisMainLoop laMainLoop = new LocalAnalysisMainLoop();
+      SubScopesRemover subscopesRemover = new SubScopesRemover();
+
+      repeatMultiAnalyzer = RepeatAnalyzerParameter.Value;
+
+      OperatorGraph.InitialOperator = randomCreator;
+
+      randomCreator.RandomParameter.ActualName = "Random";
+      randomCreator.SeedParameter.ActualName = SeedParameter.Name;
+      randomCreator.SeedParameter.Value = null;
+      randomCreator.SetSeedRandomlyParameter.ActualName = SetSeedRandomlyParameter.Name;
+      randomCreator.SetSeedRandomlyParameter.Value = null;
+      randomCreator.Successor = solutionsCreator;
+
+      solutionsCreator.NumberOfSolutions = new IntValue(1);
+      solutionsCreator.Successor = scopeDulicator;
+
+      scopeDulicator.NrOfDuplicatesParameter.ActualName = RepeatsParameter.Name;
+      scopeDulicator.Successor = uniformSubScopesProcessor;
+
+      uniformSubScopesProcessor.Operator = laMainLoop;
+      uniformSubScopesProcessor.Parallel = new BoolValue(true);
+      uniformSubScopesProcessor.Successor = repeatMultiAnalyzer;
+
+      repeatMultiAnalyzer.Successor = subscopesRemover;
+
+      laMainLoop.MutatorParameter.ActualName = MutatorParameter.Name;
+      laMainLoop.SelectorParameter.ActualName = SelectorParameter.Name;
+      laMainLoop.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name;
+      laMainLoop.RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName;
+      laMainLoop.ResultsParameter.ActualName = "Results";
+      laMainLoop.AnalyzerParameter.ActualName = AnalyzerParameter.Name;
+
+      qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
+      qualityTrailAnalyzer = new QualityTrailMultiAnalyzer();
+      ParameterizeAnalyzers();
+      UpdateAnalyzers();
+
+      Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RepeatedLocalAnalysis(this, cloner);
+    }
+
+    public override void Prepare() {
+      if (Problem != null)
+        base.Prepare();
+    }
+
+    #region Events
+    protected override void OnProblemChanged() {
+      ParameterizeStochasticOperator(Problem.SolutionCreator);
+      ParameterizeStochasticOperator(Problem.Evaluator);
+      foreach (IOperator op in Problem.Operators.OfType<IOperator>()) ParameterizeStochasticOperator(op);
+      ParameterizeSolutionsCreator();
+      ParameterizeMainLoop();
+      UpdateMutators();
+      UpdateSelectors();
+      UpdateAnalyzers();
+      ParameterizeSelector();
+      ParameterizeAnalyzers();
+      ParameterizeIterationBasedOperators();
+      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      base.OnProblemChanged();
+    }
+    protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) {
+      ParameterizeStochasticOperator(Problem.SolutionCreator);
+      ParameterizeSolutionsCreator();
+      base.Problem_SolutionCreatorChanged(sender, e);
+    }
+    protected override void Problem_EvaluatorChanged(object sender, EventArgs e) {
+      ParameterizeStochasticOperator(Problem.Evaluator);
+      ParameterizeSolutionsCreator();
+      ParameterizeMainLoop();
+      ParameterizeSelector();
+      ParameterizeAnalyzers();
+      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      base.Problem_EvaluatorChanged(sender, e);
+    }
+    protected override void Problem_OperatorsChanged(object sender, EventArgs e) {
+      foreach (IOperator op in Problem.Operators.OfType<IOperator>()) ParameterizeStochasticOperator(op);
+      UpdateMutators();
+      UpdateSelectors();
+      UpdateAnalyzers();
+      ParameterizeMainLoop();
+      ParameterizeSelector();
+      ParameterizeAnalyzers();
+      ParameterizeIterationBasedOperators();
+      base.Problem_OperatorsChanged(sender, e);
+    }
+    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeMainLoop();
+      ParameterizeSelector();
+    }
+    private void MutatorParameter_ValueChanged(object sender, EventArgs e) {
+      ParameterizeMainLoop();
+      ParameterizeSelector();
+      ParameterizeAnalyzers();
+    }
+    #endregion
+
+    #region Helpers
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserializationHook() {
+      if (RepeatAnalyzerParameter.Value.Successor == null)
+        RepeatAnalyzerParameter.Value.Successor = new SubScopesRemover();
+      Initialize();
+    }
+
+    private void Initialize() {
+      if (Problem != null) {
+        Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      }
+      MutatorParameter.ValueChanged += MutatorParameter_ValueChanged;
+    }
+    private void UpdateSelectors() {
+      SelectorParameter.ValidValues.Clear();
+      foreach (var s in ApplicationManager.Manager.GetInstances<ISelector>())
+        SelectorParameter.ValidValues.Add(s);
+    }
+    private void UpdateMutators() {
+      MutatorParameter.ValidValues.Clear();
+      foreach (var m in Problem.Operators.OfType<IManipulator>()) {
+        MutatorParameter.ValidValues.Add(m);
+      }
+    }
+    private void UpdateAnalyzers() {
+      AnalyzerParameter.Value.Operators.Clear();
+      if (Problem != null) {
+        foreach (IAnalyzer analyzer in Problem.Operators.OfType<IAnalyzer>()) {
+          foreach (IScopeTreeLookupParameter param in analyzer.Parameters.OfType<IScopeTreeLookupParameter>())
+            param.Depth = 0;
+          AnalyzerParameter.Value.Operators.Add(analyzer);
+        }
+      }
+      AnalyzerParameter.Value.Operators.Add(qualityAnalyzer);
+      AnalyzerParameter.Value.Operators.Add(qualityTrailAnalyzer);
+    }
+    private void ParameterizeSolutionsCreator() {
+      SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
+      SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
+    }
+    private void ParameterizeMainLoop() {
+      MainLoop.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
+      MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
+      MainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
+    }
+    private void ParameterizeStochasticOperator(IOperator op) {
+      if (op is IStochasticOperator)
+        ((IStochasticOperator)op).RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName;
+    }
+    private void ParameterizeSelector() {
+      if (Problem != null) {
+        foreach (var op in SelectorParameter.ValidValues) {
+          op.NumberOfSelectedSubScopesParameter.Value = new IntValue(1);
+          op.CopySelected = new BoolValue(false);
+          ISingleObjectiveSelector sos = op as ISingleObjectiveSelector;
+          if (sos != null) {
+            sos.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
+            sos.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
+          }
+          IStochasticOperator so = op as IStochasticOperator;
+          if (so != null) {
+            so.RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName;
+          }
+        }
+      }
+    }
+    private void ParameterizeAnalyzers() {
+      qualityAnalyzer.ResultsParameter.ActualName = "Results";
+      if (Problem != null) {
+        qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
+        qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
+      }
+    }
+    private void ParameterizeIterationBasedOperators() {
+      if (Problem != null) {
+        foreach (IIterationBasedOperator op in Problem.Operators.OfType<IIterationBasedOperator>()) {
+          op.IterationsParameter.ActualName = "Iterations";
+          op.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name;
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedRuggednessAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedRuggednessAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedRuggednessAnalyzer.cs	(revision 15691)
@@ -0,0 +1,194 @@
+﻿using System;
+using System.Linq;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Algorithms {
+  public interface IRepeatsAnalyzer : IOperator { }
+
+  [Item("RepeatedRuggednessAnalyzer", "Analyzes and consolidates repeated ruggedness analyses.")]
+  [StorableClass]
+  public class RepeatedRuggednessAnalyzer : SingleSuccessorOperator, IRepeatsAnalyzer {
+
+    #region Parameters
+    public ScopeTreeLookupParameter<DoubleValue> AutoCorrelationValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["AutoCorrelationValues"]; }
+    }
+    public LookupParameter<DoubleValue> AutoCorrelation1Parameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["AutoCorrelation1"]; }
+    }
+    public LookupParameter<DoubleValue> AutoCorrelation1VarianceParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["AutoCorrelation1Variance"]; }
+    }
+
+    public ScopeTreeLookupParameter<IntValue> CorrelationLengthsParameter {
+      get { return (ScopeTreeLookupParameter<IntValue>)Parameters["CorrelationLengths"]; }
+    }
+    public LookupParameter<DoubleValue> CorrelationLengthParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["CorrelationLength"]; }
+    }
+    public LookupParameter<DoubleValue> CorrelationLengthVarianceParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["CorrelationLengthVariance"]; }
+    }
+
+    public ScopeTreeLookupParameter<DataTable> AutoCorrelationTablesParameter {
+      get { return (ScopeTreeLookupParameter<DataTable>)Parameters["AutoCorrelationTables"]; }
+    }
+    public LookupParameter<DataTable> AutoCorrelationParameter {
+      get { return (LookupParameter<DataTable>)Parameters["AutoCorrelation"]; }
+    }
+    public LookupParameter<DataTable> AllAutoCorrelationsParameter {
+      get { return (LookupParameter<DataTable>)Parameters["AllAutoCorrelations"]; }
+    }
+    public LookupParameter<DataTable> AutoCorrelationVarianceParameter {
+      get { return (LookupParameter<DataTable>)Parameters["AutoCorrelationVariance"]; }
+    }
+    public LookupParameter<ResultCollection> ResultsParameter {
+      get { return (LookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public ValueParameter<BoolValue> SaveAllAutocorrelationsParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["SaveAllAutocorrelations"]; }
+    }
+    
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected RepeatedRuggednessAnalyzer(bool deserializing) : base(deserializing) { }
+    protected RepeatedRuggednessAnalyzer(RepeatedRuggednessAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public RepeatedRuggednessAnalyzer() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("AutoCorrelationValues", "Auto correlation values of repeats."));
+      Parameters.Add(new LookupParameter<DoubleValue>("AutoCorrelation1", "Consolidated auto correlation 1."));
+      Parameters.Add(new LookupParameter<DoubleValue>("AutoCorrelation1Variance", "Variance between auto correlations in repeats."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("CorrelationLengths", "Correlation lengths of the individual repeats."));
+      Parameters.Add(new LookupParameter<DoubleValue>("CorrelationLength", "Consolidated (average) correlation length."));
+      Parameters.Add(new LookupParameter<DoubleValue>("CorrelationLengthVariance", "Variance of correlation lengths."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DataTable>("AutoCorrelationTables", "List of autocorrelation tables for each repeat."));
+      Parameters.Add(new LookupParameter<DataTable>("AutoCorrelation", "Consolidated auto correlation table."));
+      Parameters.Add(new LookupParameter<DataTable>("AllAutoCorrelations", "All auto correlations merged into a single table."));
+      Parameters.Add(new LookupParameter<DataTable>("AutoCorrelationVariance", "Variance of autocorrelations."));
+      Parameters.Add(new ValueParameter<BoolValue>("SaveAllAutocorrelations", "Wether to include all repeated autocorrelation curves. Turn of to save memory instead.", new BoolValue(false)));
+
+      Parameters.Add(new LookupParameter<ResultCollection>("Results", "The collection of all results."));
+
+      AutoCorrelationValuesParameter.ActualName = "AutoCorrelation1";
+      AutoCorrelationValuesParameter.Depth = 2;
+      AutoCorrelationTablesParameter.ActualName = "Autocorrelation";
+      AutoCorrelationTablesParameter.Depth = 2;
+      CorrelationLengthsParameter.ActualName = "CorrelationLength";
+      CorrelationLengthsParameter.Depth = 2;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RepeatedRuggednessAnalyzer(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (!Parameters.ContainsKey("SaveAllAutocorrelations"))
+        Parameters.Add(new ValueParameter<BoolValue>("SaveAllAutocorrelations", "Whether to include all repeated autocorrelation curves. Turn of to save memory instead.", new BoolValue(false)));
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      AggregateAutoCorrelationValues();
+      AggregateCorrelationLengths();
+      AggregateAutoCorrelationFunctions();
+      return base.Apply();
+    }
+
+    private void AggregateAutoCorrelationValues() {
+      ResultCollection results = ResultsParameter.ActualValue;
+      var autocorrelations = AutoCorrelationValuesParameter.ActualValue.Select(v => v.Value).ToList();
+      if (autocorrelations.Count > 0) {
+        var avgAutoCorrelation1 = new DoubleValue(autocorrelations.Average());
+        var varAutoCorrelation1 = new DoubleValue(autocorrelations.Variance());
+        AutoCorrelation1Parameter.ActualValue = avgAutoCorrelation1;
+        AutoCorrelation1VarianceParameter.ActualValue = varAutoCorrelation1;
+        results.Remove("AutoCorrelation1");
+        results.Add(new Result("AutoCorrelation1", avgAutoCorrelation1));
+        results.Add(new Result("AutoCorrelation1 Variance", varAutoCorrelation1));
+      }
+    }
+
+    private void AggregateCorrelationLengths() {
+      ResultCollection results = ResultsParameter.ActualValue;
+      var correlationLengths = CorrelationLengthsParameter.ActualValue.Select(v => (double)v.Value).ToList();
+      if (correlationLengths.Count > 0) {
+        var avgCorrelationLength = new DoubleValue(correlationLengths.Average());
+        var varCorrelationLength = new DoubleValue(correlationLengths.Variance());
+        CorrelationLengthParameter.ActualValue = avgCorrelationLength;
+        CorrelationLengthVarianceParameter.ActualValue = varCorrelationLength;
+        results.Remove("CorrelationLength");
+        results.Add(new Result("CorrelationLength", avgCorrelationLength));
+        results.Add(new Result("CorrelationLength Variance", varCorrelationLength));
+      }
+    }
+
+    private void AggregateAutoCorrelationFunctions() {
+      ResultCollection results = ResultsParameter.ActualValue;
+      bool saveAllAutocorrelations = SaveAllAutocorrelationsParameter.Value.Value;
+      var tables = AutoCorrelationTablesParameter.ActualValue.ToList();
+      if (tables.Count > 0) {
+        DataTable allValues = saveAllAutocorrelations ? new DataTable("All AutoCorrelations") : null;
+        DataRow avgRow = new DataRow("Average Auto Correlation");
+        DataRow stdRow = new DataRow("Std.Dev. of Auto Correlations");
+        DataRow countRow = new DataRow("n");
+        avgRow.VisualProperties.StartIndexZero = true;
+        stdRow.VisualProperties.StartIndexZero = true;
+        countRow.VisualProperties.StartIndexZero = true;
+        countRow.VisualProperties.SecondYAxis = true;
+        for (int i = 0; i<tables.Count; i++) {
+          DataRow row = tables[i].Rows.First();
+          var newRow = new DataRow(i.ToString(), "", row.Values);
+          newRow.VisualProperties.StartIndexZero = true;
+          if (allValues != null)
+            allValues.Rows.Add(newRow);
+          while (avgRow.Values.Count < row.Values.Count) {
+            stdRow.Values.Add(0);
+            avgRow.Values.Add(0);
+            countRow.Values.Add(0);
+          }
+          for (int j = 0; j<row.Values.Count; j++) {
+            avgRow.Values[j] += row.Values[j];
+            countRow.Values[j]++;
+          }
+        }
+        for (int i = 0; i<avgRow.Values.Count; i++) {
+          avgRow.Values[i] = avgRow.Values[i] / tables.Count;
+        }
+        foreach (var table in tables) {
+          DataRow row = table.Rows.First();
+          for (int j = 0; j<row.Values.Count; j++) {
+            stdRow.Values[j] += square(avgRow.Values[j] - row.Values[j]);
+          }
+        }
+        for (int i = 0; i<avgRow.Values.Count; i++) {
+          stdRow.Values[i] = Math.Sqrt(stdRow.Values[i] / tables.Count);
+        }
+        AutoCorrelationTable avgTable = new AutoCorrelationTable("Average repeated auto correlation");
+        AutoCorrelationTable stdTable = new AutoCorrelationTable("Std.Dev. of repeated auto correlation");
+        avgTable.Rows.Add(avgRow);
+        avgTable.Rows.Add(countRow);
+        stdTable.Rows.Add(stdRow);
+        AutoCorrelationParameter.ActualValue = avgTable;
+        AutoCorrelationVarianceParameter.ActualValue = stdTable;
+        results.Remove("Autocorrelation");
+        results.Add(new Result("Auto Correlation", avgTable));
+        results.Add(new Result("auto correlation deviations", stdTable));
+        if (allValues != null) {
+          AllAutoCorrelationsParameter.ActualValue = allValues;
+          results.Add(new Result("All auto correlations", allValues));
+        }
+      }
+    }
+
+    public static double square(double x) { return x * x; }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedUpDownWalkAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedUpDownWalkAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedUpDownWalkAnalyzer.cs	(revision 15691)
@@ -0,0 +1,90 @@
+﻿using System;
+using System.Linq;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Algorithms {
+
+  [Item("RepeatedUpDownWalkAnalyzer", "Analyzes and consolidates repeated up down walk analyses.")]
+  [StorableClass]
+  public class RepeatedUpDownWalkAnalyzer : SingleSuccessorOperator, IRepeatsAnalyzer {
+
+    #region Parameters
+    public ScopeTreeLookupParameter<DoubleValue> DownWalkLengthValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["DownWalkLengthValues"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> UpWalkLengthValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["UpWalkLengthValues"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> DownWalkLenVarValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["DownWalkLenVarValues"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> UpWalkLenVarValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["UpWalkLenVarValues"]; }
+    }
+    public LookupParameter<DoubleValue> DownWalkLengthParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["DownWalkLength"]; }
+    }
+    public LookupParameter<DoubleValue> UpWalkLengthParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["UpWalkLength"]; }
+    }
+    public LookupParameter<DoubleValue> DownWalkLenVarParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["DownWalkLenVar"]; }
+    }
+    public LookupParameter<DoubleValue> UpWalkLenVarParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["UpWalkLenVar"]; }
+    }
+    public LookupParameter<ResultCollection> ResultsParameter {
+      get { return (LookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected RepeatedUpDownWalkAnalyzer(bool deserializing) : base(deserializing) { }
+    protected RepeatedUpDownWalkAnalyzer(RepeatedUpDownWalkAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public RepeatedUpDownWalkAnalyzer() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("DownWalkLengthValues", "average down length values of repeats.", "DownWalkLength", 2));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("UpWalkLengthValues", "average up walk length values of repeats.", "UpWalkLength", 2));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("DownWalkLenVarValues", "down length variance values of repeats.", "DownWalkLenVar", 2));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("UpWalkLenVarValues", "down length variance values of repeats.", "UpWalkLenVar", 2));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("DownWalkLength", "Consolidated average down walk length."));
+      Parameters.Add(new LookupParameter<DoubleValue>("UpWalkLength", "Consolidated average up walk length."));
+      Parameters.Add(new LookupParameter<DoubleValue>("DownWalkLenVar", "Consolidated down walk length variance."));
+      Parameters.Add(new LookupParameter<DoubleValue>("UpWalkLenVar", "Consolidated up walk length variance."));
+
+      Parameters.Add(new LookupParameter<ResultCollection>("Results", "The collection of all results."));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RepeatedUpDownWalkAnalyzer(this, cloner);
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      AggregateValues(DownWalkLengthValuesParameter, DownWalkLengthParameter);
+      AggregateValues(UpWalkLengthValuesParameter, UpWalkLengthParameter);
+      AggregateValues(DownWalkLenVarValuesParameter, DownWalkLenVarParameter);
+      AggregateValues(UpWalkLenVarValuesParameter, UpWalkLenVarParameter);
+      return base.Apply();
+    }
+
+    private void AggregateValues(ILookupParameter<ItemArray<DoubleValue>> valuesParameter, ILookupParameter<DoubleValue> averageParameter) {
+      var results = ResultsParameter.ActualValue;
+      var values = valuesParameter.ActualValue.Select(v => v.Value).ToList();
+      if (values.Count > 0) {
+        var avg = new DoubleValue(values.Average());
+        averageParameter.ActualValue = avg;
+        results.Remove(averageParameter.ActualName);
+        results.Add(new Result(averageParameter.ActualName, avg));
+      }
+    }
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/ScopeDuplicator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/ScopeDuplicator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/ScopeDuplicator.cs	(revision 15691)
@@ -0,0 +1,61 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Algorithms {
+
+  [Item("ScopeDuplicator", "Places clones of the first sub-scope as sub-scopes into n newly created scopes.")]
+  [StorableClass]
+  public class ScopeDuplicator : SingleSuccessorOperator {
+
+    #region Parameter Properties
+    public LookupParameter<IntValue> NrOfDuplicatesParameter {
+      get { return (LookupParameter<IntValue>)Parameters["NrOfDuplicates"]; }
+    }
+    #endregion
+
+    #region Parameter Values
+    private int NrOfDuplicates {
+      get { return NrOfDuplicatesParameter.ActualValue.Value; }
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected ScopeDuplicator(bool deserializing) : base(deserializing) { }
+    protected ScopeDuplicator(ScopeDuplicator original, Cloner cloner) : base(original, cloner) { }
+    public ScopeDuplicator()
+      : base() {
+      Parameters.Add(new LookupParameter<IntValue>("NrOfDuplicates", "Nr of copies to be created from the first sub-scope."));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ScopeDuplicator(this, cloner);
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      IScope parentScope = ExecutionContext.Scope;
+      if (parentScope.SubScopes.Count > 0) {
+        IScope scope = parentScope.SubScopes[0];
+        parentScope.SubScopes.Remove(scope);
+        for (int i = 0; i<NrOfDuplicates; i++) {
+          IScope subScope = new Scope(i.ToString()) { Parent = parentScope };
+          parentScope.SubScopes.Add(subScope);
+          IScope clone = (IScope)scope.Clone();
+          clone.Parent = subScope;
+          subScope.SubScopes.Add(clone);
+          foreach (Variable var in parentScope.Variables) {
+            if (!(var.Value is IRandom))
+              subScope.Variables.Add((Variable)var.Clone());
+          }
+        }
+        parentScope.Variables.AddRange(scope.Variables);
+      }
+      return base.Apply();
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/Aggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/Aggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/Aggregator.cs	(revision 15691)
@@ -0,0 +1,41 @@
+﻿using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("Aggregator", "Base class of aggreagtors that aggregate results collected from several trajectories.")]
+  [StorableClass]
+  public abstract class Aggregator<T> : NamedItem, IAggregator where T : class, IItem {
+
+    public static new Image StaticItemImage { get { return VSImageLibrary.Database;  } }
+    public override bool CanChangeName { get { return false; } }
+
+    protected List<T> items = new List<T>();
+
+    [StorableConstructor]
+    protected Aggregator(bool deserializing) : base(deserializing) { }
+    protected Aggregator(Aggregator<T> original, Cloner cloner)
+      : base(original, cloner) {
+        items = original.items.Select(i => cloner.Clone<IItem>(i)).Cast<T>().ToList();
+    }
+    public Aggregator() {
+      name = ItemName;
+      description = ItemDescription;
+    }
+    public virtual void MaybeAddResult(IResult result) {
+      T t = result.Value as T;
+      if (t != null)
+        items.Add(t);
+    }
+    public virtual void Reset() {
+      items.Clear();
+    }
+    public abstract IResult CreateResult();
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/AutoCorrelationAggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/AutoCorrelationAggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/AutoCorrelationAggregator.cs	(revision 15691)
@@ -0,0 +1,92 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using System.Drawing;
+using HeuristicLab.Analysis.FitnessLandscape.Analysis;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("Auto Correlation Aggregator", "Aggregates auto correlation analyses.")]
+  [StorableClass]
+  public class AutoCorrelationAggregator : Aggregator<AutoCorrelationTable> {
+
+    [StorableConstructor]
+    protected AutoCorrelationAggregator(bool deserializing) : base(deserializing) { }
+    protected AutoCorrelationAggregator(AutoCorrelationAggregator original, Cloner cloner) : base(original, cloner) { }
+    public AutoCorrelationAggregator() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AutoCorrelationAggregator(this, cloner);
+    }
+
+    public override IResult CreateResult() {
+      var groupings = items.GroupBy(act => act.Name).ToList();
+      switch (groupings.Count) {
+        case 0: return new Result("Empty Autocorrelation Summary", new AutoCorrelationTable("Empty Autocorrelations"));
+        case 1: return CreateResult(groupings[0].Key, groupings[0]);
+        default:
+          ResultCollection newResults = new ResultCollection();
+          foreach (var group in groupings) {
+            newResults.Add(CreateResult(group.Key, group));
+          }
+          return new Result("Auto Correlations", newResults);
+      }
+    }
+
+    public static IResult CreateResult(string name, IEnumerable<AutoCorrelationTable> tables) {
+      return new Result(string.Format("{0} Summary", name), Aggregate(tables.ToList()));
+    }
+
+    public static DataTable Aggregate(List<AutoCorrelationTable> autoCorrelationTables) {
+      DataRow minRow = new DataRow("min");      
+      DataRow maxRow = new DataRow("max");
+      DataRow avgRow = new DataRow("avg");
+      DataRow medRow = new DataRow("med");
+      DataRow q5Row = new DataRow("Q5");
+      DataRow q25Row = new DataRow("Q25");
+      DataRow q75Row = new DataRow("Q75");
+      DataRow q95Row = new DataRow("Q95");
+      for (int i = 0; ; i++) {
+        double[] autocorrelation_i = new double[autoCorrelationTables.Count];
+        bool allzero = true;
+        for (int j = 0; j < autoCorrelationTables.Count; j++) {
+          if (autoCorrelationTables[j].Rows.First().Values.Count > i) {
+            autocorrelation_i[j] = autoCorrelationTables[j].Rows.First().Values[i];
+            allzero = false;
+          } else {
+            autocorrelation_i[j] = 0;
+          }
+        }
+        if (allzero) break;
+        DistributionAnalyzer analyzer = new DistributionAnalyzer(autocorrelation_i);
+        minRow.Values.Add(analyzer[0]);
+        q25Row.Values.Add(analyzer[0.25]);
+        medRow.Values.Add(analyzer[0.5]);
+        q75Row.Values.Add(analyzer[0.75]);
+        maxRow.Values.Add(analyzer[1]);
+        avgRow.Values.Add(analyzer.Mean);
+        q5Row.Values.Add(analyzer[0.05]);
+        q95Row.Values.Add(analyzer[0.95]);
+      }
+      DataTable table = new DataTable("Auto correlations");
+      table.Rows.Add(minRow);
+      table.Rows.Add(maxRow);
+      table.Rows.Add(avgRow);
+      table.Rows.Add(medRow);
+      table.Rows.Add(q25Row);
+      table.Rows.Add(q75Row);
+      table.Rows.Add(q5Row);
+      table.Rows.Add(q95Row);
+      foreach (var row in table.Rows)
+        row.VisualProperties.StartIndexZero = true;
+      return table;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/BoundingBoxAggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/BoundingBoxAggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/BoundingBoxAggregator.cs	(revision 15691)
@@ -0,0 +1,76 @@
+﻿using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("BoundingBox Aggregator", "Aggregates bounding boxes")]
+  [StorableClass]
+  public class BoundingBoxAggregator : Aggregator<DoubleMatrix> {
+
+    [StorableConstructor]
+    protected BoundingBoxAggregator(bool deserializing) : base(deserializing) { }
+    protected BoundingBoxAggregator(BoundingBoxAggregator original, Cloner cloner) : base(original, cloner) { }
+    public BoundingBoxAggregator() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BoundingBoxAggregator(this, cloner);
+    }
+
+    public override IResult CreateResult() {
+      return new Result("BoundingBox Analysis", Aggregate(items));
+    }
+
+    public static DataTable Aggregate(List<DoubleMatrix> boundingBoxes) {
+      DataTable table = new DataTable("Bounding Box Analysis");
+      DataRow volumes = new DataRow("Volumes");
+      table.Rows.Add(volumes);
+      foreach (DoubleMatrix matrix in boundingBoxes) {
+        double volume = 1;
+        for (int i = 0; i < matrix.Rows; i++) {
+          volume *= matrix[i, 1] - matrix[i, 0];
+        }
+        volumes.Values.Add(Math.Pow(volume, 1.0 / matrix.Rows));
+      }
+      DataRow nrOfOverlapsRow = new DataRow("Nr of Overlaps");
+      nrOfOverlapsRow.VisualProperties.SecondYAxis = true;
+      table.Rows.Add(nrOfOverlapsRow);
+      DataRow minDistanceRow = new DataRow("MinDistance");
+      DataRow maxDistanceRow = new DataRow("MaxDistance");
+      table.Rows.Add(minDistanceRow);
+      table.Rows.Add(maxDistanceRow);
+      foreach (DoubleMatrix a in boundingBoxes) {
+        double minDistance = double.MaxValue;
+        double maxDistance = double.MinValue;
+        int nrOfOverlaps = 0;
+        foreach (DoubleMatrix b in boundingBoxes) {
+          if (a == b)
+            continue;
+          double distance = 0;
+          for (int i = 0; i < a.Rows; i++) {
+            if (a[i, 1] < b[i, 0])
+              distance += square(b[i, 0] - a[i, 1]);
+            else if (b[i, 1] < a[i, 0])
+              distance += square(a[i, 0] - b[i, 1]);
+          }
+          distance = Math.Sqrt(distance);
+          if (distance == 0)
+            nrOfOverlaps++;
+          minDistance = Math.Min(minDistance, distance);
+          maxDistance = Math.Max(maxDistance, distance);
+        }
+        minDistanceRow.Values.Add(minDistance);
+        maxDistanceRow.Values.Add(maxDistance);
+        nrOfOverlapsRow.Values.Add(nrOfOverlaps);
+      }
+      return table;
+    }
+
+    private static double square(double x) {
+      return x * x;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/DistributionAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/DistributionAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/DistributionAnalyzer.cs	(revision 15691)
@@ -0,0 +1,52 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using System.Drawing;
+using HeuristicLab.Analysis.FitnessLandscape.Analysis;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  public class DistributionAnalyzer {
+
+    private double[] values;
+
+    public DistributionAnalyzer(IEnumerable<double> values) {
+      this.values = values.ToArray();
+    }
+
+    public double Mean {
+      get {
+        try {
+          double mean = 0;
+          double variance = 0;
+          double skewness = 0;
+          double kurtosis = 0;
+          alglib.basestat.samplemoments(values, values.Length, ref mean, ref variance, ref skewness, ref kurtosis);
+          return mean;
+        } catch (Exception) {
+          return 0;
+        }
+      }
+    }
+
+    public double this[double quantile] {
+      get {
+        try {
+          double v = 0;
+          alglib.basestat.samplepercentile(values, values.Length, quantile, ref v);
+          return v;
+        } catch (Exception) {
+          return 0;
+        }
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/EvolvabilityAggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/EvolvabilityAggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/EvolvabilityAggregator.cs	(revision 15691)
@@ -0,0 +1,149 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Common.Resources;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("Evolvability Aggregator", "Aggregates evolvability values into an evolvability portrait.")]
+  [StorableClass]
+  public class EvolvabilityAggregator : NamedItem, IAggregator {
+
+    #region Fields
+    [Storable]
+    private List<double> E_a;
+    [Storable]
+    private List<double> E_b;
+    [Storable]
+    private List<double> E_c;
+    [Storable]
+    private List<double> E_d;
+    [Storable]
+    private List<double> baseQualities;
+    [Storable]
+    private List<double> expectedAbsoluteQualityDeltas;
+    [Storable]
+    private List<double> expectedRelativeQualityDeltas;
+    #endregion    
+
+    #region Properties
+    public static new Image StaticItemImage { get { return VSImageLibrary.Database; } }
+    public override bool CanChangeName { get { return false; } }
+    #endregion
+
+    #region Construction and Cloning
+    [StorableConstructor]
+    protected EvolvabilityAggregator(bool deserializing) : base(deserializing) { }
+    protected EvolvabilityAggregator(EvolvabilityAggregator original, Cloner cloner)
+      : base(original, cloner) {
+      E_a = original.E_a.ToList();
+      E_b = original.E_b.ToList();
+      E_c = original.E_c.ToList();
+      E_d = original.E_d.ToList();
+      baseQualities = original.baseQualities.ToList();
+      expectedAbsoluteQualityDeltas = original.expectedAbsoluteQualityDeltas.ToList();
+      expectedRelativeQualityDeltas = original.expectedRelativeQualityDeltas.ToList();
+    }
+    public EvolvabilityAggregator() {
+      name = ItemName;
+      description = ItemDescription;
+      E_a = new List<double>();
+      E_b = new List<double>();
+      E_c = new List<double>();
+      E_d = new List<double>();
+      baseQualities = new List<double>();
+      expectedAbsoluteQualityDeltas = new List<double>();
+      expectedRelativeQualityDeltas = new List<double>();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvolvabilityAggregator(this, cloner);
+    }
+    #endregion
+
+    #region IAggregator Members
+    public void MaybeAddResult(IResult result) {
+      if (result.DataType == typeof(DoubleValue)) {
+        double value = ((DoubleValue)result.Value).Value;
+        switch (result.Name) {
+          case "E_a": E_a.Add(value); break;
+          case "E_b": E_b.Add(value); break;
+          case "E_c": E_c.Add(value); break;
+          case "E_d": E_d.Add(value); break;
+          case "Base Quality": baseQualities.Add(value); break;
+          case "Expected Absolute Quality Delta": expectedAbsoluteQualityDeltas.Add(value); break;
+          case "Expected Relative Quality Delta": expectedRelativeQualityDeltas.Add(value); break;
+        }
+      }
+    }
+
+    public void Reset() {
+      E_a.Clear();
+      E_b.Clear();
+      E_c.Clear();
+      E_d.Clear();
+      baseQualities.Clear();
+      expectedAbsoluteQualityDeltas.Clear();
+      expectedRelativeQualityDeltas.Clear();
+    }
+
+    private class PortraitEntry {
+      public readonly double A, B, C, D, Q, AbsQDelta, RelQDelta;
+      public PortraitEntry(double a, double b, double c, double d, double q, double absQDelta, double relQDelta) {        
+        A = a;
+        B = b;
+        C = c;
+        D = d;
+        Q = q;
+        AbsQDelta = absQDelta;
+        RelQDelta = relQDelta;
+      }            
+    }
+
+    public IResult CreateResult() {
+      var portrait = new DataTable("Evolvability Portrait");
+      var E_a_row = new DataRow("E_a", "probability of non-deleterious mutation")
+                      {VisualProperties = {SecondYAxis = true}};
+      var E_b_row = new DataRow("E_b", "average expected offspring fitness");
+      var E_c_row = new DataRow("E_c", "90th percentile offspring fitness");
+      var E_d_row = new DataRow("E_d", "10th percentile offspring fitness");
+      var baseQualityRow = new DataRow("Q", "Base quality");
+      var absQDelta = new DataRow("abs Q delta", "expected absolute quality delta");
+      var relQDelta = new DataRow("rel Q delta", "expected relatve quality delta")
+                        {VisualProperties = {SecondYAxis = true}};
+      var entries = E_a.Select((t, i) => 
+        new PortraitEntry(t, E_b[i], E_c[i], E_d[i],
+          baseQualities[i], expectedAbsoluteQualityDeltas[i], expectedRelativeQualityDeltas[i]))
+          .ToList();
+      Action<List<PortraitEntry>> addBinAverages = b => {
+        if (b.Count > 0) {
+          E_a_row.Values.Add(b.Average(e => e.A));
+          E_b_row.Values.Add(b.Average(e => e.B));
+          E_c_row.Values.Add(b.Average(e => e.C));
+          E_d_row.Values.Add(b.Average(e => e.D));
+          baseQualityRow.Values.Add(b.Average(e => e.Q));
+          absQDelta.Values.Add(b.Average(e => e.AbsQDelta));
+          relQDelta.Values.Add(b.Average(e => e.RelQDelta));
+        }
+      };
+      var a = new DistributionAnalyzer(baseQualities);
+      addBinAverages(entries.Where(e => e.Q <= a[0.1]).ToList());
+      for (double t = 0.1; t < 1; t += 0.1)
+        addBinAverages(entries.Where(e => a[t] < e.Q && e.Q <= a[t+0.1]).ToList());
+      portrait.Rows.Add(E_a_row);
+      portrait.Rows.Add(E_b_row);
+      portrait.Rows.Add(E_c_row);
+      portrait.Rows.Add(E_d_row);
+      portrait.Rows.Add(baseQualityRow);
+      portrait.Rows.Add(absQDelta);
+      portrait.Rows.Add(relQDelta);
+      return new Result("Evolvability Portrait", portrait);
+    }    
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/IAggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/IAggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/IAggregator.cs	(revision 15691)
@@ -0,0 +1,12 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  public interface IAggregator : IItem {
+    void MaybeAddResult(IResult result);
+    void Reset();
+    IResult CreateResult();
+  }
+
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/InformationAnalysisAggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/InformationAnalysisAggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/InformationAnalysisAggregator.cs	(revision 15691)
@@ -0,0 +1,124 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("InformationAnalysis Aggregator", "Aggregates information anlyses.")]
+  [StorableClass]
+  public class InformationAnalysisAggregator : Aggregator<InformationAnalysisTable> {
+
+    [StorableConstructor]
+    protected InformationAnalysisAggregator(bool deserializing) : base(deserializing) { }
+    protected InformationAnalysisAggregator(InformationAnalysisAggregator original, Cloner cloner) : base(original, cloner) { }
+    public InformationAnalysisAggregator() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InformationAnalysisAggregator(this, cloner);
+    }
+
+    public override IResult CreateResult() {
+      return new Result("Information Analysis Summary", Aggregate(items, 10));
+    }
+
+    private class InformationAnalysis : IComparable<InformationAnalysis> {
+      public double Delta { get; private set; }
+      public double InformationContent { get; private set; }
+      public double PartialInformationContent { get; private set; }
+      public double DensityBasinInformation { get; private set; }
+      public InformationAnalysis(double delta, double informationContent, double partialInformationContent, double densityBasinInformation) {
+        Delta = delta;
+        InformationContent = informationContent;
+        PartialInformationContent = partialInformationContent;
+        DensityBasinInformation = densityBasinInformation;
+      }
+
+      public int CompareTo(InformationAnalysis ia) {
+        return Delta.CompareTo(ia.Delta);
+      }
+
+    }
+
+    public static DataTable Aggregate(List<InformationAnalysisTable> informationAnalysisTables, int nQuantiles) {
+      var values = new List<InformationAnalysis>();
+      foreach (var table in informationAnalysisTables) {
+        List<double> deltas = table.Rows["Quality Delta"].Values.ToList();
+        for (int i = 0; i < deltas.Count; i++) {
+          values.Add(new InformationAnalysis(
+            deltas[i],
+            table.Rows["Information Content"].Values[i],
+            table.Rows["Partial Information Content"].Values[i],
+            table.Rows["Density Basin Information"].Values[i]));
+        }
+      }
+      values.Sort();
+      Rows informationContent = new Rows("Information Content", Color.Red);
+      Rows partialInformationContent = new Rows("Partial Information Content", Color.FromArgb(255, 0, 255));
+      Rows densityBasinInformation = new Rows("Density Basin Information", Color.FromArgb(0, 255, 0));
+      Rows qualityDelta = new Rows("Quality Delta", Color.Blue, true);
+      var aggregatedValues = new List<InformationAnalysis>();
+      var valueIt = values.GetEnumerator();
+      int it = 0;
+      for (int q = 0; q < nQuantiles; q++) {
+        aggregatedValues.Clear();
+        for (; it < values.Count * (q + 1) / nQuantiles && valueIt.MoveNext(); it++)
+          aggregatedValues.Add(valueIt.Current);
+        if (aggregatedValues.Count == 0)
+          break;
+        informationContent.AppendValues(aggregatedValues.Select(v => v.InformationContent));
+        partialInformationContent.AppendValues(aggregatedValues.Select(v => v.PartialInformationContent));
+        densityBasinInformation.AppendValues(aggregatedValues.Select(v => v.DensityBasinInformation));
+        qualityDelta.AppendValues(aggregatedValues.Select(v => v.Delta));
+      }
+      DataTable summaryTable = new DataTable("Information Analysis Summary");
+      informationContent.Incorporate(summaryTable);
+      partialInformationContent.Incorporate(summaryTable);
+      densityBasinInformation.Incorporate(summaryTable);
+      qualityDelta.Incorporate(summaryTable);
+      return summaryTable;
+    }
+
+    private class Rows {
+
+      private DataRow MinRow, AvgRow, MaxRow;
+
+      public Rows(string name, Color baseColor) {
+        MaxRow = new DataRow(name + " Max");
+        AvgRow = new DataRow(name + " Avg");
+        MinRow = new DataRow(name + " Min");
+        MaxRow.VisualProperties.Color = baseColor;
+        AvgRow.VisualProperties.Color = Color.FromArgb(
+          (int)Math.Round(baseColor.R * 0.75), 
+          (int)Math.Round(baseColor.G * 0.75), 
+          (int)Math.Round(baseColor.B * 0.75));
+        MinRow.VisualProperties.Color = Color.FromArgb(
+          (int)Math.Round(baseColor.R * 0.5),
+          (int)Math.Round(baseColor.G * 0.5),
+          (int)Math.Round(baseColor.B * 0.5));
+      }
+
+      public Rows(string name, Color baseColor, bool secondYAxis) : this(name, baseColor) {
+        MinRow.VisualProperties.SecondYAxis = secondYAxis;
+        AvgRow.VisualProperties.SecondYAxis = secondYAxis;
+        MaxRow.VisualProperties.SecondYAxis = secondYAxis;
+      }
+
+      public void AppendValues(IEnumerable<double> values) {
+        MinRow.Values.Add(values.Min());
+        AvgRow.Values.Add(values.Average());
+        MaxRow.Values.Add(values.Max());
+      }
+
+      public void Incorporate(DataTable table) {
+        table.Rows.Add(MinRow);
+        table.Rows.Add(AvgRow);
+        table.Rows.Add(MaxRow);
+      }
+    }    
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/InformationAnalysisPeakAggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/InformationAnalysisPeakAggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/InformationAnalysisPeakAggregator.cs	(revision 15691)
@@ -0,0 +1,91 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("InformationAnalysis Peak Aggregator", "Aggregates peak information anlyses.")]
+  [StorableClass]
+  public class InformationAnalysisPeakAggregator : Aggregator<InformationAnalysisTable> {
+
+    [StorableConstructor]
+    protected InformationAnalysisPeakAggregator(bool deserializing) : base(deserializing) { }
+    protected InformationAnalysisPeakAggregator(InformationAnalysisPeakAggregator original, Cloner cloner) : base(original, cloner) { }
+    public InformationAnalysisPeakAggregator() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InformationAnalysisPeakAggregator(this, cloner);
+    }
+
+    public override IResult CreateResult() {
+      return new Result("Inf. Peak", Aggregate(items, 10));
+    }
+
+    public static ResultCollection Aggregate(List<InformationAnalysisTable> informationAnalysisTables, int nQuantiles) {
+      var informationContent = new List<PointD>();
+      var partialInformationContent = new List<PointD>();
+      var densityBasinInformation = new List<PointD>();
+      foreach (var table in informationAnalysisTables) {
+        List<double> deltas = table.Rows["Quality Delta"].Values.ToList();
+        informationContent.Add(GetPeak(deltas, table.Rows["Information Content"].Values));
+        partialInformationContent.Add(GetPeak(deltas, table.Rows["Partial Information Content"].Values));
+        densityBasinInformation.Add(GetPeak(deltas, table.Rows["Density Basin Information"].Values));
+      }
+      var results = new ResultCollection();
+      results.AddRange(CreateSummary("Q Delt", "Inf Cont", informationContent, true));
+      results.AddRange(CreateSummary("Q Delt", "Part Inf Cont", partialInformationContent, false));
+      results.AddRange(CreateSummary("Q Delt", "Dens Bas Inf", densityBasinInformation, false));
+      return results;
+    }
+
+    private static PointD GetPeak(IEnumerable<double> index, IEnumerable<double> value) {
+      var max = index.Zip(value, (i, v) => new { i, v }).OrderByDescending(p => p.v).First();
+      return new PointD(max.i, max.v);
+    }
+
+    private class PointD : IComparable<PointD> {
+      public double X;
+      public double Y;
+      public PointD(double x, double y) {
+        X = x;
+        Y = y;
+      }
+
+      public int CompareTo(PointD other) {
+        return X.CompareTo(other.X);
+      }
+    }
+
+    private static IEnumerable<IResult> CreateSummary(string xName, string yName, IEnumerable<PointD> values, bool showX) {
+      var xAnalyzer = new DistributionAnalyzer(values.Select(p => p.X));
+      var yAnalyzer = new DistributionAnalyzer(values.Select(p => p.Y));
+      if (showX) {
+        yield return new Result(xName + " Avg", new DoubleValue(xAnalyzer.Mean));
+        yield return new Result(xName + " Quart-Spread", new DoubleValue(xAnalyzer[0.75] - xAnalyzer[0.25]));
+        yield return new Result(xName + " 90%-Spread", new DoubleValue(xAnalyzer[0.95] - xAnalyzer[0.05]));
+        yield return new Result(xName + " Range", new DoubleValue(xAnalyzer[1] - xAnalyzer[0]));
+      }
+      yield return new Result(yName + " Avg", new DoubleValue(yAnalyzer.Mean));
+      yield return new Result(yName + " Quart-Spread", new DoubleValue(yAnalyzer[0.75] - yAnalyzer[0.25]));
+      yield return new Result(yName + " 90%-Spread", new DoubleValue(yAnalyzer[0.95] - yAnalyzer[0.05]));
+      yield return new Result(yName + " Range", new DoubleValue(yAnalyzer[1] - yAnalyzer[0]));
+
+      yield return new Result(string.Format("{0}/{1} Quart-Spread", xName, yName), new DoubleValue(
+        Math.Sqrt(sqr(xAnalyzer[0.75] - xAnalyzer[0.25]) + sqr(yAnalyzer[0.75] - yAnalyzer[0.25]))));
+      yield return new Result(string.Format("{0}/{1} 90%-Spread", xName, yName), new DoubleValue(
+        Math.Sqrt(sqr(xAnalyzer[0.95] - xAnalyzer[0.05]) + sqr(yAnalyzer[0.75] - yAnalyzer[0.25]))));
+      yield return new Result(string.Format("{0}/{1} Range", xName, yName), new DoubleValue(
+        Math.Sqrt(sqr(xAnalyzer[1] - xAnalyzer[0]) + sqr(yAnalyzer[1] - yAnalyzer[0]))));
+    }
+
+    private static double sqr(double x) {
+      return x * x;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/InformationAnalysisValueAggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/InformationAnalysisValueAggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/InformationAnalysisValueAggregator.cs	(revision 15691)
@@ -0,0 +1,98 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Common.Resources;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("InformationAnalysisValue Aggregator", "Aggregates information anlysis values.")]
+  [StorableClass]
+  public class InformationAnalysisValueAggregator : NamedItem, IAggregator {
+
+    #region Fields
+    [Storable]
+    private List<double> InformationContentValues;
+    [Storable]
+    private List<double> PartialInformationContentValues;
+    [Storable]
+    private List<double> DensityBasinInformationValues;
+    [Storable]
+    private List<double> InformationStabilityValues;
+    #endregion    
+
+    #region Properties
+    public static new Image StaticItemImage { get { return VSImageLibrary.Database; } }
+    public override bool CanChangeName { get { return false; } }
+    #endregion
+
+    #region Construction and Cloning
+    [StorableConstructor]
+    protected InformationAnalysisValueAggregator(bool deserializing) : base(deserializing) { }
+    protected InformationAnalysisValueAggregator(InformationAnalysisValueAggregator original, Cloner cloner)
+      : base(original, cloner) {
+      InformationContentValues = original.InformationContentValues.ToList();
+      PartialInformationContentValues = original.PartialInformationContentValues.ToList();      
+      DensityBasinInformationValues = original.DensityBasinInformationValues.ToList();
+      InformationStabilityValues = original.InformationStabilityValues.ToList();
+    }
+    public InformationAnalysisValueAggregator() {
+      name = ItemName;
+      description = ItemDescription;
+      InformationContentValues = new List<double>();
+      PartialInformationContentValues = new List<double>();    
+      DensityBasinInformationValues = new List<double>();
+      InformationStabilityValues = new List<double>();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InformationAnalysisValueAggregator(this, cloner);
+    }
+    #endregion
+
+    #region IAggregator Members
+    public void MaybeAddResult(IResult result) {
+      if (result.DataType == typeof(DoubleValue)) {
+        double value = ((DoubleValue)result.Value).Value;
+        switch (result.Name) {
+          case "InformationContentValue": InformationContentValues.Add(value); break;
+          case "PartialInformationContentValue": PartialInformationContentValues.Add(value); break;
+          case "DensityBasinInformationValue": DensityBasinInformationValues.Add(value); break;
+          case "InformationStabilityValue": InformationStabilityValues.Add(value); break;
+        }
+      }
+    }
+
+    public void Reset() {
+      InformationContentValues.Clear();
+      PartialInformationContentValues.Clear();
+      InformationStabilityValues.Clear();
+      DensityBasinInformationValues.Clear();
+    }
+
+    public IResult CreateResult() {
+      var results = new ResultCollection();
+      results.AddRange(CreateSummary("Inf Cont", InformationContentValues));
+      results.AddRange(CreateSummary("Part Inf Cont", PartialInformationContentValues));
+      results.AddRange(CreateSummary("Dens Bas Inf", DensityBasinInformationValues));
+      results.AddRange(CreateSummary("Inf Stab", InformationStabilityValues));
+      return new Result("Inf. Val.", results);
+    }
+
+    private static IEnumerable<IResult> CreateSummary(string name, IEnumerable<double> values) {
+      DistributionAnalyzer analyzer = new DistributionAnalyzer(values);
+      return new[] {
+        new Result(name + " Avg", new DoubleValue(analyzer.Mean)),
+        new Result(name + " Quart-Spread", new DoubleValue(analyzer[0.75]-analyzer[0.25])),
+        new Result(name + " 90%-Spread", new DoubleValue(analyzer[0.95]-analyzer[0.05])),
+        new Result(name + " Range", new DoubleValue(analyzer[1]-analyzer[0])),
+      };
+    }
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/InformationStabilityAggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/InformationStabilityAggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/InformationStabilityAggregator.cs	(revision 15691)
@@ -0,0 +1,56 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using System.Drawing;
+using HeuristicLab.Analysis.FitnessLandscape.Analysis;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("Information Stability Aggregator", "Aggregates information stability analyses.")]
+  [StorableClass]
+  public class InformationStabilityAggregator : Aggregator<InformationStabilityTable> {
+
+    [StorableConstructor]
+    protected InformationStabilityAggregator(bool deserializing) : base(deserializing) { }
+    protected InformationStabilityAggregator(InformationStabilityAggregator original, Cloner cloner) : base(original, cloner) { }
+    public InformationStabilityAggregator() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InformationStabilityAggregator(this, cloner);
+    }
+
+    public override IResult CreateResult() {
+      return new Result("Information Stabilities Summary", Aggregate(items));
+    }
+
+    public static DataTable Aggregate(List<InformationStabilityTable> informationStabilityTables) {
+      DataTable table = new DataTable("Information Stabilities");
+      if (informationStabilityTables.Count == 0)
+        return table;
+      try {
+        List<double> values = new List<double>();
+        foreach (var t in informationStabilityTables) {
+          if (t.Rows.Count > 0 && t.Rows.First().Values.Count > 0)
+            values.Add(t.Rows.First().Values.Last());
+        }
+        DataRow valuesRow = new DataRow("values", "information stability values", values);
+        valuesRow.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Points;
+        table.Rows.Add(valuesRow);
+        double max = values.Max();
+        double min = values.Min();
+        double avg = values.Average();
+        table.Rows.Add(new DataRow("max", "Maximum", values.Select(v => max)));
+        table.Rows.Add(new DataRow("min", "Minimum", values.Select(v => min)));
+        table.Rows.Add(new DataRow("avg", "Average", values.Select(v => avg)));
+      } catch (Exception) { }
+      return table;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/QualityTrailSummaryAggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/QualityTrailSummaryAggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/QualityTrailSummaryAggregator.cs	(revision 15691)
@@ -0,0 +1,50 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("QualityTrailSummary Aggregator", "Aggregates quality trail summaries.")]
+  [StorableClass]
+  public class QualityTrailSummaryAggregator : Aggregator<QualityTrailSummaryTable> {
+
+    [StorableConstructor]
+    protected QualityTrailSummaryAggregator(bool deserializing) : base(deserializing) { }
+    protected QualityTrailSummaryAggregator(QualityTrailSummaryAggregator original, Cloner cloner) : base(original, cloner) { }
+    public QualityTrailSummaryAggregator() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new QualityTrailSummaryAggregator(this, cloner);
+    }
+
+    public override IResult CreateResult() {
+      return new Result("Quality Trail Summary", Aggregate(items));
+    }
+
+    public static DataTable Aggregate(List<QualityTrailSummaryTable> qualityTrailSummaryTables) {
+
+      DataRow minRow = new DataRow("Minima");
+      DataRow q1Row = new DataRow("Q1");
+      DataRow medRow = new DataRow("Medians");
+      DataRow q3Row = new DataRow("Q3");
+      DataRow maxRow = new DataRow("Maxima");
+      foreach (var table in qualityTrailSummaryTables) {
+        var quartiles = table.Rows["Value Quantiles"].Values;
+        minRow.Values.Add(quartiles[0]);
+        q1Row.Values.Add(quartiles[1]);
+        medRow.Values.Add(quartiles[2]);
+        q3Row.Values.Add(quartiles[3]);
+        maxRow.Values.Add(quartiles[4]);
+      }
+      DataTable summaryTable = new DataTable("Quality Quartiles");
+      summaryTable.Rows.Add(minRow);
+      summaryTable.Rows.Add(q1Row);
+      summaryTable.Rows.Add(medRow);
+      summaryTable.Rows.Add(q3Row);
+      summaryTable.Rows.Add(maxRow);
+      return summaryTable;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/RuggednessAggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/RuggednessAggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/RuggednessAggregator.cs	(revision 15691)
@@ -0,0 +1,96 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using System.Drawing;
+using HeuristicLab.Analysis.FitnessLandscape.Analysis;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("Ruggedness Aggregator", "Aggregates scalar ruggedness analyses.")]
+  [StorableClass]
+  public class RuggednessAggregator : NamedItem, IAggregator {
+
+    public static new Image StaticItemImage { get { return VSImageLibrary.Database; } }
+    public override bool CanChangeName { get { return false; } }
+
+    private List<double> correlationLengthValues = new List<double>();
+    private List<double> autocorrelations = new List<double>();
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected RuggednessAggregator(bool deserializing) : base(deserializing) { }
+    protected RuggednessAggregator(RuggednessAggregator original, Cloner cloner) : base(original, cloner) {
+      autocorrelations = original.autocorrelations.ToList();
+      correlationLengthValues = original.correlationLengthValues.ToList();
+    }
+    public RuggednessAggregator() {
+      name = ItemName;
+      description = ItemDescription;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RuggednessAggregator(this, cloner);
+    }
+    #endregion
+
+    #region IAggregator interface    
+    public virtual void MaybeAddResult(IResult result) {
+      MaybeAddAutoCorrelation1(result);
+      MaybeAddCorrelationLength(result);
+    }
+
+    public virtual IResult CreateResult() {
+      var results = new ResultCollection();
+      results.AddRange(CreateSummary("AutoCorrelation1", autocorrelations));
+      results.AddRange(CreateSummary("CorrelationLength", correlationLengthValues.Select(l => (double)l)));
+      return new Result("Ruggedness", results);
+    }
+
+    public virtual void Reset() {
+      autocorrelations.Clear();
+      correlationLengthValues.Clear();
+    }
+    #endregion
+
+    private void MaybeAddAutoCorrelation1(IResult result) {
+      if (result.Name != "AutoCorrelation1")
+        return;
+      DoubleValue autocorrelation1 = result.Value as DoubleValue;
+      if (autocorrelation1 != null)
+        autocorrelations.Add(autocorrelation1.Value);
+    }
+
+    private void MaybeAddCorrelationLength(IResult result) {
+      if (result.Name != "CorrelationLength")
+        return;
+      IntValue correlationLength = result.Value as IntValue;
+      if (correlationLength != null)
+        correlationLengthValues.Add(correlationLength.Value);
+      else {
+        DoubleValue correlationLength2 = result.Value as DoubleValue;
+        if (correlationLength2 != null)
+          correlationLengthValues.Add(correlationLength2.Value);
+      }
+    }
+
+    private IEnumerable<IResult> CreateSummary(string name, IEnumerable<double> values) {
+      DistributionAnalyzer analyzer = new DistributionAnalyzer(values);      
+      return new[] {
+        new Result(name + " Avg", new DoubleValue(analyzer.Mean)),
+        new Result(name + " Quartile-Spread", new DoubleValue(analyzer[0.75]-analyzer[0.25])),
+        new Result(name + " 90%-Spread", new DoubleValue(analyzer[0.95]-analyzer[0.05])),
+        new Result(name + " Range", new DoubleValue(analyzer[1]-analyzer[0])),
+      };
+    }
+
+    
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/UpDownAggregatorAggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/UpDownAggregatorAggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/UpDownAggregatorAggregator.cs	(revision 15691)
@@ -0,0 +1,96 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using System.Drawing;
+using HeuristicLab.Analysis.FitnessLandscape.Analysis;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("Up Down Aggregator", "Aggregates scalar up down analyses.")]
+  [StorableClass]
+  public class UpDownAggregator : NamedItem, IAggregator {
+
+    public static new Image StaticItemImage { get { return VSImageLibrary.Database; } }
+    public override bool CanChangeName { get { return false; } }
+
+    [Storable]
+    private List<double> downWalkLengths = new List<double>();
+    [Storable]
+    private List<double> upWalkLengths = new List<double>();
+    [Storable]
+    private List<double> downWalkLenVars = new List<double>();
+    [Storable]
+    private List<double> upWalkLenVars = new List<double>();
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected UpDownAggregator(bool deserializing) : base(deserializing) { }
+    protected UpDownAggregator(UpDownAggregator original, Cloner cloner) : base(original, cloner) {
+      downWalkLengths = original.downWalkLengths.ToList();
+      upWalkLengths = original.upWalkLengths.ToList();
+      downWalkLenVars = original.downWalkLenVars.ToList();
+      upWalkLenVars = original.upWalkLenVars.ToList();
+    }
+    public UpDownAggregator() {
+      name = ItemName;
+      description = ItemDescription;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UpDownAggregator(this, cloner);
+    }
+    #endregion
+
+    #region IAggregator interface    
+    public virtual void MaybeAddResult(IResult result) {
+      MaybeAddValue(downWalkLengths, "DownWalkLength", result);
+      MaybeAddValue(upWalkLengths, "UpWalkLength", result);
+      MaybeAddValue(downWalkLenVars, "DownWalkLenVar", result);
+      MaybeAddValue(upWalkLenVars, "UpWalkLenVar", result);
+    }
+
+    private void MaybeAddValue(List<double> values, string resultName, IResult result) {
+      if (result.Name != resultName) return;
+      var value = result.Value as DoubleValue;
+      if (value != null)
+        values.Add(value.Value);
+    }
+
+    public virtual IResult CreateResult() {
+      var results = new ResultCollection();
+      results.AddRange(CreateSummary("DownWalkLength", downWalkLengths));
+      results.AddRange(CreateSummary("UpWalkLength", upWalkLengths));
+      results.AddRange(CreateSummary("DownWalkLenVar", downWalkLenVars));
+      results.AddRange(CreateSummary("UpWalkLenVar", upWalkLenVars));
+      return new Result("UpDown", results);
+    }
+
+    public virtual void Reset() {
+      downWalkLengths.Clear();
+      upWalkLengths.Clear();
+      downWalkLenVars.Clear();
+      upWalkLenVars.Clear();
+    }
+    #endregion
+
+    private IEnumerable<IResult> CreateSummary(string name, IEnumerable<double> values) {
+      DistributionAnalyzer analyzer = new DistributionAnalyzer(values);      
+      return new[] {
+        new Result(name + " Avg", new DoubleValue(analyzer.Mean)),
+        new Result(name + " Quartile-Spread", new DoubleValue(analyzer[0.75]-analyzer[0.25])),
+        new Result(name + " 90%-Spread", new DoubleValue(analyzer[0.95]-analyzer[0.05])),
+        new Result(name + " Range", new DoubleValue(analyzer[1]-analyzer[0])),
+      };
+    }
+
+    
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/EnumerableExtensions.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/EnumerableExtensions.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/EnumerableExtensions.cs	(revision 15691)
@@ -0,0 +1,61 @@
+﻿#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;
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  public static class Utils {
+
+    public static IEnumerable<TResult> Delta<T, TResult>(this IEnumerable<T> values, Func<T, T, TResult> f) {
+      var it = values.GetEnumerator();
+      T last = default(T);
+      if (it.MoveNext())
+        last = it.Current;
+      while (it.MoveNext()) {
+        yield return f(last, it.Current);
+        last = it.Current;
+      }
+    }
+
+    public static IEnumerable<IEnumerable<TSource>> GroupConsecutive<TSource, TKey>(
+        this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) {
+      if (source == null) throw new ArgumentNullException("source");
+      if (keySelector == null) throw new ArgumentNullException("keySelector");
+
+      var comparer = EqualityComparer<TKey>.Default;
+      var grouped = new List<TSource>();
+      using (var iter = source.GetEnumerator()) {
+        if (!iter.MoveNext()) yield break;
+        grouped.Add(iter.Current);
+        var last = iter.Current;
+        while (iter.MoveNext()) {
+          if (!comparer.Equals(keySelector(iter.Current), keySelector(last))) {
+            yield return grouped.AsReadOnly();
+            grouped = new List<TSource>();
+          }
+          grouped.Add(iter.Current);
+          last = iter.Current;
+        }
+        yield return grouped.AsReadOnly();
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/FitnessCloudAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/FitnessCloudAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/FitnessCloudAnalyzer.cs	(revision 15691)
@@ -0,0 +1,90 @@
+﻿#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.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Analysis {
+
+  [StorableClass]
+  public class FitnessCloudAnalyzer : AlgorithmOperator, IQualityTrailAnalyzer {
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    #region Parameters
+    public LookupParameter<DataTable> QualityTrailParameter {
+      get { return (LookupParameter<DataTable>)Parameters["Quality Trail"]; }
+    }
+    public LookupParameter<ScatterPlot> FitnessCloudParameter {
+      get { return (LookupParameter<ScatterPlot>)Parameters["Fitness Cloud"]; }
+    }
+    public LookupParameter<VariableCollection> ResultsParameter {
+      get { return (LookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected FitnessCloudAnalyzer(bool deserializing) : base(deserializing) { }
+    protected FitnessCloudAnalyzer(FitnessCloudAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public FitnessCloudAnalyzer() {
+      Parameters.Add(new LookupParameter<DataTable>("Quality Trail", "The qualities of the solutions"));
+      Parameters.Add(new LookupParameter<ScatterPlot>("Fitness Cloud", "Information stability development over time"));
+      Parameters.Add(new LookupParameter<VariableCollection>("Results", "The collection of all results of this algorithm"));
+
+      var resultsCollector = new ResultsCollector();
+      resultsCollector.CollectedValues.Add(new LookupParameter<ScatterPlot>(FitnessCloudParameter.Name));
+
+      OperatorGraph.InitialOperator = resultsCollector;
+      resultsCollector.Successor = null;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FitnessCloudAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ScatterPlot fitnessCloud = FitnessCloudParameter.ActualValue;
+      if (fitnessCloud == null) {
+        fitnessCloud = new ScatterPlot();
+        FitnessCloudParameter.ActualValue = fitnessCloud;
+        fitnessCloud.Name = "Fitness Cloud";
+        fitnessCloud.XAxisName = "Fitness";
+        fitnessCloud.YAxisName = "Neighboring Fitness";
+      }
+
+      DataTable qualityTrail = QualityTrailParameter.ActualValue;
+      if (qualityTrail != null && qualityTrail.Rows.Count > 0) {
+        var qualities = qualityTrail.Rows.First().Values.ToList();
+        if (qualities.Count > 2) {
+          fitnessCloud.Add(Utils.Delta(qualities, (a, b) => new PointF((float)a, (float)b)));
+        }
+      }
+      return base.Apply();
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/IQualityTrailAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/IQualityTrailAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/IQualityTrailAnalyzer.cs	(revision 15691)
@@ -0,0 +1,24 @@
+﻿#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.Analysis.FitnessLandscape {
+  public interface IQualityTrailAnalyzer : IAnalyzer { }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/InformationAnalysis.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/InformationAnalysis.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/InformationAnalysis.cs	(revision 15691)
@@ -0,0 +1,249 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Analysis {
+
+  public class InformationAnalysis {
+
+    public class Peak {
+      public double QualityDelta { get; private set; }
+      public double Value { get; private set; }
+      public Peak(double qualityDelta, double value) {
+        QualityDelta = qualityDelta;
+        Value = value;
+      }
+    }
+
+    public List<double> InformationContent { get; private set; }
+    public List<double> PartialInformationContent { get; private set; }
+    public List<double> DensityBasinInformation { get; private set; }
+    public List<double> TotalEntropy { get; private set; } 
+    public List<double> QualityDelta { get; private set; }
+    public double InformationStability { get; private set; }
+    public int Regularity { get; private set; }
+    public int Diversity { get; private set; }
+    public Peak PeakInformationContent { get; private set; }
+    public Peak PeakPartialInformationContent { get; private set; }
+    public Peak PeakDensityBasinInformation { get; private set; }
+    public Peak PeakTotalEntropy { get; private set; }
+
+    public InformationAnalysis(IList<double> qualities, int nQuantiles, int shapeSize) {
+      InformationContent = new List<double>();
+      PartialInformationContent = new List<double>();
+      DensityBasinInformation = new List<double>();
+      TotalEntropy = new List<double>();
+      QualityDelta = new List<double>();
+      if (shapeSize < 1)
+        throw new ArgumentException("Shape size must be at least 1 (better 2)");
+      if (qualities.Count > 1)
+        PerformAnalysis(qualities, nQuantiles, shapeSize);
+    }
+
+    private void PerformAnalysis(IList<double> qualities, int nQuantiles, int shapeSize) {
+      var differences = Differences(qualities).ToList();
+      InformationStability = differences.Select(Math.Abs).Max();
+      Regularity = new HashSet<double>(differences).Count;
+      Diversity = new HashSet<double>(qualities).Count;
+      var absDifferences = differences.Select(Math.Abs).OrderBy(d => d).ToList();
+      nQuantiles = Math.Min(nQuantiles, absDifferences.Count);
+      var thresholds = (nQuantiles == 0
+                         ? absDifferences
+                         : UniqueThresholdCalculator.DetermineThresholds(differences, nQuantiles)).ToList();
+      foreach (var eps in thresholds) {
+        if (QualityDelta.Count > 0 && QualityDelta.Last() == eps) {
+          QualityDelta.DuplicateLast();
+          InformationContent.DuplicateLast();
+          DensityBasinInformation.DuplicateLast();
+          TotalEntropy.DuplicateLast();
+          PartialInformationContent.DuplicateLast();
+        } else {
+          var slopes = Slopes(eps, differences).ToList();
+          var shapes = Shapes(shapeSize, slopes).ToList();
+          var shapeCounts = CountShapes(shapes);
+          QualityDelta.Add(eps);
+          InformationContent.Add(CalculateEntropy(Shape.GetAll(shapeSize, Shape.Form.NonUni), shapeCounts, shapes.Count));
+          DensityBasinInformation.Add(CalculateEntropy(Shape.GetAll(shapeSize, Shape.Form.Uni), shapeCounts, shapes.Count));
+          TotalEntropy.Add(CalculateEntropy(Shape.GetAll(shapeSize, Shape.Form.Any), shapeCounts, shapes.Count));
+          PartialInformationContent.Add(CalculatePartialInformationContent(eps, differences));
+        }
+      }
+      PeakInformationContent = GetPeak(QualityDelta, InformationContent);
+      PeakDensityBasinInformation = GetPeak(QualityDelta, DensityBasinInformation);
+      PeakPartialInformationContent = GetPeak(QualityDelta, PartialInformationContent);
+      PeakTotalEntropy = GetPeak(QualityDelta, TotalEntropy);
+    }
+
+    public static Peak GetPeak(IEnumerable<double> indexes, IEnumerable<double> values) {
+      var max = indexes.Zip(values, (i, v) => new { i, v }).OrderByDescending(p => p.v).First();
+      return new Peak(max.i, max.v);
+    }
+
+    public enum Slope {
+      Up = 1,
+      Flat = 0,
+      Down = -1
+    }
+
+    public class Shape : IEnumerable<Slope>, IComparable<Shape> {
+
+      #region types, fields and properties
+      public enum Form {Uni, NonUni, Any}
+
+      private readonly Slope[] slopes;
+
+      private static readonly Dictionary<Tuple<Form, int>, IList<Shape>> SHAPES =
+        new Dictionary<Tuple<Form,int>,IList<Shape>>();
+      #endregion
+
+      public Shape(IEnumerable<Slope> slopes) {
+        this.slopes = slopes.ToArray();
+      }
+
+      #region static methods
+
+      public static Shape Get(params Slope[] slopes) {
+        return new Shape(slopes);
+      }
+
+      public static IList<Shape> GetAll(int size, Form type) {
+        var key = Tuple.Create(type, size);
+        IList<Shape> allShapes;
+        if (!SHAPES.TryGetValue(key, out allShapes)) {
+          allShapes = CreateAll(size, type).ToList();
+          SHAPES[key] = allShapes;
+        }
+        return allShapes;
+      }
+
+      private static IEnumerable<Shape> CreateAll(int size, Form type) {
+        if (size == 0) {
+          yield return Get();
+        } else {
+          foreach (var s in CreateAll(size - 1, type)) {
+            foreach (var s2 in s.ExtendAll(type))
+              yield return s2;
+          }
+        }
+      }
+      #endregion
+
+      private Shape Extend(Slope s) {
+        return new Shape(slopes.Concat(new[] {s}));
+      }
+
+      private IEnumerable<Shape> ExtendAll(Form t) {
+        if (Length == 0 || t == Form.Any) {
+          yield return Extend(Slope.Up);
+          yield return Extend(Slope.Flat);
+          yield return Extend(Slope.Down);
+        } else if (t == Form.Uni) {
+          yield return Extend(slopes[0]);
+        } else if (t == Form.NonUni) {
+          if (slopes.Last() != Slope.Up) yield return Extend(Slope.Up);
+          if (slopes.Last() != Slope.Flat) yield return Extend(Slope.Flat);
+          if (slopes.Last() != Slope.Down) yield return Extend(Slope.Down);
+        }
+      }
+
+      public int Length {
+        get { return slopes.Length; }
+      }
+
+      public Slope this[int i] {
+        get { return slopes[i]; }
+      }
+
+      #region IEnumerable Members
+      public IEnumerator<Slope> GetEnumerator() {
+        return (IEnumerator<Slope>) slopes.GetEnumerator();
+      }
+      System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
+        return GetEnumerator();
+      }
+      #endregion
+
+      #region IComparable Members
+
+      public int CompareTo(Shape other) {
+        if (other.Length < Length)
+          return -1;
+        if (other.Length > Length)
+          return 1;
+        for (var i = 0; i<Length; i++) {
+          var d = slopes[i].CompareTo(other.slopes[i]);
+          if (d != 0)
+            return d;
+        }
+        return 0;
+      }
+      public override bool Equals(object obj) {
+        var s = obj as Shape;
+        if (s == null) return false;
+        return CompareTo(s) == 0;
+      }
+      public override int GetHashCode() {
+        return slopes.Aggregate(0, (a, s) => a*3 + ((int) s + 1)).GetHashCode();
+      }
+
+      #endregion
+
+      private string asString;
+      public override string ToString() {
+        return asString ?? (asString = string.Join("", slopes.Select(s => (s == Slope.Down ? "v" : (s == Slope.Up ? "^" : "-")))));
+      }
+    }
+
+    private static IEnumerable<Slope> Slopes(double eps, IEnumerable<double> differences) {
+      return differences.Select(d => (d > eps ? Slope.Up : (d < -eps ? Slope.Down : 0)));
+    }  
+
+    private static IEnumerable<Shape> Shapes(int size, IEnumerable<Slope> slopes) {
+      var q = new Queue<Slope>();
+      foreach (var s in slopes) {
+        q.Enqueue(s);
+        if (q.Count < size) continue;
+        yield return new Shape(q);
+        q.Dequeue();
+      }
+    }
+
+    private static double CalculateEntropy(IList<Shape> shapes, Dictionary<Shape, int> shapeCounts, int totalNShapes) {
+      return shapes.Aggregate(0.0, (current, s) => current - Entropy(shapeCounts.GetValueOrDefault(s, 0), totalNShapes, shapes.Count));
+    }
+
+    private static double CalculatePartialInformationContent(double eps, ICollection<double> differences) {
+      int slope = 0;
+      int nPeaks = 0;
+      foreach (var d in differences) {
+        if (d > eps) {
+          if (slope < 0) nPeaks++;
+          slope = +1;
+        } else if (d < -eps) {
+          if (slope > 0) nPeaks++;
+          slope = -1;
+        }
+      }
+      return 1.0 * nPeaks / differences.Count;
+    }
+
+    private static Dictionary<Shape, int> CountShapes(IEnumerable<Shape> shapes) {
+      var shapeCounts = new Dictionary<Shape, int>();
+      foreach (var group in shapes.GroupBy(s => s))
+        shapeCounts[group.Key] = group.Count();
+      return shapeCounts;
+    }
+
+    private static double Entropy(int count, int total, int nCases) {
+      if (count == 0)
+        return 0;
+      double freq = 1.0 * count / total;
+      return freq * Math.Log(freq, nCases);
+    }
+
+    private static IEnumerable<double> Differences(IEnumerable<double> values) {
+      return Utils.Delta(values, (x, y) => y - x);
+    }
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/InformationAnalysisCalculator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/InformationAnalysisCalculator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/InformationAnalysisCalculator.cs	(revision 15691)
@@ -0,0 +1,92 @@
+﻿using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Analysis {
+  [Item("InformationAnalysisCalculator", "Performs an information analysis on a quality trail as described in Vassilev et al. (2000) Evol Comput 8:31–60")]
+  [StorableClass]
+  public class InformationAnalysisCalculator : SingleSuccessorOperator {
+
+    #region Parameter Properties
+    public LookupParameter<DataTable> QualityTrailParameter {
+      get { return (LookupParameter<DataTable>)Parameters["QualityTrail"]; }
+    }
+    public ValueLookupParameter<IntValue> NQuantilesParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["NQuantiles"]; }
+    }
+    public ValueLookupParameter<IntValue> ShapeSizeParameter {
+      get { return (ValueLookupParameter<IntValue>) Parameters["ShapeSize"]; }
+    }
+    public LookupParameter<DoubleValue> InformationStabilityParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["InformationStability"]; }
+    }
+    public LookupParameter<IntValue> RegularityParameter {
+      get { return (LookupParameter<IntValue>)Parameters["Regularity"]; }
+    }
+    public LookupParameter<IntValue> DiversityParameter {
+      get { return (LookupParameter<IntValue>)Parameters["Diversity"]; }
+    }
+    public LookupParameter<DoubleArray> InformationContentParameter {
+      get { return (LookupParameter<DoubleArray>)Parameters["InformationContent"]; }
+    }
+    public LookupParameter<DoubleArray> PartialInformationContentParameter {
+      get { return (LookupParameter<DoubleArray>)Parameters["PartialInformationContent"]; }
+    }
+    public LookupParameter<DoubleArray> DensityBasinInformationParameter {
+      get { return (LookupParameter<DoubleArray>)Parameters["DensityBasinInformation"]; }
+    }
+    public LookupParameter<DoubleArray> TotalEntropyParameter {
+      get { return (LookupParameter<DoubleArray>)Parameters["TotalEntropy"]; }
+    }
+    public LookupParameter<DoubleArray> EpsilonQuantilesParameter {
+      get { return (LookupParameter<DoubleArray>)Parameters["EpsilonQuantiles"]; }
+    }
+    #endregion
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected InformationAnalysisCalculator(bool deserializing) : base(deserializing) { }
+    public InformationAnalysisCalculator() {
+      Parameters.Add(new LookupParameter<DataTable>("QualityTrail", "Historical quality trail of a walk over a fitness landscape."));
+
+      Parameters.Add(new ValueLookupParameter<IntValue>("NQuantiles", "Number of epsilon quantiles to calculate information analysis."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("ShapeSize", "The number of consecutive slopes to consider as shape.", new IntValue(2)));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("InformationStability"));
+      Parameters.Add(new LookupParameter<IntValue>("Regularity"));
+      Parameters.Add(new LookupParameter<IntValue>("Diversity"));
+      Parameters.Add(new LookupParameter<DoubleArray>("InformationContent"));
+      Parameters.Add(new LookupParameter<DoubleArray>("PartialInformationContent"));
+      Parameters.Add(new LookupParameter<DoubleArray>("DensityBasinInformation"));
+      Parameters.Add(new LookupParameter<DoubleArray>("TotalEntropy"));
+      Parameters.Add(new LookupParameter<DoubleArray>("EpsilonQuantiles", "Considered values of epsilon, selected as quantiles of actual quality differences"));
+    }
+    protected InformationAnalysisCalculator(InformationAnalysisCalculator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InformationAnalysisCalculator(this, cloner);
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      var analysis = new InformationAnalysis(
+        QualityTrailParameter.ActualValue.Rows.First().Values,
+        NQuantilesParameter.ActualValue.Value,
+        ShapeSizeParameter.ActualValue.Value);
+      RegularityParameter.ActualValue = new IntValue(analysis.Regularity);
+      DiversityParameter.ActualValue = new IntValue(analysis.Diversity);
+      InformationStabilityParameter.ActualValue = new DoubleValue(analysis.InformationStability);
+      InformationContentParameter.ActualValue = new DoubleArray(analysis.InformationContent.ToArray());
+      PartialInformationContentParameter.ActualValue = new DoubleArray(analysis.PartialInformationContent.ToArray());
+      DensityBasinInformationParameter.ActualValue = new DoubleArray(analysis.DensityBasinInformation.ToArray());
+      TotalEntropyParameter.ActualValue = new DoubleArray(analysis.TotalEntropy.ToArray());
+      EpsilonQuantilesParameter.ActualValue = new DoubleArray(analysis.QualityDelta.ToArray());
+      return base.Apply();
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/InformationAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/InformationAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/InformationAnalyzer.cs	(revision 15691)
@@ -0,0 +1,248 @@
+﻿#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.Linq;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Analysis {
+
+  [StorableClass]
+  public class InformationAnalyzer : AlgorithmOperator, IQualityTrailAnalyzer {
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    #region Parameters
+    public LookupParameter<DataTable> QualityTrailParameter {
+      get { return (LookupParameter<DataTable>)Parameters["Quality Trail"]; }
+    }
+    public LookupParameter<InformationStabilityTable> InformationStabilityParameter {
+      get { return (LookupParameter<InformationStabilityTable>)Parameters["Information Stability"]; }
+    }
+    public LookupParameter<InformationAnalysisTable> InformationParameter {
+      get { return (LookupParameter<InformationAnalysisTable>)Parameters["Information"]; }
+    }
+    public LookupParameter<VariableCollection> ResultsParameter {
+      get { return (LookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    public ValueLookupParameter<IntValue> NQuantilesParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["NQuantiles"]; }
+    }
+    public ValueLookupParameter<IntValue> ShapeSizeParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["ShapeSize"]; }
+    }
+    public LookupParameter<DoubleValue> InformationContentValueParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["InformationContentValue"]; }
+    }
+    public LookupParameter<DoubleValue> PartialInformationContentValueParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["PartialInformationContentValue"]; }
+    }
+    public LookupParameter<DoubleValue> DensityBasinInformationValueParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["DensityBasinInformationValue"]; }
+    }
+    public LookupParameter<DoubleValue> TotalEntropyValueParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["TotalEntropyValue"]; }
+    }
+    public LookupParameter<DoubleValue> InformationStabilityValueParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["InformationStabilityValue"]; }
+    }
+    public LookupParameter<IntValue> RegularityValueParameter {
+      get { return (LookupParameter<IntValue>)Parameters["RegularityValue"]; }
+    }
+    public LookupParameter<IntValue> DiversityValueParameter {
+      get { return (LookupParameter<IntValue>)Parameters["DiversityValue"]; }
+    }
+
+    #region Peaks
+    public LookupParameter<DoubleValue> PeakInformationContentParameter {
+      get { return (LookupParameter<DoubleValue>) Parameters["PeakInformationContent"]; }
+    }
+    public LookupParameter<DoubleValue> PeakInformationContentQualityDeltaParameter {
+      get { return (LookupParameter<DoubleValue>) Parameters["PeakInformationContentQualityDelta"]; }
+    }
+    public LookupParameter<DoubleValue> PeakDensityBasinInformationParameter {
+      get { return (LookupParameter<DoubleValue>) Parameters["PeakDensityBasinInformation"]; }
+    }
+    public LookupParameter<DoubleValue> PeakDensityBasinInformationQualityDeltaParameter {
+      get { return (LookupParameter<DoubleValue>) Parameters["PeakDensityBasinInformationQualityDelta"]; }
+    }
+
+
+    #endregion
+
+    #endregion
+
+    private InformationStabilityTable InformationStability {
+      get { return InformationStabilityParameter.ActualValue; }
+    }
+    private double InformationContentValue {
+      set { InformationContentValueParameter.ActualValue = new DoubleValue(value); }
+    }
+    private double PartialInformationContentValue {
+      set { PartialInformationContentValueParameter.ActualValue = new DoubleValue(value); }
+    }
+    private double DensityBasinInformationValue {
+      set { DensityBasinInformationValueParameter.ActualValue = new DoubleValue(value); }
+    }
+    private double TotalEntropyValue {
+      set { TotalEntropyValueParameter.ActualValue = new DoubleValue(value); }
+    }
+    private double InformationStabilityValue {
+      set { InformationStabilityValueParameter.ActualValue = new DoubleValue(value); }
+    }
+
+    [StorableConstructor]
+    protected InformationAnalyzer(bool deserializing) : base(deserializing) { }
+    protected InformationAnalyzer(InformationAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public InformationAnalyzer() {
+      Parameters.Add(new LookupParameter<DataTable>("Quality Trail", "The qualities of the solutions"));
+      Parameters.Add(new LookupParameter<InformationStabilityTable>("Information Stability", "Information stability development over time"));
+      Parameters.Add(new LookupParameter<InformationAnalysisTable>("Information", "A data table that information theoretic fitness landscape characteristics"));
+      Parameters.Add(new LookupParameter<VariableCollection>("Results", "The collection of all results of this algorithm"));
+
+      Parameters.Add(new ValueLookupParameter<IntValue>("NQuantiles", "The number of delta quantiles to display", new IntValue(20)));
+      Parameters.Add(new ValueLookupParameter<IntValue>("ShapeSize", "The number of slopes to consider as shapes.", new IntValue(2)));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("InformationContentValue", "The information content H(0) at eps = 0"));
+      Parameters.Add(new LookupParameter<DoubleValue>("PartialInformationContentValue", "Partial information content M(0) at eps = 0"));
+      Parameters.Add(new LookupParameter<DoubleValue>("DensityBasinInformationValue", "Density Basin Information h(0) at eps = 0"));
+      Parameters.Add(new LookupParameter<DoubleValue>("TotalEntropyValue", "The overall disorder in the trajectory"));
+      Parameters.Add(new LookupParameter<DoubleValue>("InformationStabilityValue", "Information Stability Value"));
+      Parameters.Add(new LookupParameter<IntValue>("RegularityValue", "The number of different quality differences"));
+      Parameters.Add(new LookupParameter<IntValue>("DiversityValue", "The number of different quality values"));
+      Parameters.Add(new LookupParameter<DoubleValue>("PeakInformationContent", "Maximum information content at any quality delta."));
+      Parameters.Add(new LookupParameter<DoubleValue>("PeakInformationContentQualityDelta", "Quality delta with maximum information content."));
+      Parameters.Add(new LookupParameter<DoubleValue>("PeakDensityBasinInformation", "Maximum density basin information at any quality delta."));
+      Parameters.Add(new LookupParameter<DoubleValue>("PeakDensityBasinInformationQualityDelta", "Quality delta with maximum density basin information."));
+
+      var resultsCollector = new ResultsCollector();
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(InformationParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(InformationStabilityParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(InformationContentValueParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(PartialInformationContentValueParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(DensityBasinInformationValueParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(TotalEntropyValueParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(InformationStabilityValueParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>(RegularityValueParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>(DiversityValueParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(PeakInformationContentParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(PeakInformationContentQualityDeltaParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(PeakDensityBasinInformationParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(PeakDensityBasinInformationQualityDeltaParameter.Name));
+
+      OperatorGraph.InitialOperator = resultsCollector;
+      resultsCollector.Successor = null;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InformationAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      DataTable qualityTrail = QualityTrailParameter.ActualValue;
+      if (qualityTrail != null && qualityTrail.Rows.Count > 0) {
+        EnsureExistsInformationStabilityTable();
+        EnsureExistsInformationTable();
+        AnalyseInformation();
+      }
+      return base.Apply();
+    }
+
+    private void AnalyseInformation() {
+      int nQuantiles = NQuantilesParameter.ActualValue.Value;
+      int shapeSize = ShapeSizeParameter.ActualValue.Value;
+      var qualities = QualityTrailParameter.ActualValue.Rows.First().Values.ToList();
+      if (qualities.Count > 2) {
+        InformationAnalysisTable informationTable = InformationParameter.ActualValue;
+        var informationContent = informationTable.Rows["Information Content"].Values;
+        var partialInformationContent = informationTable.Rows["Partial Information Content"].Values;
+        var densityBasinInformation = informationTable.Rows["Density Basin Information"].Values;
+        var totalEntropy = informationTable.Rows["Total Entropy"].Values;
+        var qualityDelta = informationTable.Rows["Quality Delta"].Values;
+        var analysis = new InformationAnalysis(qualities, nQuantiles, shapeSize);
+        InformationStability.Rows["Regularity"].Values.Add(analysis.Regularity);
+        InformationStability.Rows["Diversity"].Values.Add(analysis.Diversity);
+        InformationStability.Rows["Relative Regularity"].Values.Add(1.0*analysis.Regularity/qualities.Count);
+        InformationStability.Rows["Relative Diversity"].Values.Add(1.0*analysis.Diversity/qualities.Count);
+        InformationStability.Rows["Information Stability"].Values.Add(analysis.InformationStability);
+        informationContent.Clear();
+        informationContent.AddRange(analysis.InformationContent);
+        partialInformationContent.Clear();
+        partialInformationContent.AddRange(analysis.PartialInformationContent);
+        densityBasinInformation.Clear();
+        densityBasinInformation.AddRange(analysis.DensityBasinInformation);
+        totalEntropy.Clear();
+        totalEntropy.AddRange(analysis.TotalEntropy);
+        qualityDelta.Clear();
+        qualityDelta.AddRange(analysis.QualityDelta);
+        InformationContentValue = analysis.InformationContent.FirstOrDefault();
+        PartialInformationContentValue = analysis.PartialInformationContent.FirstOrDefault();
+        DensityBasinInformationValue = analysis.DensityBasinInformation.FirstOrDefault();
+        InformationStabilityValue = analysis.InformationStability;
+        RegularityValueParameter.ActualValue = new IntValue(analysis.Regularity);
+        DiversityValueParameter.ActualValue = new IntValue(analysis.Diversity);
+        if (analysis.PeakInformationContent != null) {
+          PeakInformationContentParameter.ActualValue = new DoubleValue(analysis.PeakInformationContent.Value);
+          PeakInformationContentQualityDeltaParameter.ActualValue = new DoubleValue(analysis.PeakInformationContent.QualityDelta);
+        }
+        if (analysis.PeakDensityBasinInformation != null) {
+          PeakDensityBasinInformationParameter.ActualValue = new DoubleValue(analysis.PeakDensityBasinInformation.Value);
+          PeakDensityBasinInformationQualityDeltaParameter.ActualValue = new DoubleValue(analysis.PeakDensityBasinInformation.QualityDelta);
+        }
+      }
+    }
+
+    private void EnsureExistsInformationTable() {
+      InformationAnalysisTable information = InformationParameter.ActualValue;
+      if (information == null) {
+        information = new InformationAnalysisTable("Information");
+        information.Rows.Add(new DataRow("Information Content"));
+        information.Rows.Add(new DataRow("Partial Information Content"));
+        information.Rows.Add(new DataRow("Density Basin Information"));
+        information.Rows.Add(new DataRow("Total Entropy"));
+        information.Rows.Add(new DataRow("Quality Delta") {VisualProperties = {SecondYAxis = true}});
+        InformationParameter.ActualValue = information;
+      }
+    }
+
+    private void EnsureExistsInformationStabilityTable() {
+      InformationStabilityTable informationStability = InformationStabilityParameter.ActualValue;
+      if (informationStability == null) {
+        informationStability = new InformationStabilityTable("Information Stability");
+        informationStability.Rows.Add(new DataRow("Information Stability"));
+        informationStability.Rows.Add(new DataRow("Relative Regularity"));
+        informationStability.Rows.Add(new DataRow("Relative Diversity"));
+        informationStability.Rows.Add(new DataRow("Regularity") {VisualProperties = {SecondYAxis = true}});
+        informationStability.Rows.Add(new DataRow("Diversity") {VisualProperties = {SecondYAxis = true}});
+        InformationStabilityParameter.ActualValue = informationStability;
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/NeutralityAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/NeutralityAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/NeutralityAnalyzer.cs	(revision 15691)
@@ -0,0 +1,173 @@
+﻿#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.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Optimization;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Analysis {
+
+  [Item("Neutrality Analzyer", "Analyzes neutral parts of a trajectory")]
+  [StorableClass]
+  public class NeutralityAnalyzer : AlgorithmOperator, IAnalyzer {
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    #region Parameters
+    public LookupParameter<DoubleValue> QualityParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public LookupParameter<DoubleValue> CurrentNeutralDistanceParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["CurrentNeutralDistance"]; }
+    }
+    public LookupParameter<DoubleValue> CurrentFractionOfNeutralNeighborsParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["CurrentFractionOfNeutralNeighbors"]; }
+    }
+    public LookupParameter<DataTable> NeutralWalkDistancesTableParameter {
+      get { return (LookupParameter<DataTable>)Parameters["NeutralWalkDistancesTable"]; }
+    }
+    public LookupParameter<DoubleValue> AverageNeutralWalkLengthParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["AverageNeutralWalkLength"]; }
+    }
+    public LookupParameter<DoubleValue> AverageNeutralWalkDistanceParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["AverageNeutralWalkDistance"]; }
+    }
+    public LookupParameter<DoubleValue> AverageNeutralNeighborFractionParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["AverageNeutralNeighborFraction"]; }
+    }
+    public LookupParameter<DoubleValue> AverageInnerNeutralNeighborFractionParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["AverageInnerNeutralNeighborFraction"]; }
+    }
+    public LookupParameter<DoubleValue> NeutralWalkLengthVarianceParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["NeutralWalkLengthVariance"]; }
+    }
+    public LookupParameter<DoubleValue> NeutralWalkDistanceVarianceParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["NeutralWalkDistanceVariance"]; }
+    }        
+    public LookupParameter<DoubleValue> NeutralNeighborFractionVarianceParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["NeutralNeighborFractionVariance"]; }
+    }
+    public LookupParameter<DoubleValue> InnerNeutralNeighborFractionVarianceParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["InnerNeutralNeighborFractionVariance"]; }
+    }
+    public LookupParameter<VariableCollection> ResultsParameter {
+      get { return (LookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected NeutralityAnalyzer(bool deserializing) : base(deserializing) { }
+    protected NeutralityAnalyzer(NeutralityAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public NeutralityAnalyzer() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The current quality"));
+      Parameters.Add(new LookupParameter<DoubleValue>("CurrentNeutralDistance", "The distance of the current solution to the starting point of the neutral (portion of the) walk."));
+      Parameters.Add(new LookupParameter<DoubleValue>("CurrentFractionOfNeutralNeighbors", "The current fraction of neighbors with the same fitness (within epsilon)"));
+      Parameters.Add(new LookupParameter<DataTable>("NeutralWalkDistancesTable", "The historical values of the current neutral distance."));
+      Parameters.Add(new LookupParameter<DoubleValue>("AverageNeutralWalkLength", "The average length of a neutral walk"));
+      Parameters.Add(new LookupParameter<DoubleValue>("AverageNeutralWalkDistance", "The average distance of the neutral walk to the starting point."));
+      Parameters.Add(new LookupParameter<DoubleValue>("AverageNeutralNeighborFraction", "The average fraction of neutral neighbors overall."));
+      Parameters.Add(new LookupParameter<DoubleValue>("AverageInnerNeutralNeighborFraction", "The average fraction of neutral neighbors within a neutral area."));
+      Parameters.Add(new LookupParameter<DoubleValue>("NeutralWalkLengthVariance", "The variance of the neutral walks lengths"));
+      Parameters.Add(new LookupParameter<DoubleValue>("NeutralWalkDistanceVariance", "The varaince of the neutral walks distances"));
+      Parameters.Add(new LookupParameter<DoubleValue>("NeutralNeighborFractionVariance", "The average fraction of neutral neighbors overall."));
+      Parameters.Add(new LookupParameter<DoubleValue>("InnerNeutralNeighborFractionVariance", "The average fraction of neutral neighbors within a neutral area."));
+
+      var resultsCollector = new ResultsCollector();
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(CurrentNeutralDistanceParameter.ActualName));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(CurrentFractionOfNeutralNeighborsParameter.ActualName));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(NeutralWalkDistancesTableParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(AverageNeutralWalkLengthParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(AverageNeutralWalkDistanceParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(AverageNeutralNeighborFractionParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(AverageInnerNeutralNeighborFractionParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(NeutralWalkLengthVarianceParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(NeutralWalkDistanceVarianceParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(NeutralNeighborFractionVarianceParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(InnerNeutralNeighborFractionVarianceParameter.Name));
+
+      OperatorGraph.InitialOperator = resultsCollector;
+      resultsCollector.Successor = null;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NeutralityAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      DataTable distanceTable = GetOrCreateDistanceTable();
+      var distanceValues = distanceTable.Rows["Neutral Walk Distances"].Values;
+      var fractionValues = distanceTable.Rows["Neutral Neighbor Fractions"].Values;
+      distanceValues.Add(CurrentNeutralDistanceParameter.ActualValue == null ? 0 : CurrentNeutralDistanceParameter.ActualValue.Value);
+      fractionValues.Add(CurrentFractionOfNeutralNeighborsParameter.ActualValue == null ? 0 : CurrentFractionOfNeutralNeighborsParameter.ActualValue.Value);
+      var lengths = new List<double>();
+      var distances = new List<double>();
+      var innerFractions = new List<double>();
+      double lastValue = -1;
+      int lastStart = 0;
+      for (int i = 0; i<distanceValues.Count; i++) {
+        if (distanceValues[i] < lastValue) { // restart
+          lengths.Add(i - lastStart - 1);
+          distances.Add(lastValue);
+          lastStart = i;
+        } else { // inside neutral area
+          innerFractions.Add(fractionValues[i]);
+        }
+        lastValue = distanceValues[i];
+      }
+      if (lastStart != distanceValues.Count-1) {
+        lengths.Add(distanceValues.Count - lastStart - 1);
+        distances.Add(lastValue);
+      }
+      if (distances.Count > 0 && lengths.Count > 0) {
+        AverageNeutralWalkDistanceParameter.ActualValue = new DoubleValue(distances.Average());
+        NeutralWalkDistanceVarianceParameter.ActualValue = new DoubleValue(distances.Variance());
+        AverageNeutralWalkLengthParameter.ActualValue = new DoubleValue(lengths.Average());
+        NeutralWalkLengthVarianceParameter.ActualValue = new DoubleValue(lengths.Variance());
+        AverageNeutralNeighborFractionParameter.ActualValue = new DoubleValue(fractionValues.Average());
+        NeutralNeighborFractionVarianceParameter.ActualValue = new DoubleValue(fractionValues.Variance());
+        AverageInnerNeutralNeighborFractionParameter.ActualValue = new DoubleValue(innerFractions.Average());
+        InnerNeutralNeighborFractionVarianceParameter.ActualValue = new DoubleValue(innerFractions.Variance());
+      }
+      return base.Apply();
+    }
+
+    private DataTable GetOrCreateDistanceTable() {
+      DataTable distancesTable = NeutralWalkDistancesTableParameter.ActualValue;
+      if (distancesTable == null) {
+        distancesTable = new DataTable("Neutral Walk Distances");
+        NeutralWalkDistancesTableParameter.ActualValue = distancesTable;
+        distancesTable.Rows.Add(new DataRow("Neutral Walk Distances"));
+        distancesTable.Rows.Add(new DataRow("Neutral Neighbor Fractions") {VisualProperties = {SecondYAxis = true}});
+      }
+      return distancesTable;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/QualityTrailMultiAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/QualityTrailMultiAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/QualityTrailMultiAnalyzer.cs	(revision 15691)
@@ -0,0 +1,146 @@
+﻿#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.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("QualityTrailAnalyzer", "An analyzer that creates a quality trail which can be further analyzed by several analyzers.")]
+  [StorableClass]
+  public class QualityTrailMultiAnalyzer : CheckedMultiOperator<IQualityTrailAnalyzer>, IAnalyzer {
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ValueLookupParameter<IntValue> UpdateIntervalParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["QualityTrailUpdateInterval"]; }
+    }
+    public LookupParameter<IntValue> UpdateCounterParameter {
+      get { return (LookupParameter<IntValue>)Parameters["QualityTrailUpdateCounter"]; }
+    }
+    public ValueLookupParameter<DataTable> QualityTrailParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["Quality Trail"]; }
+    }
+    public LookupParameter<VariableCollection> ResultsParameter {
+      get { return (LookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    public LookupParameter<DoubleValue> QualityParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualitiesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Qualities"]; }
+    }
+    public OperatorParameter ResultsCollector {
+      get { return (OperatorParameter)Parameters["ResultsCollector"]; }
+    }
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+    public IntValue UpdateInterval {
+      get { return UpdateIntervalParameter.Value; }
+      set { UpdateIntervalParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected QualityTrailMultiAnalyzer(bool deserializing) : base(deserializing) { }
+    protected QualityTrailMultiAnalyzer(QualityTrailMultiAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public QualityTrailMultiAnalyzer()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IntValue>("QualityTrailUpdateInterval", "The interval at which the contained analyzers should be applied.", new IntValue(1)));
+      Parameters.Add(new LookupParameter<IntValue>("QualityTrailUpdateCounter", "The number of times the Analyzer was called since the last update."));
+      Parameters.Add(new ValueLookupParameter<DataTable>("Quality Trail", "All historical quality values throughout the algorithm run"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "Single quality value from the current iteration/generation"));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Qualities", "Quality values of the whole population", "Quality", 1));
+      Parameters.Add(new LookupParameter<VariableCollection>("Results", "The collected results"));
+      Parameters.Add(new OperatorParameter("ResultsCollector"));
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Whether the problem is a maximization problem"));
+
+      foreach (var analyzer in ApplicationManager.Manager.GetInstances<IQualityTrailAnalyzer>())
+        Operators.Add(analyzer);
+
+      var resultsCollector = new ResultsCollector();
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(QualityTrailParameter.Name));
+      ResultsCollector.Value = resultsCollector;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new QualityTrailMultiAnalyzer(this, cloner);
+    }
+
+    public override IOperation InstrumentedApply() {
+      UpdateQualityTrail();
+
+      IntValue interval = UpdateIntervalParameter.ActualValue;
+      if (interval == null) interval = new IntValue(1);
+
+      IntValue counter = UpdateCounterParameter.ActualValue;
+      if (counter == null) {
+        counter = new IntValue(interval.Value);
+        UpdateCounterParameter.ActualValue = counter;
+      } else counter.Value++;
+
+      OperationCollection next = new OperationCollection();
+      next.Add(ExecutionContext.CreateOperation(ResultsCollector.Value));
+      if (counter.Value == interval.Value) {
+        counter.Value = 0;
+        foreach (IndexedItem<IQualityTrailAnalyzer> item in Operators.CheckedItems)
+          next.Add(ExecutionContext.CreateOperation(item.Value));
+
+      }
+      next.Add(base.InstrumentedApply());
+      return next;
+    }
+
+    private void UpdateQualityTrail() {
+      DataTable qualityTrail = QualityTrailParameter.ActualValue;
+      if (qualityTrail == null) {
+        qualityTrail = new DataTable("Quality Trail");
+        qualityTrail.Rows.Add(new DataRow("Qualities"));
+        QualityTrailParameter.ActualValue = qualityTrail;
+      }
+      if (QualityParameter.ActualValue != null)
+        qualityTrail.Rows["Qualities"].Values.Add(QualityParameter.ActualValue.Value);
+      if (QualitiesParameter.ActualName != null &&
+        QualitiesParameter.ActualValue.Count() > 0 &&
+        MaximizationParameter != null)
+        if (MaximizationParameter.ActualValue.Value)
+          qualityTrail.Rows["Qualities"].Values.Add(QualitiesParameter.ActualValue.Select(dv => dv.Value).Max());
+        else
+          qualityTrail.Rows["Qualities"].Values.Add(QualitiesParameter.ActualValue.Select(dv => dv.Value).Min());
+
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/QualityTrailSummarizer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/QualityTrailSummarizer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/QualityTrailSummarizer.cs	(revision 15691)
@@ -0,0 +1,109 @@
+﻿#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.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Analysis {
+
+  [StorableClass]
+  public class QualityTrailSummarizer : AlgorithmOperator, IQualityTrailAnalyzer {
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    #region Parameters
+    public LookupParameter<DataTable> QualityTrailParameter {
+      get { return (LookupParameter<DataTable>)Parameters["Quality Trail"]; }
+    }
+    public LookupParameter<QualityTrailSummaryTable> QualityTrailSummaryParameter {
+      get { return (LookupParameter<QualityTrailSummaryTable>)Parameters["QualityTrailSummary"]; }
+    }
+    public LookupParameter<VariableCollection> ResultsParameter {
+      get { return (LookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected QualityTrailSummarizer(bool deserializing) : base(deserializing) { }
+    protected QualityTrailSummarizer(QualityTrailSummarizer original, Cloner cloner) : base(original, cloner) { }
+
+    public QualityTrailSummarizer() {
+      Parameters.Add(new LookupParameter<DataTable>("Quality Trail", "The quality of the solution"));
+      Parameters.Add(new LookupParameter<QualityTrailSummaryTable>("QualityTrailSummary", "Maximum nr of steps between statistically significantly correlated quality values"));
+      Parameters.Add(new LookupParameter<VariableCollection>("Results", "The collection of all results of this algorithm"));
+
+      var resultsCollector = new ResultsCollector();
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(QualityTrailSummaryParameter.Name));
+
+      OperatorGraph.InitialOperator = resultsCollector;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new QualityTrailSummarizer(this, cloner);
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      QualityTrailSummaryTable qualityTrailSummary = CreateQualitytrailSummaryTable();
+      DataTable qualityTrail = QualityTrailParameter.ActualValue;
+      if (qualityTrail != null && qualityTrail.Rows.Count > 1) {
+        var values = qualityTrail.Rows.First().Values;        
+        DistributionAnalyzer analyzer = new DistributionAnalyzer(values);
+        qualityTrailSummary.Rows["Value Quantiles"].Values.AddRange(new[] { 0, 0.25, 0.5, 0.75, 1 }.Select(q => analyzer[q]));
+        double variance, kurtosis, skewness, mean;
+        for (int i = 0; i < 4; i++) {
+          int minIndex = (int)Math.Round(i*values.Count*0.25);
+          int maxIndex = (int)Math.Round((i+1)*values.Count*0.25);
+          alglib.samplemoments(
+            values.GetRange(minIndex, maxIndex - minIndex).ToArray(),
+            out mean, out variance, out skewness, out kurtosis);
+          qualityTrailSummary.Rows["Epoch Averages"].Values.Add(mean);
+          qualityTrailSummary.Rows["Epoch Variances"].Values.Add(variance);
+          qualityTrailSummary.Rows["Epoch Skewnesses"].Values.Add(skewness);
+          qualityTrailSummary.Rows["Epoch Kurtoses"].Values.Add(kurtosis);
+        }
+      }
+      return base.Apply();
+    }
+
+    private QualityTrailSummaryTable CreateQualitytrailSummaryTable() {
+      QualityTrailSummaryTable qualityTrailSummary = new QualityTrailSummaryTable("Quality Trail Summary");
+      QualityTrailSummaryParameter.ActualValue = qualityTrailSummary;
+      qualityTrailSummary.Rows.Add(new DataRow("Value Quantiles"));
+      qualityTrailSummary.Rows.Add(new DataRow("Epoch Averages"));
+      qualityTrailSummary.Rows.Add(new DataRow("Epoch Variances"));
+      qualityTrailSummary.Rows.Add(new DataRow("Epoch Skewnesses"));
+      qualityTrailSummary.Rows.Add(new DataRow("Epoch Kurtoses"));
+      return qualityTrailSummary;
+    }
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/RealVectorBoundingBoxUpdater.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/RealVectorBoundingBoxUpdater.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/RealVectorBoundingBoxUpdater.cs	(revision 15691)
@@ -0,0 +1,68 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+ 
+  [Item("RealVectorBoundingBoxUpdater", "Updates a bounding box using a real vector to be enclosed.")]
+  [StorableClass]
+  public class RealVectorBoundingBoxUpdater : SingleSuccessorOperator {
+
+    #region Parameter Properties
+    public LookupParameter<DoubleMatrix> BoundingBoxParameter {
+      get { return (LookupParameter<DoubleMatrix>)Parameters["BoundingBox"]; }
+    }
+    public LookupParameter<RealVector> RealVectorParameter {
+      get { return (LookupParameter<RealVector>)Parameters["RealVector"]; }
+    }
+    #endregion
+
+    #region Parameter Values
+    public RealVector RealVector {
+      get { return RealVectorParameter.ActualValue; }
+    }
+    public DoubleMatrix Bounds {
+      get { return BoundingBoxParameter.ActualValue; }
+      set { BoundingBoxParameter.ActualValue = value; }
+    }
+    #endregion
+
+    #region Construction and Cloning
+
+    [StorableConstructor]
+    protected RealVectorBoundingBoxUpdater(bool deserializing) : base(deserializing) { }
+    protected RealVectorBoundingBoxUpdater(RealVectorBoundingBoxUpdater original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public RealVectorBoundingBoxUpdater() {
+      Parameters.Add(new LookupParameter<RealVector>("RealVector", "The real vector used to update the bounding box"));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("BoundingBox", "The Bounding Box to be updated or created"));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RealVectorBoundingBoxUpdater(this, cloner);
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      if (Bounds == null) {
+        Bounds = new DoubleMatrix(RealVector.Length, 2);
+        for (int i = 0; i < RealVector.Length; i++)
+          Bounds[i, 0] = Bounds[i, 1] = RealVector[i];
+      } else {
+        for (int i = 0; i < RealVector.Length; i++) {
+          Bounds[i, 0] = Math.Min(Bounds[i, 0], RealVector[i]);
+          Bounds[i, 1] = Math.Max(Bounds[i, 1], RealVector[i]);
+        }
+      }
+      return base.Apply();
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/RepeatAggregator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/RepeatAggregator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/RepeatAggregator.cs	(revision 15691)
@@ -0,0 +1,97 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Analysis {
+
+  [Item("RepeatAggregator", "Aggregates analysis results from repeated runs on the same starting point.")]
+  [StorableClass]
+  public class RepeatAggregator : SingleSuccessorOperator {
+
+    #region Parameter Properties
+    public LookupParameter<ResultCollection> ResultsParameter {
+      get { return (LookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected RepeatAggregator(bool deserializing) : base(deserializing) { }
+    protected RepeatAggregator(RepeatAggregator original, Cloner cloner) : base(original, cloner) { }
+    public RepeatAggregator() {
+      Parameters.Add(new LookupParameter<ResultCollection>("Results", ""));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RepeatAggregator(this, cloner);
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      ResultCollection results = ResultsParameter.ActualValue;
+      var tables = ExtractTablesFromResults(results).ToList();
+      DataTable allValues = new DataTable("All AutoCorrelations");
+      DataRow avgRow = new DataRow("Average Auto Correlation");
+      DataRow stdRow = new DataRow("Std.Dev. of Auto Correlations");
+      DataRow countRow = new DataRow("n");
+      countRow.VisualProperties.SecondYAxis = true;
+      for (int i = 0; i<tables.Count; i++) {
+        DataRow row = tables[i].Rows.First();
+        allValues.Rows.Add(new DataRow(i.ToString(), "", row.Values));
+        while (avgRow.Values.Count < row.Values.Count) {
+          stdRow.Values.Add(0);
+          avgRow.Values.Add(0);
+          countRow.Values.Add(0);
+        }
+        for (int j = 0; j<row.Values.Count; j++) {
+          avgRow.Values[j] += row.Values[j];
+          countRow.Values[j]++;
+        }
+      }
+      for (int i = 0; i<avgRow.Values.Count; i++) {
+        avgRow.Values[i] = avgRow.Values[i] / tables.Count;
+      }
+      foreach (var table in tables) {
+        DataRow row = table.Rows.First();
+        for (int j = 0; j<row.Values.Count; j++) {
+          stdRow.Values[j] += square(avgRow.Values[j] - row.Values[j]);
+        }
+      }
+      for (int i = 0; i<avgRow.Values.Count; i++) {
+        stdRow.Values[i] = Math.Sqrt(stdRow.Values[i] / tables.Count);
+      }
+      results.RemoveAll(r => r.Value is IScope || r.Value is AutoCorrelationTable);
+      AutoCorrelationTable avgTable = new AutoCorrelationTable("Average repeated auto correlation");
+      AutoCorrelationTable stdTable = new AutoCorrelationTable("Std.Dev. of repeated auto correlation");
+      avgTable.Rows.Add(avgRow);
+      avgTable.Rows.Add(countRow);
+      stdTable.Rows.Add(stdRow);
+      results.Add(new Result("Average Auto Correlation", avgTable));
+      results.Add(new Result("All Auto Correlations", allValues));
+      results.Add(new Result("Std.Dev. Auto Correlations", stdTable));
+      return base.Apply();
+    }
+
+    public static IEnumerable<AutoCorrelationTable> ExtractTablesFromResults(ResultCollection results) {
+      foreach (IResult result in results) {
+        IScope scope = result.Value as IScope;
+        if (scope != null) {
+          foreach (Variable v in scope.Variables) {
+            AutoCorrelationTable table = v.Value as AutoCorrelationTable;
+            if (table != null) {
+              yield return table;
+            }
+          }
+        }
+      }
+    }
+
+    public static double square(double x) { return x * x; }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/RuggednessAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/RuggednessAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/RuggednessAnalyzer.cs	(revision 15691)
@@ -0,0 +1,125 @@
+﻿#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.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Analysis {
+
+  [StorableClass]
+  public class RuggednessAnalyzer : AlgorithmOperator, IQualityTrailAnalyzer {
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    #region Parameters
+    public LookupParameter<DataTable> QualityTrailParameter {
+      get { return (LookupParameter<DataTable>)Parameters["Quality Trail"]; }
+    }
+    public LookupParameter<DataTable> CorrelationLengthTableParameter {
+      get { return (LookupParameter<DataTable>)Parameters["CorrelationLengthTable"]; }
+    }
+    public LookupParameter<AutoCorrelationTable> AutocorrelationParameter {
+      get { return (LookupParameter<AutoCorrelationTable>)Parameters["Autocorrelation"]; }
+    }
+    public LookupParameter<VariableCollection> ResultsParameter {
+      get { return (LookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    public LookupParameter<DoubleValue> AutoCorrelation1Parameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["AutoCorrelation1"]; }
+    }
+    public LookupParameter<IntValue> CorrelationLengthParameter {
+      get { return (LookupParameter<IntValue>)Parameters["CorrelationLength"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected RuggednessAnalyzer(bool deserializing) : base(deserializing) { }
+    protected RuggednessAnalyzer(RuggednessAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public RuggednessAnalyzer() {
+      Parameters.Add(new LookupParameter<DataTable>("Quality Trail", "The quality of the solution"));
+      Parameters.Add(new LookupParameter<DataTable>("CorrelationLengthTable", "Maximum nr of steps between statistically significantly correlated quality values"));
+      Parameters.Add(new LookupParameter<AutoCorrelationTable>("Autocorrelation", "Autocorrelation function of successive quality values"));
+      Parameters.Add(new LookupParameter<VariableCollection>("Results", "The collection of all results of this algorithm"));
+      Parameters.Add(new LookupParameter<DoubleValue>("AutoCorrelation1", "Autocorrelation for one mutation step."));
+      Parameters.Add(new LookupParameter<IntValue>("CorrelationLength", "The correlation length."));
+
+      var resultsCollector = new ResultsCollector();
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(CorrelationLengthTableParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(AutocorrelationParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(AutoCorrelation1Parameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>(CorrelationLengthParameter.Name));
+
+      OperatorGraph.InitialOperator = resultsCollector;
+      resultsCollector.Successor = null;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RuggednessAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      DataTable correlationLengthTable = GetOrCreateCorrelationLengthTable();
+      AutoCorrelationTable autocorrelationTable = GetOrCreateAutoCorrelationTable();
+      DataTable qualityTrail = QualityTrailParameter.ActualValue;
+      if (qualityTrail != null && qualityTrail.Rows.Count > 0) {
+        double[] autocorrelationValues;
+        int correlationLength = RuggednessCalculator.CalculateCorrelationLength(qualityTrail.Rows.First().Values.ToArray(), out autocorrelationValues);
+        correlationLengthTable.Rows["Correlation Length"].Values.Add(correlationLength);
+        autocorrelationTable.Rows["Auto Correlation"].Values.Clear();
+        autocorrelationTable.Rows["Auto Correlation"].Values.AddRange(autocorrelationValues);
+        CorrelationLengthParameter.ActualValue = new IntValue(correlationLength);
+        AutoCorrelation1Parameter.ActualValue = new DoubleValue(autocorrelationValues.Length > 1 ? autocorrelationValues[1] : 0.0);
+      }
+      return base.Apply();
+    }
+
+    private AutoCorrelationTable GetOrCreateAutoCorrelationTable() {
+      AutoCorrelationTable autocorrelationTable = AutocorrelationParameter.ActualValue;
+      if (autocorrelationTable == null) {
+        autocorrelationTable = new AutoCorrelationTable("Auto Correlation");
+        AutocorrelationParameter.ActualValue = autocorrelationTable;
+        var row = new DataRow("Auto Correlation");
+        row.VisualProperties.StartIndexZero = true;
+        autocorrelationTable.Rows.Add(row);
+      }
+      return autocorrelationTable;
+    }
+
+    private DataTable GetOrCreateCorrelationLengthTable() {
+      DataTable correlationLengthTable = CorrelationLengthTableParameter.ActualValue;
+      if (correlationLengthTable == null) {
+        correlationLengthTable = new DataTable("Correlation Length");
+        CorrelationLengthTableParameter.ActualValue = correlationLengthTable;
+        correlationLengthTable.Rows.Add(new DataRow("Correlation Length"));
+      }
+      return correlationLengthTable;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/RuggednessCalculator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/RuggednessCalculator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/RuggednessCalculator.cs	(revision 15691)
@@ -0,0 +1,79 @@
+﻿using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Analysis {
+  [Item("Ruggedness Calculator", "Calculates ruggedness descriptors froma given quality trail.")]
+  [StorableClass]
+  public class RuggednessCalculator : SingleSuccessorOperator {
+
+    #region Parameters
+    public LookupParameter<DataTable> QualityTrailParameter {
+      get { return (LookupParameter<DataTable>)Parameters["QualityTrail"]; }
+    }
+    public LookupParameter<IntValue> CorrelationLengthParameter {
+      get { return (LookupParameter<IntValue>)Parameters["CorrelationLength"]; }
+    }
+    public LookupParameter<DoubleArray> AutoCorrelationParameter {
+      get { return (LookupParameter<DoubleArray>)Parameters["AutoCorrelation"]; }
+    }
+    #endregion
+
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected RuggednessCalculator(bool deserializing) : base(deserializing) { }
+    protected RuggednessCalculator(RuggednessCalculator original, Cloner cloner) : base(original, cloner) { }
+    public RuggednessCalculator() {
+      Parameters.Add(new LookupParameter<DataTable>("QualityTrail", "Historical values of walk qualities"));
+      Parameters.Add(new LookupParameter<IntValue>("CorrelationLength", "Average maximum distances between correlated quality values."));
+      Parameters.Add(new LookupParameter<DoubleArray>("AutoCorrelation", "AutoCorrelation"));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RuggednessCalculator(this, cloner);
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      double[] qualities = QualityTrailParameter.ActualValue.Rows.First().Values.ToArray();
+      double[] autocorrelation;
+      CorrelationLengthParameter.ActualValue = new IntValue(CalculateCorrelationLength(qualities, out autocorrelation));
+      AutoCorrelationParameter.ActualValue = new DoubleArray(autocorrelation);
+      return base.Apply();
+    }
+
+    public static int CalculateCorrelationLength(double[] qualities, out double[] acf) {
+      double[] correlations = new double[qualities.Length];
+      alglib.corr.corrr1dcircular(qualities, qualities.Length, qualities, qualities.Length, ref correlations);
+      double mean = 0;
+      double variance = 0;
+      double skewness = 0;
+      double kurtosis = 0;
+      alglib.basestat.samplemoments(qualities, qualities.Length, ref mean, ref variance, ref skewness, ref kurtosis);
+      List<double> autocorrelation = new List<double>() { 1.0 };
+      double bound = Math.Min(2 / Math.Sqrt(qualities.Length), 1.0);
+      int correlationLength = 1;
+      for (; correlationLength < qualities.Length; correlationLength++) {
+        double value = correlations[correlationLength]/qualities.Length - mean * mean;
+        if (variance > 0)
+          value = Math.Max(Math.Min(value/variance, 1.0), -1.0);
+        else
+          value = 1;
+        autocorrelation.Add(value);
+        if (Math.Abs(value) < bound) break;
+      }
+      acf = autocorrelation.ToArray();
+      return correlationLength-1;
+    }
+
+    public static bool AnyGreaterOne(double[] values) {
+      return values.Any(d => d > 1);
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/UniqueThresholdCalculator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/UniqueThresholdCalculator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/UniqueThresholdCalculator.cs	(revision 15691)
@@ -0,0 +1,159 @@
+﻿using System;
+using System.Linq;
+using System.Collections.Generic;
+using System.Text;
+using System.Diagnostics;
+
+namespace HeuristicLab.Analysis {
+
+  public static class UniqueThresholdCalculator {
+
+    private sealed class IndexRange {
+
+      public int Start, End, N;
+      public readonly bool Merge;
+      private readonly List<IndexRange> receivers, distributors;
+
+      public IndexRange(int start, int end, int n, bool merge) {
+        Start = start;
+        End = end;
+        N = n;
+        Merge = merge;
+        receivers = new List<IndexRange>();
+        distributors = new List<IndexRange>();
+      }
+
+      public void AddReceiver(IndexRange receiver) {
+        if (receiver != null) {
+          receivers.Add(receiver);
+          receiver.distributors.Add(this);
+        }
+      }
+
+      public void Distribute() {
+        int n = N - 1;
+        Debug.Assert(n >= 0);
+        switch (receivers.Count) {
+          case 0: break; // No receivers indexes are lost :-(
+          case 1: receivers[0].N += n; N = 1; break;
+          case 2: receivers[0].N += n / 2; receivers[1].N += n - n / 2; N = 1; break;
+          default: throw new InvalidOperationException("More than two receivers registered");
+        }
+        var followers = distributors.Where(d => d.Start > End).ToList();
+        if (followers.Count > 0)
+          End = followers.Min(g => g.Start);
+        var predecessors = distributors.Where(d => d.End < Start).ToList();
+        if (predecessors.Count > 0)
+          Start = predecessors.Max(g => g.End);
+      }
+
+      public override string ToString() {
+        return string.Format("[{0}-{1}, n={2}, {3}]", Start, End, N, Merge ? "Merge" : "Spread");
+      }
+    }
+
+    public static IEnumerable<double> DetermineThresholds(IEnumerable<double> differences, int n) {
+      var thresholds = differences.Select(d => Math.Abs(d)).ToList();
+      thresholds.Sort();
+      if (thresholds.Count <= n) {
+        foreach (var t in thresholds)
+          yield return t;
+      } else {
+        double min = thresholds[0];
+        double max = thresholds[thresholds.Count-1];
+        if (min == max) {
+          yield return min;
+        } else {
+          yield return min;
+          foreach (var t in DetermineInnerThresholds(thresholds, n-2))
+            yield return t;
+          yield return max;
+        }
+      }
+    }
+
+    private static IEnumerable<double> DetermineInnerThresholds(List<double> thresholds, int n) {
+      n = Math.Min(thresholds.Count - 2, n);
+      var indexes = Enumerable.Range(0, n + 2).Select(i => (int)Math.Round(1.0 * i * (thresholds.Count - 1) / (n + 1))).ToList();
+      var ranges = CreateRanges(thresholds, indexes);
+      RedistributeIndexes(ranges);
+      TrimBoundaryRanges(ranges);
+      if (ranges.Count == 1 && ranges[0].Start == 0 && ranges[0].End == thresholds.Count - 1 && ranges[0].N == n) {
+        if (ranges[0].Merge)
+          yield return thresholds[ranges[0].Start];
+        else
+          foreach (var i in indexes.Where(i => ranges[0].Start < i && i < ranges[0].End))
+            yield return thresholds[i];
+      } else {
+        foreach (var range in ranges) {
+          if (range.Merge)
+            yield return thresholds[range.Start];
+          else
+            foreach (var t in DetermineInnerThresholds(thresholds.GetRange(range.Start, range.End - range.Start + 1), range.N))
+              yield return t;
+        }
+      }
+    }
+
+    private static void TrimBoundaryRanges(List<IndexRange> ranges) {
+      if (ranges.Count > 0)
+        if (ranges[0].Merge)
+          ranges.RemoveAt(0);
+        else
+          ranges[0].N--;
+      if (ranges.Count > 0)
+        if (ranges[ranges.Count - 1].Merge)
+          ranges.RemoveAt(ranges.Count - 1);
+        else
+          ranges[ranges.Count - 1].N--;
+    }
+
+    private static void RedistributeIndexes(List<IndexRange> ranges) {
+      IndexRange lastReceiver = null;
+      List<IndexRange> lastDistributors = new List<IndexRange>();
+      foreach (var range in ranges) {
+        if (range.Merge) {
+          range.AddReceiver(lastReceiver);
+          lastDistributors.Add(range);
+        } else {
+          foreach (var d in lastDistributors)
+            d.AddReceiver(range);
+          lastDistributors = new List<IndexRange>();
+          lastReceiver = range;
+        }
+      }
+      foreach (var range in ranges) {
+        range.Distribute();
+      }
+    }
+
+    private static List<IndexRange> CreateRanges(List<double> thresholds, List<int> indexes) {
+      var values = indexes.Select(i => new { i, v = thresholds[i] }).ToList();
+      var mergedRanges = values.GroupBy(iv => iv.v)
+        .Select(g => g.Count() == 1 ?
+          new IndexRange(g.First().i, g.First().i, 1, false) :
+          new IndexRange(g.Min(iv => iv.i), g.Max(iv => iv.i), g.Count(), true)).ToList();
+      IndexRange lastSpreadRange = null;
+      var ranges = new List<IndexRange>();
+      foreach (var group in mergedRanges) {
+        if (group.Merge) {
+          if (lastSpreadRange != null) {
+            ranges.Add(lastSpreadRange);
+            lastSpreadRange = null;
+          }
+          ranges.Add(group);
+        } else {
+          if (lastSpreadRange != null) {
+            lastSpreadRange.End = group.End;
+            lastSpreadRange.N++;
+          } else {
+            lastSpreadRange = group;
+          }
+        }
+      }
+      if (lastSpreadRange != null)
+        ranges.Add(lastSpreadRange);
+      return ranges;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/UpDownWalkAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/UpDownWalkAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/UpDownWalkAnalyzer.cs	(revision 15691)
@@ -0,0 +1,203 @@
+﻿#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.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Analysis {
+
+  [StorableClass]
+  public class UpDownWalkAnalyzer : AlgorithmOperator, IQualityTrailAnalyzer {
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    #region Parameters
+    public LookupParameter<DataTable> QualityTrailParameter {
+      get { return (LookupParameter<DataTable>)Parameters["Quality Trail"]; }
+    }
+    public LookupParameter<VariableCollection> ResultsParameter {
+      get { return (LookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    public LookupParameter<DataTable> UpDownStepsParameter {
+      get { return (LookupParameter<DataTable>)Parameters["UpDownSteps"]; }
+    }
+    public LookupParameter<DataTable> UpDownLevelsParameter {
+      get { return (LookupParameter<DataTable>)Parameters["UpDownLevels"]; }
+    }
+    public LookupParameter<DoubleValue> UpWalkLengthParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["UpWalkLength"]; }
+    }
+    public LookupParameter<DoubleValue> DownWalkLengthParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["DownWalkLength"]; }
+    }
+    public LookupParameter<DoubleValue> UpWalkLenVarParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["UpWalkLenVar"]; }
+    }
+    public LookupParameter<DoubleValue> DownWalkLenVarParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["DownWalkLenVar"]; }
+    }
+    public LookupParameter<DoubleValue> UpperLevelParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["UpperLevel"]; }
+    }
+    public LookupParameter<DoubleValue> LowerLevelParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["LowerLevel"]; }
+    }
+    public LookupParameter<DoubleValue> UpperVarianceParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["UpperVariance"]; }
+    }
+    public LookupParameter<DoubleValue> LowerVarianceParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["LowerVariance"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected UpDownWalkAnalyzer(bool deserializing) : base(deserializing) { }
+    protected UpDownWalkAnalyzer(UpDownWalkAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public UpDownWalkAnalyzer() {
+      Parameters.Add(new LookupParameter<DataTable>("Quality Trail", "The qualities of the solutions"));
+      Parameters.Add(new LookupParameter<VariableCollection>("Results", "The collection of all results of this algorithm"));
+      Parameters.Add(new LookupParameter<DataTable>("UpDownSteps", "Distribution of upward and downward steps between extremes."));
+      Parameters.Add(new LookupParameter<DataTable>("UpDownLevels", "Distribution of upper and lower levels in up-down walks."));
+      Parameters.Add(new LookupParameter<DoubleValue>("DownWalkLength", "Average downward walk length."));
+      Parameters.Add(new LookupParameter<DoubleValue>("UpWalkLength", "Average updward walk length."));
+      Parameters.Add(new LookupParameter<DoubleValue>("UpWalkLenVar", "Upward walk length variance."));
+      Parameters.Add(new LookupParameter<DoubleValue>("DownWalkLenVar", "Downward walk length variance."));
+      Parameters.Add(new LookupParameter<DoubleValue>("UpperLevel", "Average maximum fitness value."));
+      Parameters.Add(new LookupParameter<DoubleValue>("LowerLevel", "Average minimum fitness value."));
+      Parameters.Add(new LookupParameter<DoubleValue>("LowerVariance", "Lower level variance."));
+      Parameters.Add(new LookupParameter<DoubleValue>("UpperVariance", "Upper level variance."));
+    
+
+      var resultsCollector = new ResultsCollector();
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(UpDownStepsParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(UpDownLevelsParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(DownWalkLengthParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(UpWalkLengthParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(UpWalkLenVarParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(DownWalkLenVarParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(UpperLevelParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(LowerLevelParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(UpperVarianceParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(LowerVarianceParameter.Name));
+
+      OperatorGraph.InitialOperator = resultsCollector;
+      resultsCollector.Successor = null;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UpDownWalkAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var stepsTable = GetOrCreateTable(UpDownStepsParameter, "Up", "Down");
+      var levelsTable = GetOrCreateTable(UpDownLevelsParameter, "Top", "Bottom");
+      DataTable qualityTrail = QualityTrailParameter.ActualValue;
+      if (qualityTrail != null && qualityTrail.Rows.Count > 0) {
+        var qualities = qualityTrail.Rows.First().Values.ToList();
+        if (qualities.Count > 2) {
+          var extremes = qualities
+            .Delta((a, b) => new {a, b, diff = b - a})
+            .Select((p, i) => new {p.a, p.b, p.diff, i = i+1})
+            .Delta((s1, s2) => new {
+              s1.i,
+              value = s2.a,
+              top = s1.diff >= 0 && s2.diff < 0,
+              bottom = s1.diff <= 0 && s2.diff > 0
+            })
+            .Where(x => x.top || x.bottom)
+            .GroupConsecutive(x => x.bottom)
+            .Select(g => g.Count() == 1
+                           ? g.First()
+                           : (g.First().bottom
+                                ? g.OrderBy(x => x.value).First()
+                                : g.OrderByDescending(x => x.value).First())).ToList();
+          var maxima = extremes.Where(x => x.top).ToList();
+          var minima = extremes.Where(x => x.bottom).ToList();
+          var tops = Enumerable.Repeat(new {length = 0, value = 0.0}, 0).ToList();
+          var bottoms = tops;
+          if (maxima.Count > 0 && minima.Count > 0) {
+            if (maxima.First().i < minima.First().i) {
+              bottoms = maxima.Zip(minima, (t, b) => new {length = b.i - t.i, b.value}).ToList();
+              minima.Insert(0, new {i = -1, value = 0.0, top = false, bottom = false});
+              tops = maxima.Zip(minima, (t, b) => new {length = t.i - b.i, t.value}).ToList();
+            } else {
+              tops = maxima.Zip(minima, (t, b) => new {length = t.i - b.i, t.value}).ToList();
+              maxima.Insert(0, new {i = -1, value = 0.0, top = false, bottom = false});
+              bottoms = maxima.Zip(minima, (t, b) => new {length = b.i - t.i, b.value}).ToList();
+            }
+            if (tops.Count > 0) {
+              var topLengths = tops.Select(t => (double) t.length).ToList();
+              var topVals = tops.Select(t => t.value).ToList();
+              ReplaceHistogram(stepsTable.Rows["Up"], topLengths);
+              ReplaceHistogram(levelsTable.Rows["Top"], topVals);
+              UpperLevelParameter.ActualValue = new DoubleValue(topVals.Average());
+              UpperVarianceParameter.ActualValue = new DoubleValue(topVals.Variance());
+              UpWalkLengthParameter.ActualValue = new DoubleValue(topLengths.Average());
+              UpWalkLenVarParameter.ActualValue = new DoubleValue(topLengths.Variance());
+            }
+            if (bottoms.Count > 0) {
+              var bottomLengths = bottoms.Select(b => (double) b.length).ToList();
+              var bottomVals = bottoms.Select(b => b.value).ToList();
+              ReplaceHistogram(stepsTable.Rows["Down"], bottomLengths);
+              ReplaceHistogram(levelsTable.Rows["Bottom"], bottomVals);
+              LowerLevelParameter.ActualValue = new DoubleValue(bottomVals.Average());
+              LowerVarianceParameter.ActualValue = new DoubleValue(bottomVals.Variance());
+              DownWalkLengthParameter.ActualValue = new DoubleValue(bottomLengths.Average());
+              DownWalkLenVarParameter.ActualValue = new DoubleValue(bottomLengths.Variance());
+            }
+          }
+        }
+      }
+      return base.Apply();
+    }
+
+    private void ReplaceHistogram(DataRow row, IEnumerable<double> values) {
+      row.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Histogram;
+      row.Values.Clear();
+      row.Values.AddRange(values);
+    }
+
+    private DataTable GetOrCreateTable(LookupParameter<DataTable> tableParameter, params string[] rowNames) {
+      DataTable table = tableParameter.ActualValue;
+      if (table == null) {
+        table = new DataTable(tableParameter.Name, tableParameter.Description) {
+          VisualProperties = { HistogramBins = 25 }
+        };
+        tableParameter.ActualValue = table;
+        foreach (var name in rowNames) {
+          table.Rows.Add(new DataRow(name));
+        }
+      }
+      return table;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BestWorstSelector.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BestWorstSelector.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BestWorstSelector.cs	(revision 15691)
@@ -0,0 +1,99 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+  [Item("BestOrWorstSelector", "A selection operator that moves towards the next local optimum, when found reverses direction and so on.")]
+  [StorableClass]
+  public class BestWorstSelector : SingleObjectiveSelector, ISingleObjectiveSelector {
+
+    #region Parameters
+    public ScopePathLookupParameter<BoolValue> MoveTowardsOptimumParameter {
+      get { return (ScopePathLookupParameter<BoolValue>)Parameters["MoveTowardsOptimum"]; }
+    }
+    public ScopePathLookupParameter<DoubleValue> BaseQualityParameter {
+      get { return (ScopePathLookupParameter<DoubleValue>)Parameters["BaseQuality"]; }
+    }
+    public LookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    #endregion
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected BestWorstSelector(bool deserializing) : base(deserializing) { }
+    protected BestWorstSelector(BestWorstSelector original, Cloner cloner) : base(original, cloner) { }
+    public BestWorstSelector() {
+      Parameters.Add(new ScopePathLookupParameter<BoolValue>("MoveTowardsOptimum", "Specifies whether the selector should optimize towards or away from the optimum."));
+      Parameters.Add(new ScopePathLookupParameter<DoubleValue>("BaseQuality", "The base quality value to compare to. This is required to determine wheter a local optimum has been found and the direction should be reversed."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "Random number generator"));
+      MoveTowardsOptimumParameter.Hidden = false;
+      BaseQualityParameter.Hidden = false;
+      MoveTowardsOptimumParameter.Path = "..";
+      BaseQualityParameter.Path = "../Remaining/{0}";
+      BaseQualityParameter.ActualName = "Quality";
+      QualityParameter.Hidden = false;
+      MaximizationParameter.Hidden = true;
+      NumberOfSelectedSubScopesParameter.Value = new IntValue(1);
+      NumberOfSelectedSubScopesParameter.Hidden = true;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestWorstSelector(this, cloner);
+    }
+    #endregion
+
+    protected override IScope[] Select(List<IScope> scopes) {
+      bool optimize = true;
+      if (MoveTowardsOptimumParameter.ActualValue == null) {
+        MoveTowardsOptimumParameter.ActualValue = new BoolValue(true);
+      } else {
+        optimize = MoveTowardsOptimumParameter.ActualValue.Value;
+      }
+      double baseQuality = BaseQualityParameter.ActualValue.Value;
+      int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
+      bool copy = CopySelectedParameter.Value.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      IScope[] selected = new IScope[count];
+      IRandom random = RandomParameter.ActualValue;
+
+      var list = qualities.Select((x, i) => new { Index=i, Quality=x.Value }).ToList();
+      if (random != null)
+        list.Shuffle(random);
+      if (maximization && optimize || !maximization && !optimize) {
+        list = list.OrderByDescending(x => x.Quality).ToList();
+        if (list.Count > 0 && list[0].Quality <= baseQuality)
+          MoveTowardsOptimumParameter.ActualValue = new BoolValue(!optimize);
+      } else {
+        list = list.OrderBy(x => x.Quality).ToList();
+        if (list.Count > 0 && list[0].Quality >= baseQuality)
+          MoveTowardsOptimumParameter.ActualValue = new BoolValue(!optimize);
+      }
+
+      if (copy) {
+        int j = 0;
+        for (int i = 0; i < count; i++) {
+          selected[i] = (IScope)scopes[list[j].Index].Clone();
+          j++;
+          if (j >= list.Count) j = 0;
+        }
+      } else {
+        for (int i = 0; i < count; i++) {
+          selected[i] = scopes[list[0].Index];
+          scopes[list[0].Index] = null;
+          list.RemoveAt(0);
+        }
+        scopes.RemoveAll(x => x == null);
+      }
+
+      return selected;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/BitmapItem.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/BitmapItem.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/BitmapItem.cs	(revision 15691)
@@ -0,0 +1,65 @@
+﻿using System;
+using System.Drawing;
+using System.Drawing.Imaging;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.BoxCharts {
+
+  [StorableClass]
+  public class BitmapItem : Item {
+
+    [Storable]
+    private Bitmap image;
+
+    public Bitmap Image {
+      get { return image; }
+      set {
+        if (value == image)
+          return;
+        image = value;
+        OnImageChanged();
+      }
+    }
+
+    public event EventHandler ImageChanged;
+
+    protected virtual void OnImageChanged() {
+      EventHandler handler = ImageChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+
+    [StorableConstructor]
+    protected BitmapItem(bool deserializing) : base(deserializing) { }
+    protected BitmapItem(BitmapItem original, Cloner cloner) : base(original, cloner) {
+      Image = (Bitmap)original.Image.Clone();
+    }
+
+    public BitmapItem(Bitmap image) {
+      Image = image;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BitmapItem(this, cloner);
+    }
+
+    public virtual void Save(string filename) {
+      if (image == null)
+        return;
+      var format = ImageFormat.Png;
+      if (filename.Length >=3) {
+        switch(filename.Substring(filename.Length-4, 3).ToLower()) {
+          case "jpg": format = ImageFormat.Jpeg; break;
+          case "emf": format = ImageFormat.Emf; break;
+          case "gif": format = ImageFormat.Gif; break;
+          case "tif": format = ImageFormat.Tiff; break;
+          default: format = ImageFormat.Png; break;
+        }
+      }
+      image.Save(filename, format);
+    }
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/BoxChartCreator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/BoxChartCreator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/BoxChartCreator.cs	(revision 15691)
@@ -0,0 +1,169 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.BoxCharts {
+
+  [Item("Box Chart Creator", "Visualizes essential run information by creating an overview chart.")]
+  [StorableClass]
+  public class BoxChartCreator : ParameterizedNamedItem, IRunCollectionModifier {
+
+    public enum AppendModes { None, Horizontal, Vertical };
+
+    #region Parameters
+    public ValueParameter<StringValue> ChartNameParameter {
+      get { return (ValueParameter<StringValue>)Parameters["ChartName"]; }
+    }
+    public ValueParameter<CheckedItemList<IBoxChartElementGenerator>> ElementsParameter {
+      get { return (ValueParameter<CheckedItemList<IBoxChartElementGenerator>>)Parameters["Elements"]; }
+    }
+    public ValueParameter<IntValue> SizeParameter {
+      get { return (ValueParameter<IntValue>)Parameters["Size"]; }
+    }
+    public ValueParameter<IntValue> PaddingParameter {
+      get { return (ValueParameter<IntValue>)Parameters["Padding"]; }
+    }
+    public ValueParameter<StringValue> ZipFileNameParameter {
+      get { return (ValueParameter<StringValue>)Parameters["ZipFileName"]; }
+    }
+    public IConstrainedValueParameter<StringValue> AppendModeParameter {
+      get { return (IConstrainedValueParameter<StringValue>)Parameters["AppendMode"]; }
+    }
+    #endregion
+
+    #region Parameter Values
+    protected string ChartName { get { return ChartNameParameter.Value.Value; } }
+    protected string ZipFileName { get { return ZipFileNameParameter.Value.Value; } }
+    protected int Size { get { return SizeParameter.Value.Value; } }
+    protected int Padding { get { return PaddingParameter.Value.Value; } }
+    protected AppendModes AppendMode { get { return (AppendModes)Enum.Parse(typeof(AppendModes), AppendModeParameter.Value.Value); } }
+    protected List<IBoxChartElementGenerator> Generators {
+      get {
+        return ElementsParameter.Value.CheckedItems.Select(i => i.Value).ToList();
+      }
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected BoxChartCreator(bool deserializing) : base(deserializing) { }
+    protected BoxChartCreator(BoxChartCreator original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEvents();
+    }
+    public BoxChartCreator() {
+      Parameters.Add(new ValueParameter<StringValue>("ChartName", "The result name of the chart.", new StringValue("Chart")));
+      Parameters.Add(new ValueParameter<CheckedItemList<IBoxChartElementGenerator>>("Elements", "List of patient chart element generators.", new CheckedItemList<IBoxChartElementGenerator>()));
+      Parameters.Add(new ValueParameter<IntValue>("Size", "The size of one box in pixels.", new IntValue(50)));
+      Parameters.Add(new ValueParameter<IntValue>("Padding", "The padding inside the boxes", new IntValue(1)));
+      Parameters.Add(new ValueParameter<StringValue>("ZipFileName", "The name of the zip file that will contain all generated charts.", new StringValue("")));
+      Parameters.Add(new ConstrainedValueParameter<StringValue>("AppendMode", "Determines how coordinates of new elements are calculated.",
+        new ItemSet<StringValue>(Enum.GetNames(typeof(AppendModes)).Select(v => new StringValue(v)))));
+      AppendModeParameter.Value = AppendModeParameter.ValidValues.SingleOrDefault(v => v.Value == AppendModes.Horizontal.ToString());
+      RegisterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BoxChartCreator(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (!Parameters.ContainsKey("ZipFileName"))
+        Parameters.Add(new ValueParameter<StringValue>("ZipFileName", "The name of the zip file that will contain all generated charts.", new StringValue("")));
+      if (!Parameters.ContainsKey("AppendMode")) {
+        Parameters.Add(new ConstrainedValueParameter<StringValue>("AppendMode", "Determines how coordinates of new elements are calculated.",
+          new ItemSet<StringValue>(Enum.GetNames(typeof(AppendModes)).Select(v => new StringValue(v)))));
+        AppendModeParameter.Value = AppendModeParameter.ValidValues.SingleOrDefault(v => v.Value == AppendModes.Horizontal.ToString());
+      }
+      RegisterEvents();
+    }
+    #endregion
+
+    private void RegisterEvents() {
+      ElementsParameter.ValueChanged += ElementsParameter_ValueChanged;
+      ElementsParameter.Value.ItemsAdded += ElementsParameter_Value_ItemsAdded;
+    }
+
+    private void ElementsParameter_ValueChanged(object sender, EventArgs e) {
+      ElementsParameter.Value.ItemsAdded += ElementsParameter_Value_ItemsAdded;
+    }
+
+    private void ElementsParameter_Value_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IBoxChartElementGenerator>> e) {
+      if (sender != ElementsParameter.Value) {
+        var oldParameter = sender as ICheckedItemList<IBoxChartElementGenerator>;
+        if (oldParameter != null)
+          oldParameter.ItemsAdded -= ElementsParameter_Value_ItemsAdded;
+      } else {
+        var generators = Generators;
+        var newItems = e.Items.Select(kvp => kvp.Value).ToList();
+        switch (AppendMode) {
+          case AppendModes.Horizontal:
+            foreach (var generator in newItems) {
+              generator.Y = generators.Max(g => g.Y + g.RowSpan - 1);
+              generator.X = generators.Where(g => g.Y + g.RowSpan - 1 == generator.Y).Max(g => g.X + g.ColSpan);
+            }
+            break;
+          case AppendModes.Vertical:
+            foreach (var generator in newItems) {
+              generator.X = generators.Max(g => g.X + g.ColSpan - 1);
+              generator.Y = generators.Where(g => g.X + g.ColSpan - 1 == generator.X).Max(g => g.Y + g.RowSpan);
+            }
+            break;
+        }
+      }
+    }
+
+    #region IRunCollectionModifier Members
+
+    public void Modify(List<IRun> runs) {
+      var bitmaps = new Dictionary<string, Bitmap>();
+      var generators = Generators;
+      var maxX = generators.Max(g => g.X + g.ColSpan);
+      var maxY = generators.Max(g => g.Y + g.RowSpan);
+      for (int i = 0; i < runs.Count; i++) {
+        var run = runs[i];
+        var b = new Bitmap(maxX * Size, maxY * Size);
+        using (var g = Graphics.FromImage(b)) {
+          g.FillRectangle(SystemBrushes.Control, 0, 0, b.Width, b.Height);
+          foreach (var gen in generators) {
+            g.SetClip(new Rectangle(gen.X * Size + Padding, gen.Y * Size + Padding, gen.ColSpan * Size - 2 * Padding, gen.RowSpan * Size - 2 * Padding));
+            gen.Draw(run, g);
+            g.ResetClip();
+          }
+        }
+        run.Results[ChartName] = new BitmapItem(b);
+        bitmaps.Add(string.Format("{0}.png", run.Name), (Bitmap)b.Clone());
+      }
+      SaveAllBitmaps(bitmaps);
+    }
+
+    private void SaveAllBitmaps(Dictionary<string, Bitmap> bitmaps) {
+      if (ZipFileNameParameter.Value == null && string.IsNullOrEmpty(ZipFileName))
+        return;
+      var filename = ZipFileName;
+      if (!filename.ToLowerInvariant().EndsWith("zip"))
+        filename = string.Format("{0}.zip", filename);
+      using (var stream = File.Create(filename)) {
+        using (var zipArchive = new ZipArchive(stream, ZipArchiveMode.Create)) {
+          foreach (var bitmap in bitmaps) {
+            var entry = zipArchive.CreateEntry(bitmap.Key);
+            using (var s = entry.Open()) {
+              bitmap.Value.Save(s, ImageFormat.Png);
+            }
+          }
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/ColorValue.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/ColorValue.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/ColorValue.cs	(revision 15691)
@@ -0,0 +1,221 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common.Resources;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.BoxChart {
+
+  [Item("Color", "A color")]
+  [StorableClass]
+  public class ColorValue : NamedItem {
+
+    #region Constants & Initializers
+    public static readonly Dictionary<int, string> KnownColors = new Dictionary<int, string>();
+
+    static ColorValue() {
+      foreach (var name in Enum.GetNames(typeof(KnownColor))) {
+        var kc = Color.FromName(name);
+        if (!kc.IsSystemColor)
+          KnownColors[kc.ToArgb()] =  name;
+      } 
+    }
+    #endregion
+
+    #region Fields
+    private int r, g, b;
+
+    [Storable]
+    private double h;
+    [Storable]
+    private double s;
+    [Storable]
+    private double v;
+
+    private Color? color;
+
+    private Image icon;
+    #endregion
+
+    #region Properties
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+    public static new Image StaticItemImage { get { return VSImageLibrary.DisplayInColorVertical; } }
+    public override Image ItemImage {
+      get {
+        if (icon != null)
+          return icon;
+        icon = new Bitmap(16, 16);
+        using (var g = Graphics.FromImage(icon)) {
+          using (var b = new SolidBrush(Color)) {
+            g.FillRectangle(b, 0, 0, 16, 16);
+          }
+        }
+        return icon;
+      }
+    }
+    public int R {
+      get { return r;  }
+      set { if (value == r) return; r = value; OnRGBChanged(); }
+    }
+    public int G {
+      get { return g;  }
+      set { if (value == g) return; g = value; OnRGBChanged(); }
+    }
+    public int B {
+      get { return b;  }
+      set { if (value == b) return; b = value; OnRGBChanged(); }
+    }
+
+    public double H {
+      get { return h; }
+      set { if (value == h) return; h = value; OnHSVChanged(); }
+    }
+
+    public double S {
+      get { return s; }
+      set { if (value == s) return; s = value; OnHSVChanged(); }
+    }
+
+    public double V {
+      get { return v; }
+      set { if (value == v) return; v = value; OnHSVChanged(); }
+    }
+
+    public Color Color {
+      get {
+        if (color.HasValue) return color.Value;
+        color = Color.FromArgb(R, G, B);
+        return color.Value;
+      }
+      set {
+        if (value == Color)
+          return;
+        color = value;
+        r = value.R;
+        g = value.G;
+        b = value.B;
+        OnRGBChanged();
+      }
+    }
+    public bool IsNamedColor { get { return KnownColors.ContainsKey(Color.ToArgb()); } }
+    #endregion
+
+    #region Events
+    protected virtual void OnRGBChanged() {
+      RGBToHSV(r, g, b, out h, out s, out v);
+      OnColorChanged();
+    }
+
+    protected virtual void OnHSVChanged() {
+      HSVtoRGB(h, s, v, out r, out g, out b);
+      OnColorChanged();
+    }
+
+    public event EventHandler ColorChanged;
+
+    protected virtual void OnColorChanged() {
+      color = null;
+      icon = null;
+      name = GetColorName(Color);
+      EventHandler handler = ColorChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+      OnToStringChanged();
+      OnItemImageChanged();
+      OnNameChanged();
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected ColorValue(bool deserializing) : base(deserializing) { }
+    protected ColorValue(ColorValue original, Cloner cloner) : base (original, cloner) {
+      h = original.h;
+      s = original.s;
+      v = original.v;
+      HSVtoRGB(h, s, v, out r, out g, out b);
+      name = GetColorName(Color);
+    }
+    public ColorValue() : this(Color.White) {}
+    public ColorValue(Color color) {
+      this.color = color;
+      r = color.R;
+      g = color.G;
+      b = color.B;
+      RGBToHSV(r, g, b, out h, out s, out v);
+      name = GetColorName(Color);
+    }
+    public ColorValue(double hue, double saturation, double value) {
+      h = hue;
+      s = saturation;
+      v = value;
+      HSVtoRGB(h, s, v, out r, out g, out b);
+      name = GetColorName(Color);
+    }
+    public ColorValue(int red, int green, int blue) {
+      r = red;
+      g = green;
+      b = blue;
+      RGBToHSV(r, g, b, out h, out s, out v);
+      name = GetColorName(Color);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      HSVtoRGB(h, s, v, out r, out g, out b);
+      name = GetColorName(Color);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ColorValue(this, cloner);
+    }
+    #endregion
+
+
+    public static string GetColorName(Color color) {
+      int argb = color.ToArgb();
+      string colorName;
+      if (KnownColors.TryGetValue(argb, out colorName))
+        return colorName;
+      return string.Format("#{0:x2}{1:x2}{2:x2}", color.R, color.G, color.B);
+    }
+
+    public override string ToString() {
+      return GetColorName(Color);
+    }
+
+    public static void RGBToHSV(int r, int g , int b, out double hue, out double saturation, out double value) {
+      int max = Math.Max(r, Math.Max(g, b));
+      int min = Math.Min(r, Math.Min(g, b));
+
+      hue = Color.FromArgb(r, g, b).GetHue();
+      saturation = (max == 0) ? 0 : 1d - (1d * min / max);
+      value = max / 255d;
+    }
+
+    public static void HSVtoRGB(double hue, double saturation, double value, out int r, out int g, out int b) {
+      int hi = Convert.ToInt32(Math.Floor(hue / 60)) % 6;
+      double f = hue / 60 - Math.Floor(hue / 60);
+
+      value = value * 255;
+      int v = Convert.ToInt32(value);
+      int p = Convert.ToInt32(value * (1 - saturation));
+      int q = Convert.ToInt32(value * (1 - f * saturation));
+      int t = Convert.ToInt32(value * (1 - (1 - f) * saturation));
+
+      switch (hi) {
+        case 0:  r=v; g=t; b=p; break;
+        case 1:  r=q; g=v; b=p; break;
+        case 2:  r=p; g=v; b=t; break;
+        case 3:  r=p; g=q; b=v; break;
+        case 4:  r=t; g=p; b=v; break;
+        default: r=v; g=p; b=q; break;
+      }
+    }
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/DiscreteValueBoxChartElementGenerator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/DiscreteValueBoxChartElementGenerator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/DiscreteValueBoxChartElementGenerator.cs	(revision 15691)
@@ -0,0 +1,144 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Analysis.FitnessLandscape.BoxChart;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.BoxCharts {
+
+  [StorableClass]
+  public class DiscreteValueBoxChartElementGenerator : EmptyBoxChartElementGenerator {
+
+    public ValueParameter<StringValue> ValueNameParameter {
+      get { return (ValueParameter<StringValue>)Parameters["ValueName"]; }
+    }
+    public ValueParameter<ItemList<StringValue>> LevelsParameter {
+      get { return (ValueParameter<ItemList<StringValue>>)Parameters["Levels"]; }
+    }
+    public ValueParameter<ItemList<ColorValue>> ColorsParameter {
+      get { return (ValueParameter<ItemList<ColorValue>>)Parameters["Colors"]; }
+    }
+    public ValueParameter<BoolValue> InvertParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["Invert"]; }
+    } 
+
+    protected string ValueName { get { return ValueNameParameter.Value.Value; } }
+    protected List<string> Levels { get { return LevelsParameter.Value.Select(v => v.Value).ToList(); } }
+    protected List<Color> Colors { get { return ColorsParameter.Value.Select(v => v.Color).ToList(); } }
+    protected bool Invert { get { return InvertParameter.Value.Value; } }
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected DiscreteValueBoxChartElementGenerator(bool deserializing) : base(deserializing) { }
+    protected DiscreteValueBoxChartElementGenerator(DiscreteValueBoxChartElementGenerator original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEvents();
+    }
+    public DiscreteValueBoxChartElementGenerator() {
+      Parameters.Add(new ValueParameter<StringValue>("ValueName", "The name of the result of parameter ot be visualized.", new StringValue("Value")));
+      Parameters.Add(new ValueParameter<ItemList<StringValue>>("Levels", "The names and order of the different possible values.",
+        new ItemList<StringValue> {
+          new StringValue("Very Low"),
+          new StringValue("Low"),
+          new StringValue("Average"),
+          new StringValue("High"),
+          new StringValue("Very High") }));
+      Parameters.Add(new ValueParameter<ItemList<ColorValue>>("Colors", "The list of colors to assigned to the different levels",
+        new ItemList<ColorValue> {
+          new ColorValue(Color.Blue),
+          new ColorValue(Color.Green),
+          new ColorValue(Color.White),
+          new ColorValue(Color.Orange),
+          new ColorValue(Color.Red) }));
+      Parameters.Add(new ValueParameter<BoolValue>("Invert", "Whether the color assignment should be inverted and highlighted.", new BoolValue(false)));
+      RegisterEvents();
+      if (GetType() == typeof(DiscreteValueBoxChartElementGenerator))
+        UpdateName();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DiscreteValueBoxChartElementGenerator(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (!Parameters.ContainsKey("Levels"))
+        Parameters.Add(new ValueParameter<ItemList<StringValue>>("Levels", "The names and order of the different possible values.",
+          new ItemList<StringValue> {
+            new StringValue("Very Low"),
+            new StringValue("Low"),
+            new StringValue("Average"),
+            new StringValue("High"),
+            new StringValue("Very High") }));
+      if (!Parameters.ContainsKey("Colors"))
+        Parameters.Add(new ValueParameter<ItemList<ColorValue>>("Colors", "The list of colors to assigned to the different levels",
+          new ItemList<ColorValue> {
+          new ColorValue(Color.Blue),
+          new ColorValue(Color.Green),
+          new ColorValue(Color.White),
+          new ColorValue(Color.Orange),
+          new ColorValue(Color.Red) }));
+      if (!Parameters.ContainsKey("Invert"))
+        Parameters.Add(new ValueParameter<BoolValue>("Invert", "Whether the color assignment should be inverted and highlighted.", new BoolValue(false)));
+      RegisterEvents();
+    }
+    #endregion
+
+    private void RegisterEvents() {
+      ValueNameParameter.ToStringChanged += new EventHandler(Parameters_Changed);
+    }
+
+    private void Parameters_Changed(object sender, EventArgs eventArgs) {
+      UpdateName();
+    }
+
+    protected override string CalculateName() {
+      return string.Format("{0} d {1}", base.CalculateName(), ValueName);
+    }
+
+    private string GetValue(IRun run) {
+      IItem value;
+      run.Results.TryGetValue(ValueName, out value);
+      if (value != null)
+        return value.ToString();
+      run.Parameters.TryGetValue(ValueName, out value);
+      if (value != null)
+        return value.ToString();
+      return "";
+    }
+
+    private Color GetColor(string value) {
+      var idx = Levels.IndexOf(value);
+      if (Invert)
+        idx = Colors.Count - 1 - idx;
+      if (idx < 0 || idx >= Colors.Count)
+        return Color.Black;
+      return Colors[idx];
+    }
+
+    public override void Draw(IRun run, Graphics g) {
+      using (var b = new SolidBrush(GetColor(GetValue(run))))
+        g.FillRectangle(b, g.ClipBounds.Left, g.ClipBounds.Top, g.ClipBounds.Width, g.ClipBounds.Height);
+      if (Invert) {
+        using (var p = new Pen(SystemBrushes.ControlDarkDark, 3)) {
+          g.DrawLines(p, new[] {
+            new PointF(g.ClipBounds.Left+1, g.ClipBounds.Bottom-1), 
+            new PointF(g.ClipBounds.Left+1, g.ClipBounds.Top+1),
+            new PointF(g.ClipBounds.Right-1, g.ClipBounds.Top+1)});
+          p.Color = SystemColors.ControlLightLight;
+          g.DrawLines(p, new[] {
+            new PointF(g.ClipBounds.Right-1, g.ClipBounds.Top+1), 
+            new PointF(g.ClipBounds.Right-1, g.ClipBounds.Bottom-1), 
+            new PointF(g.ClipBounds.Left+1, g.ClipBounds.Bottom-1) });
+        }
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/EmptyBoxChartElementGenerator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/EmptyBoxChartElementGenerator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/EmptyBoxChartElementGenerator.cs	(revision 15691)
@@ -0,0 +1,99 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.BoxCharts {
+  
+  [StorableClass]
+  public class EmptyBoxChartElementGenerator : ParameterizedNamedItem, IBoxChartElementGenerator {
+
+    public ValueParameter<IntValue> XParameter {
+      get { return (ValueParameter<IntValue>)Parameters["X"]; }
+    }
+    public ValueParameter<IntValue> YParameter {
+      get { return (ValueParameter<IntValue>)Parameters["Y"]; }
+    }
+    public ValueParameter<IntValue> RowSpanParameter {
+      get { return (ValueParameter<IntValue>)Parameters["RowSpan"]; }
+    }
+    public ValueParameter<IntValue> ColSpanParameter {
+      get { return (ValueParameter<IntValue>)Parameters["ColSpan"]; }
+    }
+
+    public int X {
+      get { return XParameter.Value.Value; }
+      set { XParameter.Value.Value = value; }
+    }
+    public int Y {
+      get { return YParameter.Value.Value; }
+      set { YParameter.Value.Value = value; }
+    }
+    public int ColSpan {
+      get { return ColSpanParameter.Value.Value; }
+      set { ColSpanParameter.Value.Value = value; }
+    }
+    public int RowSpan {
+      get { return RowSpanParameter.Value.Value; }
+      set { RowSpanParameter.Value.Value = value; }
+    }
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected EmptyBoxChartElementGenerator(bool deserializing) : base(deserializing) { }
+    protected EmptyBoxChartElementGenerator(EmptyBoxChartElementGenerator original, Cloner cloner) : base(original, cloner) {
+      RegisterEvents();
+    }
+    public EmptyBoxChartElementGenerator() {
+      Parameters.Add(new ValueParameter<IntValue>("X", "The x coordinate of the generated element.", new IntValue(0)));
+      Parameters.Add(new ValueParameter<IntValue>("Y", "The y coordinate of the generated element.", new IntValue(0)));
+      Parameters.Add(new ValueParameter<IntValue>("RowSpan", "The number of rows occupied by the generated element.", new IntValue(1)));
+      Parameters.Add(new ValueParameter<IntValue>("ColSpan", "The number of columns occupied by the generated element.", new IntValue(1)));
+      RegisterEvents();
+      if (GetType() == typeof(EmptyBoxChartElementGenerator))
+        UpdateName();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EmptyBoxChartElementGenerator(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+    #endregion
+
+    private void RegisterEvents() {
+      XParameter.ToStringChanged += new EventHandler(Parameters_Changed);
+      YParameter.ToStringChanged += new EventHandler(Parameters_Changed);
+      RowSpanParameter.ToStringChanged +=new EventHandler(Parameters_Changed);
+      ColSpanParameter.ToStringChanged += new EventHandler(Parameters_Changed);
+    }
+
+    private void Parameters_Changed(object sender, EventArgs e) {
+      UpdateName();
+    }
+
+    protected virtual string CalculateName() {
+      var sb = new StringBuilder();
+      sb.AppendFormat("({0}, {1})", X, Y);
+      if (RowSpan != 1 || ColSpan != 1)
+        sb.AppendFormat("+[{0}, {1}]", ColSpan, RowSpan);
+      return sb.ToString();
+    }
+
+    protected void UpdateName() {
+      name = CalculateName();
+      OnNameChanged();
+    }
+
+    public virtual void Draw(IRun run, Graphics g) { }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/IBoxChartElementGenerator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/IBoxChartElementGenerator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/IBoxChartElementGenerator.cs	(revision 15691)
@@ -0,0 +1,23 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.BoxCharts {
+
+  public interface IBoxChartElementGenerator : INamedItem {
+    int X { get; set; }
+    int Y { get; set; }
+    int ColSpan { get; set; }
+    int RowSpan { get; set; }
+    void Draw(IRun run, Graphics g);
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/ResultNamesCollector.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/ResultNamesCollector.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/ResultNamesCollector.cs	(revision 15691)
@@ -0,0 +1,51 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.BoxChart {
+  [Item("Result Names Collector", "Collects all occuring names of parameters and results in the currenly visible runs")]
+  [StorableClass]
+  public class ResultNamesCollector : ParameterizedNamedItem, IRunCollectionModifier {
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected ResultNamesCollector(bool deserializing) : base(deserializing) {}
+
+    protected ResultNamesCollector(ResultNamesCollector original, Cloner cloner) : base(original, cloner) {}
+    public ResultNamesCollector() {}
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ResultNamesCollector(this, cloner);
+    }
+
+    #endregion
+
+    #region IRunCollectionModifier Members
+
+    public void Modify(List<IRun> runs) {
+      var resultNames = new HashSet<string>();
+      var parameterNames = new HashSet<string>();
+      foreach (var run in runs) {
+        foreach (var name in run.Parameters.Select(p => p.Key))
+          parameterNames.Add(name);
+        foreach (var name in run.Results.Select(r => r.Key))
+          resultNames.Add(name);
+      }
+      var newRun = new Run();
+      newRun.Results.Add("Result Names",
+        new CheckedItemCollection<StringValue>(resultNames.Select(r => new StringValue(r))));
+      newRun.Parameters.Add("Parameter Names",
+        new CheckedItemCollection<StringValue>(parameterNames.Select(p => new StringValue(p))));
+      runs.Add(newRun);
+    }
+
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/RunCollectionMultiDiscretizer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/RunCollectionMultiDiscretizer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/RunCollectionMultiDiscretizer.cs	(revision 15691)
@@ -0,0 +1,154 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Optimization.RunModification {
+
+  [Item("RunCollection MultiDiscretizer",
+    "Creates several levels from the distribution of several results accross a run collection and " +
+    "assigns a discretized value. Non-existing numbers as well as NaN and infinities are excluded from the caluclation.")]
+  [StorableClass]
+  public class RunCollectionMultiDiscretizer : ParameterizedNamedItem, IRunCollectionModifier {
+
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+
+    #region Parameters
+    public ValueParameter<CheckedItemList<StringValue>> SourceParameter {
+      get { return (ValueParameter<CheckedItemList<StringValue>>)Parameters["Sources"]; }
+    }
+    public ValueParameter<StringValue> SuffixParameter {
+      get { return (ValueParameter<StringValue>)Parameters["Suffix"]; }
+    }
+    public ValueParameter<DoubleValue> SpreadParameter {
+      get { return (ValueParameter<DoubleValue>)Parameters["Spread"]; }
+    }
+    public ValueParameter<StringValue> GroupByParameter {
+      get { return (ValueParameter<StringValue>)Parameters["GroupBy"]; }
+    }    
+    public ValueParameter<ItemList<StringValue>> LevelsParameter {
+      get { return (ValueParameter<ItemList<StringValue>>)Parameters["Levels"]; }
+    }    
+    #endregion
+
+    private IEnumerable<string> Sources { get { return SourceParameter.Value.CheckedItems.Select(i => i.Value.Value); } }
+    private string Suffix { get { return SuffixParameter.Value.Value; } }
+    private double Spread { get { return SpreadParameter.Value.Value; } }
+    private string GroupBy { get { return GroupByParameter.Value.Value; } }
+    private List<string> Levels { get { return LevelsParameter.Value.Select(v => v.Value).ToList(); } }
+
+      #region Construction & Cloning
+    [StorableConstructor]
+    protected RunCollectionMultiDiscretizer(bool deserializing) : base(deserializing) { }
+    protected RunCollectionMultiDiscretizer(RunCollectionMultiDiscretizer original, Cloner cloner) : base(original, cloner) { }
+    public RunCollectionMultiDiscretizer() {
+      Parameters.Add(new ValueParameter<CheckedItemList<StringValue>>("Sources", "Source value names to be discretized."));
+      Parameters.Add(new ValueParameter<StringValue>("Suffix", "Suffix attached to new discretized values.", new StringValue("/Level")));
+      Parameters.Add(new ValueParameter<DoubleValue>("Spread", "The number of standard deviations considered one additional level. Set to zero to use empirical distribution instead.", new DoubleValue(1)));
+      Parameters.Add(new ValueParameter<StringValue>("GroupBy", "Create separate analyzes for different values of this variable.", new StringValue("")));
+      Parameters.Add(new ValueParameter<ItemList<StringValue>>("Levels", "The list of levels to be assigned.",
+        new ItemList<StringValue> {
+          new StringValue("Very Low"),
+          new StringValue("Low"),
+          new StringValue("Average"),
+          new StringValue("High"),
+          new StringValue("Very High"),
+        }));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RunCollectionMultiDiscretizer(this, cloner);
+    }
+    #endregion
+
+    #region IRunCollectionModifier Members
+
+    public void Modify(List<IRun> runs) {
+      foreach (var source in Sources) {
+        var newName = source + Suffix;
+        foreach (var group in runs
+          .Select(r => new {Run = r, Value = GetValue(source, r)})
+          .Where(r => r.Value.HasValue && !double.IsNaN(r.Value.Value) && !double.IsInfinity(r.Value.Value))
+          .Select(r => new {r.Run, r.Value.Value, Bin = GetGroupByValue(r.Run)})
+          .GroupBy(r => r.Bin).ToList()) {
+          var values = group.Select(r => r.Value).ToList();
+          if (values.Count > 0) {
+            if (Spread > 0) {
+              var avg = values.Average();
+              var stdDev = values.StandardDeviation();
+              foreach (var r in group) {
+                r.Run.Results[newName] = new StringValue(Discretize(r.Value, avg, stdDev));
+              }
+            }
+            else {
+              values.Sort();
+              var a = values.ToArray();
+              foreach (var r in group) {
+                r.Run.Results[newName] = new StringValue(Discretize(r.Value, a));
+              }
+            }
+          }
+        }
+      }
+    }
+
+    private double? GetValue(string name, IRun run) {
+      return CastValue(name, run.Results) ?? CastValue(name, run.Parameters);
+    }
+
+    private string GetGroupByValue(IRun run) {
+      if (string.IsNullOrWhiteSpace(GroupBy))
+        return String.Empty;
+      IItem value;
+      run.Results.TryGetValue(GroupBy, out value);
+      if (value == null)
+        run.Parameters.TryGetValue(GroupBy, out value);
+      if (value != null)
+        return value.ToString();
+      else
+        return String.Empty;
+    }
+
+    private double? CastValue(string name, IDictionary<string, IItem> variables) {
+      IItem value;
+      variables.TryGetValue(name, out value);
+      var intValue = value as IntValue;
+      if (intValue != null) 
+        return intValue.Value;
+      var doubleValue = value as DoubleValue;
+      if (doubleValue != null)
+        return doubleValue.Value;
+      return null;
+    }
+
+    private string Discretize(double value, double avg, double stdDev) {
+      double dev = (value - avg)/(stdDev*Spread);
+      int index;
+      if (Levels.Count % 2 == 1) {
+        index = (int) Math.Floor(Math.Abs(dev));
+        index = (Levels.Count - 1)/2 + Math.Sign(dev) * index;
+      } else {
+        index = (int) Math.Ceiling(Math.Abs(dev));
+        if (dev > 0)
+          index = Levels.Count/2 + index;
+        else
+          index = Levels.Count/2 + 1 - index;
+      }
+      return Levels[Math.Min(Levels.Count - 1, Math.Max(0, index))];
+    }
+
+    private string Discretize(double value, double[] values) {
+      var index = Array.BinarySearch(values, value);
+      var pos = 1.0*(index < 0 ? ~index : index)/(values.Length-1);
+      return Levels[Math.Min(Levels.Count - 1, Math.Max(0, (int) Math.Round(pos*(Levels.Count-1))))];
+    }
+
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/StringConstantBoxChartElementGenerator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/StringConstantBoxChartElementGenerator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/StringConstantBoxChartElementGenerator.cs	(revision 15691)
@@ -0,0 +1,72 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.BoxCharts {
+
+  [StorableClass]
+  public class StringConstantBoxChartElementGenerator : EmptyBoxChartElementGenerator {
+
+    public ValueParameter<StringValue> TextParameter {
+      get { return (ValueParameter<StringValue>)Parameters["Text"]; }
+    }
+    public ValueParameter<IntValue> FontSizeParameter {
+      get { return (ValueParameter<IntValue>) Parameters["FontSize"]; }
+    }
+
+    protected string Text { get { return TextParameter.Value.Value; } }
+    protected int FontSize { get { return FontSizeParameter.Value.Value; }}
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected StringConstantBoxChartElementGenerator(bool deserializing) : base(deserializing) { }
+    protected StringConstantBoxChartElementGenerator(StringConstantBoxChartElementGenerator original, Cloner cloner) : base(original, cloner) {
+      RegisterEvents();
+    }
+    public StringConstantBoxChartElementGenerator() {
+      Parameters.Add(new ValueParameter<StringValue>("Text", "The text to be rendered inside this element.", new StringValue("Text")));
+      Parameters.Add(new ValueParameter<IntValue>("FontSize", "The font size to be used for the text.", new IntValue(11)));
+      RegisterEvents();
+      if (GetType() == typeof(StringConstantBoxChartElementGenerator))
+        UpdateName();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StringConstantBoxChartElementGenerator(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+    #endregion
+
+    private void RegisterEvents() {
+      TextParameter.ToStringChanged += new EventHandler(Parameters_Changed);
+    }
+
+    private void Parameters_Changed(object sender, EventArgs eventArgs) {
+      UpdateName();
+    }
+
+    protected override string CalculateName() {
+      return string.Format("{0} \"{1}\" ({2})", base.CalculateName(), Text, FontSize);
+    }
+
+    public override void Draw(IRun run, Graphics g) {
+      using(var font = new Font("Helvetica", FontSize)) {
+        var size = g.MeasureString(Text, font);
+        g.DrawString(Text, font, Brushes.Black,
+          g.ClipBounds.Left+(g.ClipBounds.Width - size.Width)/2,
+          g.ClipBounds.Top+(g.ClipBounds.Height - size.Height)/2);
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/StringValueBoxChartElementGenerator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/StringValueBoxChartElementGenerator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/StringValueBoxChartElementGenerator.cs	(revision 15691)
@@ -0,0 +1,86 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.BoxCharts {
+
+  [StorableClass]
+  public class StringValueBoxChartElementGenerator : EmptyBoxChartElementGenerator {
+
+    public ValueParameter<StringValue> ValueNameParameter {
+      get { return (ValueParameter<StringValue>)Parameters["ValueName"]; }
+    }
+    public ValueParameter<IntValue> FontSizeParameter {
+      get { return (ValueParameter<IntValue>) Parameters["FontSize"]; }
+    }
+
+    protected string ValueName { get { return ValueNameParameter.Value.Value; } }
+    protected int FontSize { get { return FontSizeParameter.Value.Value; }}
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected StringValueBoxChartElementGenerator(bool deserializing) : base(deserializing) { }
+    protected StringValueBoxChartElementGenerator(StringValueBoxChartElementGenerator original, Cloner cloner) : base(original, cloner) {
+      RegisterEvents();
+    }
+    public StringValueBoxChartElementGenerator() {
+      Parameters.Add(new ValueParameter<StringValue>("ValueName", "The name of the result of parameter ot be visualized.", new StringValue("Value")));
+      Parameters.Add(new ValueParameter<IntValue>("FontSize", "The font size to be used for the text.", new IntValue(11)));
+      RegisterEvents();
+      if (GetType() == typeof(StringValueBoxChartElementGenerator))
+        UpdateName();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StringValueBoxChartElementGenerator(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+    #endregion
+
+    private void RegisterEvents() {
+      ValueNameParameter.ToStringChanged += new EventHandler(Parameters_Changed);
+      FontSizeParameter.ToStringChanged += new EventHandler(Parameters_Changed);
+    }
+
+    private void Parameters_Changed(object sender, EventArgs eventArgs) {
+      UpdateName();
+    }
+
+    protected override string CalculateName() {
+      return string.Format("{0} str {1}", base.CalculateName(), ValueName);
+    }
+
+    private string GetValue(IRun run) {
+      IItem value;
+      run.Results.TryGetValue(ValueName, out value);
+      if (value != null)
+        return value.ToString();
+      run.Parameters.TryGetValue(ValueName, out value);
+      if (value != null)
+        return value.ToString();
+      return "";
+    }
+
+    public override void Draw(IRun run, Graphics g) {
+      var value = GetValue(run);
+      using(var font = new Font("Helvetica", FontSize)) {
+        var size = g.MeasureString(value, font);
+        g.DrawString(value, font, Brushes.Black,
+          g.ClipBounds.Left+(g.ClipBounds.Width - size.Width)/2,
+          g.ClipBounds.Top+(g.ClipBounds.Height - size.Height)/2);
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/ColorGradient.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/ColorGradient.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/ColorGradient.cs	(revision 15691)
@@ -0,0 +1,47 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  public class ColorGradient {
+
+    private SortedList<double, Color> colors;
+
+    public ColorGradient() {
+      Clear();
+    }
+
+    public void Clear() {
+      colors = new SortedList<double, Color>();
+    }
+
+    public Color this[double index] {
+      get {
+        if (colors.Count == 0)
+          throw new KeyNotFoundException();
+        KeyValuePair<double, Color> lower = colors.First();
+        if (index < lower.Key)
+          return lower.Value;
+        foreach (var upper in colors) {
+          if (upper.Key == index)
+            return upper.Value;
+          if (upper.Key > index) {
+            double alpha = (index - lower.Key) / (upper.Key - lower.Key);
+            return Color.FromArgb(
+              (int)Math.Round(upper.Value.A * alpha + lower.Value.A * (1 - alpha)),
+              (int)Math.Round(upper.Value.R * alpha + lower.Value.R * (1 - alpha)),
+              (int)Math.Round(upper.Value.G * alpha + lower.Value.G * (1 - alpha)),
+              (int)Math.Round(upper.Value.B * alpha + lower.Value.B * (1 - alpha)));
+          }
+          lower = upper;
+        }
+        return colors.Last().Value;
+      }
+      set {
+        colors[index] = value;
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DataTables/AutoCorrelationTable.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DataTables/AutoCorrelationTable.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DataTables/AutoCorrelationTable.cs	(revision 15691)
@@ -0,0 +1,26 @@
+﻿
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+namespace HeuristicLab.Analysis.FitnessLandscape.DataTables {
+
+  [Item("AutoCorrelationTable", "DataTable that contains a series with the auto correlation function")]
+  [StorableClass]
+  public class AutoCorrelationTable : DataTable {
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected AutoCorrelationTable(bool deserializing) : base(deserializing) { }
+    protected AutoCorrelationTable(AutoCorrelationTable original, Cloner cloner) : base(original, cloner) { }
+    public AutoCorrelationTable() : base() { }
+    public AutoCorrelationTable(string name) : base(name) { }
+    public AutoCorrelationTable(string name, string description) : base(name, description) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AutoCorrelationTable(this, cloner);
+    }
+    #endregion
+
+  }
+
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DataTables/InformationAnalysisTable.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DataTables/InformationAnalysisTable.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DataTables/InformationAnalysisTable.cs	(revision 15691)
@@ -0,0 +1,25 @@
+﻿
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+namespace HeuristicLab.Analysis.FitnessLandscape.DataTables {
+
+  [Item("InformationAnalysisTable", "DataTable that contains series with results of an information analysis")]
+  [StorableClass]
+  public class InformationAnalysisTable : DataTable {
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected InformationAnalysisTable(bool deserializing) : base(deserializing) { }
+    protected InformationAnalysisTable(InformationAnalysisTable original, Cloner cloner) : base(original, cloner) { }
+    public InformationAnalysisTable() : base() { }
+    public InformationAnalysisTable(string name) : base(name) { }
+    public InformationAnalysisTable(string name, string description) : base(name, description) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InformationAnalysisTable(this, cloner);
+    }
+    #endregion
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DataTables/InformationStabilityTable.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DataTables/InformationStabilityTable.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DataTables/InformationStabilityTable.cs	(revision 15691)
@@ -0,0 +1,25 @@
+﻿
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+namespace HeuristicLab.Analysis.FitnessLandscape.DataTables {
+
+  [Item("InformationStabiliyTable", "DataTable that contains a series with the development of information stability over time.")]
+  [StorableClass]
+  public class InformationStabilityTable : DataTable {
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected InformationStabilityTable(bool deserializing) : base(deserializing) { }
+    protected InformationStabilityTable(InformationStabilityTable original, Cloner cloner) : base(original, cloner) { }
+    public InformationStabilityTable() : base() { }
+    public InformationStabilityTable(string name) : base(name) { }
+    public InformationStabilityTable(string name, string description) : base(name, description) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InformationStabilityTable(this, cloner);
+    }
+    #endregion
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DataTables/QualityTrailSummaryTable.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DataTables/QualityTrailSummaryTable.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DataTables/QualityTrailSummaryTable.cs	(revision 15691)
@@ -0,0 +1,26 @@
+﻿
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+namespace HeuristicLab.Analysis.FitnessLandscape.DataTables {
+
+  [Item("QualityTrailSummaryTable", "DataTable that contains a compact description of the quality trail.")]
+  [StorableClass]
+  public class QualityTrailSummaryTable : DataTable {
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected QualityTrailSummaryTable(bool deserializing) : base(deserializing) { }
+    protected QualityTrailSummaryTable(QualityTrailSummaryTable original, Cloner cloner) : base(original, cloner) { }
+    public QualityTrailSummaryTable() : base() { }
+    public QualityTrailSummaryTable(string name) : base(name) { }
+    public QualityTrailSummaryTable(string name, string description) : base(name, description) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new QualityTrailSummaryTable(this, cloner);
+    }
+    #endregion
+
+  }
+
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DictionaryExtensions.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DictionaryExtensions.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DictionaryExtensions.cs	(revision 15691)
@@ -0,0 +1,24 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+  public static class DictionaryExtensions {
+    public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> d, TKey key, Func<TValue> provider) {
+      var value = provider();
+      d.TryGetValue(key, out value);
+      return value;
+    }
+    public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> d, TKey key, TValue def) {
+      var value = def;
+      d.TryGetValue(key, out value);
+      return value;
+    }
+    public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> d, TKey key) {
+      var value = default(TValue);
+      d.TryGetValue(key, out value);
+      return value;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DistanceCalculators/BinaryVectorDistanceCalculator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DistanceCalculators/BinaryVectorDistanceCalculator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DistanceCalculators/BinaryVectorDistanceCalculator.cs	(revision 15691)
@@ -0,0 +1,67 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using System.Drawing;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.DistanceCalculators {
+
+  [Item("BinaryVectorDistanceCalculator", "Calculates the hamming distance of two binary vectors")]
+  [StorableClass]
+  public class BinaryVectorDistanceCalculator : NamedItem, IItemDistanceCalculator {
+
+    #region Properties
+
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+    public static new Image StaticItemImage { get { return VSImageLibrary.Function; } }
+
+    #endregion
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected BinaryVectorDistanceCalculator(bool deserializing) : base(deserializing) { }
+
+    protected BinaryVectorDistanceCalculator(BinaryVectorDistanceCalculator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public BinaryVectorDistanceCalculator() {
+      name = ItemName;
+      description = ItemDescription;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BinaryVectorDistanceCalculator(this, cloner);
+    }
+
+    #endregion
+
+    #region IItemDistanceCalculator Members
+
+    public Type ItemType {
+      get { return typeof(BinaryVector); }
+    }
+
+    public double Distance(IItem x, IItem y) {
+      BinaryVector a = (BinaryVector)x;
+      BinaryVector b = (BinaryVector)y;
+      if (a.Length != b.Length)
+        throw new InvalidOperationException("Cannot compare vectors of different lengths");
+      double nEqualBits = 0;
+      for (int i = 0; i < a.Length; i++) {
+        if (a[i] == b[i])
+          nEqualBits++;
+      }
+      return Math.Max(a.Length, b.Length) - nEqualBits;
+    }
+
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DistanceCalculators/IItemDistanceCalculator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DistanceCalculators/IItemDistanceCalculator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DistanceCalculators/IItemDistanceCalculator.cs	(revision 15691)
@@ -0,0 +1,12 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.DistanceCalculators {
+  public interface IItemDistanceCalculator : IItem {
+    Type ItemType { get; }
+    double Distance(IItem a, IItem b);
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DistanceCalculators/PermutationDistanceCalculator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DistanceCalculators/PermutationDistanceCalculator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DistanceCalculators/PermutationDistanceCalculator.cs	(revision 15691)
@@ -0,0 +1,101 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using System.Drawing;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.DistanceCalculators {
+
+  [Item("PermutationDistanceCalculator", "Calculates the distance of two permutations")]
+  [StorableClass]
+  public class PermutationDistanceCalculator : NamedItem, IItemDistanceCalculator {
+
+    #region Properties
+
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+    public static new Image StaticItemImage { get { return VSImageLibrary.Function; } }
+
+    #endregion
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected PermutationDistanceCalculator(bool deserializing) : base(deserializing) { }
+
+    protected PermutationDistanceCalculator(PermutationDistanceCalculator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public PermutationDistanceCalculator() {
+      name = ItemName;
+      description = ItemDescription;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PermutationDistanceCalculator(this, cloner);
+    }
+
+    #endregion
+
+    #region IItemDistanceCalculator Members
+
+    public Type ItemType {
+      get { return typeof(Permutation); }
+    }
+
+    public double Distance(IItem x, IItem y) {
+      Permutation a = (Permutation)x;
+      Permutation b = (Permutation)y;
+      if (a.PermutationType != b.PermutationType)
+        throw new InvalidOperationException("Cannot compare two permutations of different type");
+      if (a.Length != b.Length)
+        throw new InvalidOperationException("Cannot compare vectors of different lengths");
+      switch (a.PermutationType) {
+        case PermutationTypes.Absolute: return AbsoluteDistance(a, b);
+        case PermutationTypes.RelativeDirected: return RelativeDistance(a, b);
+        case PermutationTypes.RelativeUndirected: return RelativeDistance(a, b);
+        default: throw new NotImplementedException("Unknown permutation type " + a.PermutationType);
+      }      
+    }
+
+    private double AbsoluteDistance(Permutation a, Permutation b) {
+      int mismatches = 0;
+      for (int i = 0; i<a.Length; i++) {
+        if (a[i] != b[i])
+          mismatches++;
+      }
+      return (double)mismatches;
+    }
+
+    private double RelativeDistance(Permutation a, Permutation b) {
+      HashSet<Point> edges = new HashSet<Point>();
+      for (int i = 0; i < a.Length; i++)
+        edges.Add(GetEdge(a, i));
+      int nCommonEdges = 0;
+      for (int i = 0; i < b.Length; i++) {
+        if (edges.Contains(GetEdge(b, i)))
+          nCommonEdges++;
+      }
+      return Math.Max(a.Length, b.Length) - nCommonEdges;
+    }
+
+    private static Point GetEdge(Permutation a, int index) {      
+      int start = a[index];
+      int end = a[(index + 1)%a.Length];
+      switch (a.PermutationType) {
+        case PermutationTypes.RelativeDirected: return new Point(start, end);
+        case PermutationTypes.RelativeUndirected: return new Point(Math.Min(start, end), Math.Max(start, end));
+        default: throw new ArgumentException("cannot derive edge from non-relative permutation type");
+      }
+    }
+
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DistanceCalculators/RealVectorDistanceCalculator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DistanceCalculators/RealVectorDistanceCalculator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/DistanceCalculators/RealVectorDistanceCalculator.cs	(revision 15691)
@@ -0,0 +1,69 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using System.Drawing;
+using HeuristicLab.Encodings.RealVectorEncoding;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.DistanceCalculators {
+
+  [Item("RealVectorDistanceCalculator", "Calculates the Euclidian distance of two real vectors")]
+  [StorableClass]
+  public class RealVectorDistanceCalculator: NamedItem, IItemDistanceCalculator {
+
+    #region Properties
+
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+    public static new Image StaticItemImage { get { return VSImageLibrary.Function; } }
+
+    #endregion
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected RealVectorDistanceCalculator(bool deserializing) : base(deserializing) { }
+
+    protected RealVectorDistanceCalculator(RealVectorDistanceCalculator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public RealVectorDistanceCalculator() {
+      name = ItemName;
+      description = ItemDescription;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RealVectorDistanceCalculator(this, cloner);
+    }
+
+    #endregion
+
+    #region IItemDistanceCalculator Members
+
+    public Type ItemType {
+      get { return typeof(BinaryVector); }
+    }
+
+    public double Distance(IItem x, IItem y) {
+      RealVector a = (RealVector )x;
+      RealVector b = (RealVector )y;
+      if (a.Length != b.Length)
+        throw new InvalidOperationException("Cannot compare vectors of different lengths");
+      double sqrSum = 0;
+      for (int i = 0; i < a.Length; i++) {
+        sqrSum = Sqr(a[i] - b[i]);
+      }
+      return Math.Sqrt(sqrSum);
+    }
+
+    private static double Sqr(double x) { return x*x; }
+
+    #endregion
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/EngineAlgorithm/EngineAlgorithmOperator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/EngineAlgorithm/EngineAlgorithmOperator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/EngineAlgorithm/EngineAlgorithmOperator.cs	(revision 15691)
@@ -0,0 +1,160 @@
+﻿using System;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Operators {
+
+  [Item("EngineAlgorithmOperator", "An operator the encapsulates a complete algorithm.")]
+  [StorableClass]
+  public class EngineAlgorithmOperator : AlgorithmOperator {
+
+    [Storable]
+    private OperatorGraph algorithmOperatorGraph;
+
+    [Storable]
+    protected EngineAlgorithm algorithm;
+    public EngineAlgorithm Algorithm {
+      get { return algorithm; }
+      set {
+        if (value == algorithm)
+          return;
+        if (algorithm != null) {
+          DeregisterAlgorithmEvents();
+          if (algorithmOperatorGraph != null)
+            DeregisterOperatorGraphEvents();
+          OperatorGraph.InitialOperator = null;
+          OperatorGraph.Operators.Clear();
+        }
+        algorithm = value;
+        OnAlgorithmChanged();
+        if (algorithm != null) {
+          foreach (IOperator op in algorithm.OperatorGraph.Operators)
+            OperatorGraph.Operators.Add(op);
+          OperatorGraph.InitialOperator = algorithm.OperatorGraph.InitialOperator;
+          RegisterAlgorithmEvents();
+          if (algorithm.OperatorGraph != null) {
+            algorithmOperatorGraph = algorithm.OperatorGraph;
+            RegisterOperatorGraphEvents();
+          }
+        }
+      }
+    }
+
+    #region Events
+    public event EventHandler AlgorithmChanged;
+
+    protected virtual void OnAlgorithmChanged() {
+      UpdateParameters();
+      EventHandler handler = AlgorithmChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+
+    private void RegisterAlgorithmEvents() {
+      algorithm.OperatorGraphChanged += algorithm_OperatorGraphChanged;
+      algorithm.ProblemChanged +=new EventHandler(algorithm_ProblemChanged);
+    }
+
+    void algorithm_ProblemChanged(object sender, EventArgs e) {
+      UpdateParameters();
+    }
+
+    private void DeregisterAlgorithmEvents() {
+      algorithm.OperatorGraphChanged -= algorithm_OperatorGraphChanged;
+    }
+
+    void algorithm_OperatorGraphChanged(object sender, EventArgs e) {
+      if (algorithmOperatorGraph != null)
+        DeregisterOperatorGraphEvents();
+      algorithmOperatorGraph = null;
+      if (algorithm.OperatorGraph != null) {
+        algorithmOperatorGraph = algorithm.OperatorGraph;
+        RegisterOperatorGraphEvents();
+      }
+    }
+
+    private void RegisterOperatorGraphEvents() {
+      algorithmOperatorGraph.InitialOperatorChanged += algorithmOperatorGraph_InitialOperatorChanged;
+      algorithmOperatorGraph.Operators.CollectionReset += algorithmOperatorGraph_Operators_Changed;
+      algorithmOperatorGraph.Operators.ItemsAdded += algorithmOperatorGraph_Operators_Changed;
+      algorithmOperatorGraph.Operators.ItemsRemoved += algorithmOperatorGraph_Operators_Changed;
+    }
+
+    private void DeregisterOperatorGraphEvents() {
+      algorithmOperatorGraph.InitialOperatorChanged -= algorithmOperatorGraph_InitialOperatorChanged;
+      algorithmOperatorGraph.Operators.CollectionReset -= algorithmOperatorGraph_Operators_Changed;
+      algorithmOperatorGraph.Operators.ItemsAdded -= algorithmOperatorGraph_Operators_Changed;
+      algorithmOperatorGraph.Operators.ItemsRemoved -= algorithmOperatorGraph_Operators_Changed;
+    }
+
+    void algorithmOperatorGraph_Operators_Changed(object sender, CollectionItemsChangedEventArgs<IOperator> e) {
+      OperatorGraph.Operators.Clear();
+      foreach (IOperator op in algorithmOperatorGraph.Operators) {
+        OperatorGraph.Operators.Add(op);
+      }
+    }
+
+    void algorithmOperatorGraph_InitialOperatorChanged(object sender, EventArgs e) {
+      OperatorGraph.InitialOperator = algorithmOperatorGraph.InitialOperator;
+    }
+
+    private void UpdateParameters() {
+      // TODO: match previously set parameter values
+      IOperator successor = Successor;
+      Parameters.Clear();
+      Parameters.Add(new OperatorParameter("Successor", successor));
+      var alg = Algorithm as IParameterizedItem;
+      foreach (var param in alg.Parameters) {
+        Parameters.Add(WrapParameter(param));
+      }
+      if (Algorithm.Problem != null) {
+        foreach (var param in Algorithm.Problem.Parameters) {
+          Parameters.Add(WrapParameter(param));
+        }
+      }
+      Parameters.Add(new ValueLookupParameter<NamedItemCollection<IResult>>("Results", "Results collection as passed through to the inner algorithn", "Results", false));
+    }
+
+    private static IValueLookupParameter WrapParameter(IParameter param) {
+      IValueLookupParameter v = (IValueLookupParameter)Activator.CreateInstance(typeof(ValueLookupParameter<>).MakeGenericType(param.DataType), new object[] { param.Name, param.Description });
+      v.ActualName = param.Name;
+      IValueParameter valueParam = param as IValueParameter;
+      if (valueParam != null)
+        v.Value = valueParam.Value;
+      return v;
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected EngineAlgorithmOperator(bool deserializing) : base(deserializing) { }
+    protected EngineAlgorithmOperator(EngineAlgorithmOperator original, Cloner cloner)
+      : base(original, cloner) {
+      this.algorithm = cloner.Clone(original.algorithm);
+      this.algorithmOperatorGraph = cloner.Clone(original.algorithmOperatorGraph);
+    }
+    public EngineAlgorithmOperator() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EngineAlgorithmOperator(this, cloner);
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      var alg = Algorithm as IParameterizedItem;
+      foreach (var param in alg.Parameters) {
+        param.ActualValue = Parameters[param.Name].ActualValue;
+      }
+      if (Algorithm.Problem != null) {
+        foreach (var param in Algorithm.Problem.Parameters) {
+          param.ActualValue = Parameters[param.Name].ActualValue;
+        }
+      }
+      return base.Apply();
+    }
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Evolvability/EvolvabilityAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Evolvability/EvolvabilityAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Evolvability/EvolvabilityAnalyzer.cs	(revision 15691)
@@ -0,0 +1,183 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Evolvability {
+
+  [Item("Evolvability Analyzer", "Compares two sets of scopes containing the original population and the evolved population generating several evolvability measures.")]
+  public class EvolvabilityAnalyzer : AlgorithmOperator, IAnalyzer {
+
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    #region Parameters
+    public LookupParameter<DoubleValue> QualityParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public LookupParameter<IntValue> SampleSizeParameter {
+      get { return (LookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+    public LookupParameter<HeatMap> EvolvabilityPlotParameter {
+      get { return (LookupParameter<HeatMap>)Parameters["EvolvabilityPlot"]; }
+    }
+    public LookupParameter<VariableCollection> ResultsParameter {
+      get { return (LookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    public LookupParameter<ScatterPlot> FitnessCloudParameter {
+      get { return (LookupParameter<ScatterPlot>)Parameters["FitnessCloud"]; }
+    }
+    public LookupParameter<DataTable> EvolvabilityPortraitParameter {
+      get { return (LookupParameter<DataTable>)Parameters["EvolvabilityPortrait"]; }
+    }
+    public ValueLookupParameter<IntValue> NrOfBinsParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["NrOfBins"]; }
+    }
+    public ScopeParameter ScopeParameter {
+      get { return (ScopeParameter)Parameters["Scope"]; }
+    }
+    #endregion
+
+    #region Constructors
+    public EvolvabilityAnalyzer() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The qualities of evolved and unevolved solution candidates"));
+      Parameters.Add(new LookupParameter<IntValue>("SampleSize", "The number of samples or population size for evolvability analysis"));
+      Parameters.Add(new LookupParameter<HeatMap>("EvolvabilityPlot", "Collected evolvability values"));
+      Parameters.Add(new LookupParameter<VariableCollection>("Results", "The collection of all results of this algorithm"));
+      Parameters.Add(new LookupParameter<ScatterPlot>("FitnessCloud", "A fitness cloud of the original vs. evolved sample."));
+      Parameters.Add(new LookupParameter<DataTable>("EvolvabilityPortrait", "Evolvability Portrait as described in Smith et. al (2002). Evol Comput 10:1–34"));
+      Parameters.Add(new ValueLookupParameter<IntValue>("NrOfBins", "Nr of bins for evolvability portrait analysis", new IntValue(25)));
+      Parameters.Add(new ScopeParameter("Scope", "The current scope"));
+
+      var resultsCollector = new ResultsCollector();
+      resultsCollector.CollectedValues.Add(new LookupParameter<HeatMap>(EvolvabilityPlotParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<ScatterPlot>(FitnessCloudParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(EvolvabilityPortraitParameter.Name));
+
+      OperatorGraph.InitialOperator = resultsCollector;
+      resultsCollector.Successor = null;
+    }
+
+    [StorableConstructor]
+    protected EvolvabilityAnalyzer(bool deserializing) : base(deserializing) { }
+
+    protected EvolvabilityAnalyzer(EvolvabilityAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    #endregion
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvolvabilityAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var points = GenerateQualityPairs(ScopeParameter.ActualValue);
+      GetOrCreateEvolvabilityPlot().Add(points);
+      GetOrCreateScatterPlot().Add(points);
+      CreateEvolvabilityPortrait(ScopeParameter.ActualValue);
+      return base.Apply();
+    }
+
+    private IEnumerable<PointF> GenerateQualityPairs(IScope globalScope) {
+      foreach (IScope sampleScope in globalScope.SubScopes) {
+        double originalQuality = ((DoubleValue)sampleScope.Variables[QualityParameter.ActualName].Value).Value;
+        foreach (IScope evolvedScope in sampleScope.SubScopes) {
+          double evolvedQuality = ((DoubleValue)evolvedScope.Variables[QualityParameter.ActualName].Value).Value;
+          yield return new PointF((float)originalQuality, (float)evolvedQuality);
+        }
+      }
+    }
+
+    private HeatMap GetOrCreateEvolvabilityPlot() {
+      HeatMap evolvabilityPlot = EvolvabilityPlotParameter.ActualValue as HeatMap;
+      if (evolvabilityPlot == null) {
+        evolvabilityPlot = new HeatMap();
+        evolvabilityPlot.Name = "Evolvability";
+        EvolvabilityPlotParameter.ActualValue = evolvabilityPlot;
+      }
+      return evolvabilityPlot;
+    }
+
+    private ScatterPlot GetOrCreateScatterPlot() {
+      ScatterPlot scatterPlot = FitnessCloudParameter.ActualValue as ScatterPlot;
+      if (scatterPlot == null) {
+        scatterPlot = new ScatterPlot();
+        scatterPlot.Name = "Fitness Cloud";
+        scatterPlot.XAxisName = "Parent Fitness";
+        scatterPlot.YAxisName = "Offspring Fitness";
+        FitnessCloudParameter.ActualValue = scatterPlot;
+      }
+      return scatterPlot;
+    }
+
+    private DataTable GetOrCreateEvolvabilityPortrait() {
+      DataTable evolvabilityPortrait = EvolvabilityPortraitParameter.ActualValue as DataTable;
+      if (evolvabilityPortrait == null) {
+        evolvabilityPortrait = new DataTable("Evolvability Portrait");
+        evolvabilityPortrait.Rows.Add(new DataRow("E_a", "Probability of non-deleterious mutation"));
+        evolvabilityPortrait.Rows.Add(new DataRow("E_b", "Average expected offspring fitness"));
+        evolvabilityPortrait.Rows.Add(new DataRow("E_c", "Top offspring fitness"));
+        evolvabilityPortrait.Rows.Add(new DataRow("E_d", "Bottom offspring fitness"));
+        EvolvabilityPortraitParameter.ActualValue = evolvabilityPortrait;
+      }
+      return evolvabilityPortrait;
+    }
+
+    private double GetQuality(IScope scope) {
+      return ((DoubleValue)scope.Variables[QualityParameter.ActualName].Value).Value;
+    }
+
+    private void CreateEvolvabilityPortrait(IScope globalScope) {
+      DataTable table = GetOrCreateEvolvabilityPortrait();
+      var e_a = table.Rows["E_a"].Values;
+      var e_b = table.Rows["E_b"].Values;
+      var e_c = table.Rows["E_c"].Values;
+      var e_d = table.Rows["E_d"].Values;
+      var qualities = globalScope.SubScopes.Select(s => GetQuality(s));
+      double min = qualities.Min();
+      double max = qualities.Max();
+      double range = max - min;
+      double stepSize = range / NrOfBinsParameter.ActualValue.Value;
+      double threshold = min + stepSize;
+
+      int n_not_worse = 0;
+      int n = 0;
+      double totalOffspringQuality = 0;
+      double best = double.MinValue;
+      double worst = double.MaxValue;
+      foreach (IScope sampleScope in globalScope.SubScopes) {
+        double originalQuality = GetQuality(sampleScope);
+        foreach (IScope evolvedScope in sampleScope.SubScopes) {
+          double evolvedQuality = GetQuality(evolvedScope);
+          if (evolvedQuality >= originalQuality)
+            n_not_worse++;
+          n++;
+          totalOffspringQuality += evolvedQuality;
+          best = Math.Max(best, evolvedQuality);
+          worst = Math.Min(worst, evolvedQuality);
+        }
+        if (originalQuality > threshold) {
+          threshold += stepSize;
+          e_a.Add(1.0 * n_not_worse / n);
+          e_b.Add(totalOffspringQuality / n);
+          e_c.Add(best);
+          e_d.Add(worst);
+          n_not_worse = 0;
+          n = 0;
+          totalOffspringQuality = 0;
+          best = double.MinValue;
+          worst = double.MaxValue;
+        }
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Exhaustive/PermutationEnumerationManipulator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Exhaustive/PermutationEnumerationManipulator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Exhaustive/PermutationEnumerationManipulator.cs	(revision 15691)
@@ -0,0 +1,121 @@
+﻿#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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("PermutationEnumerationManipulator", "An operator that generates the next permutation based on lexicographic ordering.")]
+  [StorableClass]
+  public class PermutationEnumerationManipulator : PermutationManipulator {
+
+    public ValueLookupParameter<IntValue> NrOfStepsParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["NrOfSteps"]; }
+    }
+
+    [StorableConstructor]
+    protected PermutationEnumerationManipulator(bool deserializing) : base(deserializing) { }
+    protected PermutationEnumerationManipulator(PermutationEnumerationManipulator original, Cloner cloner) : base(original, cloner) { }
+    public PermutationEnumerationManipulator() {
+      Parameters.Add(new ValueLookupParameter<IntValue>("NrOfSteps", "The number of steps to advance the permutation.", new IntValue(1)));
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void EnsureParameterExists() {
+      if (!Parameters.ContainsKey("NrOfSteps"))
+        Parameters.Add(new ValueLookupParameter<IntValue>("NrOfSteps", "The number of steps to advance the permutation.", new IntValue(1)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PermutationEnumerationManipulator(this, cloner);
+    }
+
+    protected override void Manipulate(IRandom random, Permutation permutation) {
+      int steps = NrOfStepsParameter.ActualValue.Value;
+      if (steps < 0)
+        steps = random.Next(-steps)+1;
+      for (int i=0; i<steps; i++)
+        Advance(permutation);
+    }
+
+    public void Advance(Permutation p) {
+      Advance(p, 0, new bool[p.Length]);
+    }
+
+    public bool Advance(Permutation perm, int index, bool[] used) {
+      // cannot mutate length 1 permutations
+      if (index >= perm.Length)
+        return false;
+
+      // try to swap the last two positions
+      if (index == perm.Length - 2) {
+        if (perm[index] < perm[index + 1]) {
+          Swap(perm, index, index+1);
+          return true;
+        } else
+          return false;
+      }
+      used[perm[index]] = true;
+      if (Advance(perm, index + 1, used)) // try to advance later digits
+        return true;
+      used[perm[index]] = false;
+      for (int i = perm[index] + 1; i < perm.Length; i++) { // try to advance this digit
+        if (!used[i]) {
+          perm[index] = i;
+          used[i] = true;
+          Fill(perm, index + 1, used);
+          return true;
+        }
+      }
+      if (index == 0) { // wrap around
+        Fill(perm, 0, new bool[perm.Length]);
+        return true;
+      }
+      return false;
+    }
+
+    public static void Swap(Permutation p, int i, int j) {
+      int t = p[j];
+      p[j] = p[i];
+      p[i] = t;
+    }
+
+    private void Fill(Permutation perm, int startIndex, bool[] used) {
+      int j = 0;
+      for (int i = startIndex; i < perm.Length; i++) {
+        for (; j < used.Length; j++) {
+          if (!used[j]) {
+            perm[i] = j;
+            used[j] = true;
+            goto Done;
+          }
+        }
+        throw new InvalidOperationException("not enough elements left");
+      Done: ;
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/BinaryVectorFitnessDistanceCorrelationAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/BinaryVectorFitnessDistanceCorrelationAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/BinaryVectorFitnessDistanceCorrelationAnalyzer.cs	(revision 15691)
@@ -0,0 +1,80 @@
+﻿#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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("BinaryVectorFitnessDistanceCorrelationAnalyzer", "An operator that analyzes the correlation between fitness and distance to the best know solution for binary vector encoding")]
+  [StorableClass]
+  public class BinaryVectorFitnessDistanceCorrelationAnalyzer : FitnessDistanceCorrelationAnalyzer, IBinaryVectorOperator {
+
+    #region Parameters
+    public ScopeTreeLookupParameter<BinaryVector> BinaryVectorParameter {
+      get { return (ScopeTreeLookupParameter<BinaryVector>)Parameters["BinaryVector"]; }
+    }
+    public LookupParameter<BinaryVector> BestKnownSolution {
+      get { return (LookupParameter<BinaryVector>)Parameters["BestKnownSolution"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected BinaryVectorFitnessDistanceCorrelationAnalyzer(bool deserializing) : base(deserializing) { }
+    protected BinaryVectorFitnessDistanceCorrelationAnalyzer(BinaryVectorFitnessDistanceCorrelationAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public BinaryVectorFitnessDistanceCorrelationAnalyzer() {
+      Parameters.Add(new ScopeTreeLookupParameter<BinaryVector>("BinaryVector", "The real encoded solution"));
+      Parameters.Add(new LookupParameter<BinaryVector>("BestKnownSolution", "The best known solution"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BinaryVectorFitnessDistanceCorrelationAnalyzer(this, cloner);
+    }
+
+    public static double Distance(BinaryVector a, BinaryVector b) {
+      if (a.Length != b.Length)
+        throw new InvalidOperationException("Cannot compare vectors of different lengths");
+      double nEqualBits = 0;
+      for (int i = 0; i < a.Length; i++) {
+        if (a[i] == b[i])
+          nEqualBits++;
+      }
+      return Math.Max(a.Length, b.Length) - nEqualBits;
+    }
+
+
+    protected override IEnumerable<double> GetDistancesToBestKnownSolution() {
+      if (BinaryVectorParameter.ActualValue == null)
+        return new double[0];
+      BinaryVector bestKnownValue = BestKnownSolution.ActualValue;
+      if (bestKnownValue == null)
+        return BinaryVectorParameter.ActualValue.Select(v => 0d);
+      return BinaryVectorParameter.ActualValue.Select(v => Distance(v, bestKnownValue));
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/FitnessDistanceCorrelationAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/FitnessDistanceCorrelationAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/FitnessDistanceCorrelationAnalyzer.cs	(revision 15691)
@@ -0,0 +1,98 @@
+﻿#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.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [StorableClass]
+  public abstract class FitnessDistanceCorrelationAnalyzer : AlgorithmOperator, IAnalyzer {
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    #region Parameters
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ValueLookupParameter<ScatterPlot> FDCParameter {
+      get { return (ValueLookupParameter<ScatterPlot>)Parameters["FDC"]; }
+    }
+    public ValueLookupParameter<VariableCollection> ResultsParameter {
+      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected FitnessDistanceCorrelationAnalyzer(bool deserializing) : base(deserializing) { }
+    protected FitnessDistanceCorrelationAnalyzer(FitnessDistanceCorrelationAnalyzer original, Cloner cloner)
+      : base(original, cloner) { }
+
+    public FitnessDistanceCorrelationAnalyzer() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The quality of the solution"));
+      Parameters.Add(new ValueLookupParameter<ScatterPlot>("FDC", "The data table the stores all observed fitness/distance values"));
+      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The collection of all results of this algorithm"));
+
+      var resultsCollector = new ResultsCollector();
+      resultsCollector.CollectedValues.Add(new LookupParameter<ScatterPlot>(FDCParameter.Name));
+
+      OperatorGraph.InitialOperator = resultsCollector;
+      resultsCollector.Successor = null;
+    }
+
+    protected abstract IEnumerable<double> GetDistancesToBestKnownSolution();
+
+    public override IOperation Apply() {
+      ScatterPlot plot = FDCParameter.ActualValue;
+      if (plot == null) {
+        plot = new ScatterPlot();
+        plot.Name = "Fitness Distance Correlation";
+        plot.XAxisName = "Quality";
+        plot.YAxisName = "Distance";
+        FDCParameter.ActualValue = plot;
+      }
+      plot.Add(EnumerateFDC().ToList());
+      return base.Apply();
+    }
+
+    private IEnumerable<PointF> EnumerateFDC() {
+      var qualities = QualityParameter.ActualValue.Select(d => d.Value).ToList();
+      var distances = GetDistancesToBestKnownSolution().ToList();
+      if (qualities.Count == distances.Count) {
+        var qIt = qualities.GetEnumerator();
+        var dIt = distances.GetEnumerator();
+        while (qIt.MoveNext() && dIt.MoveNext()) {
+          yield return new PointF((float)qIt.Current, (float)dIt.Current);
+        }
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/HeatMap.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/HeatMap.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/HeatMap.cs	(revision 15691)
@@ -0,0 +1,97 @@
+﻿#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.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common.Resources;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("HeatMap", "A heat map of 2D data")]
+  [StorableClass]
+  public class HeatMap : NamedItem {
+
+    public static new Image StaticItemImage { get { return VSImageLibrary.Image; } }
+
+    #region Persistence
+
+    private IEnumerable<float> GetPointCoordinates() {
+      foreach (var p in points) {
+        yield return p.X;
+        yield return p.Y;
+      }
+    }
+
+    [Storable(Name = "Points")]
+    private List<float> PointsPersistence {
+      get {
+        return new List<float>(GetPointCoordinates());
+      }
+      set {
+        points = new List<PointF>();
+        var iter = value.GetEnumerator();
+        while (iter.MoveNext()) {
+          float x = iter.Current;
+          iter.MoveNext();
+          float y = iter.Current;
+          points.Add(new PointF(x, y));
+        }
+      }
+    }
+    #endregion
+
+    private List<PointF> points;
+    public IEnumerable<PointF> Points {
+      get { return points; }
+    }
+
+    public void Add(IEnumerable<PointF> points) {
+      this.points.AddRange(points);
+    }
+
+    [StorableConstructor]
+    protected HeatMap(bool deserializing) : base(deserializing) { }
+    protected HeatMap(HeatMap original, Cloner cloner)
+      : base(original, cloner) {
+      points = new List<PointF>(original.points.Select(p => new PointF(p.X, p.Y)));
+    }
+
+
+    public HeatMap() {
+      points = new List<PointF>();
+      Name = "Heat Map";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HeatMap(this, cloner);
+    }
+
+
+    internal void Clear() {
+      var oldPoints = points;
+      points = new List<PointF>();
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/PermutationFitnessDistanceCorrelationAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/PermutationFitnessDistanceCorrelationAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/PermutationFitnessDistanceCorrelationAnalyzer.cs	(revision 15691)
@@ -0,0 +1,107 @@
+﻿#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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("PermutationFitnessDistanceCorrelationAnalyzer", "An operator that analyzes the correlation between fitness and distance to the best know solution for permutation encoding")]
+  [StorableClass]
+  public class PermutationFitnessDistanceCorrelationAnalyzer : FitnessDistanceCorrelationAnalyzer, IPermutationOperator {
+
+    #region Parameters
+    public ScopeTreeLookupParameter<Permutation> PermutationParameter {
+      get { return (ScopeTreeLookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public LookupParameter<Permutation> BestKnownSolution {
+      get { return (LookupParameter<Permutation>)Parameters["BestKnownSolution"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected PermutationFitnessDistanceCorrelationAnalyzer(bool deserializing) : base(deserializing) { }
+    protected PermutationFitnessDistanceCorrelationAnalyzer(PermutationFitnessDistanceCorrelationAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public PermutationFitnessDistanceCorrelationAnalyzer() {
+      Parameters.Add(new ScopeTreeLookupParameter<Permutation>("Permutation", "The permutation encoded solution"));
+      Parameters.Add(new LookupParameter<Permutation>("BestKnownSolution", "The best known solution"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PermutationFitnessDistanceCorrelationAnalyzer(this, cloner);
+    }
+
+    private static Point GetEdge(Permutation a, int index) {
+      switch (a.PermutationType) {
+        case PermutationTypes.RelativeDirected:
+          return new Point(a[index], a[(index + 1) % a.Length]);
+        case PermutationTypes.RelativeUndirected:
+          return new Point(
+            Math.Min(a[index], a[(index + 1) % a.Length]),
+            Math.Max(a[index], a[(index + 1) % a.Length]));
+        default:
+          throw new ArgumentException("cannot derive edge from non-relative permutation type");
+      }
+    }
+
+    public static double Distance(Permutation a, Permutation b) {
+      if (a.PermutationType != b.PermutationType)
+        throw new ArgumentException(
+          "Cannot calculate distance between different permuatation types: " +
+          a.PermutationType + " and " + b.PermutationType);
+      if (a.PermutationType == PermutationTypes.Absolute) {
+        int nEqual = 0;
+        for (int i = 0; i < Math.Min(a.Length, b.Length); i++) {
+          if (a[i] == b[i])
+            nEqual++;
+        }
+        return Math.Max(a.Length, b.Length) - nEqual;
+      } else {
+        HashSet<Point> edges = new HashSet<Point>();
+        for (int i = 0; i < a.Length; i++)
+          edges.Add(GetEdge(a, i));
+        int nCommonEdges = 0;
+        for (int i = 0; i < b.Length; i++) {
+          if (edges.Contains(GetEdge(b, i)))
+            nCommonEdges++;
+        }
+        return Math.Max(a.Length, b.Length) - nCommonEdges;
+      }
+    }
+
+    protected override IEnumerable<double> GetDistancesToBestKnownSolution() {
+      if (PermutationParameter.ActualName == null)
+        return new double[0];
+      Permutation bestKnownValue = BestKnownSolution.ActualValue;
+      if (bestKnownValue == null)
+        return PermutationParameter.ActualValue.Select(v => 0d);
+      return PermutationParameter.ActualValue.Select(v => Distance(v, bestKnownValue));
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/QAPPermutationFitnessDistanceCorrelationAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/QAPPermutationFitnessDistanceCorrelationAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/QAPPermutationFitnessDistanceCorrelationAnalyzer.cs	(revision 15691)
@@ -0,0 +1,101 @@
+﻿#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.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("QAPPermutationFitnessDistanceCorrelationAnalyzer", "An operator that analyzes the correlation between fitness and distance to the best know solution for permutation encoding")]
+  [StorableClass]
+  public class QAPPermutationFitnessDistanceCorrelationAnalyzer : FitnessDistanceCorrelationAnalyzer, IPermutationOperator {
+
+    #region Parameters
+    public ScopeTreeLookupParameter<Permutation> PermutationParameter {
+      get { return (ScopeTreeLookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public LookupParameter<Permutation> BestKnownSolution {
+      get { return (LookupParameter<Permutation>)Parameters["BestKnownSolution"]; }
+    }
+    public ILookupParameter<DoubleMatrix> WeightsParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Weights"]; }
+    }
+    public ILookupParameter<DoubleMatrix> DistancesParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Distances"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected QAPPermutationFitnessDistanceCorrelationAnalyzer(bool deserializing) : base(deserializing) { }
+    protected QAPPermutationFitnessDistanceCorrelationAnalyzer(QAPPermutationFitnessDistanceCorrelationAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public QAPPermutationFitnessDistanceCorrelationAnalyzer() {
+      Parameters.Add(new ScopeTreeLookupParameter<Permutation>("Permutation", "The permutation encoded solution"));
+      Parameters.Add(new LookupParameter<Permutation>("BestKnownSolution", "The best known solution"));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Weights", "The weights matrix."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Distances", "The distances matrix."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new QAPPermutationFitnessDistanceCorrelationAnalyzer(this, cloner);
+    }
+
+    public static double Distance(Permutation a, Permutation b, DoubleMatrix weights, DoubleMatrix distances) {
+      Dictionary<string, int> alleles = new Dictionary<string, int>(a.Length * a.Length);
+      int distance = 0;
+      for (int x = 0; x < a.Length; x++) {
+        for (int y = 0; y < a.Length; y++) {
+          string alleleA = weights[x, y].ToString() + ">" + distances[a[x], a[y]].ToString();
+          string alleleB = weights[x, y].ToString() + ">" + distances[b[x], b[y]].ToString();
+          if (alleleA == alleleB) continue;
+
+          int countA = 1, countB = -1;
+          if (alleles.ContainsKey(alleleA)) countA += alleles[alleleA];
+          if (alleles.ContainsKey(alleleB)) countB += alleles[alleleB];
+
+          if (countA <= 0) distance--; // we've found in A an allele that was present in B
+          else distance++; // we've found in A a new allele
+          alleles[alleleA] = countA;
+
+          if (countB >= 0) distance--; // we've found in B an allele that was present in A
+          else distance++; // we've found in B a new allele
+          alleles[alleleB] = countB;
+        }
+      }
+      return distance;
+    }
+
+    protected override IEnumerable<double> GetDistancesToBestKnownSolution() {
+      if (PermutationParameter.ActualName == null)
+        return new double[0];
+      Permutation bestKnownValue = BestKnownSolution.ActualValue;
+      if (bestKnownValue == null)
+        return PermutationParameter.ActualValue.Select(v => 0d);
+      return PermutationParameter.ActualValue.Select(v => Distance(v, bestKnownValue, WeightsParameter.ActualValue, DistancesParameter.ActualValue));
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/RealVectorFitnessDistanceCorrelationAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/RealVectorFitnessDistanceCorrelationAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/RealVectorFitnessDistanceCorrelationAnalyzer.cs	(revision 15691)
@@ -0,0 +1,79 @@
+﻿#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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("RealVectorFitnessDistanceCorrelationAnalyzer", "An operator that analyzes the correlation between fitness and distance to the best know solution for real vector encoding")]
+  [StorableClass]
+  public class RealVectorFitnessDistanceCorrelationAnalyzer : FitnessDistanceCorrelationAnalyzer, IRealVectorOperator {
+
+    #region Parameters
+    public ScopeTreeLookupParameter<RealVector> RealVectorParameter {
+      get { return (ScopeTreeLookupParameter<RealVector>)Parameters["RealVector"]; }
+    }
+    public LookupParameter<RealVector> BestKnownSolution {
+      get { return (LookupParameter<RealVector>)Parameters["BestKnownSolution"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected RealVectorFitnessDistanceCorrelationAnalyzer(bool deserializing) : base(deserializing) { }
+    protected RealVectorFitnessDistanceCorrelationAnalyzer(RealVectorFitnessDistanceCorrelationAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public RealVectorFitnessDistanceCorrelationAnalyzer() {
+      Parameters.Add(new ScopeTreeLookupParameter<RealVector>("RealVector", "The real encoded solution"));
+      Parameters.Add(new LookupParameter<RealVector>("BestKnownSolution", "The best known solution"));
+      RealVectorParameter.ActualName = "Point";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RealVectorFitnessDistanceCorrelationAnalyzer(this, cloner);
+    }
+
+    public static double Distance(RealVector a, RealVector b) {
+      if (a.Length != b.Length)
+        throw new InvalidOperationException("Cannot compare vectors of different lengths");
+      double sum = 0;
+      for (int i = 0; i < a.Length; i++) {
+        sum += (a[i] - b[i]) * (a[i] - b[i]);
+      }
+      return Math.Sqrt(sum);
+    }
+
+    protected override IEnumerable<double> GetDistancesToBestKnownSolution() {
+      if (this.RealVectorParameter.ActualValue == null)
+        return new double[0];
+      RealVector bestKnownValue = BestKnownSolution.ActualValue;
+      if (bestKnownValue == null)
+        return RealVectorParameter.ActualValue.Select(v => 0d);
+      return RealVectorParameter.ActualValue.Select(v => Distance(v, bestKnownValue));
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/ScatterPlot.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/ScatterPlot.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/FDC/ScatterPlot.cs	(revision 15691)
@@ -0,0 +1,150 @@
+﻿#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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common.Resources;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  public class PointsEventArgs : EventArgs {
+    public IEnumerable<PointF> NewPoints { get; private set; }
+    public PointsEventArgs(IEnumerable<PointF> points) {
+      NewPoints = points.ToList();
+    }
+  }
+
+  [Item("ScatterPlot", "A scatter plot of 2D data")]
+  [StorableClass]
+  public class ScatterPlot : NamedItem {
+
+    public static new Image StaticItemImage { get { return VSImageLibrary.Image; } }
+
+    public event EventHandler<PointsEventArgs> PixelsChanged;
+    public event EventHandler AxisNameChanged;
+
+    protected virtual void OnPixelsChanged(IEnumerable<PointF> p) {
+      EventHandler<PointsEventArgs> handler = PixelsChanged;
+      if (handler != null)
+        handler(this, new PointsEventArgs(p));
+    }
+
+    protected virtual void OnAxesNameChanged() {
+      EventHandler handler = AxisNameChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+
+    private IEnumerable<float> GetPointCoordinates() {
+      foreach (var p in points) {
+        yield return p.X;
+        yield return p.Y;
+      }
+    }
+
+    [Storable]
+    private List<float> PointCoordinateList {
+      get {
+        return new List<float>(GetPointCoordinates());
+      }
+      set {
+        points = new HashSet<PointF>();
+        var iter = value.GetEnumerator();
+        while (iter.MoveNext()) {
+          float x = iter.Current;
+          iter.MoveNext();
+          float y = iter.Current;
+          points.Add(new PointF(x, y));
+        }
+      }
+    }
+
+    private HashSet<PointF> points;
+    public IEnumerable<PointF> Points {
+      get { return points; }
+    }
+
+    [Storable]
+    private string xAxisName;
+    public string XAxisName {
+      get { return xAxisName; }
+      set {
+        if (value == xAxisName) return;
+        xAxisName = value;
+        OnAxesNameChanged();
+      }
+    }
+
+    [Storable]
+    private string yAxisName;
+    public string YAxisName {
+      get { return yAxisName; }
+      set {
+        if (value == yAxisName) return;
+        yAxisName = value;
+        OnAxesNameChanged();
+      }
+    }
+
+    public void Add(IEnumerable<PointF> points) {
+      List<PointF> newPoints = new List<PointF>();
+      foreach (var p in points) {
+        if (this.points.Add(p))
+          newPoints.Add(p);
+      }
+      if (newPoints.Count > 0)
+        OnPixelsChanged(newPoints);
+    }
+
+    [StorableConstructor]
+    protected ScatterPlot(bool deserializing) : base(deserializing) { }
+    protected ScatterPlot(ScatterPlot original, Cloner cloner)
+      : base(original, cloner) {
+      points = new HashSet<PointF>(original.points.Select(p => new PointF(p.X, p.Y)));
+      xAxisName = original.xAxisName;
+      yAxisName = original.yAxisName;
+    }
+
+
+    public ScatterPlot() {
+      points = new HashSet<PointF>();
+      Name = "Scatter Plot";
+      xAxisName = "Fitness";
+      yAxisName = "Distance";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ScatterPlot(this, cloner);
+    }
+
+
+    internal void Clear() {
+      var oldPoints = points;
+      points = new HashSet<PointF>();
+      OnPixelsChanged(oldPoints);
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/HeuristicLab.Analysis.FitnessLandscape.csproj
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/HeuristicLab.Analysis.FitnessLandscape.csproj	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/HeuristicLab.Analysis.FitnessLandscape.csproj	(revision 15691)
@@ -0,0 +1,304 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Analysis.FitnessLandscape</RootNamespace>
+    <AssemblyName>HeuristicLab.Analysis.FitnessLandscape-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <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>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="ALGLIB-3.7.0, Version=3.7.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\..\trunk\bin\ALGLIB-3.7.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Operators-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Optimization.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.TestFunctions-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Problems.TestFunctions-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Selection-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Selection-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.IO.Compression" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Algorithms\RepeatedUpDownWalkAnalyzer.cs" />
+    <Compile Include="Algorithms\EvolvabilityAnalyzer.cs" />
+    <Compile Include="Algorithms\RepeatedInformationAnalyzer.cs" />
+    <Compile Include="Algorithms\RepeatMultiAnalyzer.cs" />
+    <Compile Include="Algorithms\RepeatedRuggednessAnalyzer.cs" />
+    <Compile Include="Algorithms\ScopeDuplicator.cs" />
+    <Compile Include="Analysis\Aggregators\BoundingBoxAggregator.cs" />
+    <Compile Include="Analysis\Aggregators\Aggregator.cs" />
+    <Compile Include="Analysis\Aggregators\AutoCorrelationAggregator.cs" />
+    <Compile Include="Analysis\Aggregators\UpDownAggregatorAggregator.cs" />
+    <Compile Include="Analysis\Aggregators\EvolvabilityAggregator.cs" />
+    <Compile Include="Analysis\Aggregators\InformationAnalysisPeakAggregator.cs" />
+    <Compile Include="Analysis\Aggregators\InformationAnalysisValueAggregator.cs" />
+    <Compile Include="Analysis\Aggregators\DistributionAnalyzer.cs" />
+    <Compile Include="Analysis\Aggregators\RuggednessAggregator.cs" />
+    <Compile Include="Analysis\Aggregators\QualityTrailSummaryAggregator.cs" />
+    <Compile Include="Analysis\Aggregators\InformationStabilityAggregator.cs" />
+    <Compile Include="Analysis\Aggregators\InformationAnalysisAggregator.cs" />
+    <Compile Include="Analysis\Aggregators\IAggregator.cs" />
+    <Compile Include="Algorithms\RepeatedLocalAnalysis.cs" />
+    <Compile Include="Analysis\UpDownWalkAnalyzer.cs" />
+    <Compile Include="Analysis\NeutralityAnalyzer.cs" />
+    <Compile Include="Analysis\QualityTrailSummarizer.cs" />
+    <Compile Include="Analysis\EnumerableExtensions.cs" />
+    <Compile Include="Analysis\FitnessCloudAnalyzer.cs" />
+    <Compile Include="Analysis\InformationAnalysis.cs" />
+    <Compile Include="Analysis\InformationAnalysisCalculator.cs" />
+    <Compile Include="Analysis\QualityTrailMultiAnalyzer.cs" />
+    <Compile Include="Analysis\RealVectorBoundingBoxUpdater.cs" />
+    <Compile Include="Analysis\RepeatAggregator.cs" />
+    <Compile Include="Analysis\RuggednessAnalyzer.cs" />
+    <Compile Include="Analysis\IQualityTrailAnalyzer.cs" />
+    <Compile Include="Algorithms\LocalAnalysis.cs" />
+    <Compile Include="Algorithms\LocalAnalysisMainLoop.cs" />
+    <Compile Include="Analysis\InformationAnalyzer.cs" />
+    <Compile Include="Analysis\RuggednessCalculator.cs" />
+    <Compile Include="Analysis\UniqueThresholdCalculator.cs" />
+    <Compile Include="BestWorstSelector.cs" />
+    <Compile Include="BoxChart\BoxChartCreator.cs" />
+    <Compile Include="BoxChart\ColorValue.cs" />
+    <Compile Include="BoxChart\RunCollectionMultiDiscretizer.cs" />
+    <Compile Include="BoxChart\ResultNamesCollector.cs" />
+    <Compile Include="BoxChart\StringValueBoxChartElementGenerator.cs" />
+    <Compile Include="BoxChart\IBoxChartElementGenerator.cs" />
+    <Compile Include="BoxChart\EmptyBoxChartElementGenerator.cs" />
+    <Compile Include="BoxChart\StringConstantBoxChartElementGenerator.cs" />
+    <Compile Include="BoxChart\DiscreteValueBoxChartElementGenerator.cs" />
+    <Compile Include="BoxChart\BitmapItem.cs" />
+    <Compile Include="ColorGradient.cs" />
+    <Compile Include="DictionaryExtensions.cs" />
+    <Compile Include="DistanceCalculators\RealVectorDistanceCalculator.cs" />
+    <Compile Include="DistanceCalculators\BinaryVectorDistanceCalculator.cs" />
+    <Compile Include="DistanceCalculators\PermutationDistanceCalculator.cs" />
+    <Compile Include="DistanceCalculators\IItemDistanceCalculator.cs" />
+    <Compile Include="IListExtensions.cs" />
+    <Compile Include="ListExtensions.cs" />
+    <Compile Include="NeutralSelector.cs" />
+    <Compile Include="DataTables\AutoCorrelationTable.cs" />
+    <Compile Include="EngineAlgorithm\EngineAlgorithmOperator.cs" />
+    <Compile Include="DataTables\QualityTrailSummaryTable.cs" />
+    <Compile Include="DataTables\InformationStabilityTable.cs" />
+    <Compile Include="DataTables\InformationAnalysisTable.cs" />
+    <Compile Include="Evolvability\EvolvabilityAnalyzer.cs" />
+    <Compile Include="FDC\QAPPermutationFitnessDistanceCorrelationAnalyzer.cs" />
+    <Compile Include="ScopePathLookupParameter.cs" />
+    <Compile Include="FDC\BinaryVectorFitnessDistanceCorrelationAnalyzer.cs" />
+    <Compile Include="FDC\HeatMap.cs" />
+    <Compile Include="HeuristicLabAnalysisFitnessLandscapePlugin.cs" />
+    <Compile Include="MultiTrajectory\GridRealVectorsCreator.cs" />
+    <Compile Include="MultiTrajectory\PreassignedPermutationCreator.cs" />
+    <Compile Include="MultiTrajectory\MultiTrajectoryAnalysis.cs" />
+    <Compile Include="MultiTrajectory\PreassignedRealVectorCreator.cs" />
+    <Compile Include="MultiTrajectory\PreassignedBinaryVectorCreator.cs" />
+    <Compile Include="MultiTrajectory\PreassignedSolutionCreator.cs" />
+    <Compile Include="PopDist\PopulationDistributionAnalyzer.cs" />
+    <Compile Include="Exhaustive\PermutationEnumerationManipulator.cs" />
+    <Compile Include="FDC\PermutationFitnessDistanceCorrelationAnalyzer.cs" />
+    <Compile Include="TestFunctions\CustomAdditiveMoveEvaluator.cs" />
+    <Compile Include="TestFunctions\CustomEvaluator.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="FDC\RealVectorFitnessDistanceCorrelationAnalyzer.cs" />
+    <Compile Include="FDC\FitnessDistanceCorrelationAnalyzer.cs" />
+    <None Include="HeuristicLabAnalysisFitnessLandscapePlugin.cs.frame" />
+    <Compile Include="FDC\ScatterPlot.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </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>
+  <ItemGroup />
+  <Import Project="$(MSBuildToolsPath)\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>
+    <PostBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+set Platform=$(PlatformName)
+set Configuration=$(ConfigurationName)</PostBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\Properties\AssemblyInfo.cs.frame" "%25ProjectDir%25\Properties\AssemblyInfo.cs"
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\HeuristicLabAnalysisFitnessLandscapePlugin.cs.frame" "%25ProjectDir%25\HeuristicLabAnalysisFitnessLandscapePlugin.cs"</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/HeuristicLabAnalysisFitnessLandscapePlugin.cs.frame
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/HeuristicLabAnalysisFitnessLandscapePlugin.cs.frame	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/HeuristicLabAnalysisFitnessLandscapePlugin.cs.frame	(revision 15691)
@@ -0,0 +1,47 @@
+﻿#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.Analysis.FitnessLandscape {
+
+  [Plugin("HeuristicLab.Analysis.FitnessLandscape", "3.3.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Analysis.FitnessLandscape-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.7")]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+  [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.BinaryVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.RealVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]  
+  [PluginDependency("HeuristicLab.Problems.TestFunctions", "3.3")]  
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  [PluginDependency("HeuristicLab.Selection", "3.3")]
+  public class HeuristicLabAnalysisFitnessLandscapePlugin : PluginBase { }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/IListExtensions.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/IListExtensions.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/IListExtensions.cs	(revision 15691)
@@ -0,0 +1,20 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+  public static class IListExtensions {
+    public static void Shuffle<T>(this IList<T> list, IRandom random) {
+      int n = list.Count;
+      while (n > 1) {
+        n--;
+        int k = random.Next(n + 1);
+        T value = list[k];
+        list[k] = list[n];
+        list[n] = value;
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/ListExtensions.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/ListExtensions.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/ListExtensions.cs	(revision 15691)
@@ -0,0 +1,15 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+  public static class ListExtensions {
+    public static void DuplicateLast<T>(this IList<T> l) {
+      l.Add(l[l.Count-1]);
+    }
+    public static T Last<T>(this IList<T> l) {
+      return l[l.Count - 1];
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/GridRealVectorsCreator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/GridRealVectorsCreator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/GridRealVectorsCreator.cs	(revision 15691)
@@ -0,0 +1,150 @@
+﻿#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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("GridRealVectorsCreator", "An operator that creates solutions on a grid accross the whole solution space.")]
+  [StorableClass]
+  public sealed class GridRealVectorCreator : SingleSuccessorOperator {
+
+    #region Parameters
+    public ValueLookupParameter<IntValue> NumberOfSolutionsParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["NumberOfSolutions"]; }
+    }
+    public LookupParameter<IntValue> ProblemSizeParameter {
+      get { return (LookupParameter<IntValue>)Parameters["ProblemSize"]; }
+    }
+    public ValueLookupParameter<DoubleMatrix> BoundsParameter {
+      get { return (ValueLookupParameter<DoubleMatrix>)Parameters["Bounds"]; }
+    }
+    private ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+    public LookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public LookupParameter<RealVector> RealVectorParameter {
+      get { return (LookupParameter<RealVector>)Parameters["RealVector"]; }
+    }
+    #endregion
+
+    #region Parameter Values
+    public IScope CurrentScope {
+      get { return CurrentScopeParameter.ActualValue; }
+    }
+    public int NumberOfSolutions {
+      get { return NumberOfSolutionsParameter.ActualValue.Value; }
+    }
+    public DoubleMatrix Bounds {
+      get { return BoundsParameter.ActualValue; }
+    }
+    public IRandom Random {
+      get { return RandomParameter.ActualValue; }
+    }
+    public int ProblemSize {
+      get { return ProblemSizeParameter.ActualValue.Value; }
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    private GridRealVectorCreator(bool deserializing) : base(deserializing) { }
+    private GridRealVectorCreator(GridRealVectorCreator original, Cloner cloner) : base(original, cloner) { }
+    public GridRealVectorCreator()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IntValue>("NumberOfSolutions", "The number of solutions that should be created."));
+      Parameters.Add(new ValueLookupParameter<DoubleMatrix>("Bounds", "The minimum and maximum values in each dimension."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope to which the new solutions are added as sub-scopes."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "Random number generator for sampling large grids."));
+      Parameters.Add(new LookupParameter<IntValue>("ProblemSize", "The number of dimensions"));
+      Parameters.Add(new LookupParameter<RealVector>("RealVector", "The real vector to be created in every scope."));
+      RealVectorParameter.ActualName = "Point";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GridRealVectorCreator(this, cloner);
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      string realVectorName = RealVectorParameter.TranslatedName;
+      int current = CurrentScope.SubScopes.Count;
+      for (int i = 0; i < NumberOfSolutions; i++)
+        CurrentScope.SubScopes.Add(new Scope((current + i).ToString()));
+      double[] ranges = Enumerable.Range(0, Bounds.Rows).Select(i => Math.Abs(Bounds[i, 0]-Bounds[i, 1])).ToArray();
+      double[] offsets = Enumerable.Range(0, Bounds.Rows).Select(i => Math.Min(Bounds[i, 0], Bounds[i, 1])).ToArray();
+      foreach (RealVector vector in GenerateGridSample(ProblemSize, NumberOfSolutions)) {
+        for (int i = 0; i<ProblemSize; i++) {
+          vector[i] = vector[i] * ranges[i % ranges.Length] + offsets[i % ranges.Length];
+        }
+        CurrentScope.SubScopes[current].Variables.Add(new Variable(realVectorName, vector));
+        current++;
+      }
+      return base.Apply();
+    }
+
+    public IEnumerable<RealVector> GenerateGridSample(int nDim, int nVectors) {
+      int nPoints = (int)Math.Max(Math.Ceiling(Math.Pow(nVectors, 1.0/nDim)), 3);
+      double nPossibleSamples = Math.Pow(nPoints, nDim);
+      if (nVectors > nPossibleSamples)
+        throw new InvalidOperationException(string.Format("Number of samples ({0}) exceeds number of possible samples ({1})", nVectors, nPossibleSamples));
+      if (nPossibleSamples < nVectors * 2) {
+        if (nPossibleSamples > (double)int.MaxValue)
+          throw new InvalidOperationException("Cannot exhaustivly generate more than int.MaxValue samples");
+        List<RealVector> vectors = new List<RealVector>();
+        for (int i = 0; i<nPossibleSamples; i++) {
+          RealVector newVector = new RealVector(nDim);
+          int index = i;
+          for (int j = 0; j<nDim; j++) {
+            newVector[j] = 1.0 * (index % nPoints) / (nPoints-1);
+            index /= nPoints;
+          }
+          vectors.Add(newVector);
+        }
+        while (vectors.Count > nVectors) {
+          vectors.RemoveAt(Random.Next(vectors.Count));
+        }
+        return vectors;
+      } else {
+        HashSet<RealVector> vectors = new HashSet<RealVector>();
+        while (vectors.Count < nVectors) {
+          RealVector newVector = new RealVector(nDim);
+          for (int i = 0; i<nDim; i++) {
+            newVector[i] = 1.0 * Random.Next(nPoints) / (nPoints-1);
+          }
+          vectors.Add(newVector);
+        }
+        return vectors;
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/MultiTrajectoryAnalysis.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/MultiTrajectoryAnalysis.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/MultiTrajectoryAnalysis.cs	(revision 15691)
@@ -0,0 +1,704 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Threading;
+using System.Threading.Tasks;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.MultiTrajectory {
+
+  [Item("Multi Trajectory Analysis", "Host for performing and aggregating several algorithm runs for an overarching analysis.")]
+  [Creatable("Analysis")]
+  [StorableClass]
+  public class MultiTrajectoryAnalysis : ParameterizedNamedItem, IAlgorithm, IStorableContent {
+
+    public IEnumerable<IOptimizer> NestedOptimizers {
+      get {
+        if (Algorithm != null)
+          yield return Algorithm;
+        if (SampleGenerationAlgorithm != null)
+          yield return SampleGenerationAlgorithm;
+      }
+    }
+
+    #region Parameters
+    public OperatorParameter PreassignedSolutionCreatorParameter {
+      get { return (OperatorParameter)Parameters["PreassignedSolutionCreator"]; }
+    }
+    public ValueParameter<IntValue> NrOfSamplesParameter {
+      get { return (ValueParameter<IntValue>)Parameters["NrOfSamples"]; }
+    }
+    public ValueParameter<BoolValue> SaveIndividualTrailsParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["SaveIndividualTrails"]; }
+    }
+    public ValueParameter<BoolValue> PrepareAfterStopParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["PrepareAfterStop"]; }
+    }
+    public ValueParameter<CheckedItemList<IAggregator>> AggregatorsParameter {
+      get { return (ValueParameter<CheckedItemList<IAggregator>>)Parameters["Aggregators"]; }
+    }
+
+
+    #endregion
+
+    #region Parameter Values
+    public PreassignedSolutionCreator PreassignedSolutionCreator {
+      get { return (PreassignedSolutionCreator)PreassignedSolutionCreatorParameter.Value; }
+      set { PreassignedSolutionCreatorParameter.Value = value; }
+    }
+    public IntValue NrOfSamples {
+      get { return NrOfSamplesParameter.Value; }
+    }
+    public bool SaveIndividualTrails {
+      get { return SaveIndividualTrailsParameter.Value.Value; }
+    }
+    public bool PrepareAfterStop {
+      get { return PrepareAfterStopParameter.Value.Value; }
+    }
+    public CheckedItemList<IAggregator> Aggregators {
+      get { return AggregatorsParameter.Value; }
+    }
+    #endregion
+
+    #region Construction and Cloning
+    [StorableConstructor]
+    protected MultiTrajectoryAnalysis(bool deserializing)
+      : base(deserializing) {
+      RegisterEvents();
+    }
+    protected MultiTrajectoryAnalysis(MultiTrajectoryAnalysis original, Cloner cloner)
+      : base(original, cloner) {
+      algorithm = cloner.Clone(original.algorithm);
+      currentAlgorithm = cloner.Clone(original.currentAlgorithm);
+      executionBaseTime = new TimeSpan(original.executionBaseTime.Ticks);
+      executionTime = new TimeSpan(original.executionTime.Ticks);
+      results = cloner.Clone(original.results);
+      running = original.running;
+      preparing = original.preparing;
+      runs = cloner.Clone(original.runs);
+      sampleGenerationAlgorithm = cloner.Clone(original.sampleGenerationAlgorithm);
+      StepNr = original.StepNr;
+      storeAlgorithmInEachRun = original.storeAlgorithmInEachRun;
+      subAlgorithmRuns = cloner.Clone(original.subAlgorithmRuns);
+      RegisterEvents();
+    }
+    public MultiTrajectoryAnalysis() {
+      Parameters.Add(new OperatorParameter("PreassignedSolutionCreator", "The operator that creates new solutions"));
+      Parameters.Add(new ValueParameter<IntValue>("NrOfSamples", "The number of samples to generate.", new IntValue(10)));
+      Parameters.Add(new ValueParameter<BoolValue>("SaveIndividualTrails", "Include all sub algorithm runs in the final run", new BoolValue(true)));
+      Parameters.Add(new ValueParameter<BoolValue>("PrepareAfterStop", "Automatically prepare algorithm after stopping to clean global scope and results (for large experiments)", new BoolValue(false)));
+      Parameters.Add(new ValueParameter<CheckedItemList<IAggregator>>("Aggregators", "List of aggretators for combining trajectory results.", new CheckedItemList<IAggregator>()));
+      currentAlgorithm = null;
+      algorithm = null;
+      executionBaseTime = new TimeSpan();
+      executionTime = new TimeSpan();
+      results = new ResultCollection();
+      running = false;
+      runs = new RunCollection();
+      sampleGenerationAlgorithm = null;
+      StepNr = -1;
+      storeAlgorithmInEachRun = false;
+      Aggregators.AddRange(ApplicationManager.Manager.GetInstances<IAggregator>());
+      RegisterEvents();
+      Prepare();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiTrajectoryAnalysis(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (algorithm != null && sampleGenerationAlgorithm != null) {
+        if (sampleGenerationAlgorithm.Problem == null) {
+          sampleGenerationAlgorithm.Problem = algorithm.Problem;
+        } else {
+          algorithm.Problem = sampleGenerationAlgorithm.Problem;
+        }
+      }
+      if (!Parameters.ContainsKey("Aggregators"))
+        Parameters.Add(new ValueParameter<CheckedItemList<IAggregator>>(
+          "Aggregators", "List of aggregators for combining trajectory results.",
+          new CheckedItemList<IAggregator>(ApplicationManager.Manager.GetInstances<IAggregator>())));
+      RegisterEvents();
+    }
+    #endregion
+
+    #region Fields & Properties
+
+    public new static Image StaticItemImage { get { return VSImageLibrary.Event; } }
+
+    public override Image ItemImage {
+      get {
+        switch (ExecutionState) {
+          case ExecutionState.Prepared: return VSImageLibrary.ExecutablePrepared;
+          case ExecutionState.Started: return VSImageLibrary.ExecutableStarted;
+          case ExecutionState.Paused: return VSImageLibrary.ExecutablePaused;
+          case ExecutionState.Stopped: return VSImageLibrary.ExecutableStopped;
+          default: return base.ItemImage;
+        }
+      }
+    }
+
+    [Storable]
+    private RunCollection subAlgorithmRuns;
+
+    public new ParameterCollection Parameters {
+      get { return base.Parameters; }
+    }
+
+    public Type ProblemType { get { return typeof(IHeuristicOptimizationProblem); } }
+    public string Filename { get; set; }
+
+    [Storable]
+    private IProblem preliminaryProblem;
+    public IProblem Problem {
+      get { return preliminaryProblem ?? algorithm.Problem; }
+      set {
+        if (ExecutionState != ExecutionState.Prepared && ExecutionState != ExecutionState.Stopped)
+          throw new InvalidOperationException("Cannot change algorithm while running or paused.");
+        if (algorithm == null)
+          preliminaryProblem = value;
+        else
+          algorithm.Problem = value;
+      }
+    }
+
+    [Storable]
+    private IAlgorithm algorithm;
+    public IAlgorithm Algorithm {
+      get { return algorithm; }
+      set {
+        if (algorithm == value)
+          return;
+        if (algorithm != null) {
+          DeregisterAlgorithmEvents();
+          ReuseOldProblem(algorithm, value);
+        }
+        algorithm = value;
+        if (algorithm != null) {
+          SyncAlgorithmProblems(algorithm, sampleGenerationAlgorithm);
+          RegisterAlgorithmEvents();
+        }
+        OnAlgorithmChanged();
+      }
+    }
+
+    [Storable]
+    private IAlgorithm sampleGenerationAlgorithm;
+    public IAlgorithm SampleGenerationAlgorithm {
+      get { return sampleGenerationAlgorithm; }
+      set {
+        if (sampleGenerationAlgorithm == value)
+          return;
+        if (sampleGenerationAlgorithm != null) {
+          DeregisterSampleGenerationAlgorithmEvents();
+          ReuseOldProblem(sampleGenerationAlgorithm, value);
+        }
+        sampleGenerationAlgorithm = value;
+        if (sampleGenerationAlgorithm != null) {
+          SyncAlgorithmProblems(sampleGenerationAlgorithm, algorithm);
+          RegisterSampleGenerationAlgorithmEvents();
+        }
+        OnSampleGenerationAlgorithmChanged();
+      }
+    }
+
+    private static void ReuseOldProblem(IAlgorithm oldAlgorithm, IAlgorithm newValue) {
+      if (oldAlgorithm.Problem != null && newValue != null && newValue.Problem == null)
+        newValue.Problem = oldAlgorithm.Problem;
+    }
+
+    private void SyncAlgorithmProblems(IAlgorithm newAlgorithm, IAlgorithm otherAlgorithm) {
+      if (otherAlgorithm != null) {
+        if (otherAlgorithm.Problem != null) {
+          newAlgorithm.Problem = otherAlgorithm.Problem;
+        } else {
+          otherAlgorithm.Problem = newAlgorithm.Problem;
+        }
+      } else {
+        if (preliminaryProblem != null) {
+          newAlgorithm.Problem = preliminaryProblem;
+          preliminaryProblem = null;
+        }
+      }
+    }
+
+    [Storable]
+    private RunCollection runs;
+    public RunCollection Runs {
+      get { return runs; }
+    }
+
+    [Storable]
+    private ResultCollection results;
+    public ResultCollection Results {
+      get { return results; }
+    }
+
+    [Storable]
+    private bool storeAlgorithmInEachRun;
+    public bool StoreAlgorithmInEachRun {
+      get { return storeAlgorithmInEachRun; }
+      set {
+        if (storeAlgorithmInEachRun == value)
+          return;
+        storeAlgorithmInEachRun = value;
+        OnStoreAlgorithmInEachRunChanged();
+      }
+    }
+
+    [Storable]
+    private ExecutionState executionState;
+    public ExecutionState ExecutionState {
+      get { return executionState; }
+      set {
+        if (executionState == value)
+          return;
+        executionState = value;
+        OnExecutionStateChanged();
+        OnItemImageChanged();
+      }
+    }
+
+    [Storable]
+    private TimeSpan executionBaseTime;
+    [Storable]
+    private TimeSpan executionTime;
+    public TimeSpan ExecutionTime {
+      get { return executionTime; }
+      set {
+        if (executionTime == value)
+          return;
+        executionTime = value;
+        OnExecutionTimeChanged();
+      }
+    }
+
+    #endregion
+
+    #region Events
+    public event EventHandler AlgorithmChanged;
+    public event EventHandler SampleGenerationAlgorithmChanged;
+    public event EventHandler ProblemChanged;
+    public event EventHandler StoreAlgorithmInEachRunChanged;
+    public event EventHandler<EventArgs<Exception>> ExceptionOccurred;
+    public event EventHandler ExecutionStateChanged;
+    public event EventHandler ExecutionTimeChanged;
+    public event EventHandler Paused;
+    public event EventHandler Prepared;
+    public event EventHandler Started;
+    public event EventHandler Stopped;
+
+    #region firing
+    protected virtual void OnAlgorithmChanged() {
+      EventHandler handler = AlgorithmChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+    protected virtual void OnSampleGenerationAlgorithmChanged() {
+      EventHandler handler = SampleGenerationAlgorithmChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+    protected virtual void OnProblemChanged() {
+      SelectPreassignedSolutionCreator();
+      EventHandler handler = ProblemChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+    protected virtual void OnStoreAlgorithmInEachRunChanged() {
+      EventHandler handler = StoreAlgorithmInEachRunChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+    protected virtual void OnExceptionOccurred(Exception args) {
+      EventHandler<EventArgs<Exception>> handler = ExceptionOccurred;
+      if (handler != null)
+        handler(this, new EventArgs<Exception>(args));
+    }
+    protected virtual void OnExecutionStateChanged() {
+      EventHandler handler = ExecutionStateChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+      switch (ExecutionState) {
+        case ExecutionState.Prepared: OnPrepared(); break;
+        case ExecutionState.Started: OnStarted(); break;
+        case ExecutionState.Paused: OnPaused(); break;
+        case ExecutionState.Stopped: OnStopped(); break;
+      }
+    }
+    protected virtual void OnExecutionTimeChanged() {
+      EventHandler handler = ExecutionTimeChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+    protected virtual void OnPaused() {
+      EventHandler handler = Paused;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+    protected virtual void OnPrepared() {
+      EventHandler handler = Prepared;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+    protected virtual void OnStarted() {
+      EventHandler handler = Started;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+    protected virtual void OnStopped() {
+      AggregateResults();
+      ClearSubAlgorithms();
+      CreateRun();
+      EventHandler handler = Stopped;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+      if (PrepareAfterStop) {
+        Prepare();
+        executionState = ExecutionState.Stopped;
+      }
+    }
+    #endregion
+    #endregion
+
+    public void CollectResultValues(IDictionary<string, IItem> values) {
+      values.Add("Execution Time", new TimeSpanValue(ExecutionTime));
+      values.Add("Time of Execution", new DateTimeValue(DateTime.Now));
+      CollectInnerResults(values, "", results);
+    }
+
+    private static void CollectInnerResults(IDictionary<string, IItem> values, string prefix, IEnumerable<IResult> results) {
+      foreach (var result in results) {
+        var innerResults = result.Value as IEnumerable<IResult>;
+        if (innerResults == null)
+          values.Add(string.Format("{0}{1}", prefix, result.Name), result.Value);
+        else
+          CollectInnerResults(values, string.Format("{0}{1}.", prefix, result.Name), innerResults);
+      }
+    }
+
+    [Storable]
+    bool running;
+
+    [Storable]
+    bool preparing;
+
+    [Storable]
+    private int StepNr;
+
+    [Storable]
+    IAlgorithm currentAlgorithm;
+
+    public void Prepare(bool clearRuns) {
+      if (clearRuns)
+        Runs.Clear();
+      Prepare();
+    }
+
+    public void Prepare() {
+      try {
+        preparing = true;
+        try {
+          if (Algorithm != null) {
+            Algorithm.Prepare();
+            Algorithm.StoreAlgorithmInEachRun = false;
+          }
+          if (SampleGenerationAlgorithm != null) {
+            SampleGenerationAlgorithm.Prepare();
+            SampleGenerationAlgorithm.StoreAlgorithmInEachRun = false;
+          }
+          ClearSubAlgorithms();
+          StepNr = -1;
+          ExecutionTime = new TimeSpan();
+          executionBaseTime = new TimeSpan();
+          results.Clear();
+          subAlgorithmRuns = new RunCollection();
+          results.Add(new Result("Sub Algorithm Runs", subAlgorithmRuns));
+          if (PreassignedSolutionCreator != null) {
+            if (PreassignedSolutionCreator.SolutionCollection != null)
+              PreassignedSolutionCreator.SolutionCollection.Clear();
+            PreassignedSolutionCreator.CurrentSolutionIndex = -1;
+          }
+          ExecutionState = ExecutionState.Prepared;
+        } catch (Exception) { }
+      } finally {
+        preparing = false;
+      }
+    }
+
+    public void Pause() {
+      try {
+        running = false;
+        if (currentAlgorithm != null) currentAlgorithm.Pause();
+        ExecutionState = ExecutionState.Paused;
+      } catch (Exception) { }
+    }
+
+    public void Start() {
+      Start(CancellationToken.None);
+    }
+    public void Start(CancellationToken cancellationToken) {
+      running = true;
+      ExecutionState = ExecutionState.Started;
+      PerformNextStep();
+    }
+    public async Task StartAsync() { await StartAsync(CancellationToken.None); }
+    public async Task StartAsync(CancellationToken cancellationToken) {
+      await AsyncHelper.DoAsync(Start, cancellationToken);
+    }
+
+    public void Stop() {
+      running = false;
+      try {
+        if (currentAlgorithm != null) currentAlgorithm.Stop();
+      } catch (Exception) { }
+    }
+
+    protected virtual void PerformNextStep() {
+      PreassignedSolutionCreator.CurrentSolutionIndex = StepNr;
+      if (StepNr == -1) {
+        currentAlgorithm = SampleGenerationAlgorithm;
+        currentAlgorithm.Start();
+      } else if (StepNr < NrOfSamples.Value) {
+        currentAlgorithm = Algorithm;
+        IHeuristicOptimizationProblem problem = Algorithm.Problem as IHeuristicOptimizationProblem;
+        if (problem != null) {
+          SynchronizeParameters(problem.SolutionCreator, PreassignedSolutionCreator as ISolutionCreator);
+          if (PreassignedSolutionCreator != problem.SolutionCreator)
+            PreassignedSolutionCreator.OriginalSolutionCreator = problem.SolutionCreator;
+          problem.SolutionCreatorParameter.ActualValue = PreassignedSolutionCreator;
+        }
+        Algorithm.Prepare();
+        Algorithm.Runs.Clear();
+        Algorithm.Start();
+      } else {
+        ExecutionState = ExecutionState.Stopped;
+      }
+    }
+
+    private void ClearSubAlgorithms() {
+      if (sampleGenerationAlgorithm != null) {
+        sampleGenerationAlgorithm.Results.Clear();
+        sampleGenerationAlgorithm.Runs.Clear();
+      }
+      if (algorithm != null) {
+        algorithm.Results.Clear();
+        algorithm.Runs.Clear();
+      }
+    }
+
+    private void AggregateResults() {
+      if (subAlgorithmRuns == null)
+        return;
+      foreach (var aggregator in Aggregators)
+        aggregator.Reset();
+      foreach (IRun run in subAlgorithmRuns) {
+        foreach (var result in run.Results) {
+          foreach (var item in Aggregators.CheckedItems)
+            item.Value.MaybeAddResult(new Result(result.Key, result.Value));
+        }
+      }
+      foreach (var item in Aggregators.CheckedItems)
+        results.Add(item.Value.CreateResult());
+    }
+
+    public override void CollectParameterValues(IDictionary<string, IItem> values) {
+      base.CollectParameterValues(values);
+      values.Add("Algorithm Name", new StringValue(Name));
+      values.Add("Algorithm Type", new StringValue(this.GetType().GetPrettyName()));
+      if (Problem != null) {
+        Problem.CollectParameterValues(values);
+        values.Add("Problem Name", new StringValue(Problem.Name));
+        values.Add("Problem Type", new StringValue(Problem.GetType().GetPrettyName()));
+      }
+      CollectPrefixedParameterValues("Sampling", SampleGenerationAlgorithm, values);
+      CollectPrefixedParameterValues("Analysis", Algorithm, values);
+    }
+
+    private void CollectPrefixedParameterValues(string prefix, IAlgorithm algorithm, IDictionary<string, IItem> values) {
+      var innerValues = new Dictionary<string, IItem>();
+      algorithm.CollectParameterValues(innerValues);
+      foreach (var value in innerValues) {
+        values.Add(string.Format("{0}.{1}", prefix, value.Key), value.Value);
+      }
+    }
+
+    protected virtual void CreateRun() {
+      Run run = new Run(Name, Description, this);
+      if (!SaveIndividualTrails)
+        run.Results.Remove("Sub Algorithm Runs");
+      Runs.Add(run);
+    }
+
+    #region Event registry
+    private void RegisterEvents() {
+      if (algorithm != null)
+        RegisterAlgorithmEvents();
+      if (sampleGenerationAlgorithm != null)
+        RegisterSampleGenerationAlgorithmEvents();
+    }
+    private void RegisterAlgorithmEvents() {
+      algorithm.ExceptionOccurred += algorithm_ExceptionOccurred;
+      algorithm.Started += algorithm_Started;
+      algorithm.Paused += algorithm_Paused;
+      algorithm.Prepared += algorithm_Prepared;
+      algorithm.Stopped += algorithm_Stopped;
+      algorithm.ExecutionTimeChanged += algorithm_ExecutionTimeChanged;
+      algorithm.ExecutionStateChanged += algorithm_ExecutionStateChanged;
+      algorithm.Runs.ItemsAdded += Algorithm_Runs_ItemsAdded;
+      algorithm.ProblemChanged += algorithm_ProblemChanged;
+    }
+    private void DeregisterAlgorithmEvents() {
+      algorithm.ExceptionOccurred -= algorithm_ExceptionOccurred;
+      algorithm.Started -= algorithm_Started;
+      algorithm.Paused -= algorithm_Paused;
+      algorithm.Prepared -= algorithm_Prepared;
+      algorithm.Stopped -= algorithm_Stopped;
+      algorithm.ExecutionTimeChanged -= algorithm_ExecutionTimeChanged;
+      algorithm.ExecutionStateChanged -= algorithm_ExecutionStateChanged;
+      algorithm.Runs.ItemsAdded -= Algorithm_Runs_ItemsAdded;
+      algorithm.ProblemChanged -= algorithm_ProblemChanged;
+    }
+    private void RegisterSampleGenerationAlgorithmEvents() {
+      sampleGenerationAlgorithm.ExceptionOccurred += algorithm_ExceptionOccurred;
+      sampleGenerationAlgorithm.Started += algorithm_Started;
+      sampleGenerationAlgorithm.Paused += algorithm_Paused;
+      sampleGenerationAlgorithm.Prepared += algorithm_Prepared;
+      sampleGenerationAlgorithm.Stopped += sampleGenerationAlgorithm_Stopped;
+      sampleGenerationAlgorithm.ExecutionTimeChanged += sampleGenerationAlgorithm_ExecutionTimeChanged;
+      sampleGenerationAlgorithm.ProblemChanged += algorithm_ProblemChanged;
+    }
+    private void DeregisterSampleGenerationAlgorithmEvents() {
+      sampleGenerationAlgorithm.ExceptionOccurred -= algorithm_ExceptionOccurred;
+      sampleGenerationAlgorithm.Started -= algorithm_Started;
+      sampleGenerationAlgorithm.Paused -= algorithm_Paused;
+      sampleGenerationAlgorithm.Prepared -= algorithm_Prepared;
+      sampleGenerationAlgorithm.Stopped -= sampleGenerationAlgorithm_Stopped;
+      sampleGenerationAlgorithm.ExecutionTimeChanged -= sampleGenerationAlgorithm_ExecutionTimeChanged;
+      sampleGenerationAlgorithm.ProblemChanged -= algorithm_ProblemChanged;
+    }
+    #endregion
+
+    #region Sub Algorithm Event Handling
+    void algorithm_ExecutionStateChanged(object sender, EventArgs e) {
+      IHeuristicOptimizationProblem problem = Algorithm.Problem as IHeuristicOptimizationProblem;
+      if (algorithm.ExecutionState == ExecutionState.Stopped && problem != null && problem.SolutionCreator is PreassignedSolutionCreator)
+        problem.SolutionCreatorParameter.ActualValue = ((PreassignedSolutionCreator)problem.SolutionCreator).OriginalSolutionCreator;
+    }
+    void algorithm_ExecutionTimeChanged(object sender, EventArgs e) {
+      ExecutionTime = executionBaseTime + algorithm.ExecutionTime;
+    }
+    void sampleGenerationAlgorithm_ExecutionTimeChanged(object sender, EventArgs e) {
+      ExecutionTime = executionBaseTime + sampleGenerationAlgorithm.ExecutionTime;
+    }
+    void algorithm_ExceptionOccurred(object sender, EventArgs<Exception> e) {
+      OnExceptionOccurred(e.Value);
+      ExecutionState = ExecutionState.Paused;
+    }
+    void algorithm_Started(object sender, EventArgs e) {
+      running = true;
+      ExecutionState = ExecutionState.Started;
+    }
+    void algorithm_Paused(object sender, EventArgs e) {
+      ExecutionState = ExecutionState.Paused;
+    }
+    void algorithm_Prepared(object sender, EventArgs e) {
+      if (executionState == ExecutionState.Stopped && !preparing)
+        Prepare();
+    }
+    void algorithm_Stopped(object sender, EventArgs e) {
+      if (running) {
+        executionBaseTime = executionTime + algorithm.ExecutionTime;
+        ExecutionTime = executionBaseTime;
+        StepNr++;
+        PerformNextStep();
+      } else {
+        ExecutionState = ExecutionState.Stopped;
+      }
+    }
+    void sampleGenerationAlgorithm_Stopped(object sender, EventArgs e) {
+      if (running) {
+        if (sampleGenerationAlgorithm.Results.ContainsKey("Samples")) {
+          IScope scope = sampleGenerationAlgorithm.Results["Samples"].Value as IScope;
+          if (scope != null)
+            PreassignedSolutionCreator.SolutionCollection = (IScope)scope.Clone();
+        }
+        executionBaseTime = executionTime + sampleGenerationAlgorithm.ExecutionTime;
+        ExecutionTime = executionBaseTime;
+        PreassignedSolutionCreator.CurrentSolutionIndex = 0;
+        StepNr++;
+        PerformNextStep();
+      } else {
+        ExecutionState = ExecutionState.Stopped;
+      }
+    }
+    void algorithm_ProblemChanged(object sender, EventArgs e) {
+      if (sender == algorithm && sampleGenerationAlgorithm != null)
+        sampleGenerationAlgorithm.Problem = algorithm.Problem;
+      if (sender == sampleGenerationAlgorithm && algorithm != null)
+        algorithm.Problem = sampleGenerationAlgorithm.Problem;
+      OnProblemChanged();
+    }
+    void Algorithm_Runs_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IRun> e) {
+      if (subAlgorithmRuns != null)
+        foreach (var run in e.Items) {
+          var slimRun = new Run();
+          foreach (var result in run.Results)
+            slimRun.Results.Add(result);
+          subAlgorithmRuns.Add(slimRun);
+          slimRun.Name = string.Format("Sub Algorithm Run {0}", subAlgorithmRuns.Count);
+        }
+    }
+    #endregion
+
+    #region Auxiliary Functions
+    private static void SynchronizeParameters(IParameterizedItem original, IParameterizedItem copy) {
+      foreach (IParameter origParam in original.Parameters) {
+        IParameter copyParam = null;
+        if (copy.Parameters.TryGetValue(origParam.Name, out copyParam))
+          SynchronizeParameters(origParam, copyParam);
+      }
+    }
+    private static void SynchronizeParameters(IParameter origParam, IParameter copyParam) {
+      if (origParam == null || copyParam == null)
+        return;
+      IValueParameter origValueParam = origParam as IValueParameter;
+      ILookupParameter origLookupParam = origParam as ILookupParameter;
+      IValueParameter copyValueParam = copyParam as IValueParameter;
+      ILookupParameter copyLookupParam = copyParam as ILookupParameter;
+      if (origValueParam != null && copyValueParam != null && copyValueParam.DataType.IsAssignableFrom(origValueParam.DataType))
+        copyValueParam.Value = origValueParam.Value;
+      if (origLookupParam != null && copyLookupParam != null)
+        copyLookupParam.ActualName = origLookupParam.ActualName;
+    }
+    private void SelectPreassignedSolutionCreator() {
+      var alg = Algorithm ?? SampleGenerationAlgorithm;
+      if (alg == null)
+        return;
+      IHeuristicOptimizationProblem problem = alg.Problem as IHeuristicOptimizationProblem;
+      if (problem != null) {
+        if (problem.SolutionCreator is IBinaryVectorCreator &&
+          (PreassignedSolutionCreator == null || !(PreassignedSolutionCreator is IBinaryVectorCreator)))
+          PreassignedSolutionCreator = new PreassignedBinaryVectorCreator();
+        else if (problem.SolutionCreator is IRealVectorCreator &&
+          (PreassignedSolutionCreator == null || !(PreassignedSolutionCreator is IRealVectorCreator)))
+          PreassignedSolutionCreator = new PreassignedRealVectorCreator();
+        else if (problem.SolutionCreator is IPermutationCreator &&
+          (PreassignedSolutionCreator == null || !(PreassignedSolutionCreator is IPermutationCreator)))
+          PreassignedSolutionCreator = new PreassignePermutationCreator();
+      }
+    }
+    #endregion
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/PreassignedBinaryVectorCreator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/PreassignedBinaryVectorCreator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/PreassignedBinaryVectorCreator.cs	(revision 15691)
@@ -0,0 +1,39 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.MultiTrajectory {
+
+  [StorableClass]
+  public class PreassignedBinaryVectorCreator : PreassignedSolutionCreator, IBinaryVectorCreator {
+
+    public ILookupParameter<BinaryVector> BinaryVectorParameter {
+      get { return (ILookupParameter<BinaryVector>)Parameters["BinaryVector"]; }
+    }
+
+    public IValueLookupParameter<IntValue> LengthParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["Length"]; }
+    }
+
+    [StorableConstructor]
+    protected PreassignedBinaryVectorCreator(bool deserializing) : base(deserializing) { }
+    protected PreassignedBinaryVectorCreator(PreassignedBinaryVectorCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public PreassignedBinaryVectorCreator() {
+      Parameters.Add(new LookupParameter<BinaryVector>("BinaryVector", "The created binary vector."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("Length", "The length of the binary vector."));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PreassignedBinaryVectorCreator(this, cloner);
+    }
+
+    public override void Create(IScope scope) {
+      BinaryVectorParameter.ActualValue = (BinaryVector)scope.Variables[BinaryVectorParameter.ActualName].Value;
+    }
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/PreassignedPermutationCreator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/PreassignedPermutationCreator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/PreassignedPermutationCreator.cs	(revision 15691)
@@ -0,0 +1,45 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Encodings.PermutationEncoding;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.MultiTrajectory {
+
+  [StorableClass]
+  public class PreassignePermutationCreator : PreassignedSolutionCreator, IPermutationCreator {
+
+    public IValueParameter<PermutationType> PermutationTypeParameter {
+      get { return (IValueParameter<PermutationType>)Parameters["PermutationType"]; }
+    }
+
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+
+    public IValueLookupParameter<IntValue> LengthParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["Length"]; }
+    }
+
+    [StorableConstructor]
+    protected PreassignePermutationCreator(bool deserializing) : base(deserializing) { }
+    protected PreassignePermutationCreator(PreassignePermutationCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public PreassignePermutationCreator() {
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The created permutation."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("Length", "The length of the permutation."));
+      Parameters.Add(new ValueParameter<PermutationType>("PermutationType", "The type of permutation (absolute, relative (direcected/undirected)."));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PreassignePermutationCreator(this, cloner);
+    }
+
+    public override void Create(IScope scope) {
+      PermutationParameter.ActualValue = (Permutation)scope.Variables[PermutationParameter.ActualName].Value;
+    }
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/PreassignedRealVectorCreator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/PreassignedRealVectorCreator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/PreassignedRealVectorCreator.cs	(revision 15691)
@@ -0,0 +1,44 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.MultiTrajectory {
+
+  [StorableClass]
+  public class PreassignedRealVectorCreator : PreassignedSolutionCreator, IRealVectorCreator {
+
+    public IValueLookupParameter<DoubleMatrix> BoundsParameter {
+      get { return (IValueLookupParameter<DoubleMatrix>)Parameters["Bounds"]; }
+    }
+    public IValueLookupParameter<IntValue> LengthParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["Length"]; }
+    }
+    public ILookupParameter<RealVector> RealVectorParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["RealVector"]; }
+    }
+
+    [StorableConstructor]
+    protected PreassignedRealVectorCreator(bool deserializing) : base(deserializing) { }
+    protected PreassignedRealVectorCreator(PreassignedRealVectorCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PreassignedRealVectorCreator(this, cloner);
+    }
+
+    public PreassignedRealVectorCreator() {
+      Parameters.Add(new ValueLookupParameter<DoubleMatrix>("Bounds", "Bounds of the real vector to create."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("Length", "Length of the real vector."));
+      Parameters.Add(new LookupParameter<RealVector>("RealVector", "The created real vector"));
+    }
+
+    public override void Create(IScope scope) {
+      if (scope.Variables.ContainsKey(RealVectorParameter.ActualName))
+        RealVectorParameter.ActualValue = scope.Variables[RealVectorParameter.ActualName].Value as RealVector;
+    }
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/PreassignedSolutionCreator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/PreassignedSolutionCreator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/MultiTrajectory/PreassignedSolutionCreator.cs	(revision 15691)
@@ -0,0 +1,70 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.MultiTrajectory {
+
+  [StorableClass]
+  public abstract class PreassignedSolutionCreator : SingleSuccessorOperator, ISolutionCreator {
+
+    #region Parameters
+    public ValueParameter<IScope> SolutionCollectionParameter {
+      get { return (ValueParameter<IScope>)Parameters["SolutionCollection"]; }
+    }
+    public ValueParameter<IntValue> CurrentSolutionIndexParameter {
+      get { return (ValueParameter<IntValue>)Parameters["CurrentSolutionIndex"]; }
+    }
+    public ValueParameter<ISolutionCreator> OriginalSolutionCreatorParameter {
+      get { return (ValueParameter<ISolutionCreator>)Parameters["OriginalSolutionCreator"]; }
+    }
+    #endregion
+
+    #region Parameter Values
+    public IScope SolutionCollection {
+      get { return SolutionCollectionParameter.Value; }
+      set { SolutionCollectionParameter.Value = value; }
+    }
+    public int CurrentSolutionIndex {
+      get { return CurrentSolutionIndexParameter.Value.Value; }
+      set { CurrentSolutionIndexParameter.Value = new IntValue(value); }
+    }
+    public ISolutionCreator OriginalSolutionCreator {
+      get { return OriginalSolutionCreatorParameter.Value; }
+      set { OriginalSolutionCreatorParameter.Value = value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected PreassignedSolutionCreator(bool deserializing) : base(deserializing) { }
+
+    protected PreassignedSolutionCreator(PreassignedSolutionCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public PreassignedSolutionCreator() {
+      Parameters.Add(new ValueParameter<IScope>("SolutionCollection", "Scope with subscopes that contains the list of solutions."));
+      Parameters.Add(new ValueParameter<IntValue>("CurrentSolutionIndex", "Index of currently created solution."));
+      Parameters.Add(new ValueParameter<ISolutionCreator>("OriginalSolutionCreator", "Original solution creator used for a certain problem."));
+    }
+
+    public abstract void Create(IScope scope);
+
+    public sealed override IOperation Apply() {
+      if (CurrentSolutionIndex < 0 && OriginalSolutionCreator != null) {
+        OperationCollection collection = new OperationCollection();
+        collection.Add(ExecutionContext.CreateOperation(OriginalSolutionCreator));
+        collection.Add(base.Apply());
+        return collection;
+      } else {
+        Create(SolutionCollection.SubScopes[CurrentSolutionIndex]);
+        CurrentSolutionIndex = (CurrentSolutionIndex+1) % SolutionCollection.SubScopes.Count;
+        return base.Apply();
+      }
+    }
+
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/NeutralSelector.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/NeutralSelector.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/NeutralSelector.cs	(revision 15691)
@@ -0,0 +1,226 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Analysis.FitnessLandscape.DistanceCalculators;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+  [Item("NeutralSelector", "A selection operator that explores neutral areas.")]
+  [StorableClass]
+  public class NeutralSelector : SingleSuccessorOperator, ISingleObjectiveSelector {
+
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    #region Parameters
+    public ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+    protected IValueParameter<BoolValue> CopySelectedParameter {
+      get { return (IValueParameter<BoolValue>)Parameters["CopySelected"]; }
+    }
+    public IValueLookupParameter<IntValue> NumberOfSelectedSubScopesParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["NumberOfSelectedSubScopes"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<ItemArray<DoubleValue>> QualityParameter {
+      get { return (ILookupParameter<ItemArray<DoubleValue>>)Parameters["Quality"]; }
+    }
+    public ScopePathLookupParameter<DoubleValue> BaseQualityParameter {
+      get { return (ScopePathLookupParameter<DoubleValue>)Parameters["BaseQuality"]; }
+    }
+    public ScopePathLookupParameter<IItem> BaseSolutionParameter {
+      get { return (ScopePathLookupParameter<IItem>)Parameters["BaseSolution"]; }
+    }
+    public ScopePathLookupParameter<IItem> StartingPointParameter {
+      get { return (ScopePathLookupParameter<IItem>)Parameters["StartingPoint"]; }
+    }
+    public ILookupParameter<ItemArray<IItem>> SolutionParameter {
+      get { return (ILookupParameter<ItemArray<IItem>>)Parameters["Solution"]; }
+    }
+    public IConstrainedValueParameter<IItemDistanceCalculator> SolutionDistanceCalculatorParameter {
+      get { return (IConstrainedValueParameter<IItemDistanceCalculator>)Parameters["SolutionDistanceCalculator"]; }
+    }
+    public ValueLookupParameter<DoubleValue> EpsilonParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["Epsilon"]; }
+    }
+    public ILookupParameter<DoubleValue> CurrentFractionOfNeutralNeighborsParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["CurrentFractionOfNeutralNeighbors"]; }
+    }
+    public LookupParameter<DoubleValue> CurrentNeutralDistanceParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["CurrentNeutralDistance"]; }
+    }
+    public LookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    #endregion
+
+    #region Parameter Values
+    protected IScope CurrentScope {
+      get { return CurrentScopeParameter.ActualValue; }
+    }
+    public BoolValue CopySelected {
+      get { return CopySelectedParameter.Value; }
+      set { CopySelectedParameter.Value = value; }
+    }
+    protected double CurrentNeutralDistance {
+      set {
+        if (CurrentNeutralDistanceParameter.ActualValue == null)
+          CurrentNeutralDistanceParameter.ActualValue = new DoubleValue(value);
+        else
+          CurrentNeutralDistanceParameter.ActualValue.Value = value;
+      }
+
+    }
+    protected double CurrentFractionOfNeutralNeighbors {
+      get { return CurrentFractionOfNeutralNeighborsParameter.ActualValue.Value; }
+      set {
+        if (CurrentFractionOfNeutralNeighborsParameter.ActualValue == null)
+          CurrentFractionOfNeutralNeighborsParameter.ActualValue = new DoubleValue(value);
+        else
+          CurrentFractionOfNeutralNeighborsParameter.ActualValue.Value = value;
+      }
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected NeutralSelector(bool deserializing) : base(deserializing) { }
+    protected NeutralSelector(NeutralSelector original, Cloner cloner) : base(original, cloner) { }
+    public NeutralSelector() {
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope from which sub-scopes should be selected."));
+      Parameters.Add(new ValueParameter<BoolValue>("CopySelected", "True if the selected sub-scopes should be copied, otherwise false.", new BoolValue(true)));
+      Parameters.Add(new ValueLookupParameter<IntValue>("NumberOfSelectedSubScopes", "The number of sub-scopes which should be selected."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the current problem is a maximization problem, otherwise false."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The quality value contained in each sub-scope which is used for selection."));
+      Parameters.Add(new ScopePathLookupParameter<DoubleValue>("BaseQuality", "The base quality value to compare to. This is required to determine wheter a local optimum has been found and the direction should be reversed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("Epsilon", "Maximum delta accepted as neutral mutation.", new DoubleValue(0)));
+      Parameters.Add(new ScopePathLookupParameter<IItem>("BaseSolution", "Previous solution in neutral walk."));
+      Parameters.Add(new ScopePathLookupParameter<IItem>("StartingPoint", "Starting point of neutral walk (broken by non neutral transition through fallback selector)"));
+      Parameters.Add(new ScopeTreeLookupParameter<IItem>("Solution", "Current solution"));
+      Parameters.Add(new ConstrainedValueParameter<IItemDistanceCalculator>("SolutionDistanceCalculator", "Operator to calculate distances between the base item and the current item."));
+      Parameters.Add(new LookupParameter<DoubleValue>("CurrentNeutralDistance", "The distance of the current item to the starting point of the neutral (portion of the) walk."));
+      Parameters.Add(new LookupParameter<DoubleValue>("CurrentFractionOfNeutralNeighbors", "The fraction of examined neighbors that have the same fitness value (within epsilon)"));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "Random number generator for breaking ties in the ordering."));
+      CopySelectedParameter.Hidden = true;
+      MaximizationParameter.Hidden = true;
+      NumberOfSelectedSubScopesParameter.Hidden = true;
+      BaseQualityParameter.Hidden = false;
+      QualityParameter.Hidden = false;
+      BaseSolutionParameter.Hidden = false;
+      StartingPointParameter.Hidden = true;
+      SolutionParameter.Hidden = false;
+      SolutionDistanceCalculatorParameter.Hidden = false;
+      StartingPointParameter.Hidden = false;
+      BaseQualityParameter.ActualName = "Quality";
+      BaseSolutionParameter.Path = "../Remaining/{0}";
+      BaseQualityParameter.Path = "../Remaining/{0}";
+      StartingPointParameter.Path = "..";
+      foreach (var v in ApplicationManager.Manager.GetInstances<IItemDistanceCalculator>())
+        SolutionDistanceCalculatorParameter.ValidValues.Add(v);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NeutralSelector(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (!Parameters.ContainsKey("CurrentFractionOfNeutralNeighbors"))
+        Parameters.Add(new LookupParameter<DoubleValue>("CurrentFractionOfNeutralNeighbors", "The fraction of examined neighbors that have the same fitness (within epsilon)"));
+    }
+    #endregion
+
+    private static double Squash(double d, double eps) {
+      return d <= eps ? 0 : d;
+    }
+
+    public sealed override IOperation Apply() {
+      var calc = (IItemDistanceCalculator)SolutionDistanceCalculatorParameter.ActualValue;
+      var baseQuality = BaseQualityParameter.ActualValue.Value;
+      var startingPoint = StartingPointParameter.ActualValue;
+      var baseSolution = BaseSolutionParameter.ActualValue;
+      var items = SolutionParameter.ActualValue;
+      var eps = EpsilonParameter.ActualValue.Value;
+      var random = RandomParameter.ActualValue;
+      double currentNeutralDistance;
+
+      if (startingPoint == null) {
+        currentNeutralDistance = 0;
+        CurrentNeutralDistance = 0;
+        startingPoint = baseSolution;
+        StartingPointParameter.ActualValue = (IItem)baseSolution.Clone();
+      } else {
+        currentNeutralDistance = calc.Distance(startingPoint, baseSolution);
+      }
+
+      var neighbors = QualityParameter.ActualValue
+        .Zip(items, (q, i) => new { Quality = q.Value, Item = i })
+        .Select((p, i) => new {
+          Idx = i,
+          Diff = Squash(Math.Abs(baseQuality - p.Quality), eps),
+          StartDist = calc.Distance(startingPoint, p.Item),
+          BaseDist = calc.Distance(baseSolution, p.Item)
+        })
+        .Where(n => n.BaseDist > 0)
+        .ToList();
+      if (neighbors.Count > 0) {
+        if (random != null)
+          neighbors.Shuffle(random);
+        var mostDistantNeutralNeighbor =
+          neighbors.Where(n => n.Diff == 0).OrderByDescending(n => n.StartDist).FirstOrDefault();
+        if (mostDistantNeutralNeighbor != null && mostDistantNeutralNeighbor.StartDist > currentNeutralDistance) {
+          if (currentNeutralDistance == 0) {
+            StartingPointParameter.ActualValue = (IItem)baseSolution.Clone();
+            CurrentNeutralDistance = mostDistantNeutralNeighbor.BaseDist;
+          } else {
+            CurrentNeutralDistance = mostDistantNeutralNeighbor.StartDist;
+          }
+          Select(mostDistantNeutralNeighbor.Idx);
+        } else {
+          var mostDistantNonNeutralNeighbor = neighbors.Where(n => n.Diff > 0).OrderByDescending(n => n.StartDist).FirstOrDefault();
+          if (mostDistantNonNeutralNeighbor != null) {
+            Select(mostDistantNonNeutralNeighbor.Idx);
+          } else {
+            var mostDistantNeighbor = neighbors.OrderByDescending(n => n.StartDist).FirstOrDefault();
+            Select(mostDistantNeighbor.Idx);
+          }
+          if (currentNeutralDistance > 0)
+            StartingPointParameter.ActualValue = (IItem)baseSolution.Clone();
+          CurrentNeutralDistance = 0;
+        }
+        CurrentFractionOfNeutralNeighbors = 1.0 * neighbors.Count(n => n.Diff == 0) / neighbors.Count;
+      }
+      return base.Apply();
+    }
+
+    private void Select(int i) {
+      List<IScope> scopes = new List<IScope>(CurrentScope.SubScopes);
+      bool copy = CopySelectedParameter.Value.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      IScope[] selected = new IScope[1];
+      if (copy) {
+        selected[0] = (IScope)scopes[i].Clone();
+      } else {
+        selected[0] = scopes[i];
+        scopes[i] = null;
+        scopes.RemoveAll(x => x == null);
+      }
+      CurrentScope.SubScopes.Clear();
+      IScope remainingScope = new Scope("Remaining");
+      remainingScope.SubScopes.AddRange(scopes);
+      CurrentScope.SubScopes.Add(remainingScope);
+      IScope selectedScope = new Scope("Selected");
+      selectedScope.SubScopes.AddRange(selected);
+      CurrentScope.SubScopes.Add(selectedScope);
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/PopDist/PopulationDistributionAnalyzer.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/PopDist/PopulationDistributionAnalyzer.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/PopDist/PopulationDistributionAnalyzer.cs	(revision 15691)
@@ -0,0 +1,190 @@
+﻿#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.IO;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("PopulationDistributionAnalyzer", "An operator that analyzes the distribution of fitness values")]
+  [StorableClass]
+  public class PopulationDistributionAnalyzer : AlgorithmOperator, IAnalyzer {
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    #region Parameters
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ValueLookupParameter<DataTable> FitnessQuantilesParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["Fitness Quantiles"]; }
+    }
+    public ValueLookupParameter<DataTable> PopulationDispersionParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["Population Dispersion"]; }
+    }
+    public ValueLookupParameter<DataTable> HigherPopulationMomentsParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["Higher Population Moments"]; }
+    }
+    public ValueLookupParameter<DataTable> PopulationNormalityParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["Population Normality"]; }
+    }
+    public ValueLookupParameter<VariableCollection> ResultsParameter {
+      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    public ValueLookupParameter<ResultCollection> PopulationDistributionResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Population Distribution Results"]; }
+    }
+    public OptionalValueParameter<StringValue> PopulationLogFileNameParameter {
+      get { return (OptionalValueParameter<StringValue>)Parameters["Population Log File Name"]; }
+    }
+    public IConstrainedValueParameter<IntValue> NQuantilesParameter {
+      get { return (IConstrainedValueParameter<IntValue>)Parameters["NQuantiles"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected PopulationDistributionAnalyzer(bool deserializing) : base(deserializing) { }
+    protected PopulationDistributionAnalyzer(PopulationDistributionAnalyzer original, Cloner cloner) : base(original, cloner) { }
+
+    public PopulationDistributionAnalyzer() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The quality of the solution"));
+      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The collection of all results of this algorithm"));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Population Distribution Results", "All results from population distribution analysis"));
+      Parameters.Add(new ValueLookupParameter<DataTable>("Fitness Quantiles", "Data table with quantiles of the fitness distribution"));
+      Parameters.Add(new ValueLookupParameter<DataTable>("Population Dispersion", "Data table dispersion statistics"));
+      Parameters.Add(new ValueLookupParameter<DataTable>("Higher Population Moments", "Data table skewness and kurtosis of population's fitness distribution"));
+      Parameters.Add(new ValueLookupParameter<DataTable>("Population Normality", "Jarque-Bera Normality Test p-value and 0.05 threshold"));
+      Parameters.Add(new OptionalValueParameter<StringValue>("Population Log File Name", "File name of a log file where all population fittness values are logged to"));
+      Parameters.Add(new ConstrainedValueParameter<IntValue>("NQuantiles", "Number of quantiles to plot", new ItemSet<IntValue>(Enumerable.Range(1, 50).Select(v => new IntValue(v)))));
+
+      NQuantilesParameter.Value = NQuantilesParameter.ValidValues.Single(v => v.Value == 10);
+
+      var resultsCollector = new ResultsCollector();
+      resultsCollector.ResultsParameter.ActualName = PopulationDistributionResultsParameter.Name;
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(FitnessQuantilesParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(PopulationDispersionParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(HigherPopulationMomentsParameter.Name));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(PopulationNormalityParameter.Name));
+
+      var globalResultsCollector = new ResultsCollector();
+      globalResultsCollector.CollectedValues.Add(new ValueLookupParameter<ResultCollection>(PopulationDistributionResultsParameter.Name));
+
+      OperatorGraph.InitialOperator = resultsCollector;
+      resultsCollector.Successor = globalResultsCollector;
+      globalResultsCollector.Successor = null;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PopulationDistributionAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      if (PopulationDistributionResultsParameter.ActualValue == null)
+        PopulationDistributionResultsParameter.ActualValue = new ResultCollection();
+      var qualities = QualityParameter.ActualValue.Select(v => v.Value).ToArray();
+      CalculateQuantiles(qualities);
+      CalculateDistributionParameters(qualities);
+      LogPopulationFitnessValues(qualities);
+      return base.Apply();
+    }
+
+    private void CalculateQuantiles(double[] qualities) {
+      DataTable quantiles = FitnessQuantilesParameter.ActualValue;
+      if (quantiles == null) {
+        quantiles = new DataTable("Fitness Quantiles");
+        quantiles.Description = "The population's fitness quantiles";
+        FitnessQuantilesParameter.ActualValue = quantiles;
+        for (int i = 0; i <= NQuantilesParameter.Value.Value; i++)
+          quantiles.Rows.Add(new DataRow((i * 10).ToString()));
+      }
+      int n_quantiles = quantiles.Rows.Count;
+      for (int i = 0; i < n_quantiles; i++) {
+        double v = 0;
+        alglib.basestat.samplepercentile(qualities, qualities.Length, 1.0 * i / n_quantiles, ref v);
+        quantiles.Rows[(i * 10).ToString()].Values.Add(v);
+      }
+    }
+
+    private void CalculateDistributionParameters(double[] qualities) {
+      DataTable populationDispersion = PopulationDispersionParameter.ActualValue;
+      if (populationDispersion == null) {
+        populationDispersion = new DataTable("Population Dispersion");
+        PopulationDispersionParameter.ActualValue = populationDispersion;
+        populationDispersion.Rows.Add(new DataRow("Std. Deviation"));
+        populationDispersion.Rows.Add(new DataRow("Mean Difference"));
+      }
+      DataTable higherPopulationMoments = HigherPopulationMomentsParameter.ActualValue;
+      if (higherPopulationMoments == null) {
+        higherPopulationMoments = new DataTable("Higher Population Moments");
+        HigherPopulationMomentsParameter.ActualValue = higherPopulationMoments;
+        higherPopulationMoments.Rows.Add(new DataRow("Skewness"));
+        higherPopulationMoments.Rows.Add(new DataRow("Kurtosis"));
+      }
+      DataTable populationNormality = PopulationNormalityParameter.ActualValue;
+      if (populationNormality == null) {
+        populationNormality = new DataTable("Population Normality");
+        PopulationNormalityParameter.ActualValue = populationNormality;
+        populationNormality.Rows.Add(new DataRow("Jarque-Bera P-Value"));
+        populationNormality.Rows.Add(new DataRow("0.05"));
+      }
+
+      double mean, variance, skewness, kurtosis, p_value;
+      mean = variance = skewness = kurtosis = p_value = 0;
+      alglib.basestat.samplemoments(qualities, qualities.Length, ref mean, ref variance, ref skewness, ref kurtosis);
+      alglib.jarquebera.jarqueberatest(qualities, qualities.Length, ref p_value);
+      double mean_difference =
+        (from i in Enumerable.Range(0, qualities.Length)
+         from j in Enumerable.Range(0, i)
+         select Math.Abs(qualities[i] - qualities[j])).Sum()
+           * 2 / qualities.Length / (qualities.Length - 1);
+
+      populationDispersion.Rows["Std. Deviation"].Values.Add(Math.Sqrt(variance));
+      populationDispersion.Rows["Mean Difference"].Values.Add(mean_difference);
+      higherPopulationMoments.Rows["Skewness"].Values.Add(skewness);
+      higherPopulationMoments.Rows["Kurtosis"].Values.Add(kurtosis);
+      populationNormality.Rows["Jarque-Bera P-Value"].Values.Add(p_value);
+      populationNormality.Rows["0.05"].Values.Add(0.05);
+    }
+
+    private void LogPopulationFitnessValues(double[] qualities) {
+      if (PopulationLogFileNameParameter.ActualValue == null)
+        return;
+      using (var writer = new StreamWriter(PopulationLogFileNameParameter.Value.Value, true)) {
+        foreach (var q in qualities) {
+          writer.Write(q);
+          writer.Write(";");
+        }
+        writer.WriteLine();
+        writer.Close();
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Properties/AssemblyInfo.cs.frame
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Properties/AssemblyInfo.cs.frame	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Properties/AssemblyInfo.cs.frame	(revision 15691)
@@ -0,0 +1,37 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+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.Analysis.FitnessLandscape")]
+[assembly: AssemblyDescription("HeuristicLab algorithm analysis for fitness landscape properties")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 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("34e1ec7e-0124-4f76-b8f8-42b9244d2b09")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.3000")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/ScopePathLookupParameter.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/ScopePathLookupParameter.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/ScopePathLookupParameter.cs	(revision 15691)
@@ -0,0 +1,104 @@
+﻿using System;
+using System.Text.RegularExpressions;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Parameters {
+
+  [Item("ScopePathLookupParameter", "Start parameter lookup after freely navigating the scope tree using a path string.")]
+  [StorableClass]
+  public class ScopePathLookupParameter<T> : LookupParameter<T>, ILookupParameter<T> where T : class, IItem {
+
+    #region Properties
+
+    public static Regex ValidPathRegex = new Regex("|(..|[a-zA-Z0-9_ ]+|\\{[0-9]+\\})(/(..|[a-zA-Z0-9_ ]+|\\{[0-9]+\\}))?");
+
+    [Storable]
+    private string path;
+    public string Path {
+      get { return path; }
+      set {
+        if (!ValidPathRegex.IsMatch(value))
+          throw new ArgumentException("Invalid Path");
+        if (value != null) {
+          path = value;
+          OnPathChanged();
+          OnToStringChanged();
+        }
+      }
+    }
+
+    #endregion
+
+    #region Constructors & Cloning
+
+    [StorableConstructor]
+    protected ScopePathLookupParameter(bool deserializing) : base(deserializing) { }
+    protected ScopePathLookupParameter(ScopePathLookupParameter<T> original, Cloner cloner)
+      : base(original, cloner) {
+      path = original.path;
+    }
+    public ScopePathLookupParameter()
+      : base() {
+      path = "";
+    }
+    public ScopePathLookupParameter(string name)
+      : base(name) {
+      path = "";
+    }
+    public ScopePathLookupParameter(string name, string description)
+      : base(name, description) {
+      path = "";
+    }
+    public ScopePathLookupParameter(string name, string description, string actualName)
+      : base(name, description, actualName) {
+      path = "";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ScopePathLookupParameter<T>(this, cloner);
+    }
+
+    #endregion
+
+    public static IScope NavigateScope(IScope scope, string path) {
+      foreach (var dir in path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries)) {
+        if (dir == "..")
+          scope = scope.Parent;
+        else if (dir.StartsWith("{")) {
+          scope = scope.SubScopes[int.Parse(dir.Substring(1, dir.Length-2))];
+        } else {
+          scope = scope.SubScopes.Find(s => s.Name == dir);
+        }
+      }
+      return scope;
+    }
+
+    protected override IItem GetActualValue() {
+      var originalContext = ExecutionContext as ExecutionContext;
+      ExecutionContext = new ExecutionContext(originalContext.Parent, originalContext.Operator, NavigateScope(originalContext.Scope, Path));
+      IItem result = base.GetActualValue();
+      ExecutionContext = originalContext;
+      return result;
+    }
+
+    protected override void SetActualValue(IItem value) {
+      var originalContext = ExecutionContext as ExecutionContext;
+      ExecutionContext = new ExecutionContext(originalContext.Parent, originalContext.Operator, NavigateScope(originalContext.Scope, Path));
+      base.SetActualValue(value);
+      ExecutionContext = originalContext;
+    }
+
+    public event EventHandler PathChanged;
+    protected virtual void OnPathChanged() {
+      EventHandler handler = PathChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+
+    public override string ToString() {
+      return string.Format("{0} [{1}]", base.ToString(), Path);
+    }
+  }  
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/TestFunctions/CustomAdditiveMoveEvaluator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/TestFunctions/CustomAdditiveMoveEvaluator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/TestFunctions/CustomAdditiveMoveEvaluator.cs	(revision 15691)
@@ -0,0 +1,62 @@
+﻿#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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.TestFunctions.Evaluators;
+
+namespace HeuristicLab.Problems.TestFunctions {
+  [Item("CustomAdditiveMoveEvaluator", "Class for evaluating an additive move on a custom test function.")]
+  [StorableClass]
+  public class CustomAdditiveMoveEvaluator : AdditiveMoveEvaluator {
+    public LookupParameter<ISingleObjectiveTestFunctionProblemEvaluator> EvaluatorParameter {
+      get { return (LookupParameter<ISingleObjectiveTestFunctionProblemEvaluator>)Parameters["Evaluator"]; }
+    }
+
+    [StorableConstructor]
+    protected CustomAdditiveMoveEvaluator(bool deserializing) : base(deserializing) { }
+    protected CustomAdditiveMoveEvaluator(CustomAdditiveMoveEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public CustomAdditiveMoveEvaluator() {
+      Parameters.Add(new LookupParameter<ISingleObjectiveTestFunctionProblemEvaluator>("Evaluator", ""));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CustomAdditiveMoveEvaluator(this, cloner);
+    }
+
+    public override System.Type EvaluatorType {
+      get { return typeof(CustomEvaluator); }
+    }
+
+    protected override double Evaluate(double quality, RealVector point, AdditiveMove move) {
+      RealVector vector = new RealVector(point.Select((x, i) => move.Dimension == i ? x + move.MoveDistance : x).ToArray());
+      var eval = EvaluatorParameter.ActualValue as CustomEvaluator;
+      if (eval != null)
+        return eval.Evaluate(vector);
+      throw new InvalidOperationException("evaluator is not a custom evaluator");
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/TestFunctions/CustomEvaluator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/TestFunctions/CustomEvaluator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/TestFunctions/CustomEvaluator.cs	(revision 15691)
@@ -0,0 +1,75 @@
+﻿#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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TestFunctions.Evaluators {
+  [Item("CustomEvaluator", "Evaluates a custom test fuction.")]
+  [StorableClass]
+  public class CustomEvaluator : SingleObjectiveTestFunctionProblemEvaluator {
+
+    public override string FunctionName {
+      get { return "sin(x^y)"; }
+    }
+
+    [StorableConstructor]
+    protected CustomEvaluator(bool deserializing) : base(deserializing) { }
+    protected CustomEvaluator(CustomEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public CustomEvaluator() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CustomEvaluator(this, cloner);
+    }
+
+    public override bool Maximization {
+      get { return false; }
+    }
+
+    public override DoubleMatrix Bounds {
+      get { return new DoubleMatrix(new double[,] { { 0, 5 } }); }
+    }
+
+    public override double BestKnownQuality {
+      get {
+        return -1;
+      }
+    }
+
+    public override int MinimumProblemSize { get { return 2; } }
+
+    public override int MaximumProblemSize { get { return 2; } }
+
+    public override RealVector GetBestKnownSolution(int dimension) {
+      return new RealVector(dimension);
+    }
+
+    public override double Evaluate(RealVector point) {
+      if (point[0] < 0 || point[1] < 0)
+        return 0;
+      return Math.Sin(Math.Pow(point[0], point[1]));
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/PreBuildEvent.cmd
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/PreBuildEvent.cmd	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/PreBuildEvent.cmd	(revision 15691)
@@ -0,0 +1,11 @@
+IF EXIST "%ProjectDir%\Properties\AssemblyInfo.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Properties\AssemblyInfo.cs.frame" "%ProjectDir%\Properties\AssemblyInfo.cs"
+IF %ERRORLEVEL% NEQ 0 GOTO Error_Handling
+IF EXIST "%ProjectDir%\Plugin.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Plugin.cs.frame" "%ProjectDir%\Plugin.cs"
+IF %ERRORLEVEL% NEQ 0 GOTO Error_Handling
+GOTO Done
+
+:Error_Handling
+ECHO There was an error while running subwcrev. Please verify that the *.cs.frame files have been correctly converted to *.cs files, otherwise HeuristicLab won't build. 
+exit 0
+
+:Done
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/DepotExcentricityCalculator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/DepotExcentricityCalculator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/DepotExcentricityCalculator.cs	(revision 15691)
@@ -0,0 +1,48 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace VRPProblemAnalyzer {
+
+  public class DepotExcentricityCalculator {
+
+    public static double Geographic(double[,] vertices) {
+      var customers = Utils.MatrixToPointList(vertices);
+      var depot = customers[0];
+      customers.RemoveAt(0);
+      var minX = customers.Min(c => c.X);
+      var minY = customers.Min(c => c.Y);
+      var maxX = customers.Max(c => c.X);
+      var maxY = customers.Max(c => c.Y);
+      var rangeX = maxX - minX;
+      var rangeY = maxY - minY;
+      var center = new PointD(minX + rangeX/2, minY + rangeY/2);
+      Console.WriteLine("Geographic {0} -> {1} = {2}", depot, center, depot.DistanceTo(center));
+      return depot.DistanceTo(center);
+    }
+
+    public static double DistanceCentroid(double[,] vertices) {
+      var customers = Utils.MatrixToPointList(vertices);
+      var depot = customers[0];
+      customers.RemoveAt(0);
+      var center = new PointD(
+        customers.Select(c => c.X).Average(),
+        customers.Select(c => c.Y).Average());
+      Console.WriteLine("Distance {0} -> {1} = {2}", depot, center, depot.DistanceTo(center));
+      return depot.DistanceTo(center);
+    }
+
+    public static double DemandDistanceCentroid(double[,] vertices, double[] demands) {
+      var factor = demands.Sum()/demands.Length;
+      var customers = Utils.MatrixToPointList(vertices).Zip(demands, (c, d) => new {c.X, c.Y, D = d/factor}).ToList();
+      var depot = customers[0];
+      customers.RemoveAt(0);
+      var center = new PointD(
+        customers.Select(c => c.X*c.D).Average(),
+        customers.Select(c => c.Y*c.D).Average());
+      Console.WriteLine("Demand {0} -> {1} = {2}", depot, center, new PointD(depot.X, depot.Y).DistanceTo(center));
+      return new PointD(depot.X, depot.Y).DistanceTo(center);
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/EnumerableExtensions.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/EnumerableExtensions.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/EnumerableExtensions.cs	(revision 15691)
@@ -0,0 +1,15 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace VRPProblemAnalyzer {
+  public static class EnumerableExtensions {
+    public static double StandardDeviation(this IEnumerable<double> data) {
+      var dataList = data.ToList();
+      double average = dataList.Average();
+      var individualDeviations = dataList.Select(num => Math.Pow(num - average, 2.0));
+      return Math.Sqrt(individualDeviations.Average());
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/KMeansClustering.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/KMeansClustering.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/KMeansClustering.cs	(revision 15691)
@@ -0,0 +1,62 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Diagnostics;
+
+namespace VRPProblemAnalyzer {
+  class Cluster {
+    public List<double[]> Items { get; set; }
+    public double[] Center { get; set; }    
+
+    public Cluster() {
+      Items = new List<double[]>();
+      Center = new double[2];
+    }
+  }
+
+  class KMeansClustering {
+    public static List<Cluster> Cluster(double[,] vertices, int k, int restarts) {
+      while (true) {
+        int info = 0;
+        double[,] centers = null;
+        int[] xyc = null;
+
+
+        Thread t = new Thread(delegate() {
+          alglib.kmeansgenerate(vertices, vertices.Length / 2, 2, k, restarts + 1, out info, out centers, out xyc);
+        });
+        t.Start();
+        if (!t.Join(1000)) {
+          t.Abort();
+          continue;
+        }
+
+        if (info == -3)
+          return new List<Cluster>();
+        else if (info == 1) {
+          List<Cluster> result = new List<Cluster>();
+          int count = centers.Length / 2;
+          for (int i = 0; i < count; i++) {
+            result.Add(new Cluster());
+            result[i].Center[0] = centers[0, i];
+            result[i].Center[1] = centers[1, i];
+          }
+
+          for (int i = 0; i < xyc.Length; i++) {
+            double[] coords = new double[2];
+            coords[0] = vertices[i, 0];
+            coords[1] = vertices[i, 1];
+
+            result[xyc[i]].Items.Add(coords);
+          }
+
+          result.RemoveAll(c => c.Items.Count == 0);
+
+          return result;
+        }
+      } 
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/PictureGenerator.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/PictureGenerator.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/PictureGenerator.cs	(revision 15691)
@@ -0,0 +1,228 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms.DataVisualization.Charting;
+using System.IO;
+
+namespace VRPProblemAnalyzer {
+  public class PictureGenerator {
+
+    private static int TourWidth = 400;
+    private static int TourHeight = 500;
+    private static double MinDemandSize = 2;
+    private static double MaxDemandSize = Math.Min(TourWidth, TourHeight) / 25.0;
+
+    private static int TourBorder = (int)Math.Ceiling(MaxDemandSize);
+
+    private static int ChartWidth = 300;
+    private static int ChartHeight = TourHeight/2;
+    
+    private static int DemandSegments = 20;
+
+    private static int DistanceSegments = 20;
+
+    public static Image GeneratePicture(TSPLIBParser problemInstance, SolutionParser solution) {    
+      Image tourVisualization = GenerateTourVisualization(problemInstance, solution);
+      Image demandDistribution = GenerateDemandDistribution(problemInstance);
+      Image distanceDistribution = GenerateDistanceDistribution(problemInstance);
+
+      SizeF titleSize;
+      using (var font = new Font("Helvetica", 20)) {
+        using (var b = new Bitmap(1, 1)) {
+          using (Graphics g = Graphics.FromImage(b)) {
+            titleSize = g.MeasureString(problemInstance.Name, font);
+          }
+        }
+        Bitmap bmp = new Bitmap(TourWidth+ChartWidth,
+                                Math.Max(TourHeight,  2*ChartHeight) + (int)titleSize.Height);
+        using (Graphics g = Graphics.FromImage(bmp)) {
+          g.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);
+          g.DrawString(problemInstance.Name, font, Brushes.Black, (bmp.Width-titleSize.Width)/2, 0);
+          g.DrawImage(tourVisualization, (TourWidth-tourVisualization.Width)/2, titleSize.Height+(TourHeight-tourVisualization.Height)/2);
+          g.DrawImage(demandDistribution, TourWidth, titleSize.Height);
+          g.DrawImage(distanceDistribution, TourWidth, ChartHeight + titleSize.Height);
+        }
+        return bmp;
+      }
+    }
+
+    private static Color[] TourColors = new[] {
+      Color.FromArgb(100, 92, 20,237), Color.FromArgb(100,237,183, 20), Color.FromArgb(100,237, 20,219), Color.FromArgb(100, 20,237, 76),
+      Color.FromArgb(100,237, 61, 20), Color.FromArgb(100,115, 78, 26), Color.FromArgb(100, 20,237,229), Color.FromArgb(100, 39,101, 19),
+      Color.FromArgb(100,230,170,229), Color.FromArgb(100,142,136, 89), Color.FromArgb(100,157,217,166), Color.FromArgb(100, 31, 19,101),
+      Color.FromArgb(100,173,237, 20), Color.FromArgb(100,230,231,161), Color.FromArgb(100,142, 89, 89), Color.FromArgb(100, 93, 89,142),
+      Color.FromArgb(100,146,203,217), Color.FromArgb(100,101, 19, 75), Color.FromArgb(100,198, 20,237), Color.FromArgb(100,185,185,185),
+      Color.FromArgb(100,179, 32, 32), Color.FromArgb(100, 18,119,115), Color.FromArgb(100,104,158,239), Color.Black};
+
+    private static Image GenerateTourVisualization(TSPLIBParser problemInstance, SolutionParser solution) {
+      double[,] coordinates = problemInstance.Vertices;
+
+      double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue;
+      for (int i = 0; i < coordinates.GetLength(0); i++) {
+        if (xMin > coordinates[i, 0]) xMin = coordinates[i, 0];
+        if (yMin > coordinates[i, 1]) yMin = coordinates[i, 1];
+        if (xMax < coordinates[i, 0]) xMax = coordinates[i, 0];
+        if (yMax < coordinates[i, 1]) yMax = coordinates[i, 1];
+      }
+      double xRange = xMax - xMin;
+      double yRange = yMax - yMin;
+      double scaling = Math.Min((TourWidth-TourBorder*2)/xRange, (TourHeight-TourBorder*2)/yRange);
+      Bitmap bitmap = new Bitmap((int)Math.Ceiling(xRange*scaling+TourBorder*2), (int)Math.Ceiling(yRange*scaling+TourBorder*2));
+      var pens = TourColors.Select(c => new Pen(c, 2)).ToList();
+      using (Graphics g = Graphics.FromImage(bitmap)) {
+        using (var brush = new SolidBrush(Color.FromArgb(100, 0, 0, 0))) {
+          g.FillRectangle(Brushes.White, 0, 0, bitmap.Width, bitmap.Height);
+
+          int currentTour = 0;
+          foreach (List<int> tour in solution.Routes) {
+            Point[] tourPoints = new Point[tour.Count + 2];
+            int[] customerSizes = new int[tour.Count];
+
+            for (int i = -1; i <= tour.Count; i++) {
+              int location = (i == -1 || i == tour.Count) ? 0 : tour[i];
+              Point locationPoint = new Point(TourBorder + ((int) ((coordinates[location, 0] - xMin)*scaling)),
+                                              bitmap.Height -
+                                              (TourBorder + ((int) ((coordinates[location, 1] - yMin)*scaling))));
+              tourPoints[i + 1] = locationPoint;
+              if (i != -1 && i != tour.Count) {
+                customerSizes[i] =
+                  (int)
+                  Math.Round(MinDemandSize +
+                             problemInstance.Demands[location]/problemInstance.Capacity*(MaxDemandSize - MinDemandSize));
+              }
+            }
+            g.DrawPolygon(pens[((currentTour >= pens.Count) ? (pens.Count - 1) : (currentTour))], tourPoints);
+            for (int i = 0; i < tour.Count; i++) {
+              int size = customerSizes[i];
+              g.FillEllipse(brush, tourPoints[i + 1].X - size, tourPoints[i + 1].Y - size, size*2, size*2);
+            }
+            g.FillRectangle(Brushes.Blue, tourPoints[0].X - 5, tourPoints[0].Y - 5, 10, 10);
+            currentTour++;
+          }
+        }
+      }
+      foreach (var p in pens) p.Dispose();
+      return bitmap;
+    }
+
+    private static List<Tuple<double, int>> GetDemandDistribution(TSPLIBParser problemInstance) {
+      var result = new List<Tuple<double, int>>();
+
+      double step = problemInstance.Capacity / (double)DemandSegments;
+      double current = 0;
+
+      while(current < problemInstance.Capacity) {
+        int count = problemInstance.Demands.Where(d => d > current && d <= current + step).Count(); 
+        result.Add(new Tuple<double, int>(current + step / 2, count));
+        current += step;           
+      }
+     
+      return result;
+    }
+
+    private static Image GenerateDemandDistribution(TSPLIBParser problemInstance) {     
+      Chart chart = new Chart();
+      chart.Size = new Size(ChartWidth, ChartHeight);
+
+      chart.ChartAreas.Add("");
+      ConfigureChartAppearance(chart);
+      chart.ChartAreas[0].AxisX.Title = "Demands";
+      chart.ChartAreas[0].AxisX.Minimum = 0;
+      chart.ChartAreas[0].AxisX.Maximum = problemInstance.Capacity;
+      chart.ChartAreas[0].AxisX.Interval = problemInstance.Capacity/DemandSegments;
+      chart.ChartAreas[0].AxisX.LabelStyle.Interval = problemInstance.Capacity/DemandSegments*4;
+      chart.ChartAreas[0].AxisY.Title = "Customers";
+      chart.ChartAreas[0].AxisY.Minimum = 0;
+      chart.ChartAreas[0].AxisY.Maximum = problemInstance.Vertices.GetLength(0);
+
+      chart.Series.Add("");
+      chart.Series[0].ChartType = SeriesChartType.Column;
+
+      foreach (Tuple<double, int> entry in GetDemandDistribution(problemInstance)) {
+        chart.Series[0].Points.AddXY(entry.Item1, entry.Item2);
+      }
+
+      Image image;
+      using (var chartimage = new MemoryStream()) {
+        chart.SaveImage(chartimage, ChartImageFormat.Png);
+        image = Image.FromStream(chartimage);
+      }
+      return image;
+    }
+
+    private static void ConfigureChartAppearance(Chart chart) {
+      chart.ChartAreas[0].BackColor = Color.White;
+      chart.ChartAreas[0].AxisX.TitleFont = new Font("Helvetica", 16);
+      chart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
+      chart.ChartAreas[0].AxisY.TitleFont = new Font("Helvetica", 16);
+      chart.ChartAreas[0].AxisY.MajorGrid.Enabled = true;
+      chart.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.FromArgb(100, Color.LightBlue);
+    }
+
+    private static double GetAverageDistance(int customer, double[,] vertices) {
+      double dist = 0;
+      int count = 0;
+
+      for (int i = 0; i < vertices.GetLength(0); i++) {
+        if (i != customer) {
+          dist += Utils.GetDistance(vertices, customer, i);
+          count++;
+        }
+      }
+
+      return dist / count;
+    }
+
+    private static List<Tuple<double, int>> GetDistanceDistribution(TSPLIBParser problemInstance) {
+      var result = new List<Tuple<double, int>>();
+
+      double step = 1.0 / (double)DistanceSegments;
+      double current = 0;
+
+      List<double> averageDistances = new List<double>();
+      for (int i = 0; i < problemInstance.Vertices.GetLength(0); i++) {
+        averageDistances.Add(GetAverageDistance(i, problemInstance.Vertices));
+      }
+
+        while (current < 1.0) {
+          int count = averageDistances.Where(d => d > current && d <= current + step).Count();
+          result.Add(new Tuple<double, int>(current + step / 2, count));
+          current += step;
+        }
+
+      return result;
+    }
+
+    private static Image GenerateDistanceDistribution(TSPLIBParser problemInstance) {
+      Chart chart = new Chart();
+      chart.Size = new Size(ChartWidth, ChartHeight);
+
+      chart.ChartAreas.Add("");
+      ConfigureChartAppearance(chart);
+      chart.ChartAreas[0].AxisX.Title = "Distances";
+      chart.ChartAreas[0].AxisX.Minimum = 0;
+      chart.ChartAreas[0].AxisX.Maximum = 1;
+      chart.ChartAreas[0].AxisX.Interval = 1.0/DistanceSegments;
+      chart.ChartAreas[0].AxisX.LabelStyle.Interval = 1.0/DistanceSegments*4;
+      chart.ChartAreas[0].AxisY.Title = "Customers";
+      chart.ChartAreas[0].AxisY.Minimum = 0;
+      chart.ChartAreas[0].AxisY.Maximum = problemInstance.Vertices.GetLength(0);
+
+      chart.Series.Add("");
+      chart.Series[0].ChartType = SeriesChartType.Column;
+
+      foreach (Tuple<double, int> entry in GetDistanceDistribution(problemInstance)) {
+        chart.Series[0].Points.AddXY(entry.Item1, entry.Item2);
+      }
+
+      Image image;
+      using (var chartimage = new MemoryStream()) {
+        chart.SaveImage(chartimage, ChartImageFormat.Png);
+        image = Image.FromStream(chartimage);
+      }
+      return image;
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/PointD.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/PointD.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/PointD.cs	(revision 15691)
@@ -0,0 +1,17 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace VRPProblemAnalyzer {
+
+  public class PointD : Tuple<double, double> {
+    public double X { get { return Item1; } }
+    public double Y { get { return Item2; }}
+    public PointD(double x, double y) : base(x, y) {}
+    public double DistanceTo(PointD other) {
+      return Math.Sqrt(Square(X - other.X) + Square(Y - other.Y));
+    }
+    private static double Square(double x) { return x*x; }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n32-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n32-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n32-k5.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 21 31 19 17 13 7 26
+Route #2: 12 1 16 30
+Route #3: 27 24
+Route #4: 29 18 8 9 22 15 10 25 5 20
+Route #5: 14 28 11 4 23 3 2 6
+cost 784
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n32-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n32-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n32-k5.vrp	(revision 15691)
@@ -0,0 +1,76 @@
+NAME : A-n32-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 784)
+TYPE : CVRP
+DIMENSION : 32
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 82 76
+ 2 96 44
+ 3 50 5
+ 4 49 8
+ 5 13 7
+ 6 29 89
+ 7 58 30
+ 8 84 39
+ 9 14 24
+ 10 2 39
+ 11 3 82
+ 12 5 10
+ 13 98 52
+ 14 84 25
+ 15 61 59
+ 16 1 65
+ 17 88 51
+ 18 91 2
+ 19 19 32
+ 20 93 3
+ 21 50 93
+ 22 98 14
+ 23 5 42
+ 24 42 9
+ 25 61 62
+ 26 9 97
+ 27 80 55
+ 28 57 69
+ 29 23 15
+ 30 20 70
+ 31 85 60
+ 32 98 5
+DEMAND_SECTION 
+1 0 
+2 19 
+3 21 
+4 6 
+5 19 
+6 7 
+7 12 
+8 16 
+9 6 
+10 16 
+11 8 
+12 14 
+13 21 
+14 16 
+15 3 
+16 22 
+17 18 
+18 19 
+19 1 
+20 24 
+21 8 
+22 12 
+23 4 
+24 8 
+25 24 
+26 24 
+27 2 
+28 20 
+29 15 
+30 2 
+31 14 
+32 9 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n33-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n33-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n33-k5.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 15 17 9 3 16 29
+Route #2: 12 5 26 7 8 13 32 2
+Route #3: 20 4 27 25 30 10
+Route #4: 23 28 18 22
+Route #5: 24 6 19 14 21 1 31 11
+cost 661
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n33-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n33-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n33-k5.vrp	(revision 15691)
@@ -0,0 +1,78 @@
+NAME : A-n33-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 661)
+TYPE : CVRP
+DIMENSION : 33
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 42 68
+ 2 77 97
+ 3 28 64
+ 4 77 39
+ 5 32 33
+ 6 32 8
+ 7 42 92
+ 8 8 3
+ 9 7 14
+ 10 82 17
+ 11 48 13
+ 12 53 82
+ 13 39 27
+ 14 7 24
+ 15 67 98
+ 16 54 52
+ 17 72 43
+ 18 73 3
+ 19 59 77
+ 20 58 97
+ 21 23 43
+ 22 68 98
+ 23 47 62
+ 24 52 72
+ 25 32 88
+ 26 39 7
+ 27 17 8
+ 28 38 7
+ 29 58 74
+ 30 82 67
+ 31 42 7
+ 32 68 82
+ 33 7 48
+DEMAND_SECTION 
+1 0 
+2 5 
+3 23 
+4 14 
+5 13 
+6 8 
+7 18 
+8 19 
+9 10 
+10 18 
+11 20 
+12 5 
+13 9 
+14 23 
+15 9 
+16 18 
+17 10 
+18 24 
+19 13 
+20 14 
+21 8 
+22 10 
+23 19 
+24 14 
+25 13 
+26 14 
+27 2 
+28 23 
+29 15 
+30 8 
+31 20 
+32 24 
+33 3 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n33-k6.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n33-k6.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n33-k6.opt	(revision 15691)
@@ -0,0 +1,7 @@
+Route #1: 5 2 20 15 9 3 8 4
+Route #2: 31 24 23 26 22
+Route #3: 17 11 29 19 7
+Route #4: 10 12 21
+Route #5: 28 27 30 16 25 32
+Route #6: 13 6 18 1 14
+cost 742
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n33-k6.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n33-k6.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n33-k6.vrp	(revision 15691)
@@ -0,0 +1,78 @@
+NAME : A-n33-k6
+COMMENT : (Augerat et al, No of trucks: 6, Optimal value: 742)
+TYPE : CVRP
+DIMENSION : 33
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 34 31
+ 2 45 55
+ 3 70 80
+ 4 81 70
+ 5 85 61
+ 6 59 55
+ 7 45 60
+ 8 50 64
+ 9 80 64
+ 10 75 90
+ 11 25 40
+ 12 9 66
+ 13 1 44
+ 14 50 54
+ 15 35 45
+ 16 71 84
+ 17 1 9
+ 18 25 54
+ 19 45 59
+ 20 45 71
+ 21 66 84
+ 22 11 35
+ 23 81 46
+ 24 85 10
+ 25 75 20
+ 26 15 21
+ 27 90 45
+ 28 15 0
+ 29 31 26
+ 30 10 95
+ 31 6 6
+ 32 51 5
+ 33 26 36
+DEMAND_SECTION 
+1 0 
+2 26 
+3 17 
+4 6 
+5 15 
+6 7 
+7 5 
+8 15 
+9 16 
+10 17 
+11 1 
+12 21 
+13 66 
+14 25 
+15 16 
+16 11 
+17 7 
+18 17 
+19 17 
+20 22 
+21 10 
+22 25 
+23 16 
+24 7 
+25 21 
+26 11 
+27 21 
+28 11 
+29 21 
+30 22 
+31 25 
+32 2 
+33 22 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n34-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n34-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n34-k5.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 18 21 32 28 31 25 13
+Route #2: 4 26 5 24 30
+Route #3: 10 17 19 11 23 1 27
+Route #4: 20 33 16 22 12 3 9 2
+Route #5: 14 29 8 15 6 7
+cost 778
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n34-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n34-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n34-k5.vrp	(revision 15691)
@@ -0,0 +1,80 @@
+NAME : A-n34-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 778)
+TYPE : CVRP
+DIMENSION : 34
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 73 39
+ 2 67 91
+ 3 39 21
+ 4 3 9
+ 5 97 15
+ 6 91 65
+ 7 55 75
+ 8 55 71
+ 9 57 85
+ 10 21 15
+ 11 47 57
+ 12 51 97
+ 13 11 11
+ 14 43 59
+ 15 63 69
+ 16 55 77
+ 17 35 11
+ 18 27 91
+ 19 49 25
+ 20 29 93
+ 21 71 27
+ 22 31 43
+ 23 27 9
+ 24 67 99
+ 25 87 81
+ 26 23 81
+ 27 89 33
+ 28 71 91
+ 29 19 77
+ 30 65 77
+ 31 87 79
+ 32 19 83
+ 33 1 59
+ 34 55 7
+DEMAND_SECTION 
+1 0 
+2 23 
+3 3 
+4 24 
+5 15 
+6 15 
+7 24 
+8 7 
+9 25 
+10 13 
+11 5 
+12 7 
+13 5 
+14 14 
+15 13 
+16 5 
+17 24 
+18 15 
+19 9 
+20 16 
+21 13 
+22 16 
+23 13 
+24 24 
+25 20 
+26 23 
+27 20 
+28 3 
+29 15 
+30 12 
+31 19 
+32 4 
+33 15 
+34 1 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n36-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n36-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n36-k5.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 9 6 3 4 19 31 12
+Route #2: 28 14 34 23 2 35 8 15
+Route #3: 16 11 24 27 25 5 20
+Route #4: 10 7 26
+Route #5: 1 22 32 13 17 30 29 33 18 21
+cost 799
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n36-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n36-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n36-k5.vrp	(revision 15691)
@@ -0,0 +1,84 @@
+NAME : A-n36-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 799)
+TYPE : CVRP
+DIMENSION : 36
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 15 19
+ 2 1 49
+ 3 87 25
+ 4 69 65
+ 5 93 91
+ 6 33 31
+ 7 71 61
+ 8 29 9
+ 9 93 7
+ 10 55 47
+ 11 23 13
+ 12 19 47
+ 13 57 63
+ 14 5 95
+ 15 65 43
+ 16 69 1
+ 17 3 25
+ 18 19 91
+ 19 21 81
+ 20 67 91
+ 21 41 23
+ 22 19 75
+ 23 15 79
+ 24 79 47
+ 25 19 65
+ 26 27 49
+ 27 29 17
+ 28 25 65
+ 29 59 51
+ 30 27 95
+ 31 21 91
+ 32 61 83
+ 33 15 83
+ 34 31 87
+ 35 71 41
+ 36 91 21
+DEMAND_SECTION 
+1 0 
+2 1 
+3 14 
+4 15 
+5 11 
+6 18 
+7 2 
+8 22 
+9 7 
+10 18 
+11 23 
+12 12 
+13 21 
+14 2 
+15 14 
+16 9 
+17 10 
+18 4 
+19 19 
+20 2 
+21 20 
+22 15 
+23 11 
+24 6 
+25 13 
+26 19 
+27 13 
+28 8 
+29 15 
+30 18 
+31 11 
+32 21 
+33 12 
+34 2 
+35 23 
+36 11 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n37-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n37-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n37-k5.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 22 13 10 6 5 33 4 7
+Route #2: 1 12 2 19 20 23 14 17
+Route #3: 36 29 32 28 31 30 15
+Route #4: 3 24 9 11 27 8 25 35 18 26 34
+Route #5: 21 16
+cost 669
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n37-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n37-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n37-k5.vrp	(revision 15691)
@@ -0,0 +1,86 @@
+NAME : A-n37-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 669)
+TYPE : CVRP
+DIMENSION : 37
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 38 46
+ 2 59 46
+ 3 96 42
+ 4 47 61
+ 5 26 15
+ 6 66 6
+ 7 96 7
+ 8 37 25
+ 9 68 92
+ 10 78 84
+ 11 82 28
+ 12 93 90
+ 13 74 42
+ 14 60 20
+ 15 78 58
+ 16 36 48
+ 17 45 36
+ 18 73 57
+ 19 10 91
+ 20 98 51
+ 21 92 62
+ 22 43 42
+ 23 53 25
+ 24 78 65
+ 25 72 79
+ 26 37 88
+ 27 16 73
+ 28 75 96
+ 29 11 66
+ 30 9 49
+ 31 25 72
+ 32 8 68
+ 33 12 61
+ 34 50 2
+ 35 26 54
+ 36 18 89
+ 37 22 53
+DEMAND_SECTION 
+1 0 
+2 16 
+3 18 
+4 1 
+5 13 
+6 8 
+7 23 
+8 7 
+9 27 
+10 1 
+11 3 
+12 6 
+13 24 
+14 19 
+15 2 
+16 5 
+17 16 
+18 7 
+19 4 
+20 22 
+21 7 
+22 23 
+23 16 
+24 2 
+25 2 
+26 9 
+27 2 
+28 12 
+29 1 
+30 9 
+31 23 
+32 6 
+33 19 
+34 7 
+35 7 
+36 20 
+37 20 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n37-k6.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n37-k6.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n37-k6.opt	(revision 15691)
@@ -0,0 +1,7 @@
+Route #1: 7 25 35 16 
+Route #2: 18 31 19 9 21 26 
+Route #3: 14 6 36 29 24 
+Route #4: 33 2 28 23 22 12 11 10 4 
+Route #5: 13 30 15 32 27 
+Route #6: 20 8 5 3 1 34 17 
+cost 949
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n37-k6.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n37-k6.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n37-k6.vrp	(revision 15691)
@@ -0,0 +1,86 @@
+NAME : A-n37-k6
+COMMENT : (Augerat et al, No of trucks: 6, Optimal value: 949)
+TYPE : CVRP
+DIMENSION : 37
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 86 22
+ 2 29 17
+ 3 4 50
+ 4 25 13
+ 5 67 37
+ 6 13 7
+ 7 62 15
+ 8 84 38
+ 9 34 3
+ 10 19 45
+ 11 42 76
+ 12 40 86
+ 13 25 94
+ 14 63 57
+ 15 75 24
+ 16 61 85
+ 17 87 38
+ 18 54 39
+ 19 66 34
+ 20 46 39
+ 21 47 17
+ 22 21 54
+ 23 19 83
+ 24 1 82
+ 25 94 28
+ 26 82 72
+ 27 41 59
+ 28 100 77
+ 29 1 57
+ 30 96 7
+ 31 57 82
+ 32 47 38
+ 33 68 89
+ 34 16 36
+ 35 51 38
+ 36 83 74
+ 37 84 2
+DEMAND_SECTION 
+1 0 
+2 1 
+3 23 
+4 23 
+5 5 
+6 7 
+7 18 
+8 12 
+9 20 
+10 19 
+11 19 
+12 16 
+13 2 
+14 26 
+15 13 
+16 19 
+17 17 
+18 14 
+19 8 
+20 10 
+21 5 
+22 19 
+23 12 
+24 9 
+25 18 
+26 4 
+27 20 
+28 8 
+29 3 
+30 18 
+31 26 
+32 21 
+33 21 
+34 8 
+35 19 
+36 66 
+37 21 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n38-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n38-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n38-k5.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 37 11 27 22 5 7
+Route #2: 10 30 29 34 19 18
+Route #3: 20 32 15 13 36 17 2 14
+Route #4: 28 31 6 25 16 4 1 3 12 26 21
+Route #5: 24 33 35 23 8 9
+cost 730
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n38-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n38-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n38-k5.vrp	(revision 15691)
@@ -0,0 +1,88 @@
+NAME : A-n38-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 730)
+TYPE : CVRP
+DIMENSION : 38
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 69 63
+ 2 3 35
+ 3 71 79
+ 4 1 47
+ 5 11 15
+ 6 87 23
+ 7 37 33
+ 8 87 29
+ 9 35 81
+ 10 55 71
+ 11 41 51
+ 12 93 9
+ 13 11 49
+ 14 75 89
+ 15 75 69
+ 16 97 95
+ 17 15 13
+ 18 63 95
+ 19 47 41
+ 20 45 41
+ 21 89 43
+ 22 45 59
+ 23 95 23
+ 24 19 83
+ 25 71 69
+ 26 27 19
+ 27 17 57
+ 28 93 15
+ 29 59 29
+ 30 35 39
+ 31 33 51
+ 32 61 21
+ 33 89 53
+ 34 33 85
+ 35 37 37
+ 36 21 91
+ 37 67 95
+ 38 61 15
+DEMAND_SECTION 
+1 0 
+2 12 
+3 5 
+4 8 
+5 12 
+6 18 
+7 12 
+8 11 
+9 19 
+10 23 
+11 8 
+12 25 
+13 1 
+14 5 
+15 17 
+16 13 
+17 9 
+18 13 
+19 19 
+20 5 
+21 26 
+22 9 
+23 20 
+24 21 
+25 8 
+26 12 
+27 13 
+28 12 
+29 4 
+30 19 
+31 25 
+32 7 
+33 3 
+34 2 
+35 24 
+36 13 
+37 14 
+38 14 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n39-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n39-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n39-k5.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 17 24 35 37 34 26 11 8 
+Route #2: 2 22 3 7 16 32 10 
+Route #3: 21 30 13 28 27 36 6 
+Route #4: 14 19 25 33 12 18 4 
+Route #5: 9 38 15 5 29 20 23 1 31 
+cost 822
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n39-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n39-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n39-k5.vrp	(revision 15691)
@@ -0,0 +1,90 @@
+NAME : A-n39-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 822)
+TYPE : CVRP
+DIMENSION : 39
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 9 35
+ 2 43 19
+ 3 79 35
+ 4 93 7
+ 5 13 35
+ 6 67 13
+ 7 31 77
+ 8 81 7
+ 9 27 49
+ 10 27 35
+ 11 69 23
+ 12 31 51
+ 13 27 27
+ 14 15 83
+ 15 7 35
+ 16 53 25
+ 17 75 13
+ 18 47 49
+ 19 25 33
+ 20 1 23
+ 21 45 11
+ 22 1 47
+ 23 93 15
+ 24 41 9
+ 25 75 55
+ 26 3 1
+ 27 51 67
+ 28 57 91
+ 29 21 97
+ 30 55 13
+ 31 3 71
+ 32 37 19
+ 33 73 21
+ 34 19 19
+ 35 75 73
+ 36 93 49
+ 37 41 87
+ 38 97 73
+ 39 45 29
+DEMAND_SECTION 
+1 0 
+2 5 
+3 24 
+4 3 
+5 20 
+6 26 
+7 23 
+8 15 
+9 3 
+10 20 
+11 16 
+12 9 
+13 21 
+14 3 
+15 24 
+16 14 
+17 6 
+18 6 
+19 13 
+20 5 
+21 3 
+22 3 
+23 20 
+24 16 
+25 22 
+26 10 
+27 12 
+28 20 
+29 24 
+30 6 
+31 1 
+32 2 
+33 13 
+34 7 
+35 6 
+36 24 
+37 19 
+38 4 
+39 7 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n39-k6.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n39-k6.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n39-k6.opt	(revision 15691)
@@ -0,0 +1,7 @@
+Route #1: 37 31 14 35 25 33 19 2
+Route #2: 26 11
+Route #3: 24 3 38 12 9 28 29 5
+Route #4: 15 30 13
+Route #5: 18 27 10 16 4 8 7
+Route #6: 6 1 36 17 23 21 22 34 32 20
+cost 831
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n39-k6.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n39-k6.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n39-k6.vrp	(revision 15691)
@@ -0,0 +1,90 @@
+NAME : A-n39-k6
+COMMENT : (Augerat et al, No of trucks: 6, Optimal value: 831)
+TYPE : CVRP
+DIMENSION : 39
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 39 19
+ 2 79 19
+ 3 41 79
+ 4 25 31
+ 5 63 93
+ 6 33 5
+ 7 69 17
+ 8 57 73
+ 9 53 75
+ 10 1 1
+ 11 79 73
+ 12 59 5
+ 13 1 37
+ 14 41 31
+ 15 23 73
+ 16 37 27
+ 17 85 93
+ 18 93 13
+ 19 85 45
+ 20 49 91
+ 21 55 43
+ 22 83 29
+ 23 93 49
+ 24 87 23
+ 25 31 23
+ 26 19 97
+ 27 41 9
+ 28 83 61
+ 29 9 7
+ 30 13 13
+ 31 43 37
+ 32 13 61
+ 33 71 51
+ 34 45 93
+ 35 93 55
+ 36 5 97
+ 37 81 11
+ 38 7 53
+ 39 7 41
+DEMAND_SECTION 
+1 0 
+2 18 
+3 16 
+4 22 
+5 24 
+6 3 
+7 19 
+8 6 
+9 6 
+10 6 
+11 12 
+12 18 
+13 16 
+14 72 
+15 7 
+16 16 
+17 23 
+18 4 
+19 22 
+20 23 
+21 7 
+22 11 
+23 11 
+24 1 
+25 22 
+26 16 
+27 15 
+28 7 
+29 5 
+30 22 
+31 9 
+32 10 
+33 11 
+34 9 
+35 3 
+36 7 
+37 15 
+38 10 
+39 2 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n44-k6.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n44-k6.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n44-k6.opt	(revision 15691)
@@ -0,0 +1,7 @@
+Route #1: 1 35 18 20 16 11 10 26 
+Route #2: 31 8 15 27 28 7 
+Route #3: 22 36 9 38 13 14 41 2 
+Route #4: 4 34 39 12 3 25 6 
+Route #5: 17 23 30 40 29 43 
+Route #6: 24 5 21 32 42 37 33 19 
+cost 937
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n44-k6.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n44-k6.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n44-k6.vrp	(revision 15691)
@@ -0,0 +1,100 @@
+NAME : A-n44-k6
+COMMENT : (Augerat et al, No of trucks: 6, Optimal value: 937)
+TYPE : CVRP
+DIMENSION : 44
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 14 68
+ 2 73 2
+ 3 13 47
+ 4 37 44
+ 5 34 63
+ 6 58 98
+ 7 33 42
+ 8 18 98
+ 9 24 79
+ 10 17 28
+ 11 72 67
+ 12 78 63
+ 13 42 48
+ 14 1 2
+ 15 2 28
+ 16 32 82
+ 17 97 38
+ 18 39 53
+ 19 87 1
+ 20 42 77
+ 21 83 27
+ 22 79 92
+ 23 22 39
+ 24 58 32
+ 25 53 84
+ 26 38 37
+ 27 63 59
+ 28 42 88
+ 29 32 88
+ 30 38 23
+ 31 63 32
+ 32 22 73
+ 33 88 94
+ 34 58 78
+ 35 43 62
+ 36 73 1
+ 37 17 32
+ 38 87 79
+ 39 12 24
+ 40 48 53
+ 41 48 23
+ 42 7 37
+ 43 98 77
+ 44 34 12
+DEMAND_SECTION 
+1 0 
+2 8 
+3 24 
+4 9 
+5 19 
+6 9 
+7 18 
+8 9 
+9 14 
+10 3 
+11 14 
+12 8 
+13 8 
+14 13 
+15 18 
+16 4 
+17 24 
+18 14 
+19 8 
+20 18 
+21 13 
+22 2 
+23 9 
+24 18 
+25 3 
+26 24 
+27 8 
+28 24 
+29 14 
+30 13 
+31 24 
+32 23 
+33 9 
+34 13 
+35 14 
+36 14 
+37 18 
+38 24 
+39 4 
+40 8 
+41 13 
+42 4 
+43 14 
+44 18 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n45-k6.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n45-k6.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n45-k6.opt	(revision 15691)
@@ -0,0 +1,7 @@
+Route #1: 18 17 11 40 30 19 34 44 
+Route #2: 29 43 13 7 28 23 
+Route #3: 32 20 5 21 33 41 8 10 3 
+Route #4: 12 39 36 42 4 16 22 9 
+Route #5: 26 27 37 24 6 1 
+Route #6: 15 25 2 38 31 35 14 
+cost 944
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n45-k6.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n45-k6.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n45-k6.vrp	(revision 15691)
@@ -0,0 +1,102 @@
+NAME : A-n45-k6
+COMMENT : (Augerat et al, No of trucks: 6, Optimal value: 944)
+TYPE : CVRP
+DIMENSION : 45
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 31 73
+ 2 11 67
+ 3 52 96
+ 4 81 29
+ 5 97 62
+ 6 71 5
+ 7 6 56
+ 8 48 50
+ 9 91 17
+ 10 49 68
+ 11 85 29
+ 12 11 16
+ 13 74 98
+ 14 56 37
+ 15 13 81
+ 16 66 80
+ 17 96 55
+ 18 36 17
+ 19 32 23
+ 20 6 13
+ 21 64 30
+ 22 87 5
+ 23 75 61
+ 24 40 72
+ 25 1 44
+ 26 60 95
+ 27 27 49
+ 28 15 33
+ 29 46 53
+ 30 28 43
+ 31 3 9
+ 32 1 100
+ 33 53 46
+ 34 98 8
+ 35 6 25
+ 36 7 81
+ 37 96 88
+ 38 2 35
+ 39 32 94
+ 40 95 94
+ 41 9 11
+ 42 96 16
+ 43 90 68
+ 44 33 31
+ 45 6 59
+DEMAND_SECTION 
+1 0 
+2 19 
+3 2 
+4 12 
+5 20 
+6 6 
+7 17 
+8 8 
+9 14 
+10 2 
+11 8 
+12 5 
+13 7 
+14 22 
+15 14 
+16 17 
+17 23 
+18 15 
+19 21 
+20 2 
+21 24 
+22 10 
+23 20 
+24 6 
+25 21 
+26 10 
+27 6 
+28 13 
+29 21 
+30 24 
+31 11 
+32 16 
+33 8 
+34 11 
+35 11 
+36 22 
+37 17 
+38 22 
+39 17 
+40 8 
+41 23 
+42 5 
+43 3 
+44 18 
+45 12 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n45-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n45-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n45-k7.opt	(revision 15691)
@@ -0,0 +1,8 @@
+Route #1: 21 27 41 43 11 3 28 6 2 
+Route #2: 8 42 1 37 30 22 9 
+Route #3: 31 29 19 36 5 32 
+Route #4: 40 20 16 7 18 
+Route #5: 39 24 44 33 14 
+Route #6: 35 34 26 4 12 
+Route #7: 10 15 25 23 17 38 13 
+cost 1146
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n45-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n45-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n45-k7.vrp	(revision 15691)
@@ -0,0 +1,102 @@
+NAME : A-n45-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 1146)
+TYPE : CVRP
+DIMENSION : 45
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 61 99
+ 2 95 7
+ 3 45 87
+ 4 15 47
+ 5 39 75
+ 6 55 23
+ 7 29 71
+ 8 87 79
+ 9 75 63
+ 10 65 61
+ 11 73 35
+ 12 17 35
+ 13 39 99
+ 14 75 77
+ 15 49 37
+ 16 85 31
+ 17 89 71
+ 18 89 43
+ 19 79 81
+ 20 45 5
+ 21 93 69
+ 22 49 69
+ 23 63 25
+ 24 93 33
+ 25 39 45
+ 26 89 33
+ 27 47 77
+ 28 29 19
+ 29 13 65
+ 30 33 9
+ 31 63 9
+ 32 41 13
+ 33 67 75
+ 34 41 27
+ 35 49 77
+ 36 57 81
+ 37 45 5
+ 38 83 7
+ 39 81 61
+ 40 57 81
+ 41 93 89
+ 42 17 13
+ 43 89 27
+ 44 7 25
+ 45 35 35
+DEMAND_SECTION 
+1 0 
+2 14 
+3 1 
+4 16 
+5 23 
+6 12 
+7 6 
+8 5 
+9 1 
+10 13 
+11 20 
+12 14 
+13 18 
+14 7 
+15 8 
+16 21 
+17 8 
+18 24 
+19 20 
+20 19 
+21 13 
+22 3 
+23 26 
+24 17 
+25 22 
+26 8 
+27 16 
+28 20 
+29 12 
+30 22 
+31 20 
+32 12 
+33 14 
+34 25 
+35 17 
+36 19 
+37 20 
+38 15 
+39 2 
+40 9 
+41 10 
+42 6 
+43 11 
+44 21 
+45 24 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n46-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n46-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n46-k7.opt	(revision 15691)
@@ -0,0 +1,8 @@
+Route #1: 23
+Route #2: 13 4 30 2 37 38
+Route #3: 19 15 24 16 42 33 8
+Route #4: 21 29 31 34 40 1 27 20 41 28
+Route #5: 9 17 45 6 43 26 14
+Route #6: 5 32 22 10 7 39 36
+Route #7: 11 12 35 18 25 44 3
+cost 914
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n46-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n46-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n46-k7.vrp	(revision 15691)
@@ -0,0 +1,104 @@
+NAME : A-n46-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 914)
+TYPE : CVRP
+DIMENSION : 46
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 75 55
+ 2 7 75
+ 3 77 1
+ 4 51 25
+ 5 81 25
+ 6 59 37
+ 7 93 45
+ 8 43 21
+ 9 35 53
+ 10 77 63
+ 11 37 13
+ 12 37 51
+ 13 27 31
+ 14 95 31
+ 15 87 43
+ 16 23 65
+ 17 9 51
+ 18 73 81
+ 19 3 1
+ 20 41 61
+ 21 29 81
+ 22 51 95
+ 23 49 25
+ 24 81 53
+ 25 7 51
+ 26 21 5
+ 27 91 35
+ 28 17 81
+ 29 61 69
+ 30 27 97
+ 31 83 23
+ 32 21 93
+ 33 59 31
+ 34 27 53
+ 35 9 91
+ 36 11 27
+ 37 59 41
+ 38 67 1
+ 39 77 39
+ 40 47 29
+ 41 3 89
+ 42 33 87
+ 43 17 45
+ 44 91 41
+ 45 23 3
+ 46 97 61
+DEMAND_SECTION 
+1 0 
+2 12 
+3 26 
+4 1 
+5 20 
+6 2 
+7 13 
+8 20 
+9 7 
+10 10 
+11 15 
+12 7 
+13 24 
+14 10 
+15 12 
+16 23 
+17 13 
+18 19 
+19 9 
+20 12 
+21 6 
+22 9 
+23 22 
+24 18 
+25 19 
+26 20 
+27 24 
+28 10 
+29 4 
+30 20 
+31 15 
+32 13 
+33 12 
+34 3 
+35 7 
+36 18 
+37 3 
+38 23 
+39 1 
+40 17 
+41 13 
+42 6 
+43 22 
+44 20 
+45 21 
+46 2 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n48-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n48-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n48-k7.opt	(revision 15691)
@@ -0,0 +1,8 @@
+Route #1: 34 9 24 4 11 42 15 27 45 
+Route #2: 32 36 38 19 25 22 6 
+Route #3: 40 7 8 39 26 20 3 37 
+Route #4: 41 2 10 47 17 14 
+Route #5: 44 35 18 
+Route #6: 28 29 21 30 13 46 33 16 
+Route #7: 23 43 31 1 5 12 
+cost 1073
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n48-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n48-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n48-k7.vrp	(revision 15691)
@@ -0,0 +1,108 @@
+NAME : A-n48-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 1073)
+TYPE : CVRP
+DIMENSION : 48
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 47 5
+ 2 1 19
+ 3 97 35
+ 4 23 79
+ 5 77 87
+ 6 3 9
+ 7 5 27
+ 8 41 53
+ 9 51 87
+ 10 67 73
+ 11 89 45
+ 12 71 99
+ 13 11 1
+ 14 85 85
+ 15 57 11
+ 16 57 85
+ 17 71 33
+ 18 61 13
+ 19 39 15
+ 20 13 59
+ 21 43 99
+ 22 87 73
+ 23 11 37
+ 24 21 11
+ 25 77 81
+ 26 3 63
+ 27 47 95
+ 28 53 75
+ 29 73 55
+ 30 81 71
+ 31 89 75
+ 32 11 9
+ 33 27 37
+ 34 95 59
+ 35 63 63
+ 36 37 21
+ 37 33 47
+ 38 23 63
+ 39 13 55
+ 40 47 93
+ 41 45 43
+ 42 83 7
+ 43 69 91
+ 44 13 11
+ 45 37 15
+ 46 53 59
+ 47 97 83
+ 48 75 31
+DEMAND_SECTION 
+1 0 
+2 20 
+3 14 
+4 5 
+5 11 
+6 22 
+7 25 
+8 2 
+9 18 
+10 10 
+11 26 
+12 14 
+13 22 
+14 9 
+15 11 
+16 18 
+17 24 
+18 15 
+19 23 
+20 16 
+21 14 
+22 8 
+23 5 
+24 12 
+25 8 
+26 16 
+27 12 
+28 15 
+29 9 
+30 2 
+31 10 
+32 2 
+33 3 
+34 20 
+35 3 
+36 13 
+37 25 
+38 23 
+39 8 
+40 16 
+41 9 
+42 14 
+43 4 
+44 13 
+45 7 
+46 16 
+47 18 
+48 16 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n53-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n53-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n53-k7.opt	(revision 15691)
@@ -0,0 +1,8 @@
+Route #1: 9 16 32 15 19 23 43 50 36 2 37 
+Route #2: 4 28 17 41 11 24 52 34 
+Route #3: 47 7 12 48 42 45 22 
+Route #4: 51 46 8 35 27 
+Route #5: 33 6 20 31 
+Route #6: 39 3 5 14 13 21 25 
+Route #7: 1 30 44 29 49 10 26 40 18 38 
+cost 1010
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n53-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n53-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n53-k7.vrp	(revision 15691)
@@ -0,0 +1,118 @@
+NAME : A-n53-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 1010)
+TYPE : CVRP
+DIMENSION : 53
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 24 63
+ 2 35 60
+ 3 79 46
+ 4 3 45
+ 5 42 50
+ 6 3 40
+ 7 29 96
+ 8 47 30
+ 9 54 77
+ 10 36 30
+ 11 83 86
+ 12 30 6
+ 13 55 29
+ 14 13 2
+ 15 1 19
+ 16 98 1
+ 17 75 10
+ 18 39 23
+ 19 62 91
+ 20 96 9
+ 21 27 87
+ 22 14 16
+ 23 52 49
+ 24 95 21
+ 25 30 6
+ 26 18 40
+ 27 82 90
+ 28 50 79
+ 29 48 49
+ 30 82 73
+ 31 64 62
+ 32 34 78
+ 33 83 6
+ 34 3 77
+ 35 18 8
+ 36 53 86
+ 37 88 51
+ 38 77 51
+ 39 58 89
+ 40 12 44
+ 41 70 88
+ 42 36 17
+ 43 85 23
+ 44 93 30
+ 45 68 67
+ 46 71 34
+ 47 56 73
+ 48 37 37
+ 49 78 20
+ 50 88 69
+ 51 95 42
+ 52 44 71
+ 53 18 1
+DEMAND_SECTION 
+1 0 
+2 2 
+3 12 
+4 14 
+5 2 
+6 17 
+7 20 
+8 2 
+9 26 
+10 7 
+11 24 
+12 23 
+13 13 
+14 25 
+15 20 
+16 3 
+17 18 
+18 23 
+19 6 
+20 2 
+21 13 
+22 22 
+23 3 
+24 6 
+25 7 
+26 1 
+27 18 
+28 18 
+29 10 
+30 2 
+31 9 
+32 10 
+33 8 
+34 30 
+35 16 
+36 23 
+37 2 
+38 18 
+39 22 
+40 1 
+41 8 
+42 4 
+43 26 
+44 21 
+45 2 
+46 15 
+47 25 
+48 22 
+49 19 
+50 3 
+51 3 
+52 5 
+53 13 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n54-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n54-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n54-k7.opt	(revision 15691)
@@ -0,0 +1,8 @@
+Route #1: 29 26 45 21 33 9 38 
+Route #2: 11 19 8 31 40 48 37 32 
+Route #3: 14 2 12 27 6 16 
+Route #4: 13 22 3 53 44 
+Route #5: 43 4 28 7 39 50 5 18 
+Route #6: 30 25 47 51 24 42 46 41 34 52 
+Route #7: 23 20 49 36 1 17 10 15 35 
+Cost 1167
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n54-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n54-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n54-k7.vrp	(revision 15691)
@@ -0,0 +1,120 @@
+NAME : A-n54-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 1167)
+TYPE : CVRP
+DIMENSION : 54
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 61 5
+ 2 85 53
+ 3 17 57
+ 4 49 93
+ 5 69 11
+ 6 87 15
+ 7 49 39
+ 8 87 23
+ 9 19 83
+ 10 69 87
+ 11 69 43
+ 12 49 67
+ 13 17 61
+ 14 45 61
+ 15 21 53
+ 16 71 37
+ 17 53 23
+ 18 77 63
+ 19 89 7
+ 20 21 83
+ 21 77 25
+ 22 85 95
+ 23 43 93
+ 24 75 25
+ 25 1 43
+ 26 7 7
+ 27 81 69
+ 28 23 57
+ 29 81 15
+ 30 77 35
+ 31 49 3
+ 32 21 93
+ 33 41 37
+ 34 71 91
+ 35 31 13
+ 36 69 33
+ 37 91 47
+ 38 13 69
+ 39 65 75
+ 40 91 27
+ 41 9 85
+ 42 15 19
+ 43 7 37
+ 44 61 11
+ 45 59 83
+ 46 85 69
+ 47 15 29
+ 48 1 13
+ 49 1 83
+ 50 85 31
+ 51 95 25
+ 52 5 33
+ 53 51 11
+ 54 51 85
+DEMAND_SECTION 
+1 0 
+2 24 
+3 9 
+4 15 
+5 17 
+6 2 
+7 19 
+8 10 
+9 17 
+10 20 
+11 16 
+12 8 
+13 12 
+14 3 
+15 23 
+16 4 
+17 23 
+18 20 
+19 2 
+20 19 
+21 2 
+22 23 
+23 23 
+24 5 
+25 12 
+26 15 
+27 9 
+28 13 
+29 18 
+30 16 
+31 7 
+32 6 
+33 2 
+34 8 
+35 2 
+36 2 
+37 4 
+38 13 
+39 18 
+40 9 
+41 19 
+42 3 
+43 14 
+44 19 
+45 21 
+46 4 
+47 6 
+48 22 
+49 13 
+50 10 
+51 18 
+52 5 
+53 9 
+54 36 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n55-k9.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n55-k9.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n55-k9.opt	(revision 15691)
@@ -0,0 +1,10 @@
+Route #1: 4 7 42 31 20 46 26 
+Route #2: 36 11 15 51 2 17 14 
+Route #3: 37 3 34 33 21 
+Route #4: 1 45 6 8 
+Route #5: 25 41 29 
+Route #6: 23 52 24 44 50 48 18 
+Route #7: 32 38 16 40 53 5 10 12 
+Route #8: 30 22 19 27 13 54 28 
+Route #9: 47 39 49 9 35 43 
+cost 1073
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n55-k9.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n55-k9.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n55-k9.vrp	(revision 15691)
@@ -0,0 +1,122 @@
+NAME : A-n55-k9
+COMMENT : (Augerat et al, No of trucks: 9, Optimal value: 1073)
+TYPE : CVRP
+DIMENSION : 55
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 36 64
+ 2 94 47
+ 3 10 23
+ 4 16 46
+ 5 25 79
+ 6 41 30
+ 7 81 45
+ 8 14 79
+ 9 42 56
+ 10 90 17
+ 11 41 39
+ 12 21 14
+ 13 41 46
+ 14 65 96
+ 15 13 49
+ 16 21 14
+ 17 57 2
+ 18 14 42
+ 19 66 62
+ 20 58 96
+ 21 5 51
+ 22 41 50
+ 23 50 99
+ 24 84 85
+ 25 97 90
+ 26 47 76
+ 27 11 54
+ 28 60 97
+ 29 60 89
+ 30 58 68
+ 31 30 93
+ 32 9 60
+ 33 47 44
+ 34 19 40
+ 35 15 40
+ 36 88 21
+ 37 33 58
+ 38 21 51
+ 39 57 7
+ 40 81 6
+ 41 49 6
+ 42 51 78
+ 43 9 62
+ 44 84 36
+ 45 95 76
+ 46 89 44
+ 47 10 49
+ 48 69 16
+ 49 75 66
+ 50 97 11
+ 51 74 69
+ 52 1 14
+ 53 96 91
+ 54 46 22
+ 55 74 92
+DEMAND_SECTION 
+1 0 
+2 3 
+3 12 
+4 25 
+5 4 
+6 11 
+7 20 
+8 21 
+9 10 
+10 20 
+11 13 
+12 14 
+13 16 
+14 17 
+15 11 
+16 36 
+17 6 
+18 7 
+19 21 
+20 11 
+21 17 
+22 22 
+23 10 
+24 19 
+25 21 
+26 23 
+27 19 
+28 15 
+29 22 
+30 7 
+31 11 
+32 15 
+33 22 
+34 12 
+35 24 
+36 25 
+37 2 
+38 15 
+39 18 
+40 13 
+41 3 
+42 20 
+43 14 
+44 10 
+45 10 
+46 66 
+47 10 
+48 7 
+49 12 
+50 24 
+51 5 
+52 18 
+53 7 
+54 11 
+55 12 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n60-k9.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n60-k9.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n60-k9.opt	(revision 15691)
@@ -0,0 +1,10 @@
+Route #1: 2 1 48 22 36 31 
+Route #2: 4 21 53 30 49 44 28 6 
+Route #3: 7 29 13 8 15 55 35 
+Route #4: 10 54 5 45 42 
+Route #5: 14 47 23 58 24 34 
+Route #6: 16 20 3 11 40 46 25 
+Route #7: 18 52 59 38 33 41 
+Route #8: 19 27 57 37 17 26 39 
+Route #9: 32 9 51 12 56 43 50 
+cost 1354
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n60-k9.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n60-k9.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n60-k9.vrp	(revision 15691)
@@ -0,0 +1,132 @@
+NAME : A-n60-k9
+COMMENT : (Augerat et al, No of trucks: 9, Optimal value: 1354)
+TYPE : CVRP
+DIMENSION : 60
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 27 93
+ 2 33 27
+ 3 29 39
+ 4 7 81
+ 5 1 59
+ 6 49 9
+ 7 21 53
+ 8 79 89
+ 9 81 83
+ 10 85 11
+ 11 45 9
+ 12 7 65
+ 13 95 27
+ 14 81 85
+ 15 37 81
+ 16 69 69
+ 17 15 95
+ 18 89 75
+ 19 33 93
+ 20 57 83
+ 21 11 95
+ 22 3 57
+ 23 45 11
+ 24 43 61
+ 25 35 43
+ 26 19 83
+ 27 83 69
+ 28 85 77
+ 29 19 39
+ 30 83 87
+ 31 1 13
+ 32 15 39
+ 33 83 17
+ 34 41 97
+ 35 31 61
+ 36 59 69
+ 37 29 15
+ 38 93 83
+ 39 63 97
+ 40 65 57
+ 41 15 69
+ 42 31 97
+ 43 57 9
+ 44 85 37
+ 45 21 29
+ 46 53 11
+ 47 15 77
+ 48 41 69
+ 49 45 17
+ 50 13 25
+ 51 63 57
+ 52 95 5
+ 53 55 91
+ 54 3 31
+ 55 47 7
+ 56 61 69
+ 57 85 35
+ 58 89 81
+ 59 45 47
+ 60 65 93
+DEMAND_SECTION 
+1 0 
+2 16 
+3 2 
+4 7 
+5 11 
+6 9 
+7 17 
+8 21 
+9 23 
+10 10 
+11 6 
+12 19 
+13 18 
+14 20 
+15 13 
+16 5 
+17 11 
+18 24 
+19 2 
+20 3 
+21 1 
+22 5 
+23 20 
+24 23 
+25 24 
+26 18 
+27 19 
+28 2 
+29 17 
+30 17 
+31 9 
+32 11 
+33 2 
+34 6 
+35 9 
+36 5 
+37 9 
+38 2 
+39 14 
+40 19 
+41 11 
+42 21 
+43 20 
+44 21 
+45 18 
+46 48 
+47 1 
+48 17 
+49 42 
+50 2 
+51 4 
+52 24 
+53 18 
+54 21 
+55 11 
+56 9 
+57 18 
+58 22 
+59 9 
+60 23 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n61-k9.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n61-k9.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n61-k9.opt	(revision 15691)
@@ -0,0 +1,10 @@
+Route #1: 14 7 23 55 50 
+Route #2: 12 22 4 26 43 32 42 33 
+Route #3: 10 2 46 54 5 53 40 
+Route #4: 19 8 41 6 20 58 
+Route #5: 51 35 18 47 56 27 21 36 29 25 
+Route #6: 44 11 1 16 48 34 9 
+Route #7: 3 38 15 
+Route #8: 13 17 57 52 31 60 28 39 
+Route #9: 24 49 59 45 37 30 
+Cost 1034
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n61-k9.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n61-k9.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n61-k9.vrp	(revision 15691)
@@ -0,0 +1,134 @@
+NAME : A-n61-k9
+COMMENT : (Augerat et al, No of trucks: 9, Optimal value: 1034)
+TYPE : CVRP
+DIMENSION : 61
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 61 37
+ 2 93 57
+ 3 15 67
+ 4 23 43
+ 5 53 5
+ 6 13 75
+ 7 29 73
+ 8 47 37
+ 9 23 71
+ 10 67 45
+ 11 21 49
+ 12 93 43
+ 13 67 13
+ 14 69 25
+ 15 53 35
+ 16 25 39
+ 17 85 69
+ 18 81 27
+ 19 77 79
+ 20 45 43
+ 21 31 75
+ 22 49 99
+ 23 63 9
+ 24 47 37
+ 25 33 47
+ 26 39 69
+ 27 49 3
+ 28 49 87
+ 29 87 39
+ 30 37 91
+ 31 19 33
+ 32 97 35
+ 33 31 5
+ 34 35 25
+ 35 79 61
+ 36 73 73
+ 37 35 95
+ 38 5 43
+ 39 19 45
+ 40 71 39
+ 41 35 63
+ 42 27 73
+ 43 31 21
+ 44 47 9
+ 45 87 45
+ 46 1 49
+ 47 1 77
+ 48 63 73
+ 49 79 71
+ 50 21 55
+ 51 65 23
+ 52 65 47
+ 53 97 23
+ 54 23 71
+ 55 5 81
+ 56 53 27
+ 57 57 85
+ 58 89 23
+ 59 51 65
+ 60 13 49
+ 61 91 41
+DEMAND_SECTION 
+1 0 
+2 23 
+3 17 
+4 12 
+5 6 
+6 22 
+7 3 
+8 24 
+9 24 
+10 11 
+11 7 
+12 12 
+13 8 
+14 14 
+15 20 
+16 16 
+17 16 
+18 4 
+19 9 
+20 18 
+21 14 
+22 10 
+23 19 
+24 22 
+25 19 
+26 9 
+27 18 
+28 2 
+29 18 
+30 11 
+31 19 
+32 18 
+33 15 
+34 4 
+35 12 
+36 8 
+37 18 
+38 12 
+39 72 
+40 2 
+41 5 
+42 14 
+43 11 
+44 19 
+45 16 
+46 19 
+47 3 
+48 12 
+49 10 
+50 20 
+51 7 
+52 13 
+53 16 
+54 23 
+55 22 
+56 18 
+57 6 
+58 12 
+59 27 
+60 9 
+61 15 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n62-k8.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n62-k8.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n62-k8.opt	(revision 15691)
@@ -0,0 +1,9 @@
+Route #1: 6 32 57 50 17 58 33 55 
+Route #2: 7 10 8 43 29 61 40 20 
+Route #3: 14 5 9 54 3 39 27 23 41 21 4 11 31 34 
+Route #4: 15 28 51 
+Route #5: 36 16 37 22 44 2 52 
+Route #6: 38 19 30 1 18 13 12 48 53 
+Route #7: 45 47 24 42 46 
+Route #8: 56 60 25 49 35 26 59 
+cost 1288
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n62-k8.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n62-k8.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n62-k8.vrp	(revision 15691)
@@ -0,0 +1,136 @@
+NAME : A-n62-k8
+COMMENT : (Augerat et al, No of trucks: 8, Optimal value: 1288)
+TYPE : CVRP
+DIMENSION : 62
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 2 48
+ 2 64 71
+ 3 33 83
+ 4 77 89
+ 5 96 61
+ 6 53 55
+ 7 38 10
+ 8 7 40
+ 9 7 1
+ 10 73 68
+ 11 4 24
+ 12 82 56
+ 13 30 56
+ 14 38 62
+ 15 42 53
+ 16 5 49
+ 17 1 85
+ 18 94 4
+ 19 50 70
+ 20 35 69
+ 21 14 41
+ 22 94 73
+ 23 23 96
+ 24 96 88
+ 25 74 94
+ 26 68 52
+ 27 73 22
+ 28 92 96
+ 29 4 48
+ 30 24 10
+ 31 52 72
+ 32 61 46
+ 33 38 9
+ 34 90 15
+ 35 58 41
+ 36 93 41
+ 37 8 74
+ 38 13 87
+ 39 34 68
+ 40 84 97
+ 41 35 20
+ 42 96 79
+ 43 73 87
+ 44 21 1
+ 45 28 93
+ 46 55 94
+ 47 56 84
+ 48 68 99
+ 49 30 53
+ 50 85 49
+ 51 85 2
+ 52 0 30
+ 53 12 71
+ 54 26 55
+ 55 72 75
+ 56 71 21
+ 57 33 49
+ 58 51 2
+ 59 93 7
+ 60 70 22
+ 61 54 53
+ 62 26 17
+DEMAND_SECTION 
+1 0 
+2 26 
+3 18 
+4 16 
+5 8 
+6 7 
+7 11 
+8 4 
+9 9 
+10 9 
+11 16 
+12 7 
+13 6 
+14 1 
+15 2 
+16 22 
+17 23 
+18 4 
+19 3 
+20 20 
+21 7 
+22 1 
+23 2 
+24 12 
+25 22 
+26 6 
+27 11 
+28 12 
+29 2 
+30 14 
+31 14 
+32 2 
+33 9 
+34 20 
+35 2 
+36 18 
+37 19 
+38 18 
+39 4 
+40 16 
+41 26 
+42 3 
+43 23 
+44 16 
+45 10 
+46 9 
+47 21 
+48 24 
+49 24 
+50 19 
+51 12 
+52 16 
+53 6 
+54 2 
+55 2 
+56 2 
+57 23 
+58 16 
+59 26 
+60 21 
+61 2 
+62 7 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n63-k10.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n63-k10.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n63-k10.opt	(revision 15691)
@@ -0,0 +1,11 @@
+Route #1: 7 46 23 31 
+Route #2: 8 35 27 6 12 41 
+Route #3: 15 49 5 3 42 19 10 59 
+Route #4: 17 56 29 40 25 
+Route #5: 18 45 39 1 9 2 14 53 
+Route #6: 20 13 26 4 38 36 
+Route #7: 21 61 60 37 16 54 
+Route #8: 24 33 55 22 58 
+Route #9: 28 57 32 34 11 47 44 51 50 62 
+Route #10: 48 30 43 52 
+cost 1314
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n63-k10.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n63-k10.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n63-k10.vrp	(revision 15691)
@@ -0,0 +1,138 @@
+\NAME : A-n63-k10
+COMMENT : (Augerat et al, No of trucks: 10, Optimal value: 1314)
+TYPE : CVRP
+DIMENSION : 63
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 76 75
+ 2 60 14
+ 3 46 5
+ 4 91 14
+ 5 70 95
+ 6 86 31
+ 7 20 0
+ 8 41 55
+ 9 21 15
+ 10 46 1
+ 11 95 45
+ 12 16 89
+ 13 41 1
+ 14 60 94
+ 15 55 25
+ 16 71 41
+ 17 39 35
+ 18 61 70
+ 19 80 36
+ 20 100 26
+ 21 65 85
+ 22 40 51
+ 23 19 71
+ 24 34 50
+ 25 36 61
+ 26 69 50
+ 27 61 94
+ 28 19 11
+ 29 51 91
+ 30 61 54
+ 31 76 90
+ 32 41 75
+ 33 35 100
+ 34 1 40
+ 35 15 91
+ 36 21 11
+ 37 79 81
+ 38 34 36
+ 39 74 99
+ 40 75 14
+ 41 65 54
+ 42 55 10
+ 43 100 6
+ 44 99 91
+ 45 25 86
+ 46 75 16
+ 47 30 45
+ 48 21 85
+ 49 75 80
+ 50 71 35
+ 51 56 81
+ 52 25 76
+ 53 85 76
+ 54 60 34
+ 55 41 44
+ 56 6 55
+ 57 60 54
+ 58 40 96
+ 59 20 71
+ 60 94 45
+ 61 31 41
+ 62 40 49
+ 63 56 80
+DEMAND_SECTION 
+1 0 
+2 11 
+3 20 
+4 26 
+5 17 
+6 5 
+7 17 
+8 1 
+9 15 
+10 16 
+11 22 
+12 2 
+13 22 
+14 25 
+15 20 
+16 20 
+17 21 
+18 26 
+19 12 
+20 5 
+21 11 
+22 5 
+23 21 
+24 17 
+25 12 
+26 12 
+27 15 
+28 21 
+29 12 
+30 2 
+31 17 
+32 16 
+33 15 
+34 26 
+35 12 
+36 22 
+37 16 
+38 21 
+39 16 
+40 2 
+41 6 
+42 2 
+43 6 
+44 10 
+45 11 
+46 1 
+47 63 
+48 10 
+49 21 
+50 7 
+51 1 
+52 6 
+53 26 
+54 17 
+55 10 
+56 25 
+57 25 
+58 25 
+59 16 
+60 5 
+61 22 
+62 17 
+63 6 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n63-k9.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n63-k9.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n63-k9.opt	(revision 15691)
@@ -0,0 +1,10 @@
+Route #1: 5 45 27 59 24 8 13 
+Route #2: 7 61 60 25 26 
+Route #3: 9 38 31 43 46 1 18 52 
+Route #4: 10 39 23 4 47 62 57 51 35 
+Route #5: 11 33 44 15 56 
+Route #6: 12 28 6 37 17 53 
+Route #7: 16 42 41 3 48 36 49 
+Route #8: 19 54 29 30 2 34 20 
+Route #9: 21 55 32 58 40 14 50 22 
+cost 1616
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n63-k9.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n63-k9.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n63-k9.vrp	(revision 15691)
@@ -0,0 +1,138 @@
+NAME : A-n63-k9
+COMMENT : (Augerat et al, No of trucks: 9, Optimal value: 1616)
+TYPE : CVRP
+DIMENSION : 63
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 91 93
+ 2 7 5
+ 3 27 91
+ 4 21 47
+ 5 33 11
+ 6 19 99
+ 7 59 25
+ 8 69 79
+ 9 11 73
+ 10 21 35
+ 11 59 45
+ 12 99 81
+ 13 71 47
+ 14 53 83
+ 15 87 1
+ 16 79 67
+ 17 59 65
+ 18 67 21
+ 19 27 1
+ 20 81 93
+ 21 59 89
+ 22 95 23
+ 23 73 25
+ 24 41 25
+ 25 3 65
+ 26 59 83
+ 27 83 97
+ 28 5 83
+ 29 71 35
+ 30 37 97
+ 31 29 93
+ 32 19 21
+ 33 83 13
+ 34 97 67
+ 35 31 83
+ 36 65 17
+ 37 19 63
+ 38 59 23
+ 39 17 25
+ 40 45 27
+ 41 89 7
+ 42 19 41
+ 43 23 39
+ 44 23 21
+ 45 83 61
+ 46 11 93
+ 47 17 11
+ 48 35 11
+ 49 21 59
+ 50 21 69
+ 51 71 13
+ 52 63 13
+ 53 49 21
+ 54 83 31
+ 55 41 97
+ 56 85 15
+ 57 77 73
+ 58 57 1
+ 59 83 11
+ 60 1 75
+ 61 45 71
+ 62 41 55
+ 63 45 13
+DEMAND_SECTION 
+1 0 
+2 4 
+3 18 
+4 22 
+5 14 
+6 5 
+7 9 
+8 7 
+9 20 
+10 19 
+11 7 
+12 18 
+13 20 
+14 2 
+15 11 
+16 10 
+17 5 
+18 21 
+19 20 
+20 1 
+21 15 
+22 15 
+23 14 
+24 19 
+25 22 
+26 21 
+27 22 
+28 6 
+29 24 
+30 14 
+31 14 
+32 2 
+33 15 
+34 21 
+35 15 
+36 6 
+37 23 
+38 14 
+39 26 
+40 15 
+41 15 
+42 23 
+43 7 
+44 22 
+45 26 
+46 20 
+47 3 
+48 2 
+49 15 
+50 2 
+51 21 
+52 12 
+53 4 
+54 10 
+55 23 
+56 4 
+57 24 
+58 17 
+59 2 
+60 20 
+61 18 
+62 19 
+63 8 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n64-k9.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n64-k9.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n64-k9.opt	(revision 15691)
@@ -0,0 +1,10 @@
+Route #1: 4 5 50 31 59 37 23 
+Route #2: 6 29 25 
+Route #3: 9 54 58 2 63 47 46 8 16 60 41 
+Route #4: 10 56 52 13 61 24 32 42 
+Route #5: 15 11 57 12 22 18 
+Route #6: 17 1 27 14 28 43 38 
+Route #7: 20 19 51 3 53 
+Route #8: 33 48 62 
+Route #9: 34 55 49 44 39 40 36 7 21 26 35 30 45 
+cost 1401
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n64-k9.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n64-k9.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n64-k9.vrp	(revision 15691)
@@ -0,0 +1,140 @@
+NAME : A-n64-k9
+COMMENT : (Augerat et al, No of trucks: 9, Optimal value: 1401)
+TYPE : CVRP
+DIMENSION : 64
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 97 33
+ 2 57 81
+ 3 1 33
+ 4 55 57
+ 5 29 37
+ 6 21 39
+ 7 93 37
+ 8 5 91
+ 9 25 11
+ 10 47 37
+ 11 87 25
+ 12 67 65
+ 13 71 89
+ 14 67 15
+ 15 45 79
+ 16 71 57
+ 17 29 1
+ 18 59 79
+ 19 93 83
+ 20 47 41
+ 21 51 41
+ 22 23 93
+ 23 87 95
+ 24 39 45
+ 25 45 7
+ 26 85 51
+ 27 35 93
+ 28 47 79
+ 29 59 91
+ 30 83 51
+ 31 49 65
+ 32 21 55
+ 33 51 21
+ 34 69 43
+ 35 37 41
+ 36 37 95
+ 37 5 71
+ 38 37 47
+ 39 83 73
+ 40 17 71
+ 41 5 71
+ 42 81 17
+ 43 59 33
+ 44 63 87
+ 45 21 77
+ 46 71 51
+ 47 21 17
+ 48 9 7
+ 49 65 43
+ 50 25 63
+ 51 13 57
+ 52 47 43
+ 53 77 9
+ 54 57 55
+ 55 21 33
+ 56 27 59
+ 57 83 9
+ 58 63 69
+ 59 9 35
+ 60 25 55
+ 61 33 3
+ 62 53 11
+ 63 51 49
+ 64 9 23
+DEMAND_SECTION 
+1 0 
+2 10 
+3 15 
+4 23 
+5 23 
+6 24 
+7 17 
+8 1 
+9 4 
+10 2 
+11 5 
+12 18 
+13 9 
+14 8 
+15 23 
+16 13 
+17 4 
+18 18 
+19 16 
+20 26 
+21 16 
+22 4 
+23 23 
+24 8 
+25 26 
+26 16 
+27 5 
+28 2 
+29 21 
+30 23 
+31 8 
+32 5 
+33 8 
+34 26 
+35 12 
+36 8 
+37 3 
+38 8 
+39 19 
+40 16 
+41 2 
+42 3 
+43 17 
+44 7 
+45 5 
+46 8 
+47 4 
+48 12 
+49 19 
+50 19 
+51 26 
+52 24 
+53 5 
+54 8 
+55 22 
+56 9 
+57 18 
+58 19 
+59 15 
+60 5 
+61 11 
+62 12 
+63 54 
+64 8 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n65-k9.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n65-k9.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n65-k9.opt	(revision 15691)
@@ -0,0 +1,10 @@
+Route #1: 55 29 62 39 51 17 
+Route #2: 45 61 42 38 2 41 16 50 60 
+Route #3: 21 25 52 24 13 12 1 33 
+Route #4: 49 4 3 36 35 37 30 
+Route #5: 47 34 31 26 6 64 46 
+Route #6: 28 23 57 48 54 63 11 7 
+Route #7: 44 59 40 58 20 32 
+Route #8: 5 53 56 10 8 19 18 
+Route #9: 43 27 14 9 22 15 
+Cost 1174
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n65-k9.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n65-k9.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n65-k9.vrp	(revision 15691)
@@ -0,0 +1,142 @@
+NAME : A-n65-k9
+COMMENT : (Augerat et al, No of trucks: 9, Optimal value: 1174)
+TYPE : CVRP
+DIMENSION : 65
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 25 51
+ 2 35 7
+ 3 93 75
+ 4 53 95
+ 5 51 81
+ 6 51 55
+ 7 1 67
+ 8 9 23
+ 9 75 7
+ 10 15 97
+ 11 79 5
+ 12 9 19
+ 13 39 1
+ 14 47 1
+ 15 33 97
+ 16 27 83
+ 17 83 79
+ 18 17 59
+ 19 47 19
+ 20 57 9
+ 21 87 41
+ 22 55 25
+ 23 21 91
+ 24 21 13
+ 25 67 1
+ 26 59 21
+ 27 1 75
+ 28 33 85
+ 29 25 21
+ 30 45 29
+ 31 63 77
+ 32 1 77
+ 33 77 41
+ 34 35 11
+ 35 9 77
+ 36 61 87
+ 37 59 91
+ 38 63 79
+ 39 97 67
+ 40 9 45
+ 41 93 21
+ 42 83 71
+ 43 95 57
+ 44 31 69
+ 45 77 17
+ 46 63 57
+ 47 3 63
+ 48 11 69
+ 49 7 9
+ 50 37 65
+ 51 75 83
+ 52 15 53
+ 53 69 5
+ 54 69 27
+ 55 5 19
+ 56 49 31
+ 57 77 17
+ 58 15 7
+ 59 91 39
+ 60 79 17
+ 61 67 75
+ 62 93 51
+ 63 25 33
+ 64 9 19
+ 65 3 65
+DEMAND_SECTION 
+1 0 
+2 12 
+3 24 
+4 16 
+5 7 
+6 9 
+7 20 
+8 10 
+9 18 
+10 26 
+11 17 
+12 2 
+13 11 
+14 9 
+15 12 
+16 11 
+17 12 
+18 23 
+19 7 
+20 1 
+21 26 
+22 10 
+23 9 
+24 22 
+25 21 
+26 17 
+27 2 
+28 15 
+29 16 
+30 14 
+31 23 
+32 24 
+33 2 
+34 12 
+35 18 
+36 5 
+37 19 
+38 15 
+39 8 
+40 6 
+41 14 
+42 13 
+43 5 
+44 24 
+45 25 
+46 2 
+47 8 
+48 14 
+49 2 
+50 13 
+51 10 
+52 6 
+53 6 
+54 24 
+55 21 
+56 20 
+57 24 
+58 4 
+59 19 
+60 14 
+61 23 
+62 2 
+63 16 
+64 23 
+65 14 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n69-k9.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n69-k9.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n69-k9.opt	(revision 15691)
@@ -0,0 +1,10 @@
+Route #1: 16 48 1 36 56 62 
+Route #2: 18 53 2 33 49 9 30 23 
+Route #3: 19 58 12 22 24 
+Route #4: 26 37 32 17 10 50 52 
+Route #5: 27 65 55 60 4 47 14 34 
+Route #6: 28 7 67 21 61 64 31 
+Route #7: 29 40 38 39 8 59 20 41 68 
+Route #8: 43 54 5 46 63 11 25 42 57 
+Route #9: 51 6 3 15 44 35 45 13 66 
+cost 1159
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n69-k9.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n69-k9.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n69-k9.vrp	(revision 15691)
@@ -0,0 +1,150 @@
+NAME : A-n69-k9
+COMMENT : (Augerat et al, No of trucks: 9, Optimal value: 1159)
+TYPE : CVRP
+DIMENSION : 69
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 59 44
+ 2 9 23
+ 3 84 68
+ 4 36 93
+ 5 87 9
+ 6 34 16
+ 7 40 98
+ 8 72 43
+ 9 0 60
+ 10 64 90
+ 11 11 8
+ 12 46 7
+ 13 33 54
+ 14 23 84
+ 15 67 18
+ 16 34 93
+ 17 19 25
+ 18 14 9
+ 19 70 64
+ 20 58 50
+ 21 5 78
+ 22 95 39
+ 23 38 54
+ 24 50 73
+ 25 48 46
+ 26 64 4
+ 27 39 28
+ 28 79 30
+ 29 61 36
+ 30 28 50
+ 31 51 91
+ 32 68 59
+ 33 14 9
+ 34 94 87
+ 35 68 29
+ 36 12 91
+ 37 2 22
+ 38 25 16
+ 39 11 57
+ 40 3 51
+ 41 13 52
+ 42 9 76
+ 43 58 18
+ 44 40 39
+ 45 32 89
+ 46 9 92
+ 47 36 14
+ 48 82 13
+ 49 10 25
+ 50 96 97
+ 51 20 21
+ 52 40 91
+ 53 33 31
+ 54 72 74
+ 55 41 24
+ 56 90 20
+ 57 4 44
+ 58 54 22
+ 59 43 59
+ 60 3 70
+ 61 94 16
+ 62 94 54
+ 63 14 40
+ 64 37 0
+ 65 88 55
+ 66 80 25
+ 67 37 64
+ 68 87 47
+ 69 18 68
+DEMAND_SECTION 
+1 0 
+2 2 
+3 1 
+4 6 
+5 9 
+6 16 
+7 5 
+8 3 
+9 9 
+10 12 
+11 1 
+12 1 
+13 18 
+14 10 
+15 5 
+16 5 
+17 9 
+18 16 
+19 12 
+20 6 
+21 6 
+22 20 
+23 23 
+24 39 
+25 17 
+26 8 
+27 2 
+28 13 
+29 17 
+30 3 
+31 2 
+32 7 
+33 23 
+34 10 
+35 7 
+36 12 
+37 20 
+38 13 
+39 21 
+40 25 
+41 5 
+42 4 
+43 13 
+44 12 
+45 23 
+46 19 
+47 10 
+48 7 
+49 15 
+50 5 
+51 15 
+52 13 
+53 30 
+54 15 
+55 7 
+56 9 
+57 23 
+58 8 
+59 5 
+60 8 
+61 25 
+62 12 
+63 25 
+64 24 
+65 8 
+66 22 
+67 7 
+68 24 
+69 18 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n80-k10.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n80-k10.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n80-k10.opt	(revision 15691)
@@ -0,0 +1,11 @@
+Route #1: 1 7 21 40 
+Route #2: 10 63 11 24 6 23 
+Route #3: 13 74 60 39 3 77 51 
+Route #4: 17 31 27 59 5 44 12 62 
+Route #5: 29 20 75 57 19 26 35 65 69 56 47 15 33 64 
+Route #6: 30 78 61 16 43 68 8 37 2 34 
+Route #7: 38 72 54 9 55 41 25 46 
+Route #8: 42 53 66 67 36 73 49 
+Route #9: 52 28 79 18 48 14 71 
+Route #10: 58 32 4 22 45 50 76 70 
+cost 1763
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n80-k10.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n80-k10.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/A/A-n80-k10.vrp	(revision 15691)
@@ -0,0 +1,172 @@
+NAME : A-n80-k10
+COMMENT : (Augerat et al, No of trucks: 10, Optimal value: 1763)
+TYPE : CVRP
+DIMENSION : 80
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 92 92
+ 2 88 58
+ 3 70 6
+ 4 57 59
+ 5 0 98
+ 6 61 38
+ 7 65 22
+ 8 91 52
+ 9 59 2
+ 10 3 54
+ 11 95 38
+ 12 80 28
+ 13 66 42
+ 14 79 74
+ 15 99 25
+ 16 20 43
+ 17 40 3
+ 18 50 42
+ 19 97 0
+ 20 21 19
+ 21 36 21
+ 22 100 61
+ 23 11 85
+ 24 69 35
+ 25 69 22
+ 26 29 35
+ 27 14 9
+ 28 50 33
+ 29 89 17
+ 30 57 44
+ 31 60 25
+ 32 48 42
+ 33 17 93
+ 34 21 50
+ 35 77 18
+ 36 2 4
+ 37 63 83
+ 38 68 6
+ 39 41 95
+ 40 48 54
+ 41 98 73
+ 42 26 38
+ 43 69 76
+ 44 40 1
+ 45 65 41
+ 46 14 86
+ 47 32 39
+ 48 14 24
+ 49 96 5
+ 50 82 98
+ 51 23 85
+ 52 63 69
+ 53 87 19
+ 54 56 75
+ 55 15 63
+ 56 10 45
+ 57 7 30
+ 58 31 11
+ 59 36 93
+ 60 50 31
+ 61 49 52
+ 62 39 10
+ 63 76 40
+ 64 83 34
+ 65 33 51
+ 66 0 15
+ 67 52 82
+ 68 52 82
+ 69 46 6
+ 70 3 26
+ 71 46 80
+ 72 94 30
+ 73 26 76
+ 74 75 92
+ 75 57 51
+ 76 34 21
+ 77 28 80
+ 78 59 66
+ 79 51 16
+ 80 87 11
+DEMAND_SECTION 
+1 0 
+2 24 
+3 22 
+4 23 
+5 5 
+6 11 
+7 23 
+8 26 
+9 9 
+10 23 
+11 9 
+12 14 
+13 16 
+14 12 
+15 2 
+16 2 
+17 6 
+18 20 
+19 26 
+20 12 
+21 15 
+22 13 
+23 26 
+24 17 
+25 7 
+26 12 
+27 4 
+28 4 
+29 20 
+30 10 
+31 9 
+32 2 
+33 9 
+34 1 
+35 2 
+36 2 
+37 12 
+38 14 
+39 23 
+40 21 
+41 13 
+42 13 
+43 23 
+44 3 
+45 6 
+46 23 
+47 11 
+48 2 
+49 7 
+50 13 
+51 10 
+52 3 
+53 6 
+54 13 
+55 2 
+56 14 
+57 7 
+58 21 
+59 7 
+60 22 
+61 13 
+62 22 
+63 18 
+64 22 
+65 6 
+66 2 
+67 11 
+68 5 
+69 9 
+70 9 
+71 5 
+72 12 
+73 2 
+74 12 
+75 19 
+76 6 
+77 14 
+78 2 
+79 2 
+80 24 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n31-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n31-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n31-k5.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 30 23 8 12 28 26
+Route #2: 21 16 18 25 5 4 29
+Route #3: 7 17 13 6 9 22
+Route #4: 20 27 10 2
+Route #5: 14 15 11 24 19 1 3
+cost 672
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n31-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n31-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n31-k5.vrp	(revision 15691)
@@ -0,0 +1,74 @@
+NAME : B-n31-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 672)
+TYPE : CVRP
+DIMENSION : 31
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 17 76
+ 2 24 6
+ 3 96 29
+ 4 14 19
+ 5 14 32
+ 6 0 34
+ 7 16 22
+ 8 20 26
+ 9 22 28
+ 10 17 23
+ 11 98 30
+ 12 30 8
+ 13 23 27
+ 14 19 23
+ 15 34 7
+ 16 31 7
+ 17 0 37
+ 18 19 23
+ 19 0 36
+ 20 26 7
+ 21 98 32
+ 22 5 40
+ 23 17 26
+ 24 21 26
+ 25 28 8
+ 26 1 35
+ 27 27 28
+ 28 99 30
+ 29 26 28
+ 30 17 29
+ 31 20 26
+DEMAND_SECTION 
+1 0 
+2 25 
+3 3 
+4 13 
+5 17 
+6 16 
+7 9 
+8 22 
+9 10 
+10 16 
+11 8 
+12 3 
+13 16 
+14 16 
+15 10 
+16 24 
+17 16 
+18 15 
+19 14 
+20 5 
+21 12 
+22 2 
+23 18 
+24 20 
+25 15 
+26 8 
+27 22 
+28 15 
+29 10 
+30 13 
+31 19 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n34-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n34-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n34-k5.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 33 32 22 30 11
+Route #2: 15 13 28 31 17 25 6 5
+Route #3: 14 9
+Route #4: 12 26 3 27 29 24 16 18 19 1
+Route #5: 8 10 23 20 4 21 7 2
+cost 788
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n34-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n34-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n34-k5.vrp	(revision 15691)
@@ -0,0 +1,80 @@
+NAME : B-n34-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 788)
+TYPE : CVRP
+DIMENSION : 34
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 28 57
+ 2 76 46
+ 3 67 5
+ 4 84 22
+ 5 73 6
+ 6 67 72
+ 7 68 74
+ 8 68 6
+ 9 76 7
+ 10 91 30
+ 11 80 0
+ 12 0 25
+ 13 73 13
+ 14 76 81
+ 15 92 30
+ 16 69 80
+ 17 90 30
+ 18 71 77
+ 19 83 47
+ 20 79 47
+ 21 74 6
+ 22 68 6
+ 23 72 0
+ 24 80 0
+ 25 91 25
+ 26 71 73
+ 27 78 10
+ 28 85 24
+ 29 75 80
+ 30 87 24
+ 31 0 7
+ 32 71 78
+ 33 74 0
+ 34 76 0
+DEMAND_SECTION 
+1 0 
+2 6 
+3 12 
+4 2 
+5 24 
+6 3 
+7 18 
+8 21 
+9 14 
+10 69 
+11 1 
+12 13 
+13 2 
+14 2 
+15 7 
+16 7 
+17 1 
+18 23 
+19 19 
+20 14 
+21 8 
+22 11 
+23 4 
+24 8 
+25 24 
+26 12 
+27 9 
+28 4 
+29 19 
+30 15 
+31 2 
+32 2 
+33 15 
+34 66 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n35-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n35-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n35-k5.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 34 27 24 28 4 14 22
+Route #2: 29 17 10 16 12
+Route #3: 21 25 31 8
+Route #4: 15 30 5 11 19 2 32 13
+Route #5: 20 7 9 23 1 26 18 3 33 6
+cost 955
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n35-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n35-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n35-k5.vrp	(revision 15691)
@@ -0,0 +1,82 @@
+NAME : B-n35-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 955)
+TYPE : CVRP
+DIMENSION : 35
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 78 95
+ 2 93 43
+ 3 57 4
+ 4 2 80
+ 5 10 17
+ 6 31 8
+ 7 10 87
+ 8 97 50
+ 9 16 93
+ 10 98 48
+ 11 103 47
+ 12 38 9
+ 13 100 51
+ 14 60 11
+ 15 15 19
+ 16 39 15
+ 17 102 47
+ 18 103 59
+ 19 10 82
+ 20 39 9
+ 21 97 52
+ 22 18 97
+ 23 32 13
+ 24 96 45
+ 25 11 21
+ 26 15 96
+ 27 10 81
+ 28 13 24
+ 29 0 8
+ 30 103 59
+ 31 33 11
+ 32 13 94
+ 33 63 5
+ 34 3 87
+ 35 14 25
+DEMAND_SECTION 
+1 0 
+2 12 
+3 3 
+4 2 
+5 13 
+6 17 
+7 12 
+8 1 
+9 26 
+10 13 
+11 15 
+12 20 
+13 20 
+14 3 
+15 3 
+16 12 
+17 25 
+18 2 
+19 15 
+20 24 
+21 2 
+22 7 
+23 15 
+24 2 
+25 13 
+26 9 
+27 12 
+28 26 
+29 17 
+30 26 
+31 9 
+32 14 
+33 9 
+34 25 
+35 13 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n38-k6.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n38-k6.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n38-k6.opt	(revision 15691)
@@ -0,0 +1,7 @@
+Route #1: 36 17 8 34 24 29 12 7 25
+Route #2: 31 30 2 35 37 13 3 11
+Route #3: 27 5 4 33 18 23
+Route #4: 26 16
+Route #5: 14 21 22 6 19 9
+Route #6: 20 10 1 15 28 32
+cost 805
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n38-k6.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n38-k6.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n38-k6.vrp	(revision 15691)
@@ -0,0 +1,88 @@
+NAME : B-n38-k6
+COMMENT : (Augerat et al, No of trucks: 6, Optimal value: 805)
+TYPE : CVRP
+DIMENSION : 38
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 64 75
+ 2 16 97
+ 3 2 79
+ 4 28 79
+ 5 16 3
+ 6 39 20
+ 7 35 65
+ 8 43 21
+ 9 44 0
+ 10 37 67
+ 11 17 100
+ 12 34 80
+ 13 45 7
+ 14 11 83
+ 15 35 88
+ 16 21 98
+ 17 41 72
+ 18 51 0
+ 19 17 9
+ 20 36 66
+ 21 20 105
+ 22 35 85
+ 23 37 75
+ 24 17 11
+ 25 46 6
+ 26 40 23
+ 27 43 73
+ 28 40 21
+ 29 29 85
+ 30 45 6
+ 31 0 24
+ 32 42 66
+ 33 30 81
+ 34 17 9
+ 35 46 4
+ 36 0 85
+ 37 51 2
+ 38 5 80
+DEMAND_SECTION 
+1 0 
+2 18 
+3 10 
+4 16 
+5 12 
+6 21 
+7 23 
+8 15 
+9 25 
+10 3 
+11 6 
+12 7 
+13 4 
+14 20 
+15 25 
+16 20 
+17 12 
+18 3 
+19 12 
+20 14 
+21 26 
+22 9 
+23 22 
+24 20 
+25 9 
+26 13 
+27 21 
+28 10 
+29 8 
+30 5 
+31 14 
+32 7 
+33 21 
+34 20 
+35 1 
+36 21 
+37 17 
+38 2 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n39-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n39-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n39-k5.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 8 14 7 29
+Route #2: 27 38 32 25 12 11 15 5
+Route #3: 9 34 19 20 6 18 13 10
+Route #4: 3 28 4 35 17 36 31
+Route #5: 2 33 24 21 37 23 30 16 22 26 1
+cost 549
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n39-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n39-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n39-k5.vrp	(revision 15691)
@@ -0,0 +1,90 @@
+NAME : B-n39-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 549)
+TYPE : CVRP
+DIMENSION : 39
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 37 21
+ 2 77 57
+ 3 97 79
+ 4 39 33
+ 5 45 47
+ 6 85 23
+ 7 7 1
+ 8 16 6
+ 9 21 13
+ 10 21 7
+ 11 12 6
+ 12 92 24
+ 13 92 32
+ 14 10 8
+ 15 19 15
+ 16 86 24
+ 17 106 84
+ 18 48 48
+ 19 8 2
+ 20 14 2
+ 21 14 2
+ 22 98 82
+ 23 106 80
+ 24 98 86
+ 25 98 82
+ 26 80 62
+ 27 82 62
+ 28 52 52
+ 29 42 42
+ 30 25 11
+ 31 104 86
+ 32 44 38
+ 33 78 64
+ 34 98 80
+ 35 16 4
+ 36 46 48
+ 37 44 42
+ 38 100 82
+ 39 52 54
+DEMAND_SECTION 
+1 0 
+2 14 
+3 16 
+4 18 
+5 20 
+6 1 
+7 12 
+8 13 
+9 18 
+10 9 
+11 15 
+12 8 
+13 10 
+14 7 
+15 18 
+16 14 
+17 1 
+18 15 
+19 7 
+20 25 
+21 2 
+22 3 
+23 4 
+24 16 
+25 15 
+26 23 
+27 11 
+28 21 
+29 10 
+30 12 
+31 9 
+32 7 
+33 8 
+34 4 
+35 23 
+36 8 
+37 6 
+38 2 
+39 15 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n41-k6.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n41-k6.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n41-k6.opt	(revision 15691)
@@ -0,0 +1,7 @@
+Route #1: 5 15 31 22 13 8
+Route #2: 30 36 12 32 17 14 29 1
+Route #3: 23 10 40 20 16 7
+Route #4: 25 6 33 34 11 28
+Route #5: 24 35 2 3 18 21 37 9
+Route #6: 4 39 38 27 26 19
+cost 829
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n41-k6.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n41-k6.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n41-k6.vrp	(revision 15691)
@@ -0,0 +1,94 @@
+NAME : B-n41-k6
+COMMENT : (Augerat et al, No of trucks: 6, Optimal value: 829)
+TYPE : CVRP
+DIMENSION : 41
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 37 35
+ 2 61 78
+ 3 18 33
+ 4 10 7
+ 5 48 26
+ 6 96 58
+ 7 16 97
+ 8 102 67
+ 9 97 67
+ 10 20 17
+ 11 110 77
+ 12 26 101
+ 13 102 74
+ 14 98 64
+ 15 71 82
+ 16 101 60
+ 17 104 69
+ 18 70 85
+ 19 17 9
+ 20 56 34
+ 21 105 69
+ 22 20 8
+ 23 103 63
+ 24 105 76
+ 25 25 35
+ 26 28 43
+ 27 58 36
+ 28 56 32
+ 29 65 87
+ 30 70 80
+ 31 100 65
+ 32 102 61
+ 33 99 73
+ 34 24 103
+ 35 26 107
+ 36 21 39
+ 37 99 71
+ 38 20 16
+ 39 56 30
+ 40 51 31
+ 41 106 70
+DEMAND_SECTION 
+1 0 
+2 6 
+3 11 
+4 14 
+5 7 
+6 12 
+7 16 
+8 6 
+9 18 
+10 7 
+11 20 
+12 7 
+13 23 
+14 16 
+15 10 
+16 9 
+17 18 
+18 8 
+19 15 
+20 9 
+21 23 
+22 7 
+23 15 
+24 14 
+25 21 
+26 25 
+27 14 
+28 11 
+29 19 
+30 12 
+31 8 
+32 25 
+33 17 
+34 22 
+35 11 
+36 16 
+37 16 
+38 8 
+39 23 
+40 15 
+41 13 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n43-k6.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n43-k6.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n43-k6.opt	(revision 15691)
@@ -0,0 +1,7 @@
+Route #1: 17 16 15 36 38 7 9
+Route #2: 41 35 4
+Route #3: 26 34 39 42 6 24 22 3
+Route #4: 11 13 30 29 32 25 27 40
+Route #5: 33 20 21 5 18 19 14 28 37
+Route #6: 1 23 2 8 12 31 10
+cost 742
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n43-k6.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n43-k6.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n43-k6.vrp	(revision 15691)
@@ -0,0 +1,98 @@
+NAME : B-n43-k6
+COMMENT : (Augerat et al, No of trucks: 6, Optimal value: 742)
+TYPE : CVRP
+DIMENSION : 43
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 74 34
+ 2 9 22
+ 3 13 28
+ 4 47 63
+ 5 74 43
+ 6 71 10
+ 7 11 61
+ 8 23 33
+ 9 14 29
+ 10 31 34
+ 11 22 29
+ 12 50 66
+ 13 16 30
+ 14 48 70
+ 15 16 0
+ 16 18 33
+ 17 20 34
+ 18 26 36
+ 19 49 0
+ 20 19 0
+ 21 80 17
+ 22 75 13
+ 23 18 68
+ 24 10 27
+ 25 12 66
+ 26 80 50
+ 27 29 43
+ 28 79 48
+ 29 14 0
+ 30 76 51
+ 31 54 68
+ 32 17 30
+ 33 78 50
+ 34 72 19
+ 35 23 37
+ 36 78 45
+ 37 14 34
+ 38 0 15
+ 39 16 31
+ 40 24 37
+ 41 84 47
+ 42 80 44
+ 43 24 41
+DEMAND_SECTION 
+1 0 
+2 25 
+3 19 
+4 8 
+5 10 
+6 1 
+7 14 
+8 11 
+9 20 
+10 23 
+11 3 
+12 4 
+13 6 
+14 23 
+15 7 
+16 15 
+17 13 
+18 3 
+19 11 
+20 24 
+21 8 
+22 14 
+23 8 
+24 9 
+25 24 
+26 10 
+27 19 
+28 10 
+29 5 
+30 7 
+31 23 
+32 11 
+33 12 
+34 4 
+35 11 
+36 16 
+37 22 
+38 24 
+39 12 
+40 5 
+41 11 
+42 7 
+43 9 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n44-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n44-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n44-k7.opt	(revision 15691)
@@ -0,0 +1,8 @@
+Route #1: 32 38 22 42 30 8 4
+Route #2: 18 11 23 10
+Route #3: 29 16 7
+Route #4: 5 17 2 36 14 39 24 26 9
+Route #5: 20 33 43 31 27 35 15
+Route #6: 40 1 12 3 28 25
+Route #7: 6 21 34 41 37 13 19
+cost 909
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n44-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n44-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n44-k7.vrp	(revision 15691)
@@ -0,0 +1,100 @@
+NAME : B-n44-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 909)
+TYPE : CVRP
+DIMENSION : 44
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 35 31
+ 2 77 13
+ 3 95 51
+ 4 91 15
+ 5 65 93
+ 6 51 17
+ 7 41 57
+ 8 39 39
+ 9 70 102
+ 10 74 94
+ 11 81 97
+ 12 77 95
+ 13 84 14
+ 14 48 60
+ 15 98 54
+ 16 92 18
+ 17 42 42
+ 18 52 18
+ 19 44 42
+ 20 48 44
+ 21 80 22
+ 22 42 58
+ 23 73 105
+ 24 81 101
+ 25 102 58
+ 26 82 18
+ 27 96 58
+ 28 98 18
+ 29 84 16
+ 30 44 44
+ 31 73 103
+ 32 96 16
+ 33 46 48
+ 34 92 16
+ 35 44 64
+ 36 98 22
+ 37 96 52
+ 38 46 64
+ 39 77 103
+ 40 104 54
+ 41 58 20
+ 42 46 64
+ 43 73 103
+ 44 94 16
+DEMAND_SECTION 
+1 0 
+2 26 
+3 11 
+4 22 
+5 18 
+6 10 
+7 9 
+8 12 
+9 10 
+10 12 
+11 19 
+12 5 
+13 18 
+14 7 
+15 14 
+16 14 
+17 20 
+18 7 
+19 4 
+20 11 
+21 3 
+22 22 
+23 15 
+24 69 
+25 26 
+26 20 
+27 12 
+28 22 
+29 9 
+30 23 
+31 7 
+32 17 
+33 3 
+34 18 
+35 18 
+36 9 
+37 4 
+38 20 
+39 24 
+40 3 
+41 4 
+42 4 
+43 23 
+44 17 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n45-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n45-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n45-k5.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 16 33 19 26 25 11 29 4 43
+Route #2: 9 7 34 27 14 44 18 36
+Route #3: 1 37 32 15 2 13 28
+Route #4: 3 31 38 20 35 24 10 17 23 30
+Route #5: 39 5 41 22 8 21 12 6 40 42
+cost 751
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n45-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n45-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n45-k5.vrp	(revision 15691)
@@ -0,0 +1,102 @@
+\NAME : B-n45-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 751)
+TYPE : CVRP
+DIMENSION : 45
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 53 22
+ 2 34 28
+ 3 2 5
+ 4 40 85
+ 5 88 38
+ 6 74 20
+ 7 82 21
+ 8 0 46
+ 9 84 31
+ 10 11 12
+ 11 42 37
+ 12 90 44
+ 13 85 22
+ 14 9 8
+ 15 4 51
+ 16 3 10
+ 17 90 40
+ 18 41 33
+ 19 10 50
+ 20 96 45
+ 21 48 90
+ 22 87 31
+ 23 79 26
+ 24 39 32
+ 25 0 91
+ 26 89 45
+ 27 91 46
+ 28 3 53
+ 29 44 0
+ 30 89 41
+ 31 40 32
+ 32 42 86
+ 33 0 13
+ 34 97 45
+ 35 1 50
+ 36 45 94
+ 37 36 33
+ 38 4 15
+ 39 42 88
+ 40 42 29
+ 41 92 0
+ 42 75 26
+ 43 78 0
+ 44 77 29
+ 45 5 47
+DEMAND_SECTION 
+1 0 
+2 1 
+3 19 
+4 19 
+5 22 
+6 20 
+7 11 
+8 2 
+9 5 
+10 20 
+11 22 
+12 2 
+13 2 
+14 11 
+15 22 
+16 19 
+17 3 
+18 1 
+19 2 
+20 16 
+21 2 
+22 13 
+23 7 
+24 8 
+25 16 
+26 14 
+27 4 
+28 14 
+29 7 
+30 20 
+31 14 
+32 7 
+33 9 
+34 7 
+35 5 
+36 10 
+37 13 
+38 25 
+39 1 
+40 22 
+41 9 
+42 3 
+43 8 
+44 10 
+45 19 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n45-k6.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n45-k6.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n45-k6.opt	(revision 15691)
@@ -0,0 +1,7 @@
+Route #1: 1 11 10 36 2 14 17 24
+Route #2: 16 25 26 6 34 18 29
+Route #3: 5 30 42 13 43
+Route #4: 44 33 40 9 3 15 7 20
+Route #5: 39 8 22 28 32 23 37 19 27 4
+Route #6: 21 31 41 38 35 12
+cost 678
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n45-k6.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n45-k6.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n45-k6.vrp	(revision 15691)
@@ -0,0 +1,102 @@
+NAME : B-n45-k6
+COMMENT : (Augerat et al, No of trucks: 6, Optimal value: 678)
+TYPE : CVRP
+DIMENSION : 45
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 49 64
+ 2 60 38
+ 3 38 21
+ 4 98 27
+ 5 69 60
+ 6 59 40
+ 7 82 28
+ 8 86 36
+ 9 76 65
+ 10 102 29
+ 11 43 26
+ 12 45 28
+ 13 76 68
+ 14 64 45
+ 15 0 44
+ 16 89 31
+ 17 60 44
+ 18 0 44
+ 19 84 29
+ 20 83 66
+ 21 86 36
+ 22 103 32
+ 23 76 65
+ 24 86 74
+ 25 0 48
+ 26 66 41
+ 27 67 40
+ 28 77 61
+ 29 78 66
+ 30 66 46
+ 31 61 41
+ 32 105 31
+ 33 78 68
+ 34 91 37
+ 35 83 29
+ 36 91 45
+ 37 42 25
+ 38 83 69
+ 39 101 36
+ 40 74 65
+ 41 93 37
+ 42 107 34
+ 43 63 40
+ 44 61 47
+ 45 90 43
+DEMAND_SECTION 
+1 0 
+2 21 
+3 13 
+4 24 
+5 10 
+6 22 
+7 16 
+8 9 
+9 9 
+10 18 
+11 15 
+12 3 
+13 7 
+14 14 
+15 22 
+16 10 
+17 13 
+18 3 
+19 4 
+20 14 
+21 2 
+22 16 
+23 10 
+24 5 
+25 11 
+26 19 
+27 14 
+28 18 
+29 12 
+30 21 
+31 21 
+32 24 
+33 6 
+34 7 
+35 13 
+36 15 
+37 5 
+38 10 
+39 19 
+40 6 
+41 21 
+42 19 
+43 17 
+44 26 
+45 8 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n50-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n50-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n50-k7.opt	(revision 15691)
@@ -0,0 +1,8 @@
+Route #1: 47 31 41 7
+Route #2: 37 11 20 8 5 36 45 21
+Route #3: 35 4 29 46 9 38 22 33
+Route #4: 34 49 44 19 17 48 2 6
+Route #5: 32 28 40 15
+Route #6: 30 25 18 14 43 24 27 16 42 10 3
+Route #7: 23 1 13 26 39 12
+cost 741
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n50-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n50-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n50-k7.vrp	(revision 15691)
@@ -0,0 +1,112 @@
+NAME : B-n50-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 741)
+TYPE : CVRP
+DIMENSION : 50
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 49 53
+ 2 59 1
+ 3 17 83
+ 4 85 57
+ 5 47 21
+ 6 1 21
+ 7 25 69
+ 8 75 63
+ 9 3 7
+ 10 56 26
+ 11 86 58
+ 12 8 8
+ 13 59 27
+ 14 64 2
+ 15 86 64
+ 16 28 72
+ 17 88 58
+ 18 18 90
+ 19 82 64
+ 20 22 92
+ 21 6 10
+ 22 10 24
+ 23 59 29
+ 24 52 24
+ 25 94 62
+ 26 76 68
+ 27 66 2
+ 28 90 58
+ 29 20 84
+ 30 50 22
+ 31 76 64
+ 32 63 33
+ 33 20 84
+ 34 59 31
+ 35 32 74
+ 36 48 24
+ 37 2 30
+ 38 10 8
+ 39 57 27
+ 40 68 6
+ 41 28 74
+ 42 63 35
+ 43 86 58
+ 44 90 62
+ 45 22 90
+ 46 6 28
+ 47 62 8
+ 48 59 35
+ 49 18 88
+ 50 30 76
+DEMAND_SECTION 
+1 0 
+2 21 
+3 8 
+4 11 
+5 7 
+6 21 
+7 5 
+8 13 
+9 10 
+10 9 
+11 20 
+12 7 
+13 12 
+14 23 
+15 2 
+16 4 
+17 14 
+18 12 
+19 3 
+20 5 
+21 13 
+22 5 
+23 12 
+24 2 
+25 3 
+26 18 
+27 24 
+28 4 
+29 63 
+30 19 
+31 2 
+32 9 
+33 4 
+34 9 
+35 23 
+36 6 
+37 3 
+38 12 
+39 7 
+40 17 
+41 22 
+42 26 
+43 14 
+44 9 
+45 2 
+46 16 
+47 24 
+48 4 
+49 19 
+50 11 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n50-k8.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n50-k8.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n50-k8.opt	(revision 15691)
@@ -0,0 +1,9 @@
+Route #1: 1 28 29 19 32
+Route #2: 2 40 7 48 34
+Route #3: 2 23 41 45 39 35
+Route #4: 5 16 43 12
+Route #5: 6 30 36 49 33 9 27 37 44
+Route #6: 10 21 42 17 8 15
+Route #7 13 38 22 46 14 31
+Route #8: 20 11 24 47 26 18 4 25
+cost 1312
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n50-k8.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n50-k8.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n50-k8.vrp	(revision 15691)
@@ -0,0 +1,112 @@
+NAME : B-n50-k8
+COMMENT : (Augerat et al, No of trucks: 8, Optimal value: 1312)
+TYPE : CVRP
+DIMENSION : 50
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 8 12
+ 2 63 77
+ 3 19 10
+ 4 39 49
+ 5 86 5
+ 6 96 64
+ 7 34 25
+ 8 44 15
+ 9 58 90
+ 10 49 21
+ 11 43 57
+ 12 52 28
+ 13 47 22
+ 14 40 50
+ 15 44 34
+ 16 0 70
+ 17 56 30
+ 18 60 98
+ 19 103 0
+ 20 105 70
+ 21 45 25
+ 22 64 82
+ 23 44 50
+ 24 44 53
+ 25 59 27
+ 26 54 16
+ 27 92 11
+ 28 46 22
+ 29 98 74
+ 30 103 72
+ 31 44 29
+ 32 39 30
+ 33 97 71
+ 34 49 22
+ 35 22 13
+ 36 44 58
+ 37 50 25
+ 38 46 21
+ 39 44 50
+ 40 51 66
+ 41 28 12
+ 42 50 59
+ 43 61 92
+ 44 52 25
+ 45 21 16
+ 46 51 61
+ 47 46 51
+ 48 91 13
+ 49 25 13
+ 50 53 22
+DEMAND_SECTION 
+1 0 
+2 14 
+3 3 
+4 5 
+5 9 
+6 69 
+7 13 
+8 25 
+9 17 
+10 12 
+11 12 
+12 10 
+13 2 
+14 23 
+15 15 
+16 16 
+17 26 
+18 12 
+19 12 
+20 26 
+21 10 
+22 22 
+23 4 
+24 16 
+25 8 
+26 23 
+27 2 
+28 24 
+29 12 
+30 24 
+31 4 
+32 19 
+33 21 
+34 7 
+35 15 
+36 14 
+37 18 
+38 7 
+39 20 
+40 18 
+41 2 
+42 21 
+43 21 
+44 3 
+45 5 
+46 20 
+47 16 
+48 25 
+49 3 
+50 10 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n51-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n51-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n51-k7.opt	(revision 15691)
@@ -0,0 +1,8 @@
+Route #1: 6 4 42 13 29 39 16
+Route #2: 48 33 19 3 35 5 36 40
+Route #3: 7 14 28 26 43 11
+Route #4: 50 23 47 45 30 24 22 46 25
+Route #5: 41 27 31 32 37 12 8
+Route #6: 18 34 38 2 10 17
+Route #7: 21 44 20 1 9 49 15
+cost 1032
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n51-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n51-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n51-k7.vrp	(revision 15691)
@@ -0,0 +1,114 @@
+NAME : B-n51-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 1032)
+TYPE : CVRP
+DIMENSION : 51
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 53 55
+ 2 1 90
+ 3 94 85
+ 4 13 19
+ 5 97 45
+ 6 78 69
+ 7 92 35
+ 8 98 36
+ 9 99 0
+ 10 2 94
+ 11 85 77
+ 12 94 42
+ 13 101 3
+ 14 103 51
+ 15 106 38
+ 16 9 95
+ 17 88 71
+ 18 83 77
+ 19 100 55
+ 20 17 23
+ 21 3 91
+ 22 6 91
+ 23 9 102
+ 24 9 95
+ 25 8 104
+ 26 9 99
+ 27 98 39
+ 28 101 8
+ 29 99 38
+ 30 103 54
+ 31 3 103
+ 32 101 7
+ 33 103 8
+ 34 20 25
+ 35 97 93
+ 36 0 51
+ 37 81 70
+ 38 103 7
+ 39 95 87
+ 40 102 54
+ 41 83 72
+ 42 101 10
+ 43 105 48
+ 44 96 40
+ 45 5 91
+ 46 9 96
+ 47 10 100
+ 48 9 96
+ 49 22 21
+ 50 2 95
+ 51 9 95
+DEMAND_SECTION 
+1 0 
+2 9 
+3 10 
+4 14 
+5 5 
+6 8 
+7 10 
+8 15 
+9 16 
+10 23 
+11 4 
+12 22 
+13 16 
+14 12 
+15 20 
+16 18 
+17 9 
+18 17 
+19 42 
+20 9 
+21 17 
+22 7 
+23 4 
+24 7 
+25 13 
+26 6 
+27 22 
+28 6 
+29 13 
+30 21 
+31 16 
+32 20 
+33 11 
+34 18 
+35 24 
+36 26 
+37 9 
+38 21 
+39 3 
+40 22 
+41 7 
+42 10 
+43 17 
+44 8 
+45 10 
+46 12 
+47 10 
+48 24 
+49 5 
+50 10 
+51 6 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n52-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n52-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n52-k7.opt	(revision 15691)
@@ -0,0 +1,8 @@
+Route #1: 21 11 28 3 31 24 39 14 45 4
+Route #2: 2 48 9 16 46 13 26
+Route #3: 47 51 7 43 35 33
+Route #4: 44 10 5 8 27 29 37
+Route #5: 40 42 20 30 18 1 36
+Route #6: 25 6 41
+Route #7: 23 12 50 22 17 49 15 19 34 32 38
+cost 747
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n52-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n52-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n52-k7.vrp	(revision 15691)
@@ -0,0 +1,116 @@
+NAME : B-n52-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 747)
+TYPE : CVRP
+DIMENSION : 52
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 29 33
+ 2 41 11
+ 3 31 87
+ 4 91 27
+ 5 53 87
+ 6 7 19
+ 7 27 19
+ 8 1 41
+ 9 8 20
+ 10 40 92
+ 11 14 20
+ 12 92 32
+ 13 62 94
+ 14 45 97
+ 15 96 36
+ 16 47 101
+ 17 40 92
+ 18 49 97
+ 19 48 12
+ 20 45 101
+ 21 46 16
+ 22 92 34
+ 23 49 95
+ 24 62 92
+ 25 96 28
+ 26 28 22
+ 27 47 95
+ 28 9 21
+ 29 92 30
+ 30 12 22
+ 31 48 12
+ 32 94 28
+ 33 43 99
+ 34 8 42
+ 35 43 99
+ 36 8 42
+ 37 30 20
+ 38 16 24
+ 39 36 92
+ 40 98 34
+ 41 36 28
+ 42 28 26
+ 43 42 18
+ 44 2 50
+ 45 16 20
+ 46 56 90
+ 47 45 97
+ 48 17 23
+ 49 34 88
+ 50 47 99
+ 51 62 96
+ 52 8 24
+DEMAND_SECTION 
+1 0 
+2 22 
+3 8 
+4 3 
+5 6 
+6 10 
+7 18 
+8 8 
+9 13 
+10 13 
+11 3 
+12 10 
+13 6 
+14 23 
+15 8 
+16 4 
+17 13 
+18 6 
+19 5 
+20 10 
+21 22 
+22 13 
+23 13 
+24 18 
+25 14 
+26 14 
+27 26 
+28 23 
+29 4 
+30 25 
+31 9 
+32 8 
+33 16 
+34 3 
+35 1 
+36 17 
+37 9 
+38 15 
+39 2 
+40 19 
+41 7 
+42 6 
+43 22 
+44 22 
+45 10 
+46 7 
+47 4 
+48 23 
+49 13 
+50 10 
+51 8 
+52 14 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n56-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n56-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n56-k7.opt	(revision 15691)
@@ -0,0 +1,8 @@
+Route #1: 53 6 24 15 7 37 29 45
+Route #2: 48 36 32 49 13 3
+Route #3: 46 28 51 44 14 17 8 10 18
+Route #4: 43 23 22 50 38 9 12 5 40
+Route #5: 41 42 47 39 4 26 21
+Route #6: 33 11 55 20 31 30 34 54 2 19 25
+Route #7: 27 35 16 52 1
+cost 707
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n56-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n56-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n56-k7.vrp	(revision 15691)
@@ -0,0 +1,124 @@
+NAME : B-n56-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 707)
+TYPE : CVRP
+DIMENSION : 56
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 87 45
+ 2 93 41
+ 3 75 95
+ 4 89 55
+ 5 89 19
+ 6 21 9
+ 7 81 31
+ 8 79 25
+ 9 30 18
+ 10 5 5
+ 11 31 21
+ 12 84 98
+ 13 10 8
+ 14 90 58
+ 15 24 16
+ 16 80 26
+ 17 96 42
+ 18 28 18
+ 19 37 23
+ 20 39 27
+ 21 78 104
+ 22 98 26
+ 23 8 12
+ 24 10 12
+ 25 82 30
+ 26 82 38
+ 27 94 24
+ 28 94 44
+ 29 30 16
+ 30 84 28
+ 31 76 96
+ 32 76 102
+ 33 98 58
+ 34 90 64
+ 35 76 96
+ 36 100 44
+ 37 94 56
+ 38 84 26
+ 39 6 12
+ 40 90 24
+ 41 26 12
+ 42 84 30
+ 43 86 28
+ 44 31 27
+ 45 24 16
+ 46 84 30
+ 47 33 19
+ 48 90 28
+ 49 94 50
+ 50 92 60
+ 51 8 12
+ 52 24 16
+ 53 94 42
+ 54 82 32
+ 55 76 96
+ 56 80 100
+DEMAND_SECTION 
+1 0 
+2 10 
+3 15 
+4 7 
+5 25 
+6 16 
+7 8 
+8 15 
+9 23 
+10 8 
+11 2 
+12 14 
+13 7 
+14 15 
+15 14 
+16 7 
+17 14 
+18 11 
+19 7 
+20 6 
+21 1 
+22 22 
+23 26 
+24 5 
+25 18 
+26 18 
+27 4 
+28 10 
+29 3 
+30 2 
+31 12 
+32 6 
+33 15 
+34 12 
+35 5 
+36 7 
+37 12 
+38 24 
+39 6 
+40 12 
+41 5 
+42 18 
+43 3 
+44 7 
+45 15 
+46 23 
+47 20 
+48 5 
+49 24 
+50 6 
+51 19 
+52 5 
+53 10 
+54 3 
+55 4 
+56 5 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n57-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n57-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n57-k7.opt	(revision 15691)
@@ -0,0 +1,8 @@
+Route #1: 16 24 41 34 17 19 26 56 
+Route #2: 48 45 6 31 11 15 
+Route #3: 22 14 7 43 20 47 32 
+Route #4: 27 49 44 21 10 3 13 33 
+Route #5: 37 39 52 50 42 30 2 55 1 
+Route #6: 28 25 8 9 51 38 36 53 12 18 
+Route #7: 5 46 23 4 40 29 35 54 
+cost 1153
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n57-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n57-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n57-k7.vrp	(revision 15691)
@@ -0,0 +1,126 @@
+NAME : B-n57-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 1153)
+TYPE : CVRP
+DIMENSION : 57
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 11 83
+ 2 37 61
+ 3 77 81
+ 4 35 21
+ 5 1 93
+ 6 21 39
+ 7 63 7
+ 8 97 95
+ 9 3 7
+ 10 5 3
+ 11 36 22
+ 12 64 10
+ 13 6 8
+ 14 24 40
+ 15 86 82
+ 16 68 14
+ 17 28 46
+ 18 10 8
+ 19 8 14
+ 20 10 10
+ 21 104 104
+ 22 38 24
+ 23 80 82
+ 24 22 46
+ 25 26 40
+ 26 4 10
+ 27 10 12
+ 28 26 44
+ 29 4 10
+ 30 4 98
+ 31 78 82
+ 32 64 8
+ 33 98 98
+ 34 24 40
+ 35 10 8
+ 36 8 96
+ 37 8 8
+ 38 84 90
+ 39 8 8
+ 40 86 86
+ 41 6 94
+ 42 10 10
+ 43 80 82
+ 44 102 96
+ 45 36 26
+ 46 44 28
+ 47 22 46
+ 48 100 100
+ 49 28 42
+ 50 30 40
+ 51 78 84
+ 52 10 4
+ 53 78 84
+ 54 6 8
+ 55 10 94
+ 56 40 66
+ 57 10 16
+DEMAND_SECTION 
+1 0 
+2 2 
+3 1 
+4 3 
+5 9 
+6 13 
+7 21 
+8 6 
+9 22 
+10 10 
+11 23 
+12 2 
+13 15 
+14 10 
+15 23 
+16 8 
+17 5 
+18 14 
+19 6 
+20 15 
+21 18 
+22 15 
+23 10 
+24 17 
+25 1 
+26 1 
+27 18 
+28 7 
+29 12 
+30 9 
+31 26 
+32 60 
+33 12 
+34 17 
+35 9 
+36 7 
+37 13 
+38 24 
+39 10 
+40 17 
+41 24 
+42 25 
+43 1 
+44 20 
+45 14 
+46 6 
+47 9 
+48 11 
+49 2 
+50 11 
+51 17 
+52 3 
+53 1 
+54 8 
+55 12 
+56 9 
+57 13 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n57-k9.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n57-k9.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n57-k9.opt	(revision 15691)
@@ -0,0 +1,10 @@
+oute #1: 31 55 9 28 18 27 1 
+Route #2: 32 40 3 50 46 22 
+Route #3: 4 30 49 35 48 38 12 
+Route #4: 53 29 41 21 36 47 5 
+Route #5: 43 54 52 24 45 17 10 
+Route #6: 42 44 16 23 2 20 7 
+Route #7: 33 11 37 25 51 15 8 
+Route #8: 6 56 
+Route #9: 14 34 19 39 26 13 
+Cost 1598
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n57-k9.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n57-k9.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n57-k9.vrp	(revision 15691)
@@ -0,0 +1,126 @@
+NAME : B-n57-k9
+COMMENT : (Augerat et al, No of trucks: 9, Optimal value: 1598)
+TYPE : CVRP
+DIMENSION : 57
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 19 1
+ 2 83 61
+ 3 59 95
+ 4 73 25
+ 5 51 53
+ 6 23 49
+ 7 63 19
+ 8 51 81
+ 9 1 89
+ 10 97 41
+ 11 74 30
+ 12 60 88
+ 13 58 54
+ 14 63 95
+ 15 65 89
+ 16 6 94
+ 17 61 97
+ 18 75 31
+ 19 106 48
+ 20 69 93
+ 21 56 84
+ 22 26 54
+ 23 66 24
+ 24 60 98
+ 25 92 66
+ 26 8 92
+ 27 64 102
+ 28 104 48
+ 29 104 42
+ 30 30 52
+ 31 52 54
+ 32 77 33
+ 33 68 20
+ 34 56 62
+ 35 65 91
+ 36 54 60
+ 37 26 52
+ 38 52 90
+ 39 56 56
+ 40 66 102
+ 41 72 24
+ 42 28 56
+ 43 58 82
+ 44 84 66
+ 45 63 93
+ 46 88 64
+ 47 74 28
+ 48 26 50
+ 49 58 58
+ 50 52 56
+ 51 76 26
+ 52 8 92
+ 53 90 68
+ 54 32 50
+ 55 84 66
+ 56 78 34
+ 57 64 24
+DEMAND_SECTION 
+1 0 
+2 18 
+3 16 
+4 23 
+5 20 
+6 18 
+7 19 
+8 2 
+9 4 
+10 10 
+11 2 
+12 26 
+13 21 
+14 10 
+15 8 
+16 20 
+17 21 
+18 4 
+19 5 
+20 15 
+21 18 
+22 2 
+23 21 
+24 20 
+25 23 
+26 13 
+27 22 
+28 17 
+29 11 
+30 7 
+31 13 
+32 13 
+33 16 
+34 14 
+35 25 
+36 18 
+37 2 
+38 19 
+39 6 
+40 19 
+41 9 
+42 24 
+43 2 
+44 13 
+45 17 
+46 20 
+47 24 
+48 8 
+49 15 
+50 7 
+51 7 
+52 4 
+53 22 
+54 11 
+55 10 
+56 25 
+57 24 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n63-k10.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n63-k10.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n63-k10.opt	(revision 15691)
@@ -0,0 +1,11 @@
+Route #1: 41 14 58 54 12 43 24 17 11 23 
+Route #2: 29 28 
+Route #3: 18 1 20 7 53 38 57 37 
+Route #4: 10 61 2 21 52 19 42 
+Route #5: 39 62 51 33 26 6 35 25 
+Route #6: 45 36 27 50 
+Route #7: 60 5 55 13 32 48 
+Route #8: 31 49 56 46 59 8 30 
+Route #9: 44 16 40 3 4 
+Route #10: 22 34 9 47 15 
+Cost 1496
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n63-k10.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n63-k10.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n63-k10.vrp	(revision 15691)
@@ -0,0 +1,138 @@
+NAME : B-n63-k10
+COMMENT : (Augerat et al, No of trucks: 10, Optimal value: 1496)
+TYPE : CVRP
+DIMENSION : 63
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 73 89
+ 2 97 22
+ 3 19 31
+ 4 23 95
+ 5 18 89
+ 6 60 94
+ 7 9 26
+ 8 71 7
+ 9 10 80
+ 10 27 64
+ 11 46 32
+ 12 26 0
+ 13 8 8
+ 14 63 101
+ 15 16 10
+ 16 30 69
+ 17 26 103
+ 18 20 0
+ 19 99 32
+ 20 16 33
+ 21 79 13
+ 22 18 30
+ 23 27 41
+ 24 34 4
+ 25 19 0
+ 26 12 33
+ 27 11 28
+ 28 101 0
+ 29 69 98
+ 30 69 102
+ 31 15 81
+ 32 26 90
+ 33 65 100
+ 34 14 29
+ 35 21 40
+ 36 10 29
+ 37 81 10
+ 38 53 37
+ 39 31 9
+ 40 21 36
+ 41 24 98
+ 42 15 14
+ 43 28 36
+ 44 19 0
+ 45 30 102
+ 46 81 15
+ 47 12 86
+ 48 30 65
+ 49 66 99
+ 50 17 89
+ 51 102 29
+ 52 16 31
+ 53 17 33
+ 54 32 8
+ 55 11 11
+ 56 61 102
+ 57 16 88
+ 58 29 9
+ 59 15 9
+ 60 14 85
+ 61 63 95
+ 62 29 32
+ 63 19 32
+DEMAND_SECTION 
+1 0 
+2 18 
+3 11 
+4 18 
+5 17 
+6 21 
+7 6 
+8 12 
+9 6 
+10 21 
+11 14 
+12 2 
+13 5 
+14 12 
+15 23 
+16 23 
+17 19 
+18 18 
+19 8 
+20 21 
+21 7 
+22 19 
+23 18 
+24 7 
+25 6 
+26 12 
+27 21 
+28 6 
+29 21 
+30 20 
+31 18 
+32 6 
+33 20 
+34 20 
+35 23 
+36 4 
+37 21 
+38 4 
+39 6 
+40 9 
+41 21 
+42 5 
+43 20 
+44 11 
+45 16 
+46 48 
+47 2 
+48 15 
+49 15 
+50 22 
+51 25 
+52 23 
+53 5 
+54 24 
+55 11 
+56 24 
+57 20 
+58 21 
+59 10 
+60 24 
+61 3 
+62 9 
+63 5 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n64-k9.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n64-k9.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n64-k9.opt	(revision 15691)
@@ -0,0 +1,10 @@
+Route #1: 24 5 4 14 59 51 55 22 18
+Route #2: 17 8 21 27 38 40 34 46 30
+Route #3: 57 20 63 42 39 23 25
+Route #4: 47 61 50 10 12
+Route #5: 1 26 41 54 31 7
+Route #6: 37 9 48 60 36 35 15 19
+Route #7: 33 29 11 28 56 13 16
+Route #8: 32 3 6 53 58 45 44 2
+Route #9: 52 43 49 62
+cost 861
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n64-k9.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n64-k9.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n64-k9.vrp	(revision 15691)
@@ -0,0 +1,140 @@
+NAME : B-n64-k9
+COMMENT : (Augerat et al, No of trucks: 9, Optimal value: 861)
+TYPE : CVRP
+DIMENSION : 64
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 59 73
+ 2 79 65
+ 3 73 27
+ 4 41 81
+ 5 11 93
+ 6 13 89
+ 7 11 15
+ 8 71 81
+ 9 77 89
+ 10 41 87
+ 11 44 94
+ 12 51 101
+ 13 42 92
+ 14 58 104
+ 15 14 94
+ 16 18 90
+ 17 60 102
+ 18 72 86
+ 19 45 95
+ 20 20 90
+ 21 74 32
+ 22 78 90
+ 23 18 98
+ 24 78 36
+ 25 16 90
+ 26 78 36
+ 27 80 74
+ 28 78 92
+ 29 52 108
+ 30 49 97
+ 31 72 82
+ 32 72 88
+ 33 42 82
+ 34 50 92
+ 35 82 94
+ 36 16 94
+ 37 18 94
+ 38 42 88
+ 39 78 94
+ 40 80 32
+ 41 84 96
+ 42 76 82
+ 43 78 30
+ 44 88 68
+ 45 18 20
+ 46 18 20
+ 47 74 82
+ 48 47 95
+ 49 18 94
+ 50 86 68
+ 51 45 95
+ 52 14 102
+ 53 82 66
+ 54 14 16
+ 55 76 86
+ 56 18 102
+ 57 58 106
+ 58 76 34
+ 59 18 18
+ 60 14 96
+ 61 18 94
+ 62 46 96
+ 63 82 70
+ 64 76 28
+DEMAND_SECTION 
+1 0 
+2 24 
+3 15 
+4 2 
+5 3 
+6 24 
+7 17 
+8 9 
+9 4 
+10 2 
+11 15 
+12 20 
+13 17 
+14 15 
+15 20 
+16 8 
+17 6 
+18 2 
+19 6 
+20 18 
+21 5 
+22 16 
+23 2 
+24 18 
+25 1 
+26 13 
+27 17 
+28 5 
+29 14 
+30 19 
+31 3 
+32 22 
+33 6 
+34 9 
+35 22 
+36 6 
+37 18 
+38 23 
+39 24 
+40 4 
+41 20 
+42 16 
+43 15 
+44 24 
+45 16 
+46 9 
+47 4 
+48 11 
+49 3 
+50 54 
+51 36 
+52 19 
+53 11 
+54 21 
+55 12 
+56 9 
+57 17 
+58 16 
+59 14 
+60 14 
+61 21 
+62 19 
+63 6 
+64 17 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n66-k9.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n66-k9.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n66-k9.opt	(revision 15691)
@@ -0,0 +1,10 @@
+Route #1: 1 7 35 19 38 57 11 23 18
+Route #2: 6 2 10 26 46 63 25
+Route #3: 24 36 21 4 60 15 3 29 39 14 27
+Route #4: 32 58 40 8 65 33
+Route #5: 41 17 20 53 54 52
+Route #6: 42 5 9 12 49
+Route #7: 45 31 13 56 22 43 34 51
+Route #8: 47 59 44 64 30 55
+Route #9: 50 28 16 62 48 37 61
+cost 1316
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n66-k9.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n66-k9.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n66-k9.vrp	(revision 15691)
@@ -0,0 +1,144 @@
+NAME : B-n66-k9
+COMMENT : (Augerat et al, No of trucks: 9, Optimal value: 1316)
+TYPE : CVRP
+DIMENSION : 66
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 41 88
+ 2 53 83
+ 3 87 28
+ 4 42 11
+ 5 22 1
+ 6 34 36
+ 7 84 33
+ 8 81 63
+ 9 11 29
+ 10 62 27
+ 11 90 30
+ 12 84 69
+ 13 69 33
+ 14 89 72
+ 15 45 16
+ 16 28 6
+ 17 89 35
+ 18 58 88
+ 19 62 87
+ 20 88 67
+ 21 57 90
+ 22 54 0
+ 23 92 71
+ 24 63 86
+ 25 70 34
+ 26 91 35
+ 27 93 30
+ 28 39 44
+ 29 86 36
+ 30 43 13
+ 31 89 41
+ 32 85 70
+ 33 0 72
+ 34 18 39
+ 35 93 76
+ 36 90 65
+ 37 88 0
+ 38 91 36
+ 39 87 66
+ 40 45 14
+ 41 0 33
+ 42 54 89
+ 43 35 46
+ 44 91 73
+ 45 95 35
+ 46 85 71
+ 47 94 31
+ 48 88 37
+ 49 91 35
+ 50 66 34
+ 51 86 38
+ 52 92 77
+ 53 56 93
+ 54 58 91
+ 55 60 91
+ 56 61 84
+ 57 90 70
+ 58 85 67
+ 59 0 69
+ 60 94 35
+ 61 28 5
+ 62 89 37
+ 63 90 34
+ 64 94 32
+ 65 95 35
+ 66 16 32
+DEMAND_SECTION 
+1 0 
+2 5 
+3 20 
+4 7 
+5 2 
+6 19 
+7 19 
+8 9 
+9 15 
+10 22 
+11 14 
+12 15 
+13 18 
+14 4 
+15 6 
+16 4 
+17 10 
+18 16 
+19 14 
+20 1 
+21 23 
+22 19 
+23 16 
+24 22 
+25 15 
+26 4 
+27 21 
+28 16 
+29 22 
+30 6 
+31 2 
+32 11 
+33 5 
+34 2 
+35 12 
+36 6 
+37 17 
+38 15 
+39 11 
+40 4 
+41 22 
+42 13 
+43 21 
+44 13 
+45 20 
+46 6 
+47 15 
+48 22 
+49 11 
+50 18 
+51 8 
+52 22 
+53 16 
+54 7 
+55 16 
+56 21 
+57 16 
+58 17 
+59 16 
+60 23 
+61 3 
+62 20 
+63 13 
+64 6 
+65 12 
+66 15 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n67-k10.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n67-k10.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n67-k10.opt	(revision 15691)
@@ -0,0 +1,11 @@
+Route #1: 58 15 56 55 54 22 52 45 12 
+Route #2: 66 51 32 8 23 37 65 
+Route #3: 13 28 5 
+Route #4: 9 48 21 25 63 
+Route #5: 62 61 30 57 3 60 
+Route #6: 4 6 34 64 40 44 42 53 
+Route #7: 39 36 1 49 35 19 20 14 
+Route #8: 31 18 26 2 47 33 
+Route #9: 17 38 10 29 24 59 41 
+Route #10: 46 11 50 7 27 43 16 
+Cost 1032
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n67-k10.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n67-k10.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n67-k10.vrp	(revision 15691)
@@ -0,0 +1,146 @@
+NAME : B-n67-k10
+COMMENT : (Augerat et al, No of trucks: 10, Optimal value: 1032)
+TYPE : CVRP
+DIMENSION : 67
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 58 90
+ 2 5 66
+ 3 34 98
+ 4 93 17
+ 5 23 67
+ 6 71 91
+ 7 20 39
+ 8 20 86
+ 9 7 99
+ 10 72 78
+ 11 27 90
+ 12 14 72
+ 13 72 101
+ 14 72 96
+ 15 19 73
+ 16 76 95
+ 17 30 92
+ 18 30 87
+ 19 40 104
+ 20 7 73
+ 21 7 76
+ 22 79 86
+ 23 82 105
+ 24 12 104
+ 25 21 93
+ 26 77 85
+ 27 37 101
+ 28 28 91
+ 29 72 95
+ 30 22 92
+ 31 98 18
+ 32 42 107
+ 33 16 101
+ 34 41 100
+ 35 23 41
+ 36 8 70
+ 37 22 45
+ 38 15 103
+ 39 27 88
+ 40 25 47
+ 41 26 42
+ 42 29 93
+ 43 25 45
+ 44 29 91
+ 45 26 44
+ 46 78 109
+ 47 27 69
+ 48 40 99
+ 49 74 81
+ 50 8 69
+ 51 18 74
+ 52 24 96
+ 53 82 107
+ 54 27 46
+ 55 81 95
+ 56 79 95
+ 57 76 95
+ 58 97 19
+ 59 74 98
+ 60 21 94
+ 61 40 0
+ 62 100 23
+ 63 99 24
+ 64 73 85
+ 65 26 40
+ 66 16 103
+ 67 33 94
+DEMAND_SECTION 
+1 0 
+2 12 
+3 12 
+4 10 
+5 2 
+6 23 
+7 15 
+8 16 
+9 26 
+10 12 
+11 12 
+12 26 
+13 10 
+14 22 
+15 4 
+16 16 
+17 8 
+18 23 
+19 2 
+20 24 
+21 12 
+22 24 
+23 4 
+24 19 
+25 21 
+26 7 
+27 15 
+28 14 
+29 18 
+30 7 
+31 20 
+32 18 
+33 2 
+34 21 
+35 21 
+36 3 
+37 5 
+38 20 
+39 16 
+40 25 
+41 3 
+42 10 
+43 18 
+44 4 
+45 14 
+46 6 
+47 13 
+48 25 
+49 17 
+50 15 
+51 19 
+52 21 
+53 15 
+54 25 
+55 7 
+56 4 
+57 16 
+58 24 
+59 16 
+60 10 
+61 15 
+62 14 
+63 14 
+64 2 
+65 1 
+66 9 
+67 3 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n68-k9.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n68-k9.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n68-k9.opt	(revision 15691)
@@ -0,0 +1,10 @@
+Route #1: 12 45 59 30 54 62 14 5 66 
+Route #2: 15 33 28 18 24 10 58 6 32 36 67 
+Route #3: 19 53 38 50 63 
+Route #4: 20 57 51 61 26 52 1 56 
+Route #5: 21 16 44 34 48 9 17 42 29 
+Route #6: 25 23 39 11 3 55 40 
+Route #7: 31 4 60 35 27 64 
+Route #8: 37 41 8 2 22 49 
+Route #9: 47 7 13 46 43 65 
+cost 1272
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n68-k9.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n68-k9.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n68-k9.vrp	(revision 15691)
@@ -0,0 +1,148 @@
+NAME : B-n68-k9
+COMMENT : (Augerat et al, No of trucks: 9, Optimal value: 1272)
+TYPE : CVRP
+DIMENSION : 68
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 87 39
+ 2 63 45
+ 3 5 71
+ 4 71 13
+ 5 59 63
+ 6 45 95
+ 7 29 13
+ 8 51 79
+ 9 7 67
+ 10 25 85
+ 11 1 7
+ 12 72 14
+ 13 28 86
+ 14 52 86
+ 15 46 100
+ 16 66 46
+ 17 28 90
+ 18 16 70
+ 19 2 14
+ 20 79 21
+ 21 14 72
+ 22 32 88
+ 23 6 72
+ 24 73 15
+ 25 2 12
+ 26 73 21
+ 27 12 76
+ 28 66 72
+ 29 2 16
+ 30 38 16
+ 31 30 88
+ 32 68 54
+ 33 32 14
+ 34 64 46
+ 35 26 88
+ 36 62 68
+ 37 34 16
+ 38 8 68
+ 39 77 15
+ 40 73 15
+ 41 75 15
+ 42 8 68
+ 43 36 20
+ 44 56 82
+ 45 26 88
+ 46 28 86
+ 47 52 84
+ 48 60 70
+ 49 26 86
+ 50 8 72
+ 51 76 16
+ 52 6 76
+ 53 14 72
+ 54 78 14
+ 55 34 92
+ 56 74 14
+ 57 64 46
+ 58 10 74
+ 59 6 8
+ 60 28 88
+ 61 60 64
+ 62 6 78
+ 63 46 102
+ 64 77 23
+ 65 68 66
+ 66 58 80
+ 67 58 84
+ 68 36 14
+DEMAND_SECTION 
+1 0 
+2 10 
+3 3 
+4 7 
+5 18 
+6 2 
+7 2 
+8 23 
+9 8 
+10 9 
+11 22 
+12 12 
+13 20 
+14 21 
+15 9 
+16 6 
+17 11 
+18 18 
+19 23 
+20 10 
+21 11 
+22 3 
+23 10 
+24 23 
+25 8 
+26 16 
+27 26 
+28 19 
+29 9 
+30 18 
+31 5 
+32 23 
+33 1 
+34 2 
+35 21 
+36 19 
+37 5 
+38 14 
+39 10 
+40 2 
+41 16 
+42 17 
+43 5 
+44 16 
+45 6 
+46 11 
+47 14 
+48 17 
+49 8 
+50 48 
+51 12 
+52 9 
+53 6 
+54 10 
+55 19 
+56 22 
+57 5 
+58 12 
+59 5 
+60 9 
+61 8 
+62 21 
+63 9 
+64 3 
+65 8 
+66 9 
+67 16 
+68 17 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n78-k10.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n78-k10.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n78-k10.opt	(revision 15691)
@@ -0,0 +1,11 @@
+Route #1: 1 52 24 21 43 67 69 72 17
+Route #2: 2 63 49 27 56 38 58
+Route #3: 5 30 70 29 37 65
+Route #4: 8 22 71 31 73 32 76 7 57 47
+Route #5: 9 19 33 55 35 59 4 36 14 41 10
+Route #6: 11 64 40 53 68 18 25 42
+Route #7: 15 12 34 46 45 51
+Route #8: 16 66 60 6 62 54 20 3 75
+Route #9: 23 26 44 77
+Route #10: 28 74 48 13 39 61 50
+cost 1221
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n78-k10.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n78-k10.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/B/B-n78-k10.vrp	(revision 15691)
@@ -0,0 +1,168 @@
+NAME : B-n78-k10
+COMMENT : (Augerat et al, No of trucks: 10, Optimal value: 1221)
+TYPE : CVRP
+DIMENSION : 78
+EDGE_WEIGHT_TYPE : EUC_2D 
+CAPACITY : 100
+NODE_COORD_SECTION 
+ 1 46 12
+ 2 51 4
+ 3 52 30
+ 4 80 70
+ 5 18 90
+ 6 59 39
+ 7 23 59
+ 8 77 48
+ 9 82 30
+ 10 18 82
+ 11 11 41
+ 12 7 9
+ 13 88 33
+ 14 23 88
+ 15 0 76
+ 16 85 34
+ 17 17 46
+ 18 52 10
+ 19 13 45
+ 20 19 85
+ 21 86 77
+ 22 54 6
+ 23 83 32
+ 24 15 10
+ 25 53 5
+ 26 14 42
+ 27 13 10
+ 28 57 32
+ 29 20 85
+ 30 65 46
+ 31 61 42
+ 32 87 52
+ 33 79 51
+ 34 25 91
+ 35 89 34
+ 36 26 100
+ 37 0 88
+ 38 63 43
+ 39 55 10
+ 40 23 86
+ 41 8 18
+ 42 0 74
+ 43 20 44
+ 44 56 7
+ 45 14 10
+ 46 88 40
+ 47 96 38
+ 48 59 31
+ 49 22 87
+ 50 59 36
+ 51 24 83
+ 52 83 37
+ 53 53 5
+ 54 0 37
+ 55 84 78
+ 56 27 93
+ 57 61 12
+ 58 69 43
+ 59 54 9
+ 60 20 98
+ 61 18 50
+ 62 25 84
+ 63 31 69
+ 64 58 36
+ 65 0 11
+ 66 61 36
+ 67 18 49
+ 68 57 8
+ 69 0 49
+ 70 56 8
+ 71 62 45
+ 72 83 32
+ 73 53 10
+ 74 82 53
+ 75 21 85
+ 76 64 41
+ 77 80 50
+ 78 16 10
+DEMAND_SECTION 
+1 0 
+2 14 
+3 17 
+4 17 
+5 16 
+6 19 
+7 17 
+8 5 
+9 12 
+10 4 
+11 2 
+12 2 
+13 26 
+14 2 
+15 7 
+16 18 
+17 6 
+18 6 
+19 18 
+20 2 
+21 14 
+22 5 
+23 9 
+24 4 
+25 3 
+26 15 
+27 4 
+28 23 
+29 7 
+30 21 
+31 4 
+32 1 
+33 6 
+34 16 
+35 4 
+36 20 
+37 5 
+38 14 
+39 14 
+40 26 
+41 5 
+42 2 
+43 14 
+44 11 
+45 21 
+46 20 
+47 18 
+48 2 
+49 19 
+50 12 
+51 22 
+52 14 
+53 23 
+54 25 
+55 8 
+56 3 
+57 9 
+58 21 
+59 3 
+60 22 
+61 6 
+62 2 
+63 22 
+64 20 
+65 5 
+66 13 
+67 6 
+68 14 
+69 16 
+70 12 
+71 23 
+72 5 
+73 12 
+74 15 
+75 21 
+76 4 
+77 23 
+78 19 
+DEPOT_SECTION 
+ 1  
+ -1  
+EOF 
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n22-k4.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n22-k4.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n22-k4.opt	(revision 15691)
@@ -0,0 +1,5 @@
+Route #1: 17 20 18 15 12 
+Route #2: 16 19 21 14 
+Route #3: 13 11 4 3 8 10 
+Route #4: 9 7 5 2 1 6 
+Cost 375
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n22-k4.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n22-k4.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n22-k4.vrp	(revision 15691)
@@ -0,0 +1,56 @@
+NAME : E-n22-k4
+COMMENT : (Christophides and Eilon, Min no of trucks: 4, Optimal value: 375)
+TYPE : CVRP
+DIMENSION : 22
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 6000
+NODE_COORD_SECTION
+1 145 215
+2 151 264
+3 159 261
+4 130 254
+5 128 252
+6 163 247
+7 146 246
+8 161 242
+9 142 239
+10 163 236
+11 148 232
+12 128 231
+13 156 217
+14 129 214
+15 146 208
+16 164 208
+17 141 206
+18 147 193
+19 164 193
+20 129 189
+21 155 185
+22 139 182
+DEMAND_SECTION
+1 0
+2 1100
+3 700
+4 800
+5 1400
+6 2100
+7 400
+8 800
+9 100
+10 500
+11 600
+12 1200
+13 1300
+14 1300
+15 300
+16 900
+17 2100
+18 1000
+19 900
+20 2500
+21 1800
+22 700
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n23-k3.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n23-k3.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n23-k3.opt	(revision 15691)
@@ -0,0 +1,4 @@
+Route #1: 21 4 5 8 9 7 
+Route #2: 18 19 20 22 17 14 15 16 3 2 1 6 11 12 
+Route #3: 13 10 
+Cost 569
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n23-k3.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n23-k3.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n23-k3.vrp	(revision 15691)
@@ -0,0 +1,58 @@
+NAME : E-n23-k3
+COMMENT : (Christophides and Eilon, Min no of trucks: 3, Optimal value: 569)
+TYPE : CVRP
+DIMENSION : 23
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 4500
+NODE_COORD_SECTION
+1 266 235
+2 295 272
+3 301 258
+4 309 260
+5 217 274
+6 218 278
+7 282 267
+8 242 249
+9 230 262
+10 249 268
+11 256 267
+12 265 257
+13 267 242
+14 259 265
+15 315 233
+16 329 252
+17 318 252
+18 329 224
+19 267 213
+20 275 192
+21 303 201
+22 208 217
+23 326 181
+DEMAND_SECTION
+1 0
+2 125
+3 84
+4 60
+5 500
+6 300
+7 175
+8 350
+9 150
+10 1100
+11 4100
+12 225
+13 300
+14 250
+15 500
+16 150
+17 100
+18 250
+19 120
+20 600
+21 500
+22 175
+23 75
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n30-k3.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n30-k3.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n30-k3.opt	(revision 15691)
@@ -0,0 +1,4 @@
+Route #1: 26 28 27 29 25 24 6 21 
+Route #2: 22 3 4 1 5 2 20 
+Route #3: 19 15 16 13 7 17 9 14 8 12 11 10 23 18 
+Cost 534
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n30-k3.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n30-k3.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n30-k3.vrp	(revision 15691)
@@ -0,0 +1,72 @@
+NAME : E-n30-k3
+COMMENT : (Christophides and Eilon, Min no of trucks: 3, Optimal value: 534)
+TYPE : CVRP
+DIMENSION : 30
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 4500
+NODE_COORD_SECTION
+1 162 354
+2 218 382
+3 218 358
+4 201 370
+5 214 371
+6 224 370
+7 210 382
+8 104 354
+9 126 338
+10 119 340
+11 129 349
+12 126 347
+13 125 346
+14 116 355
+15 126 335
+16 125 355
+17 119 357
+18 115 341
+19 153 351
+20 175 363
+21 180 360
+22 159 331
+23 188 357
+24 152 349
+25 215 389
+26 212 394
+27 188 393
+28 207 406
+29 184 410
+30 207 392
+DEMAND_SECTION
+1 0
+2 300
+3 3100
+4 125
+5 100
+6 200
+7 150
+8 150
+9 450
+10 300
+11 100
+12 950
+13 125
+14 150
+15 150
+16 550
+17 150
+18 100
+19 150
+20 400
+21 300
+22 1500
+23 100
+24 300
+25 500
+26 800
+27 300
+28 100
+29 150
+30 1000
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n33-k4.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n33-k4.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n33-k4.opt	(revision 15691)
@@ -0,0 +1,5 @@
+Route #1: 1 15 26 27 16 28 29 
+Route #2: 30 14 31 
+Route #3: 3 5 6 10 18 19 22 21 20 23 24 25 17 13 
+Route #4: 2 12 11 32 8 9 7 4 
+Cost 835
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n33-k4.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n33-k4.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/E/E-n33-k4.vrp	(revision 15691)
@@ -0,0 +1,78 @@
+NAME : E-n33-k4
+COMMENT : (Christophides and Eilon, Min no of trucks: 4, Optimal value: 835)
+TYPE : CVRP
+DIMENSION : 33
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 8000
+NODE_COORD_SECTION
+1 292 495
+2 298 427
+3 309 445
+4 307 464
+5 336 475
+6 320 439
+7 321 437
+8 322 437
+9 323 433
+10 324 433
+11 323 429
+12 314 435
+13 311 442
+14 304 427
+15 293 421
+16 296 418
+17 261 384
+18 297 410
+19 315 407
+20 314 406
+21 321 391
+22 321 398
+23 314 394
+24 313 378
+25 304 382
+26 295 402
+27 283 406
+28 279 399
+29 271 401
+30 264 414
+31 277 439
+32 290 434
+33 319 433
+DEMAND_SECTION
+1 0
+2 700
+3 400
+4 400
+5 1200
+6 40
+7 80
+8 2000
+9 900
+10 600
+11 750
+12 1500
+13 150
+14 250
+15 1600
+16 450
+17 700
+18 550
+19 650
+20 200
+21 400
+22 300
+23 1300
+24 700
+25 750
+26 1400
+27 4000
+28 600
+29 1000
+30 500
+31 2500
+32 1700
+33 1100
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/F/F-n45-k4.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/F/F-n45-k4.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/F/F-n45-k4.opt	(revision 15691)
@@ -0,0 +1,5 @@
+Route #1: 43 44 28 33 29 27 6 5 7 35 3 4 14 13 12 11 18 17 10 
+Route #2: 42 30 41 32 31 34 40 39 36 38 37 
+Route #3: 24 9 15 1 2 16 
+Route #4: 20 21 25 26 23 22 19 8 
+Cost 724
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/F/F-n45-k4.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/F/F-n45-k4.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/F/F-n45-k4.vrp	(revision 15691)
@@ -0,0 +1,102 @@
+NAME : F-n45-k4
+COMMENT : (Fisher: problem 10, No of trucks: 4, Optimal value: 724)
+TYPE : CVRP
+DIMENSION : 45
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 2010
+NODE_COORD_SECTION
+1 0 0
+2 3 5
+3 2.5 9
+4 48 16
+5 48 17
+6 69 16
+7 70 16
+8 64 13
+9 3 -22
+10 2.5 1
+11 -13 11.5
+12 -20 45
+13 -9 52
+14 -8.5 53
+15 -8 52
+16 2 2
+17 -2 9
+18 -10 20
+19 -20 19
+20 -15 -21
+21 -5 -9
+22 -4.5 -9
+23 -52 -36
+24 -53 -36
+25 0 0.01
+26 -30 -18
+27 -51 -35
+28 81 9
+29 84 -99
+30 82 -6
+31 40 -12
+32 50 -7
+33 51 -8
+34 63 -17
+35 45 -1
+36 54 8.5
+37 29 4
+38 21 3
+39 22 2
+40 39 -3
+41 39.5 -3
+42 40 -11
+43 28 -2
+44 24 -18
+45 24 -19 
+DEMAND_SECTION
+1 0
+2 33
+3 15
+4 10
+5 40
+6 15
+7 5
+8 77
+9 435
+10 165
+11 120
+12 65
+13 23
+14 18
+15 550
+16 78
+17 627
+18 9
+19 96
+20 116
+21 116
+22 83
+23 41
+24 645
+25 694
+26 573
+27 1
+28 181
+29 106
+30 52
+31 117
+32 52
+33 1300
+34 57
+35 28
+36 84
+37 1
+38 54
+39 19
+40 88
+41 41
+42 238
+43 66
+44 44
+45 42
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n101-k4.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n101-k4.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n101-k4.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 6 96 99 59 92 93 98 37 100 91 85 61 16 86 38 44 14 42 43 15 57 2 87 97 95 94 
+Route #2: 53 26 12 80 68 29 24 54 4 55 25 39 67 23 56 75 22 41 74 72 73 21 40 58 13 
+Route #3: 28 76 77 3 79 78 34 35 71 65 66 20 32 90 63 64 49 36 47 46 8 45 17 84 5 60 83 18 89 
+Route #4: 27 69 1 50 33 81 9 51 30 70 10 62 11 19 48 82 7 88 31 52 
+cost 681
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n101-k4.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n101-k4.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n101-k4.vrp	(revision 15691)
@@ -0,0 +1,214 @@
+NAME : P-n101-k4
+COMMENT : (Augerat et al, No of trucks: 4, Optimal value: 681)
+TYPE : CVRP
+DIMENSION : 101
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 400
+NODE_COORD_SECTION
+1 35 35
+2 41 49
+3 35 17
+4 55 45
+5 55 20
+6 15 30
+7 25 30
+8 20 50
+9 10 43
+10 55 60
+11 30 60
+12 20 65
+13 50 35
+14 30 25
+15 15 10
+16 30 5
+17 10 20
+18 5 30
+19 20 40
+20 15 60
+21 45 65
+22 45 20
+23 45 10
+24 55 5
+25 65 35
+26 65 20
+27 45 30
+28 35 40
+29 41 37
+30 64 42
+31 40 60
+32 31 52
+33 35 69
+34 53 52
+35 65 55
+36 63 65
+37 2 60
+38 20 20
+39 5 5
+40 60 12
+41 40 25
+42 42 7
+43 24 12
+44 23 3
+45 11 14
+46 6 38
+47 2 48
+48 8 56
+49 13 52
+50 6 68
+51 47 47
+52 49 58
+53 27 43
+54 37 31
+55 57 29
+56 63 23
+57 53 12
+58 32 12
+59 36 26
+60 21 24
+61 17 34
+62 12 24
+63 24 58
+64 27 69
+65 15 77
+66 62 77
+67 49 73
+68 67 5
+69 56 39
+70 37 47
+71 37 56
+72 57 68
+73 47 16
+74 44 17
+75 46 13
+76 49 11
+77 49 42
+78 53 43
+79 61 52
+80 57 48
+81 56 37
+82 55 54
+83 15 47
+84 14 37
+85 11 31
+86 16 22
+87 4 18
+88 28 18
+89 26 52
+90 26 35
+91 31 67
+92 15 19
+93 22 22
+94 18 24
+95 26 27
+96 25 24
+97 22 27
+98 25 21
+99 19 21
+100 20 26
+101 18 18
+DEMAND_SECTION
+1 0
+2 10
+3 7
+4 13
+5 19
+6 26
+7 3
+8 5
+9 9
+10 16
+11 16
+12 12
+13 19
+14 23
+15 20
+16 8
+17 19
+18 2
+19 12
+20 17
+21 9
+22 11
+23 18
+24 29
+25 3
+26 6
+27 17
+28 16
+29 16
+30 9
+31 21
+32 27
+33 23
+34 11
+35 14
+36 8
+37 5
+38 8
+39 16
+40 31
+41 9
+42 5
+43 5
+44 7
+45 18
+46 16
+47 1
+48 27
+49 36
+50 30
+51 13
+52 10
+53 9
+54 14
+55 18
+56 2
+57 6
+58 7
+59 18
+60 28
+61 3
+62 13
+63 19
+64 10
+65 9
+66 20
+67 25
+68 25
+69 36
+70 6
+71 5
+72 15
+73 25
+74 9
+75 8
+76 18
+77 13
+78 14
+79 3
+80 23
+81 6
+82 26
+83 16
+84 11
+85 7
+86 41
+87 35
+88 26
+89 9
+90 15
+91 3
+92 1
+93 2
+94 22
+95 27
+96 20
+97 11
+98 12
+99 10
+100 9
+101 17
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n16-k8.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n16-k8.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n16-k8.opt	(revision 15691)
@@ -0,0 +1,9 @@
+Route #1: 2 
+Route #2: 6 
+Route #3: 8 
+Route #4: 15 12 10 
+Route #5: 14 5 
+Route #6: 13 9 7 
+Route #7: 11 4 
+Route #8: 3 1 
+cost 450
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n16-k8.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n16-k8.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n16-k8.vrp	(revision 15691)
@@ -0,0 +1,44 @@
+NAME : P-n16-k8
+COMMENT : (Augerat et al, No of trucks: 8, Optimal value: 450)
+TYPE : CVRP
+DIMENSION : 16
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 35
+NODE_COORD_SECTION
+1 30 40
+2 37 52
+3 49 49
+4 52 64
+5 31 62
+6 52 33
+7 42 41
+8 52 41
+9 57 58
+10 62 42
+11 42 57
+12 27 68
+13 43 67
+14 58 48
+15 58 27
+16 37 69
+DEMAND_SECTION
+1 0
+2 19
+3 30
+4 16
+5 23
+6 11
+7 31
+8 15
+9 28
+10 8
+11 8
+12 7
+13 14
+14 6
+15 19
+16 11
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n19-k2.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n19-k2.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n19-k2.opt	(revision 15691)
@@ -0,0 +1,4 @@
+Route #1: 4 11 14 12 3 17 16 8 6 
+Route #2: 18 5 13 15 9 7 2 10 1 
+cost 212
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n19-k2.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n19-k2.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n19-k2.vrp	(revision 15691)
@@ -0,0 +1,50 @@
+NAME : P-n19-k2
+COMMENT : (Augerat et al, No of trucks: 2, Optimal value: 212)
+TYPE : CVRP
+DIMENSION : 19
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 160
+NODE_COORD_SECTION
+1 30 40
+2 37 52
+3 49 43
+4 52 64
+5 31 62
+6 52 33
+7 42 41
+8 52 41
+9 57 58
+10 62 42
+11 42 57
+12 27 68
+13 43 67
+14 58 27
+15 37 69
+16 61 33
+17 62 63
+18 63 69
+19 45 35
+DEMAND_SECTION
+1 0
+2 19
+3 30
+4 16
+5 23
+6 11
+7 31
+8 15
+9 28
+10 14
+11 8
+12 7
+13 14
+14 19
+15 11
+16 26
+17 17
+18 6
+19 15
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n20-k2.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n20-k2.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n20-k2.opt	(revision 15691)
@@ -0,0 +1,3 @@
+Route #1: 19 5 14 16 9 7 2 10 1 
+Route #2: 6 13 8 17 18 3 12 15 11 4
+cost 216
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n20-k2.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n20-k2.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n20-k2.vrp	(revision 15691)
@@ -0,0 +1,52 @@
+NAME :  P-n20-k2
+COMMENT : (Augerat et al, No of trucks: 2, Optimal value: 216)
+TYPE : CVRP
+DIMENSION : 20
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 160
+NODE_COORD_SECTION
+1 30 40
+2 37 52
+3 49 49
+4 52 64
+5 31 62
+6 52 33
+7 42 41
+8 52 41
+9 57 58
+10 62 42
+11 42 57
+12 27 68
+13 43 67
+14 58 48
+15 58 27
+16 37 69
+17 61 33
+18 62 63
+19 63 69
+20 45 35
+DEMAND_SECTION
+1 0
+2 19
+3 30
+4 16
+5 23
+6 11
+7 31
+8 15
+9 28
+10 8
+11 8
+12 7
+13 14
+14 6
+15 19
+16 11
+17 26
+18 17
+19 6
+20 15
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n21-k2.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n21-k2.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n21-k2.opt	(revision 15691)
@@ -0,0 +1,4 @@
+Route #1: 20 5 14 17 9 13 2 7 6 
+Route #2: 16 1 10 8 18 19 3 12 15 11 4 
+cost 211
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n21-k2.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n21-k2.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n21-k2.vrp	(revision 15691)
@@ -0,0 +1,54 @@
+NAME : P-n21-k2
+COMMENT : (Augerat et al, No of trucks: 2, Optimal value: 211)
+TYPE : CVRP
+DIMENSION : 21
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 160
+NODE_COORD_SECTION
+1 30 40
+2 37 52
+3 49 49
+4 52 64
+5 31 62
+6 52 33
+7 42 41
+8 52 41
+9 57 58
+10 62 42
+11 42 57
+12 27 68
+13 43 67
+14 58 48
+15 58 27
+16 37 69
+17 38 46
+18 61 33
+19 62 63
+20 63 69
+21 45 35
+DEMAND_SECTION
+1 0
+2 7
+3 30
+4 16
+5 23
+6 11
+7 19
+8 15
+9 28
+10 8
+11 8
+12 7
+13 14
+14 6
+15 19
+16 11
+17 12
+18 26
+19 17
+20 6
+21 15
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n22-k2.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n22-k2.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n22-k2.opt	(revision 15691)
@@ -0,0 +1,4 @@
+Route #1: 6 2 13 9 7 21 17 14 5 20 
+Route #2: 16 1 10 8 18 19 3 12 15 11 4 
+cost 216
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n22-k2.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n22-k2.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n22-k2.vrp	(revision 15691)
@@ -0,0 +1,56 @@
+NAME : P-n22-k2
+COMMENT : (Augerat et al, No of trucks: 2, Optimal value: 216)
+TYPE : CVRP
+DIMENSION : 22
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 160
+NODE_COORD_SECTION
+1 30 40
+2 37 52
+3 49 49
+4 52 64
+5 31 62
+6 52 33
+7 42 41
+8 52 41
+9 57 58
+10 62 42
+11 42 57
+12 27 68
+13 43 67
+14 58 48
+15 58 27
+16 37 69
+17 38 46
+18 61 33
+19 62 63
+20 63 69
+21 45 35
+22 56 37
+DEMAND_SECTION
+1 0
+2 7
+3 30
+4 16
+5 23
+6 11
+7 19
+8 15
+9 28
+10 8
+11 8
+12 7
+13 14
+14 6
+15 19
+16 11
+17 12
+18 26
+19 17
+20 6
+21 15
+22 10
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n22-k8.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n22-k8.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n22-k8.opt	(revision 15691)
@@ -0,0 +1,10 @@
+Route #1: 19 
+Route #2: 21 17 12 
+Route #3: 18 20 14 
+Route #4: 16 15 
+Route #5: 13 11 
+Route #6: 10 8 3 4 
+Route #7: 9 2 1 6 
+Route #8: 7 5 
+cost 603
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n22-k8.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n22-k8.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n22-k8.vrp	(revision 15691)
@@ -0,0 +1,56 @@
+NAME : P-n22-k8
+COMMENT : (Augerat et al, No of trucks: 8, Optimal value: 603)
+TYPE : CVRP
+DIMENSION : 22
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 3000
+NODE_COORD_SECTION
+1 145 215
+2 151 264
+3 159 261
+4 130 254
+5 128 252
+6 163 247
+7 146 246
+8 161 242
+9 142 239
+10 163 236
+11 148 232
+12 128 231
+13 156 217
+14 129 214
+15 146 208
+16 164 208
+17 141 206
+18 147 193
+19 164 193
+20 129 189
+21 155 185
+22 139 182
+DEMAND_SECTION
+1 0
+2 1100
+3 700
+4 800
+5 1400
+6 2100
+7 400
+8 800
+9 100
+10 500
+11 600
+12 1200
+13 1300
+14 1300
+15 300
+16 900
+17 2100
+18 1000
+19 900
+20 2500
+21 1800
+22 700
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n23-k8.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n23-k8.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n23-k8.opt	(revision 15691)
@@ -0,0 +1,9 @@
+Route #1: 13 9 17 
+Route #2: 4 7 
+Route #3: 3 19 18 
+Route #4: 21 20 6 
+Route #5: 8 16 
+Route #6: 2 1 
+Route #7: 10 12 15 11 
+Route #8: 5 14 22
+cost 529
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n23-k8.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n23-k8.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n23-k8.vrp	(revision 15691)
@@ -0,0 +1,58 @@
+NAME : P-n23-k8
+COMMENT : (Augerat et al, No of trucks: 8, Optimal value: 529)
+TYPE : CVRP
+DIMENSION : 23
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 40
+NODE_COORD_SECTION
+1 30 40
+2 37 52
+3 49 49
+4 52 64
+5 31 62
+6 52 33
+7 42 41
+8 52 41
+9 57 58
+10 62 42
+11 42 57
+12 27 68
+13 43 67
+14 58 48
+15 58 27
+16 37 69
+17 38 46
+18 61 33
+19 62 63
+20 63 69
+21 45 35
+22 32 39
+23 56 37
+DEMAND_SECTION
+1 0
+2 7
+3 30
+4 16
+5 23
+6 11
+7 19
+8 15
+9 28
+10 8
+11 8
+12 7
+13 14
+14 6
+15 19
+16 11
+17 12
+18 26
+19 17
+20 6
+21 15
+22 5
+23 10
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n40-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n40-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n40-k5.opt	(revision 15691)
@@ -0,0 +1,7 @@
+Route #1: 11 16 29 21 34 30 9 38 
+Route #2: 27 8 31 26 7 23 24 6 
+Route #3: 12 17 37 15 33 39 10 5 
+Route #4: 18 4 19 13 25 14 
+Route #5: 1 22 28 3 36 35 20 2 32 
+cost 458
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n40-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n40-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n40-k5.vrp	(revision 15691)
@@ -0,0 +1,92 @@
+NAME : P-n40-k5.vrp
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 458)
+TYPE : CVRP
+DIMENSION : 40
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 140
+NODE_COORD_SECTION
+1 30 40
+2 37 52
+3 49 49
+4 52 64
+5 20 26
+6 40 30
+7 21 47
+8 17 63
+9 31 62
+10 52 33
+11 51 21
+12 42 41
+13 31 32
+14 5 25
+15 12 42
+16 36 16
+17 52 41
+18 27 23
+19 17 33
+20 13 13
+21 57 58
+22 62 42
+23 42 57
+24 16 57
+25 8 52
+26 7 38
+27 27 68
+28 30 48
+29 43 67
+30 58 48
+31 58 27
+32 37 69
+33 38 46
+34 46 10
+35 61 33
+36 62 63
+37 63 69
+38 32 22
+39 45 35
+40 59 15
+DEMAND_SECTION
+1 0
+2 7
+3 30
+4 16
+5 9
+6 21
+7 15
+8 19
+9 23
+10 11
+11 5
+12 19
+13 29
+14 23
+15 21
+16 10
+17 15
+18 3
+19 41
+20 9
+21 28
+22 8
+23 8
+24 16
+25 10
+26 28
+27 7
+28 15
+29 14
+30 6
+31 19
+32 11
+33 12
+34 23
+35 26
+36 17
+37 6
+38 9
+39 15
+40 14
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n45-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n45-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n45-k5.opt	(revision 15691)
@@ -0,0 +1,7 @@
+Route #1: 32 1 22 20 35 36 3 28 31 26 8 
+Route #2: 11 16 2 29 21 34 30 9 38 
+Route #3: 18 13 41 40 19 42 44 17 4 
+Route #4: 5 10 39 33 15 37 12 
+Route #5: 6 14 25 24 43 7 23 27 
+cost 510
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n45-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n45-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n45-k5.vrp	(revision 15691)
@@ -0,0 +1,102 @@
+NAME : P-n45-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 510)
+TYPE : CVRP
+DIMENSION : 45
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 150
+NODE_COORD_SECTION
+1 30 40
+2 37 52
+3 49 49
+4 52 64
+5 20 26
+6 40 30
+7 21 47
+8 17 63
+9 31 62
+10 52 33
+11 51 21
+12 42 41
+13 31 32
+14 5 25
+15 12 42
+16 36 16
+17 52 41
+18 27 23
+19 17 33
+20 13 13
+21 57 58
+22 62 42
+23 42 57
+24 16 57
+25 8 52
+26 7 38
+27 27 68
+28 30 48
+29 43 67
+30 58 48
+31 58 27
+32 37 69
+33 38 46
+34 46 10
+35 61 33
+36 62 63
+37 63 69
+38 32 22
+39 45 35
+40 59 15
+41 5 6
+42 10 17
+43 21 10
+44 5 64
+45 30 15
+DEMAND_SECTION
+1 0
+2 7
+3 30
+4 16
+5 9
+6 21
+7 15
+8 19
+9 23
+10 11
+11 5
+12 19
+13 29
+14 23
+15 21
+16 10
+17 15
+18 3
+19 41
+20 9
+21 28
+22 8
+23 8
+24 16
+25 10
+26 28
+27 7
+28 15
+29 14
+30 6
+31 19
+32 11
+33 12
+34 23
+35 26
+36 17
+37 6
+38 9
+39 15
+40 14
+41 7
+42 27
+43 13
+44 11
+45 16
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k10.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k10.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k10.opt	(revision 15691)
@@ -0,0 +1,11 @@
+Route #1: 16 23 43 41 42 22 6
+Route #2: 3 44 32 9
+Route #3: 21 36 37 20 15 13
+Route #4: 39 31 25 18 24 49
+Route #5: 35 11 38 10
+Route #6: 17 40 12 26
+Route #7: 2 28 1 33
+Route #8: 30 48 47 5 29
+Route #9: 46 27 45 4
+Route #10: 34 8 19 14 7
+cost 696
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k10.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k10.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k10.vrp	(revision 15691)
@@ -0,0 +1,112 @@
+NAME : P-n50-k10
+COMMENT : (Augerat et al, No of trucks: 10, Optimal value: 696)
+TYPE : CVRP
+DIMENSION : 50
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 100
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k7.opt	(revision 15691)
@@ -0,0 +1,8 @@
+Route #1: 40 3 44 32 9 39 12 
+Route #2: 6 33 1 22 42 41 43 23 16 
+Route #3: 2 28 21 47 48 30 
+Route #4: 17 49 24 18 25 31 10 26 
+Route #5: 46 34 4 
+Route #6: 7 38 11 14 19 35 8 
+Route #7: 27 13 15 20 37 36 5 29 45 
+cost 554
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k7.vrp	(revision 15691)
@@ -0,0 +1,112 @@
+NAME :  P-n50-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 554)
+TYPE : CVRP
+DIMENSION : 50
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 150
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k8.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k8.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k8.opt	(revision 15691)
@@ -0,0 +1,9 @@
+Route #1: 2 22 42 41 43 1 6 
+Route #2: 4 45 46 8 35 7 
+Route #3: 9 39 31 10 38 
+Route #4: 12 40 44 3 16 17 
+Route #5: 26 11 14 19 34 
+Route #6: 27 13 15 20 37 36 5 29 
+Route #7: 28 21 47 48 30 
+Route #8: 32 25 18 24 49 23 33 
+cost 631
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k8.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k8.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n50-k8.vrp	(revision 15691)
@@ -0,0 +1,112 @@
+NAME : P-n50-k8
+COMMENT : (Augerat et al, No of trucks: 8, Optimal value: 631)
+TYPE : CVRP
+DIMENSION : 50
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 120
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n51-k10.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n51-k10.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n51-k10.opt	(revision 15691)
@@ -0,0 +1,11 @@
+Route #1: 42 40 19 41 13
+Route #2: 46 50 21 34 30 9
+Route #3: 49 10 39 33 45 15
+Route #4: 8 26 31 28 22 32
+Route #5: 27 6 14 25
+Route #6: 47 4 18
+Route #7: 5 37 44 17 12
+Route #8: 48 23 7 43 24
+Route #9: 29 20 35 36 3 1
+Route #10: 11 2 16 38
+cost 741
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n51-k10.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n51-k10.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n51-k10.vrp	(revision 15691)
@@ -0,0 +1,114 @@
+NAME : P-n51-k10
+COMMENT : (Augerat et al, No of trucks: 10, Best value: 741)
+TYPE : CVRP
+DIMENSION : 51
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 80
+NODE_COORD_SECTION
+1 30 40
+2 37 52
+3 49 49
+4 52 64
+5 20 26
+6 40 30
+7 21 47
+8 17 63
+9 31 62
+10 52 33
+11 51 21
+12 42 41
+13 31 32
+14 5 25
+15 12 42
+16 36 16
+17 52 41
+18 27 23
+19 17 33
+20 13 13
+21 57 58
+22 62 42
+23 42 57
+24 16 57
+25 8 52
+26 7 38
+27 27 68
+28 30 48
+29 43 67
+30 58 48
+31 58 27
+32 37 69
+33 38 46
+34 46 10
+35 61 33
+36 62 63
+37 63 69
+38 32 22
+39 45 35
+40 59 15
+41 5 6
+42 10 17
+43 21 10
+44 5 64
+45 30 15
+46 39 10
+47 32 39
+48 25 32
+49 25 55
+50 48 28
+51 56 37
+DEMAND_SECTION
+1 0
+2 7
+3 30
+4 16
+5 9
+6 21
+7 15
+8 19
+9 23
+10 11
+11 5
+12 19
+13 29
+14 23
+15 21
+16 10
+17 15
+18 3
+19 41
+20 9
+21 28
+22 8
+23 8
+24 16
+25 10
+26 28
+27 7
+28 15
+29 14
+30 6
+31 19
+32 11
+33 12
+34 23
+35 26
+36 17
+37 6
+38 9
+39 15
+40 14
+41 7
+42 27
+43 13
+44 11
+45 16
+46 10
+47 5
+48 25
+49 17
+50 18
+51 10
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k10.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k10.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k10.opt	(revision 15691)
@@ -0,0 +1,11 @@
+Route #1: 4
+Route #2: 2 21 47 48 30 
+Route #3: 6 33 16 3 44 17 
+Route #4: 7 35 53 14 19 8 
+Route #5: 11 38 10 31 
+Route #6: 15 20 37 36 5 29 45 
+Route #7: 23 49 24 18 50 25 32 
+Route #8: 26 12 39 9 40 
+Route #9: 28 22 42 41 43 1 51 
+Route #10: 34 52 27 13 54 46 
+cost 694
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k10.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k10.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k10.vrp	(revision 15691)
@@ -0,0 +1,122 @@
+NAME : P-n55-k10
+COMMENT : (Augerat et al, No of trucks: 10, Optimal value: 694)
+TYPE : CVRP
+DIMENSION : 55
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 115
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+51 15 56
+52 29 39
+53 54 38
+54 55 57
+55 67 41
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+51 22
+52 12
+53 19
+54 22
+55 16
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k15.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k15.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k15.opt	(revision 15691)
@@ -0,0 +1,16 @@
+Route #1: 1 42 22 28 
+Route #2: 2 48 30 
+Route #3: 3 24 49 33 
+Route #4: 4 45 34 
+Route #5: 5 47 21 
+Route #6: 6 31 10 
+Route #7: 7 14 38 
+Route #8: 9 18 32 
+Route #9: 11 53 35 
+Route #10: 12 40 17 
+Route #11: 19 54 13 46 
+Route #12: 26 8 52 27 
+Route #13: 29 15 20 37 36 
+Route #14: 39 25 50 44 
+Route #15: 43 41 23 16 51 
+cost 989
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k15.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k15.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k15.vrp	(revision 15691)
@@ -0,0 +1,122 @@
+NAME : P-n55-k15
+COMMENT : (Augerat et al, No of trucks: 15, Optimal value: 989)
+TYPE : CVRP
+DIMENSION : 55
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 70
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+51 15 56
+52 29 39
+53 54 38
+54 55 57
+55 67 41
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+51 22
+52 12
+53 19
+54 22
+55 16
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k7.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k7.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k7.opt	(revision 15691)
@@ -0,0 +1,9 @@
+Route #1: 3 44 32 50 18 25 9 40 
+Route #2: 27 15 20 37 36 5 29 45 4 
+Route #3: 46 8 35 14 19 54 13 52 34 
+Route #4: 51 16 49 24 23 43 41 42 22 1 33 
+Route #5: 39 31 10 38 11 53 7 
+Route #6: 17 12 26 
+Route #7: 6 2 28 21 47 48 30 
+cost 568
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k7.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k7.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k7.vrp	(revision 15691)
@@ -0,0 +1,122 @@
+NAME : P-n55-k7
+COMMENT : (Augerat et al, No of trucks: 7, Optimal value: 568)
+TYPE : CVRP
+DIMENSION : 55
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 170
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+51 15 56
+52 29 39
+53 54 38
+54 55 57
+55 67 41
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+51 22
+52 12
+53 19
+54 22
+55 16
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k8.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k8.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k8.opt	(revision 15691)
@@ -0,0 +1,10 @@
+Route #1: 26 
+Route #2: 45 29 5 37 20 15 13 54 19 8 
+Route #3: 6 33 1 22 42 41 43 23 16 
+Route #4: 17 3 44 32 9 39 40 
+Route #5: 12 10 31 25 50 18 24 49 51 
+Route #6: 38 11 14 53 35 7 
+Route #7: 2 28 21 36 47 48 30 
+Route #8: 4 27 52 46 34 
+cost 588
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k8.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k8.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n55-k8.vrp	(revision 15691)
@@ -0,0 +1,122 @@
+NAME : P-n55-k8
+COMMENT : (Augerat et al, No of trucks: 8, Optimal value: 588)
+TYPE : CVRP
+DIMENSION : 55
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 160
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+51 15 56
+52 29 39
+53 54 38
+54 55 57
+55 67 41
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+51 22
+52 12
+53 19
+54 22
+55 16
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n60-k10.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n60-k10.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n60-k10.opt	(revision 15691)
@@ -0,0 +1,11 @@
+Route #1: 1 43 42 41 56 23 51 
+Route #2: 2 28 22 33 6 
+Route #3: 4 52 46 34 
+Route #4: 7 53 11 38 58 
+Route #5: 8 35 14 19 54 13 27 
+Route #6: 10 31 55 25 9 39 
+Route #7: 16 49 24 18 50 32 
+Route #8: 17 3 44 40 12 26 
+Route #9: 29 47 36 59 21 30 
+Route #10: 45 15 57 20 37 5 48 
+cost 744
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n60-k10.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n60-k10.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n60-k10.vrp	(revision 15691)
@@ -0,0 +1,132 @@
+NAME : P-n60-k10
+COMMENT : (Augerat et al, No of trucks: 10, Optimal value: 744)
+TYPE : CVRP
+DIMENSION : 60
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 120
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+51 15 56
+52 29 39
+53 54 38
+54 55 57
+55 67 41
+56 10 70
+57 6 25
+58 65 27
+59 40 60
+60 50 4
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+51 22
+52 12
+53 19
+54 22
+55 16
+56 7
+57 26
+58 14
+59 21
+60 24
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n60-k15.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n60-k15.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n60-k15.opt	(revision 15691)
@@ -0,0 +1,16 @@
+Route #1: 1 43 41 42 22 
+Route #2: 2 28 30 
+Route #3: 3 24 49 56 23 
+Route #4: 4 45 29 
+Route #5: 5 37 20 15 57 
+Route #6: 6 33 16 51 
+Route #7: 8 54 13 27 52 
+Route #8: 12 40 17 
+Route #9: 19 59 14 35 
+Route #10: 21 36 47 48 
+Route #11: 25 55 18 50 44 
+Route #12: 26 7 46 34 
+Route #13: 31 10 38 
+Route #14: 32 9 39 
+Route #15: 53 11 58 
+cost 968
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n60-k15.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n60-k15.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n60-k15.vrp	(revision 15691)
@@ -0,0 +1,132 @@
+NAME : P-n60-k15
+COMMENT : (Augerat et al, No of trucks: 15, Optimal value: 968)
+TYPE : CVRP
+DIMENSION : 60
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 80
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+51 15 56
+52 29 39
+53 54 38
+54 55 57
+55 67 41
+56 10 70
+57 6 25
+58 65 27
+59 40 60
+60 70 64
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+51 22
+52 12
+53 19
+54 22
+55 16
+56 7
+57 26
+58 14
+59 21
+60 24
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n65-k10.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n65-k10.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n65-k10.opt	(revision 15691)
@@ -0,0 +1,11 @@
+Route #1: 1 43 41 42 64 22 62 
+Route #2: 2 28 61 21 30 
+Route #3: 4 27 52 34 46 
+Route #4: 5 37 20 60 36 47 48 
+Route #5: 6 51 3 44 40 17 
+Route #6: 7 53 14 59 11 
+Route #7: 8 35 19 54 13 57 15 29 45 
+Route #8: 12 9 25 55 18 50 32 
+Route #9: 16 49 24 56 23 63 33 
+Route #10: 26 58 38 10 31 39 
+cost 792
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n65-k10.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n65-k10.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n65-k10.vrp	(revision 15691)
@@ -0,0 +1,142 @@
+NAME : P-n65-k10
+COMMENT : (Augerat et al, No of trucks: 10, Optimal value: 792)
+TYPE : CVRP
+DIMENSION : 65
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 130
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+51 15 56
+52 29 39
+53 54 38
+54 55 57
+55 67 41
+56 10 70
+57 6 25
+58 65 27
+59 40 60
+60 70 64
+61 64 4
+62 36 6
+63 30 20
+64 20 30
+65 15 5
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+51 22
+52 12
+53 19
+54 22
+55 16
+56 7
+57 26
+58 14
+59 21
+60 24
+61 13
+62 15
+63 18
+64 11
+65 28
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n70-k10.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n70-k10.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n70-k10.opt	(revision 15691)
@@ -0,0 +1,11 @@
+Route #1: 1 43 41 42 64 22 62 68 
+Route #2: 3 44 24 49 56 23 63 16 51 
+Route #3: 4 30 2 33 6 
+Route #4: 7 35 53 14 59 19 8 
+Route #5: 10 31 25 55 18 50 32 
+Route #6: 11 66 65 38 58 
+Route #7: 17 40 9 39 12 26 
+Route #8: 28 61 21 69 36 47 48 
+Route #9: 29 5 37 60 20 15 57 13 54 
+Route #10: 45 27 52 34 46 67 
+cost 827
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n70-k10.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n70-k10.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n70-k10.vrp	(revision 15691)
@@ -0,0 +1,152 @@
+NAME : P-n70-k10
+COMMENT : (Augerat et al, No of trucks: 10, Optimal value: 827)
+TYPE : CVRP
+DIMENSION : 70
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 135
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+51 15 56
+52 29 39
+53 54 38
+54 55 57
+55 67 41
+56 10 70
+57 6 25
+58 65 27
+59 40 60
+60 70 64
+61 64 4
+62 36 6
+63 30 20
+64 20 30
+65 15 5
+66 50 70
+67 57 72
+68 45 42
+69 38 33
+70 50 4
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+51 22
+52 12
+53 19
+54 22
+55 16
+56 7
+57 26
+58 14
+59 21
+60 24
+61 13
+62 15
+63 18
+64 11
+65 28
+66 9
+67 37
+68 30
+69 10
+70 8
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n76-k4.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n76-k4.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n76-k4.opt	(revision 15691)
@@ -0,0 +1,6 @@
+Route #1: 75 68 2 74 28 62 73 1 43 41 42 64 22 61 21 48 30 4 
+Route #2: 67 46 8 19 54 13 57 15 37 20 70 60 71 69 36 47 5 29 45 27 52 34 
+Route #3: 51 16 3 44 32 9 39 31 55 25 50 18 24 49 56 23 63 33 6 
+Route #4: 26 7 35 53 14 59 66 11 65 38 10 58 72 12 40 17 
+cost 593
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n76-k4.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n76-k4.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n76-k4.vrp	(revision 15691)
@@ -0,0 +1,164 @@
+NAME : P-n76-k4
+COMMENT : (Augerat et al, No of trucks: 4, Optimal value: 593)
+TYPE : CVRP
+DIMENSION : 76
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 350
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+51 15 56
+52 29 39
+53 54 38
+54 55 57
+55 67 41
+56 10 70
+57 6 25
+58 65 27
+59 40 60
+60 70 64
+61 64 4
+62 36 6
+63 30 20
+64 20 30
+65 15 5
+66 50 70
+67 57 72
+68 45 42
+69 38 33
+70 50 4
+71 66 8
+72 59 5
+73 35 60
+74 27 24
+75 40 20
+76 40 37
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+51 22
+52 12
+53 19
+54 22
+55 16
+56 7
+57 26
+58 14
+59 21
+60 24
+61 13
+62 15
+63 18
+64 11
+65 28
+66 9
+67 37
+68 30
+69 10
+70 8
+71 11
+72 3
+73 1
+74 6
+75 10
+76 20
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n76-k5.opt
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n76-k5.opt	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n76-k5.opt	(revision 15691)
@@ -0,0 +1,7 @@
+Route #1: 30 74 21 47 36 69 71 60 70 20 37 5 48 29 45 4 
+Route #2: 46 8 35 53 14 59 19 54 13 57 15 27 52 34 67 
+Route #3: 6 33 73 1 43 41 42 64 22 61 28 62 2 68 75 
+Route #4: 7 11 66 65 38 10 31 55 25 9 39 72 58 26 
+Route #5: 17 51 16 63 23 56 49 24 18 50 32 44 3 40 12 
+cost 627
+
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n76-k5.vrp
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n76-k5.vrp	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/P/P-n76-k5.vrp	(revision 15691)
@@ -0,0 +1,164 @@
+NAME : P-n76-k5
+COMMENT : (Augerat et al, No of trucks: 5, Optimal value: 627)
+TYPE : CVRP
+DIMENSION : 76
+EDGE_WEIGHT_TYPE : EUC_2D
+CAPACITY : 280
+NODE_COORD_SECTION
+1 40 40
+2 22 22
+3 36 26
+4 21 45
+5 45 35
+6 55 20
+7 33 34
+8 50 50
+9 55 45
+10 26 59
+11 40 66
+12 55 65
+13 35 51
+14 62 35
+15 62 57
+16 62 24
+17 21 36
+18 33 44
+19 9 56
+20 62 48
+21 66 14
+22 44 13
+23 26 13
+24 11 28
+25 7 43
+26 17 64
+27 41 46
+28 55 34
+29 35 16
+30 52 26
+31 43 26
+32 31 76
+33 22 53
+34 26 29
+35 50 40
+36 55 50
+37 54 10
+38 60 15
+39 47 66
+40 30 60
+41 30 50
+42 12 17
+43 15 14
+44 16 19
+45 21 48
+46 50 30
+47 51 42
+48 50 15
+49 48 21
+50 12 38
+51 15 56
+52 29 39
+53 54 38
+54 55 57
+55 67 41
+56 10 70
+57 6 25
+58 65 27
+59 40 60
+60 70 64
+61 64 4
+62 36 6
+63 30 20
+64 20 30
+65 15 5
+66 50 70
+67 57 72
+68 45 42
+69 38 33
+70 50 4
+71 66 8
+72 59 5
+73 35 60
+74 27 24
+75 40 20
+76 40 37
+DEMAND_SECTION
+1 0
+2 18
+3 26
+4 11
+5 30
+6 21
+7 19
+8 15
+9 16
+10 29
+11 26
+12 37
+13 16
+14 12
+15 31
+16 8
+17 19
+18 20
+19 13
+20 15
+21 22
+22 28
+23 12
+24 6
+25 27
+26 14
+27 18
+28 17
+29 29
+30 13
+31 22
+32 25
+33 28
+34 27
+35 19
+36 10
+37 12
+38 14
+39 24
+40 16
+41 33
+42 15
+43 11
+44 18
+45 17
+46 21
+47 27
+48 19
+49 20
+50 5
+51 22
+52 12
+53 19
+54 22
+55 16
+56 7
+57 26
+58 14
+59 21
+60 24
+61 13
+62 15
+63 18
+64 11
+65 28
+66 9
+67 37
+68 30
+69 10
+70 8
+71 11
+72 3
+73 1
+74 6
+75 10
+76 20
+DEPOT_SECTION
+ 1
+ -1
+EOF
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/analysis.csv
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/analysis.csv	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Problems/analysis.csv	(revision 15691)
@@ -0,0 +1,53 @@
+Instance;Customers;Clustering;DistanceAvg;DistanceStdev;DemandAvg;DemandStdev;GeographicExcentricity;DistanceExcentricity;DistanceDemandExcenetricity
+A-n32-k5;31;0,0454545454545455;0,428173910381301;0,0578195041497551;0,128125;0,0739272235039299;0,305692268106861;0,345633911768931;0,31840419574972;
+A-n33-k5;32;0,0416666666666667;0,380385586618042;0,0557836825083318;0,135151515151515;0,0660175005319968;0,131578947368421;0,150317790096151;0,16710706254297;
+A-n33-k6;32;0,0526315789473684;0,360862644236501;0,0732480778385679;0,163939393939394;0,114201825436225;0,149699606877136;0,156636468039234;0,159250579400224;
+A-n34-k5;33;0,0416666666666667;0,382313382990295;0,0672301597169352;0,135294117647059;0,0740919656721471;0,204655028170714;0,223026498106771;0,228183002070817;
+A-n36-k5;35;0,1;0,389539164611983;0,0678619161331505;0,122777777777778;0,0673139869529816;0,324860244353244;0,340562553839752;0,333569234084721;
+A-n37-k5;36;0,04;0,374497267188804;0,0622631840058976;0,11;0,0811738208364568;0,115070785387149;0,120647382831678;0,134214061824765;
+A-n37-k6;36;0,0384615384615385;0,36742697222167;0,0635259399286581;0,154054054054054;0,111317890538021;0,31428997104489;0,312398323071495;0,294268532254346;
+A-n38-k5;37;0,0344827586206897;0,371846772937562;0,0652445009937016;0,126578947368421;0,0706465001103334;0,168125129078844;0,161412120694719;0,143173687543491;
+A-n39-k5;38;0,0357142857142857;0,370497963882012;0,0711550189614701;0,121794871794872;0,0810783664867704;0,31215258466191;0,271891411495271;0,306768633965218;
+A-n39-k6;38;0,032258064516129;0,402773397151716;0,0614369733072219;0,134871794871795;0,117448773227633;0,22869269166771;0,208859633580354;0,21744945791244;
+A-n44-k6;43;0,0256410256410256;0,364079651377545;0,0747777252248873;0,129545454545455;0,0671143713594578;0,291818141334395;0,267186647645877;0,273813730372928;
+A-n45-k6;44;0,0303030303030303;0,418338222313051;0,0688546337860758;0,131777777777778;0,0697388426405221;0,201295094739862;0,20969276348102;0,196015009325877;
+A-n45-k7;44;0,0277777777777778;0,371273408626982;0,0523491482390582;0,140888888888889;0,071081243727699;0,361467383149617;0,387419336335602;0,41782399369629;
+A-n60-k9;59;0,025;0,401451888418079;0,0578708764119616;0,138166666666667;0,0939413232939701;0,353233142891149;0,32325548937004;0,359163321397479;
+A-n61-k9;60;0,0217391304347826;0,344327158212244;0,0510078590810308;0,145081967213115;0,0979732809146415;0,135816716775055;0,129183466649396;0,139541683727624;
+A-n62-k8;61;0,0196078431372549;0,393626203285813;0,0682067277387073;0,118225806451613;0,0797480749802734;0,332220828491831;0,349697705664986;0,356182602958437;
+A-n63-k10;62;0,0285714285714286;0,358670362006507;0,062643466411655;0,147936507936508;0,0984830777528734;0,252512375934329;0,231550726221568;0,244528100814904;
+A-n63-k9;62;0,02;0,393222760009284;0,0569283817831231;0,138571428571429;0,0750630876009068;0,428692888522449;0,449844443099279;0,430231950770356;
+A-n64-k9;63;0,0212765957446809;0,352436551985404;0,0665387987491975;0,1325;0,0920937022819693;0,384500600526911;0,394274345285414;0,36569124311714;
+A-n65-k9;64;0,0217391304347826;0,403916192952806;0,0457909922364332;0,134923076923077;0,0741749092332664;0,177389441311733;0,158963025425047;0,167488507216751;
+B-n31-k5;30;0,5;0,24110572428733;0,119659168027445;0,132903225806452;0,0636620892093356;0,444056878767181;0,377960787999406;0,3747140165763;
+B-n34-k5;33;0,2;0,329933539398844;0,0941707124293761;0,134411764705882;0,153089577323608;0,187677137498174;0,393676917263678;0,441263922672459;
+B-n35-k5;34;0,333333333333333;0,430772631557775;0,0409220042173869;0,124857142857143;0,0799060673030323;0,355563884994757;0,415324892082623;0,412669106249901;
+B-n38-k6;37;0,5;0,327116097365227;0,047011339743742;0,134736842105263;0,0746125727413305;0,300302190960525;0,281382692776191;0,264920078283435;
+B-n39-k5;38;0,2;0,391267656914721;0,0610083857156671;0,112820512820513;0,06605936405404;0,212661649206336;0,204414102002462;0,166896173762151;
+B-n41-k6;40;0,25;0,384317277456768;0,0704631362977351;0,138292682926829;0,059424165201331;0,225055548698538;0,248792333081227;0,282015750241072;
+B-n43-k6;42;0,125;0,351932593529989;0,0638902781571556;0,121162790697674;0,0699903416036342;0,269505510063614;0,29980516620699;0,332119004758312;
+B-n44-k7;43;0,2;0,369027348454808;0,0396955978270264;0,145681818181818;0,109677165255637;0,35357427569183;0,32423709704331;0,365184536965768;
+B-n45-k5;44;0,2;0,389592873058217;0,0653890330806314;0,108;0,0734725950421123;0,185172834501918;0,120705673851753;0,122879006370084;
+B-n45-k6;44;0,2;0,235020210504019;0,076599460411456;0,131555555555556;0,0666318427565665;0,11302230488269;0,199596703976906;0,220141715749763;
+B-n56-k7;55;0,333333333333333;0,364686491506898;0,077318036290155;0,11;0,069462219947249;0,255587493512727;0,167388767780965;0,158822261537284;
+B-n57-k7;56;0,2;0,403180451921377;0,0862170593777846;0,122280701754386;0,0951825124705652;0,349548272376596;0,31651006037393;0,33741686735724;
+B-n57-k9;56;0,142857142857143;0,307926147916583;0,0626097668823756;0,140877192982456;0,0738486052500913;0,463179390077204;0,49253277425244;0,517087790312764;
+B-n63-k10;62;0,25;0,385345637063865;0,0758666237114195;0,146349206349206;0,0836527514002405;0,285563177929042;0,389489703517493;0,351607226386633;
+B-n64-k9;63;0,2;0,353558923468069;0,0866517739534191;0,1371875;0,0912323399006624;0,113414102740478;0,0664646236148433;0,048085505752401;
+E-n22-k4;21;0,0625;0,314040490274895;0,0540813015857772;0,170454545454545;0,106828927033159;0,0695228917743377;0,0776863716989113;0,0565081857756056;
+E-n23-k3;22;0,0555555555555556;0,343605166639881;0,07335240826655;0,0984444444444444;0,180991211312029;0,0353058006004857;0,0792717227409856;0,125237598177112;
+E-n30-k3;29;0,0714285714285714;0,325546688360079;0,0405416703704165;0,0944444444444445;0,132264232355138;0,0979388272795263;0,0631563174878908;0,130028021757773;
+E-n33-k4;32;0,0625;0,242174145560853;0,0687741789535798;0,11125;0,0999910033831832;0,415849516492105;0,459371621517699;0,447273670156982;
+F-n45-k4;44;0,166666666666667;0,25031643710638;0,0795819456951723;0,0798231066887783;0,126315069418666;0,12902538590431;0,0874948252381805;0,0553941031421476;
+P-n16-k8;15;0,0666666666666667;0,370660814167569;0,0633651498012128;0,439285714285714;0,25210845576733;0,278810438776914;0,34354171809044;0,367739647705826;
+P-n19-k2;18;0,0588235294117647;0,398863650652237;0,0605870426751435;0,101973684210526;0,0515409197894487;0,286209887623126;0,364465398926868;0,380440115429168;
+P-n20-k2;19;0,0526315789473684;0,390299268027833;0,0629978610236907;0,096875;0,0531984785966666;0,286209887623126;0,372924414446929;0,383528657156966;
+P-n21-k2;20;0,05;0,384103149626547;0,06364072577175;0,0886904761904762;0,0483592031400919;0,286209887623126;0,362655862183996;0,388028367556715;
+P-n22-k2;21;0,0476190476190476;0,381029345694788;0,0634970915345939;0,0875;0,0475612643191533;0,286209887623126;0,362170812760644;0,386853894104552;
+P-n22-k8;21;0,0625;0,314040490274895;0,0540813015857772;0,340909090909091;0,213657854066318;0,0695228917743377;0,0776863716989113;0,0565081857756056;
+P-n23-k8;22;0,0454545454545455;0,383058414650681;0,0628239595164676;0,340217391304348;0,191637555664386;0,286209887623126;0,346671899489548;0,380071066291991;
+P-n40-k5;39;0,0256410256410256;0,375502286573084;0,0642016339469024;0,110357142857143;0,0610693399809944;0,0483125180126753;0,0910185834034147;0,0858805473843325;
+P-n45-k5;44;0,0232558139534884;0,375385059682668;0,0646589301327009;0,102518518518519;0,0558178499506552;0,0529431113655807;0,0528779309113061;0,0493574524874079;
+P-n60-k10;59;0,0178571428571429;0,314780419016174;0,0541044670603242;0,1575;0,0614203036764204;0,0343732463076794;0,0255417024641281;0,00668186960227169;
+P-n60-k15;59;0,0175438596491228;0,344756818798973;0,0605162204456085;0,23625;0,0921304555146306;0,0386289357090363;0,0182900579153255;0,01037112612687;
+P-n65-k10;64;0,0163934426229508;0,324309090903442;0,0577661823095842;0,144260355029586;0,0560744477052176;0,0196418550329597;0,0339628469444459;0,0136163911966154;
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Program.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Program.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Program.cs	(revision 15691)
@@ -0,0 +1,255 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.IO;
+using System.Drawing;
+
+namespace VRPProblemAnalyzer {
+  
+  public class Program {
+
+    private static double[] GetDistances(double[,] vertices) {
+      List<double> result = new List<double>();
+
+      int cities = vertices.Length / 2;
+      for (int i = 0; i < cities; i++) {
+        for (int j = 0; j < cities; j++) {
+          if (i != j) {
+            result.Add(Utils.GetDistance(vertices, i, j));
+          }
+        }
+      }
+
+      return result.ToArray();
+    }
+
+    private static double[] GetAverageDistances(double[,] vertices) {
+      int cities = vertices.Length / 2;
+      double[] result = new double[cities];
+      
+      for (int i = 0; i < cities; i++) {
+        double distance = 0;
+        for (int j = 0; j < cities; j++) {
+          if (i != j) {
+            distance += Utils.GetDistance(vertices, i, j);
+          }
+        }
+        result[i] = distance / (cities - 1);
+      }
+
+      return result;
+    }
+
+    private static double GetAverageDistance(TSPLIBParser instance) {
+      double result = 0;
+
+      double[] distances = GetDistances(instance.Vertices);
+      result = distances.Average();
+
+      return result;
+    }
+
+    private static double GetDistanceHeterogenity(TSPLIBParser instance) {
+      double result = 0;
+
+      result = GetAverageDistances(instance.Vertices).StandardDeviation();
+
+      return result;
+    }
+
+    private static double GetDistance(double[] cust1, double[] cust2) {
+      return Math.Sqrt(
+                 Math.Pow((cust1[0] - cust2[0]), 2) +
+                 Math.Pow((cust1[1] - cust2[1]), 2));
+    }
+
+    private static double GetDistance(Cluster cluster1, Cluster cluster2) {
+      List<double> distances = new List<double>();
+      foreach (double[] cust1 in cluster1.Items) {
+        foreach (double[] cust2 in cluster2.Items) {
+          distances.Add(GetDistance(cust1, cust2));
+        }
+      }
+
+      return distances.Min();
+
+      //return GetDistance(cluster1.Center, cluster2.Center);
+    }
+
+    private static double GetDistance(List<Cluster> clusters, Cluster cluster) {
+      List<double> distances = new List<double>();
+      foreach (Cluster other in clusters) {
+        if (other != cluster) {
+          distances.Add(GetDistance(cluster, other));
+        }
+      }
+
+      if (distances.Count > 0)
+        return distances.Min();
+      else
+        return 0;
+    }
+
+    private static double GetCohesion(Cluster cluster) {
+      double cohesion = 0;
+
+      List<double> distances = new List<double>();
+      foreach (double[] cust1 in cluster.Items) {
+        //option 1
+        foreach (double[] cust2 in cluster.Items) {
+          if (cust1 != cust2) {
+            distances.Add(GetDistance(cust1, cust2));            
+          }
+        }
+
+        //option2
+        //distances.Add(GetDistance(cluster.Center, cust1));
+      }
+
+      if (distances.Count > 0)
+        cohesion = distances.Average();
+
+      return cohesion;
+    }
+
+    private static double GetClustering(TSPLIBParser instance) {
+      double result = 0;
+
+      int cities = instance.Vertices.Length / 2 - 1;
+      double[,] coordinates = new double[cities, 2];
+      for (int i = 1; i <= cities; i++) {
+        coordinates[i - 1, 0] = instance.Vertices[i, 0];
+        coordinates[i - 1, 1] = instance.Vertices[i, 1];
+      }
+
+      double clusterFactor = 0;
+      double couplingFactor = 1;
+      double cohesionFactor = 1;
+
+      double maxQuality = double.MinValue;
+
+      int clusters = -1;
+      for (int i = 1; i <= cities; i++) {
+        List<Cluster> collection = KMeansClustering.Cluster(coordinates, i, 9);
+
+        if (collection.Count > 0) {
+          List<double> distances = new List<double>();
+          List<double> cohesions = new List<double>();
+          foreach (Cluster cluster in collection) {
+            distances.Add(GetDistance(collection, cluster));
+            cohesions.Add(GetCohesion(cluster));
+          }
+
+          double distance = distances.Average();
+          double cohesion = cohesions.Average();
+
+          double quality = clusterFactor * (distances.Count / (double)cities) + couplingFactor * distance - cohesionFactor * cohesion;
+          if (quality > maxQuality) {
+            maxQuality = quality;
+            clusters = distances.Count;
+          }
+        }
+      }
+
+      if (clusters != 0)
+        result = (cities / (double)clusters) / cities;
+
+      return result;
+    }
+
+    private static double GetDemandSize(TSPLIBParser instance) {
+      double result = 0;
+
+      result = instance.Demands.Average();
+
+      return result;
+    }
+
+    private static double GetDemandHeterogenity(TSPLIBParser instance) {
+      double result = 0;
+
+      result = instance.Demands.StandardDeviation();
+
+      return result;
+    }
+
+
+    private static void Normalize(TSPLIBParser instance) {
+      //normalize demands
+      for (int i = 0; i < instance.Demands.Length; i++) {
+          instance.Demands[i] = instance.Demands[i] / instance.Capacity;
+      }
+      instance.Capacity = 1.0;
+
+      //normalize coordinates
+      //-find bounds
+      var cities = Utils.MatrixToPointList(instance.Vertices);
+      var minX = cities.Min(c => c.X);
+      var minY = cities.Min(c => c.Y);
+      var maxX = cities.Max(c => c.X);
+      var maxY = cities.Max(c => c.Y);
+      var rangeX = maxX - minX;
+      var rangeY = maxY - minY;
+      var factor = Math.Sqrt(0.5)/Math.Max(rangeX, rangeY);
+
+      for (int i = 0; i < instance.Vertices.GetLength(0); i++) {
+        instance.Vertices[i, 0] = (cities[i].X-minX)*factor;
+        instance.Vertices[i, 1] = (cities[i].Y-minY)*factor;
+      }
+    }
+
+    static void Main(string[] args) {
+      if (args.Length < 1) {
+        Console.Error.WriteLine("Not enough arguments, please specify directory with VRP instances.");
+        Environment.Exit(-1);
+      }
+      var path = args[0];
+      using (StreamWriter sw = new StreamWriter(Path.Combine(path, "analysis.csv"))) {
+        sw.WriteLine("Instance;Customers;Clustering;DistanceAvg;DistanceStdev;DemandAvg;DemandStdev;GeographicExcentricity;DistanceExcentricity;DistanceDemandExcenetricity");
+        
+        string[] instances = Directory.GetFiles(path, "*.vrp", SearchOption.AllDirectories);
+        foreach (string instance in instances) {
+          TSPLIBParser parser = new TSPLIBParser(instance);
+          parser.Parse();
+          Normalize(parser);
+
+          string instanceName = Path.GetFileNameWithoutExtension(instance);
+
+          string solutionName = Path.Combine(Path.GetDirectoryName(instance), Path.GetFileNameWithoutExtension(instance) + ".opt");
+          SolutionParser solution = new SolutionParser(solutionName);
+          solution.Parse();
+
+          sw.Write(instanceName);
+          sw.Write(';');
+          sw.Write(parser.Vertices.Length / 2 - 1);
+          sw.Write(';');
+          sw.Write(GetClustering(parser));
+          sw.Write(';');
+          sw.Write(GetAverageDistance(parser));
+          sw.Write(';');
+          sw.Write(GetDistanceHeterogenity(parser));
+          sw.Write(';');
+          sw.Write(GetDemandSize(parser));
+          sw.Write(';');
+          sw.Write(GetDemandHeterogenity(parser));
+          sw.Write(';');
+          sw.Write(DepotExcentricityCalculator.Geographic(parser.Vertices));
+          sw.Write(';');
+          sw.Write(DepotExcentricityCalculator.DistanceCentroid(parser.Vertices));
+          sw.Write(';');
+          sw.Write(DepotExcentricityCalculator.DemandDistanceCentroid(parser.Vertices, parser.Demands));
+          sw.Write(';');
+          sw.WriteLine();
+
+
+          Image picture = PictureGenerator.GeneratePicture(parser, solution);
+          picture.Save(Path.Combine(path, instanceName + ".png"));
+        }
+      }
+      //Console.WriteLine("Done. Press Enter...");
+      //Console.ReadLine();
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Properties/AssemblyInfo.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Properties/AssemblyInfo.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Properties/AssemblyInfo.cs	(revision 15691)
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+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("VRPProblemAnalyzer")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("VRPProblemAnalyzer")]
+[assembly: AssemblyCopyright("Copyright ©  2011")]
+[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("faa91e21-554d-437a-8d46-45837d27d884")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/SolutionParser.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/SolutionParser.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/SolutionParser.cs	(revision 15691)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+
+namespace VRPProblemAnalyzer {
+  public class SolutionParser {
+    private string file;
+
+    private List<List<int>> routes;
+
+    public List<List<int>> Routes {
+      get {
+        return routes;
+      }
+    }
+
+    public SolutionParser(string file) {
+      this.file = file;
+      this.routes = new List<List<int>>();
+    }
+
+    public void Parse() {
+      this.routes.Clear();
+      using (StreamReader reader = new StreamReader(file)) {
+        String line;
+        while ((line = reader.ReadLine()) != null) {
+          string[] token = line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+          if (token.Length > 2) {
+            List<int> route = new List<int>();
+
+            for (int i = 2; i < token.Length; i++) {
+              route.Add(int.Parse(token[i]));
+            }
+
+            routes.Add(route);
+          }
+        }
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/TSPLIBParser.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/TSPLIBParser.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/TSPLIBParser.cs	(revision 15691)
@@ -0,0 +1,405 @@
+#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 VRPProblemAnalyzer {
+  /// <summary>
+  /// Parses a *.vrp file in TSPLIB format and extracts its information about a VRP.
+  /// </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 WEIGHTFORMAT = 11;
+    private const int NODETYPE = 6;
+    private const int NODESECTION = 7;
+    private const int CAPACITY = 8;
+    private const int DISTANCE = 12;
+    private const int VEHICLES = 13;
+    private const int DEPOTSECTION = 9;
+    private const int DEMANDSECTION = 10;
+
+    private StreamReader source;
+    private bool alternateFormat;
+    CultureInfo culture = new CultureInfo("en-US");
+
+    private string name;
+    /// <summary>
+    /// Gets the name of the parsed VRP.
+    /// </summary>
+    public string Name {
+      get { return name; }
+    }
+    private string comment;
+    /// <summary>
+    /// Gets the comment of the parsed VRP.
+    /// </summary>
+    public string Comment {
+      get { return comment; }
+    }
+    private double[,] vertices;
+    /// <summary>
+    /// Gets the vertices of the parsed VRP.
+    /// </summary>
+    public double[,] Vertices {
+      get { return vertices; }
+    }
+    private TSPLIBEdgeWeightType weightType;
+    /// <summary>
+    /// Gets the weight format of the parsed VRP.
+    /// </summary>
+    public TSPLIBEdgeWeightType WeightType {
+      get { return weightType; }
+    }
+
+    private double capacity;
+    public double Capacity {
+      get {
+        return capacity;
+      }
+      set {
+        capacity = value;
+      }
+    }
+
+    private double distance;
+    public double Distance {
+      get {
+        return distance;
+      }
+    }
+
+    private int vehicles;
+    public int Vehicles {
+      get {
+        return vehicles;
+      }
+    }
+
+    private int depot;
+    public int Depot {
+      get {
+        return depot;
+      }
+    }
+
+    private double[] demands;
+    public double[] Demands {
+      get {
+        return demands;
+      }
+    }
+
+    /// <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 (*.vrp)
+    /// </exception>
+    /// <param name="path">The path where the VRP is stored.</param>
+    public TSPLIBParser(String path) {
+      if (!path.EndsWith(".vrp"))
+        throw new ArgumentException("Input file has to be a TSPLIB CVRP file (*.vrp, *.txt).");
+
+      source = null;
+      name = path;
+      comment = string.Empty;
+      vertices = null;
+      weightType = TSPLIBEdgeWeightType.UNDEFINED;
+      capacity = -1;
+      distance = -1;
+      vehicles = -1;
+      depot = -1;
+      demands = null;
+      alternateFormat = false;
+    }
+
+    /// <summary>
+    /// Reads the TSPLIB VRP 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() {
+      using (source = new StreamReader(name)) {
+        int section = -1;
+        string str = null;
+        bool typeIsChecked = false;
+        bool weightTypeIsChecked = false;
+        bool weightFormatIsChecked = 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:
+                InitArrays(str);
+                break;
+              case WEIGHTTYPE:
+                ReadWeightType(str);
+                weightTypeIsChecked = true;
+                break;
+              case WEIGHTFORMAT:
+                ReadWeightFormat(str);
+                weightFormatIsChecked = true;
+                break;
+              case NODETYPE:
+                CheckNodeType(str);
+                break;
+              case NODESECTION:
+                ReadVertices();
+                break;
+              case CAPACITY:
+                ReadCapacity(str);
+                break;
+              case DISTANCE:
+                ReadDistance(str);
+                break;
+              case VEHICLES:
+                ReadVehicles(str);
+                break;
+              case DEPOTSECTION:
+                ReadDepot();
+                break;
+              case DEMANDSECTION:
+                ReadDemands();
+                break;
+            }
+          }
+        } while (!((section == EOF) || (str == null)));
+
+        if (!typeIsChecked || !weightTypeIsChecked || 
+          (alternateFormat && !weightFormatIsChecked) || 
+          weightType == TSPLIBEdgeWeightType.UNDEFINED)
+          throw new InvalidDataException("Input file does not contain format or edge weight format information.");
+      }
+      source = null;
+    }
+
+    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("edge_weight_format", StringComparison.OrdinalIgnoreCase))
+        return WEIGHTFORMAT;
+      if (token.Equals("node_coord_type", StringComparison.OrdinalIgnoreCase))
+        return NODETYPE;
+      if (token.Equals("node_coord_section", StringComparison.OrdinalIgnoreCase))
+        return NODESECTION;
+      if (token.Equals("capacity", StringComparison.OrdinalIgnoreCase))
+        return CAPACITY;
+      if (token.Equals("distance", StringComparison.OrdinalIgnoreCase))
+        return DISTANCE;
+      if (token.Equals("vehicles", StringComparison.OrdinalIgnoreCase))
+        return VEHICLES;
+      if (token.Equals("depot_section", StringComparison.OrdinalIgnoreCase))
+        return DEPOTSECTION;
+      if (token.Equals("demand_section", StringComparison.OrdinalIgnoreCase))
+        return DEMANDSECTION;
+
+      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("cvrp", StringComparison.OrdinalIgnoreCase))
+        throw new InvalidDataException("Input file format is not \"CVRP\"");
+    }
+
+    private void ReadComment(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      comment = tokens[tokens.Length - 1].Trim();
+    }
+
+    private void InitArrays(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];
+      demands = new double[dim];
+    }
+
+    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 if (type.Equals("function", StringComparison.OrdinalIgnoreCase)) {
+        weightType = TSPLIBEdgeWeightType.UNDEFINED;
+        alternateFormat = true;
+      } else
+        throw new InvalidDataException("Input file contains an unsupported edge weight format (only \"EUC_2D\" and \"GEO\" are supported).");
+    }
+
+    private void ReadWeightFormat(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string format = tokens[tokens.Length - 1].Trim();
+
+      if (alternateFormat && format.Equals("euc_2d", StringComparison.OrdinalIgnoreCase))
+        weightType = TSPLIBEdgeWeightType.EUC_2D;
+      else if (format.Equals("geo", StringComparison.OrdinalIgnoreCase))
+        weightType = TSPLIBEdgeWeightType.GEO;
+      else
+        throw new InvalidDataException("Input file contains an unsupported edge weight format.");
+    }
+
+    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 format (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++) {
+        if (!(alternateFormat && i == 0)) {
+          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.");
+
+          vertices[i, 0] = double.Parse(tokens[1], culture.NumberFormat);
+          vertices[i, 1] = double.Parse(tokens[2], culture.NumberFormat);
+        }
+      }
+    }
+
+    private void ReadCapacity(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      capacity = double.Parse(tokens[tokens.Length - 1].Trim(), culture.NumberFormat);
+    }
+
+    private void ReadDistance(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      distance = double.Parse(tokens[tokens.Length - 1].Trim(), culture.NumberFormat);
+    }
+
+    private void ReadVehicles(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      vehicles = int.Parse(tokens[tokens.Length - 1].Trim());
+    }
+
+    private void ReadDepot() {
+      if (alternateFormat) {
+        string[] tokens;
+        do { 
+          string str = source.ReadLine();
+          tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+          if (tokens.Length == 2) {
+            vertices[0, 0] = double.Parse(tokens[0], culture.NumberFormat);
+            vertices[0, 1] = double.Parse(tokens[1], culture.NumberFormat);
+            depot = 1;
+          }
+        } while(tokens.Length == 2);
+      } else {
+        int read;
+        do {
+          string str = source.ReadLine();
+          read = int.Parse(str);
+          if (read != -1)
+            depot = read;
+        } while (read != -1);
+      }
+    }
+
+    private void ReadDemands() {
+      if (demands == null)
+        throw new InvalidDataException("Input file does not contain dimension information.");
+
+      for (int i = 0; i < demands.Length; i++) {
+        if (!(alternateFormat && i == 0)) {
+          string str = source.ReadLine();
+          string[] tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+          if (tokens.Length != 2)
+            throw new InvalidDataException("Input file contains invalid demands.");
+
+          int index = int.Parse(tokens[0]);
+          double value = double.Parse(tokens[1]);
+
+          if (alternateFormat)
+            demands[index] = value;
+          else
+            demands[index - 1] = value;
+        } else {
+          demands[0] = 0;
+        }
+      }
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Utils.cs
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Utils.cs	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/Utils.cs	(revision 15691)
@@ -0,0 +1,24 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace VRPProblemAnalyzer {
+
+  public static class Utils {
+
+    public static List<PointD> MatrixToPointList(double[,] vertices) {
+      var points = new List<PointD>();
+      for (int i = 0; i < vertices.GetLength(0); i++) {
+        points.Add(new PointD(vertices[i, 0], vertices[i, 1]));
+      }
+      return points;
+    }
+
+    public static double GetDistance(double[,] vertices, int source, int target) {
+      return Math.Sqrt(
+        Math.Pow((vertices[source, 0] - vertices[target, 0]), 2) +
+        Math.Pow((vertices[source, 1] - vertices[target, 1]), 2));
+    }
+  }
+}
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/VRPProblemAnalyzer.csproj
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/VRPProblemAnalyzer.csproj	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/VRPProblemAnalyzer.csproj	(revision 15691)
@@ -0,0 +1,145 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{683C29F1-9A43-4998-B58A-C477B86B7A64}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>VRPProblemAnalyzer</RootNamespace>
+    <AssemblyName>VRPProblemAnalyzer</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\VRPProblemAnalyzer.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\VRPProblemAnalyzer.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </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>
+    <CodeAnalysisLogFile>bin\Debug\VRPProblemAnalyzer.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\VRPProblemAnalyzer.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="ALGLIB-3.7.0">
+      <HintPath>..\..\..\trunk\bin\ALGLIB-3.7.0.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="EnumerableExtensions.cs" />
+    <Compile Include="PictureGenerator.cs" />
+    <Compile Include="PointD.cs" />
+    <Compile Include="DepotExcentricityCalculator.cs" />
+    <Compile Include="KMeansClustering.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SolutionParser.cs" />
+    <Compile Include="TSPLIBParser.cs" />
+    <Compile Include="Utils.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\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>
+  -->
+</Project>
Index: /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/app.config
===================================================================
--- /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/app.config	(revision 15691)
+++ /addons/HeuristicLab.FitnessLandscapeAnalysis/VRPProblemAnalyzer/app.config	(revision 15691)
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>
