Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestAverageWorstVRPToursAnalyzer.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestAverageWorstVRPToursAnalyzer.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestAverageWorstVRPToursAnalyzer.cs	(revision 4374)
@@ -0,0 +1,202 @@
+#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.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Analysis;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator which analyzes the best, average and worst quality of solutions in the scope tree.
+  /// </summary>
+  [Item("BestAverageWorstVRPToursAnalyzer", "An operator which analyzes the best, average and worst properties of the VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstVRPToursAnalyzer : AlgorithmOperator, IAnalyzer, IGeneralVRPOperator {
+    #region Parameter properties
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> DistanceParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentBestDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentBestDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentAverageDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentAverageDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentWorstDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentWorstDistance"]; }
+    }
+    public ValueLookupParameter<DataTable> DistancesParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["Distances"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> VehiclesUtilizedParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["VehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestVehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentBestVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentBestVehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentAverageVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentAverageVehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentWorstVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentWorstVehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DataTable> VehiclesUtilizedValuesParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["VehiclesUtilizedValues"]; }
+    }
+
+    public ValueLookupParameter<VariableCollection> ResultsParameter {
+      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Properties
+    private BestVRPToursMemorizer BestMemorizer {
+      get { return (BestVRPToursMemorizer)OperatorGraph.InitialOperator; }
+    }
+    private BestAverageWorstVRPToursCalculator BestAverageWorstCalculator {
+      get { return (BestAverageWorstVRPToursCalculator)BestMemorizer.Successor; }
+    }
+    #endregion
+
+    public BestAverageWorstVRPToursAnalyzer()
+      : base() {
+      #region Create parameters
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Distance", "The distance of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestDistance", "The best distance value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentBestDistance", "The current best distance value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentAverageDistance", "The current average distance value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentWorstDistance", "The current worst distance value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DataTable>("Distances", "The data table to store the current best, current average, current worst, best and best known distance value."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("VehiclesUtilized", "The vehicles utilized of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestVehiclesUtilized", "The best  vehicles utilized value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentBestVehiclesUtilized", "The current best  vehicles utilized value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentAverageVehiclesUtilized", "The current average  vehicles utilized value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentWorstVehiclesUtilized", "The current worst  vehicles utilized value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DataTable>("VehiclesUtilizedValues", "The data table to store the current best, current average, current worst, best and best known vehicles utilized value."));
+
+      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The results collection where the analysis values should be stored."));
+      #endregion
+
+      #region Create operators
+      BestVRPToursMemorizer bestMemorizer = new BestVRPToursMemorizer();
+      BestAverageWorstVRPToursCalculator calculator = new BestAverageWorstVRPToursCalculator();
+      ResultsCollector resultsCollector = new ResultsCollector();
+
+      //Distance
+      bestMemorizer.BestDistanceParameter.ActualName = BestDistanceParameter.Name;
+      bestMemorizer.DistanceParameter.ActualName = DistanceParameter.Name;
+      bestMemorizer.DistanceParameter.Depth = DistanceParameter.Depth;
+
+      calculator.DistanceParameter.ActualName = DistanceParameter.Name;
+      calculator.DistanceParameter.Depth = DistanceParameter.Depth;
+      calculator.BestDistanceParameter.ActualName = CurrentBestDistanceParameter.Name;
+      calculator.AverageDistanceParameter.ActualName = CurrentAverageDistanceParameter.Name;
+      calculator.WorstDistanceParameter.ActualName = CurrentWorstDistanceParameter.Name;
+
+      DataTableValuesCollector distanceDataTablesCollector = new DataTableValuesCollector();
+      distanceDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("BestDistance", null, BestDistanceParameter.Name));
+      distanceDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentBestDistance", null, CurrentBestDistanceParameter.Name));
+      distanceDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentAverageDistance", null, CurrentAverageDistanceParameter.Name));
+      distanceDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentWorstDistance", null, CurrentWorstDistanceParameter.Name));
+      distanceDataTablesCollector.DataTableParameter.ActualName = DistancesParameter.Name;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(DistancesParameter.Name));
+
+      //Vehicles Utlized
+      bestMemorizer.BestVehiclesUtilizedParameter.ActualName = BestVehiclesUtilizedParameter.Name;
+      bestMemorizer.VehiclesUtilizedParameter.ActualName = VehiclesUtilizedParameter.Name;
+      bestMemorizer.VehiclesUtilizedParameter.Depth = VehiclesUtilizedParameter.Depth;
+
+      calculator.VehiclesUtilizedParameter.ActualName = VehiclesUtilizedParameter.Name;
+      calculator.VehiclesUtilizedParameter.Depth = VehiclesUtilizedParameter.Depth;
+      calculator.BestVehiclesUtilizedParameter.ActualName = CurrentBestVehiclesUtilizedParameter.Name;
+      calculator.AverageVehiclesUtilizedParameter.ActualName = CurrentAverageVehiclesUtilizedParameter.Name;
+      calculator.WorstVehiclesUtilizedParameter.ActualName = CurrentWorstVehiclesUtilizedParameter.Name;
+
+      DataTableValuesCollector vehiclesUtilizedDataTablesCollector = new DataTableValuesCollector();
+      vehiclesUtilizedDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("BestVehiclesUtilized", null, BestVehiclesUtilizedParameter.Name));
+      vehiclesUtilizedDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentBestVehiclesUtilized", null, CurrentBestVehiclesUtilizedParameter.Name));
+      vehiclesUtilizedDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentAverageVehiclesUtilized", null, CurrentAverageVehiclesUtilizedParameter.Name));
+      vehiclesUtilizedDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentWorstVehiclesUtilized", null, CurrentWorstVehiclesUtilizedParameter.Name));
+      vehiclesUtilizedDataTablesCollector.DataTableParameter.ActualName = VehiclesUtilizedValuesParameter.Name;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(VehiclesUtilizedValuesParameter.Name));
+      #endregion
+
+      #region Create operator graph
+      OperatorGraph.InitialOperator = bestMemorizer;
+      bestMemorizer.Successor = calculator;
+      calculator.Successor = distanceDataTablesCollector;
+      distanceDataTablesCollector.Successor = vehiclesUtilizedDataTablesCollector;
+      vehiclesUtilizedDataTablesCollector.Successor = resultsCollector;
+      resultsCollector.Successor = null;
+      #endregion
+
+      Initialize();
+    }
+    [StorableConstructor]
+    private BestAverageWorstVRPToursAnalyzer(bool deserializing) : base() { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      DistanceParameter.DepthChanged += new EventHandler(DistanceParameter_DepthChanged);
+      VehiclesUtilizedParameter.DepthChanged += new EventHandler(VehiclesUtilizedParameter_DepthChanged);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      BestAverageWorstVRPToursAnalyzer clone = (BestAverageWorstVRPToursAnalyzer)base.Clone(cloner);
+      clone.Initialize();
+      return clone;
+    }
+
+    void DistanceParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.DistanceParameter.Depth = DistanceParameter.Depth;
+      BestMemorizer.DistanceParameter.Depth = DistanceParameter.Depth;
+    }
+
+    void VehiclesUtilizedParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.VehiclesUtilizedParameter.Depth = VehiclesUtilizedParameter.Depth;
+      BestMemorizer.VehiclesUtilizedParameter.Depth = DistanceParameter.Depth;
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestAverageWorstVRPToursCalculator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestAverageWorstVRPToursCalculator.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestAverageWorstVRPToursCalculator.cs	(revision 4374)
@@ -0,0 +1,123 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestAverageWorstVRPToursCalculator", "An operator which calculates the current best, average and worst properties of VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstVRPToursCalculator : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<DoubleValue> DistanceParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> AverageDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["AverageDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> WorstDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["WorstDistance"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> VehiclesUtilizedParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["VehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestVehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> AverageVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["AverageVehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> WorstVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["WorstVehiclesUtilized"]; }
+    }
+
+    public BestAverageWorstVRPToursCalculator()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Distance", "The distances of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestDistance", "The best distance value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("AverageDistance", "The average distance value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("WorstDistance", "The worst distance value of all solutions."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("VehiclesUtilized", "The utilized vehicles of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestVehiclesUtilized", "The best utilized vehicles value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("AverageVehiclesUtilized", "The average utilized vehicles value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("WorstVehiclesUtilized", "The worst utilized vehicles value of all solutions."));
+    }
+
+    private void UpdateDistances() {
+      ItemArray<DoubleValue> distances = DistanceParameter.ActualValue;
+      if (distances.Length > 0) {
+        double min = double.MaxValue, max = double.MinValue, sum = 0.0;
+        for (int i = 0; i < distances.Length; i++) {
+          if (distances[i].Value < min) min = distances[i].Value;
+          if (distances[i].Value > max) max = distances[i].Value;
+          sum += distances[i].Value;
+        }
+
+        DoubleValue best = BestDistanceParameter.ActualValue;
+        if (best == null) BestDistanceParameter.ActualValue = new DoubleValue(min);
+        else best.Value = min;
+        DoubleValue average = AverageDistanceParameter.ActualValue;
+        if (average == null) AverageDistanceParameter.ActualValue = new DoubleValue(sum / distances.Length);
+        else average.Value = sum / distances.Length;
+        DoubleValue worst = WorstDistanceParameter.ActualValue;
+        if (worst == null) WorstDistanceParameter.ActualValue = new DoubleValue(max);
+        else worst.Value = max;
+      }
+    }
+
+   
+    private void UpdateVehiclesUtilized() {
+      ItemArray<DoubleValue> vehiclesUtilized = VehiclesUtilizedParameter.ActualValue;
+      if (vehiclesUtilized.Length > 0) {
+        double min = double.MaxValue, max = double.MinValue, sum = 0.0;
+        for (int i = 0; i < vehiclesUtilized.Length; i++) {
+          if (vehiclesUtilized[i].Value < min) min = vehiclesUtilized[i].Value;
+          if (vehiclesUtilized[i].Value > max) max = vehiclesUtilized[i].Value;
+          sum += vehiclesUtilized[i].Value;
+        }
+
+        DoubleValue best = BestVehiclesUtilizedParameter.ActualValue;
+        if (best == null) BestVehiclesUtilizedParameter.ActualValue = new DoubleValue(min);
+        else best.Value = min;
+        DoubleValue average = AverageVehiclesUtilizedParameter.ActualValue;
+        if (average == null) AverageVehiclesUtilizedParameter.ActualValue = new DoubleValue(sum / vehiclesUtilized.Length);
+        else average.Value = sum / vehiclesUtilized.Length;
+        DoubleValue worst = WorstVehiclesUtilizedParameter.ActualValue;
+        if (worst == null) WorstVehiclesUtilizedParameter.ActualValue = new DoubleValue(max);
+        else worst.Value = max;
+      }
+    }
+
+    public override IOperation Apply() {
+      UpdateDistances();
+      UpdateVehiclesUtilized();
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestVRPToursMemorizer.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestVRPToursMemorizer.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestVRPToursMemorizer.cs	(revision 4374)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestVRPToursMemorizer", "An operator that updates the best VRP tour found so far in the scope three.")]
+  [StorableClass]
+  public class BestVRPToursMemorizer : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<DoubleValue> DistanceParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> VehiclesUtilizedParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["VehiclesUtilized"]; }
+    }
+
+    public ValueLookupParameter<DoubleValue> BestDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestVehiclesUtilized"]; }
+    }
+
+    public BestVRPToursMemorizer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Distance", "The distances of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("VehiclesUtilized", "The utilized vehicles of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestDistance", "The best distance found so far."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestVehiclesUtilized", "The best vehicles utilized found so far."));
+ 
+    }
+
+    public override IOperation Apply() {
+      int i = DistanceParameter.ActualValue.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      if (BestDistanceParameter.ActualValue == null)
+        BestDistanceParameter.ActualValue = new DoubleValue(DistanceParameter.ActualValue[i].Value);
+      else if (DistanceParameter.ActualValue[i].Value <= BestDistanceParameter.ActualValue.Value)
+        BestDistanceParameter.ActualValue.Value = DistanceParameter.ActualValue[i].Value;
+
+      i = VehiclesUtilizedParameter.ActualValue.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      if (BestVehiclesUtilizedParameter.ActualValue == null)
+        BestVehiclesUtilizedParameter.ActualValue = new DoubleValue(VehiclesUtilizedParameter.ActualValue[i].Value);
+      else if (VehiclesUtilizedParameter.ActualValue[i].Value <= BestVehiclesUtilizedParameter.ActualValue.Value)
+        BestVehiclesUtilizedParameter.ActualValue.Value = VehiclesUtilizedParameter.ActualValue[i].Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestAverageWorstCapacitatedVRPToursAnalyzer.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestAverageWorstCapacitatedVRPToursAnalyzer.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestAverageWorstCapacitatedVRPToursAnalyzer.cs	(revision 4374)
@@ -0,0 +1,149 @@
+#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.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Analysis;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator which analyzes the best, average and worst quality of solutions in the scope tree.
+  /// </summary>
+  [Item("BestAverageWorstCapaciatatedVRPToursAnalyzer", "An operator which analyzes the best, average and worst properties of the VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstCapaciatatedVRPToursAnalyzer : AlgorithmOperator, IAnalyzer, ICapacitatedOperator {
+    #region Parameter properties
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> OverloadParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestOverload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentBestOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentBestOverload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentAverageOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentAverageOverload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentWorstOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentWorstOverload"]; }
+    }
+    public ValueLookupParameter<DataTable> OverloadsParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["Overloads"]; }
+    }
+
+    public ValueLookupParameter<VariableCollection> ResultsParameter {
+      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Properties
+    private BestCapacitatedVRPToursMemorizer BestMemorizer {
+      get { return (BestCapacitatedVRPToursMemorizer)OperatorGraph.InitialOperator; }
+    }
+    private BestAverageWorstCapacitatedVRPToursCalculator BestAverageWorstCalculator {
+      get { return (BestAverageWorstCapacitatedVRPToursCalculator)BestMemorizer.Successor; }
+    }
+    #endregion
+
+    public BestAverageWorstCapaciatatedVRPToursAnalyzer()
+      : base() {
+      #region Create parameters 
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Overload", "The overloads of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestOverload", "The best overload value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentBestOverload", "The current best overload value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentAverageOverload", "The current average overload value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentWorstOverload", "The current worst overload value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DataTable>("Overloads", "The data table to store the current best, current average, current worst, best and best known overload value."));
+ 
+      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The results collection where the analysis values should be stored."));
+      #endregion
+
+      #region Create operators
+      BestCapacitatedVRPToursMemorizer bestMemorizer = new BestCapacitatedVRPToursMemorizer();
+      BestAverageWorstCapacitatedVRPToursCalculator calculator = new BestAverageWorstCapacitatedVRPToursCalculator();
+      ResultsCollector resultsCollector = new ResultsCollector();
+
+      //overload
+      bestMemorizer.BestOverloadParameter.ActualName = BestOverloadParameter.Name;
+      bestMemorizer.OverloadParameter.ActualName = OverloadParameter.Name;
+      bestMemorizer.OverloadParameter.Depth = OverloadParameter.Depth;
+
+      calculator.OverloadParameter.ActualName = OverloadParameter.Name;
+      calculator.OverloadParameter.Depth = OverloadParameter.Depth;
+      calculator.BestOverloadParameter.ActualName = CurrentBestOverloadParameter.Name;
+      calculator.AverageOverloadParameter.ActualName = CurrentAverageOverloadParameter.Name;
+      calculator.WorstOverloadParameter.ActualName = CurrentWorstOverloadParameter.Name;
+
+      DataTableValuesCollector overloadDataTablesCollector = new DataTableValuesCollector();
+      overloadDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("BestOverload", null, BestOverloadParameter.Name));
+      overloadDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentBestOverload", null, CurrentBestOverloadParameter.Name));
+      overloadDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentAverageOverload", null, CurrentAverageOverloadParameter.Name));
+      overloadDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentWorstOverload", null, CurrentWorstOverloadParameter.Name));
+      overloadDataTablesCollector.DataTableParameter.ActualName = OverloadsParameter.Name;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(OverloadsParameter.Name));
+      #endregion
+
+      #region Create operator graph
+      OperatorGraph.InitialOperator = bestMemorizer;
+      bestMemorizer.Successor = calculator;
+      calculator.Successor = overloadDataTablesCollector;
+      overloadDataTablesCollector.Successor = resultsCollector;
+      resultsCollector.Successor = null;
+      #endregion
+
+      Initialize();
+    }
+    [StorableConstructor]
+    private BestAverageWorstCapaciatatedVRPToursAnalyzer(bool deserializing) : base() { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      OverloadParameter.DepthChanged += new EventHandler(OverloadParameter_DepthChanged);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      BestAverageWorstCapaciatatedVRPToursAnalyzer clone = (BestAverageWorstCapaciatatedVRPToursAnalyzer)base.Clone(cloner);
+      clone.Initialize();
+      return clone;
+    }
+
+    void OverloadParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.OverloadParameter.Depth = OverloadParameter.Depth;
+      BestMemorizer.OverloadParameter.Depth = OverloadParameter.Depth;
+    } 
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestAverageWorstCapacitatedVRPToursCalculator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestAverageWorstCapacitatedVRPToursCalculator.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestAverageWorstCapacitatedVRPToursCalculator.cs	(revision 4374)
@@ -0,0 +1,81 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestAverageWorstCapacitatedVRPToursCalculator", "An operator which calculates the current best, average and worst properties of VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstCapacitatedVRPToursCalculator : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<DoubleValue> OverloadParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestOverload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> AverageOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["AverageOverload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> WorstOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["WorstOverload"]; }
+    }
+
+    public BestAverageWorstCapacitatedVRPToursCalculator()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Overload", "The overloads of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestOverload", "The best overload value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("AverageOverload", "The average overload value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("WorstOverload", "The worst overload value of all solutions."));
+    }
+
+    private void UpdateOverloads() {
+      ItemArray<DoubleValue> overloads = OverloadParameter.ActualValue;
+      if (overloads.Length > 0) {
+        double min = double.MaxValue, max = double.MinValue, sum = 0.0;
+        for (int i = 0; i < overloads.Length; i++) {
+          if (overloads[i].Value < min) min = overloads[i].Value;
+          if (overloads[i].Value > max) max = overloads[i].Value;
+          sum += overloads[i].Value;
+        }
+
+        DoubleValue best = BestOverloadParameter.ActualValue;
+        if (best == null) BestOverloadParameter.ActualValue = new DoubleValue(min);
+        else best.Value = min;
+        DoubleValue average = AverageOverloadParameter.ActualValue;
+        if (average == null) AverageOverloadParameter.ActualValue = new DoubleValue(sum / overloads.Length);
+        else average.Value = sum / overloads.Length;
+        DoubleValue worst = WorstOverloadParameter.ActualValue;
+        if (worst == null) WorstOverloadParameter.ActualValue = new DoubleValue(max);
+        else worst.Value = max;
+      }
+    }
+  
+    public override IOperation Apply() {
+      UpdateOverloads();
+     
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestCapacitatedVRPToursMemorizer.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestCapacitatedVRPToursMemorizer.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestCapacitatedVRPToursMemorizer.cs	(revision 4374)
@@ -0,0 +1,58 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestCapacitatedVRPToursMemorizer", "An operator that updates the best VRP tour found so far in the scope three.")]
+  [StorableClass]
+  public class BestCapacitatedVRPToursMemorizer : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<DoubleValue> OverloadParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+
+    public ValueLookupParameter<DoubleValue> BestOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestOverload"]; }
+    }
+
+    public BestCapacitatedVRPToursMemorizer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Overload", "The overloads of the VRP solutions which should be analyzed."));
+ 
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestOverload", "The best overload found so far."));
+    }
+
+    public override IOperation Apply() {
+      int i = OverloadParameter.ActualValue.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      if (BestOverloadParameter.ActualValue == null)
+        BestOverloadParameter.ActualValue = new DoubleValue(OverloadParameter.ActualValue[i].Value);
+      else if(OverloadParameter.ActualValue[i].Value <= BestOverloadParameter.ActualValue.Value)
+        BestOverloadParameter.ActualValue.Value = OverloadParameter.ActualValue[i].Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestAverageWorstTimeWindowedVRPToursAnalyzer.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestAverageWorstTimeWindowedVRPToursAnalyzer.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestAverageWorstTimeWindowedVRPToursAnalyzer.cs	(revision 4374)
@@ -0,0 +1,202 @@
+#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.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Analysis;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator which analyzes the best, average and worst quality of solutions in the scope tree.
+  /// </summary>
+  [Item("BestAverageWorstTimeWindowedVRPToursAnalyzer", "An operator which analyzes the best, average and worst properties of the VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstTimeWindowedVRPToursAnalyzer : AlgorithmOperator, IAnalyzer, ITimeWindowedOperator {
+    #region Parameter properties
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> TardinessParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentBestTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentBestTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentAverageTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentAverageTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentWorstTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentWorstTardiness"]; }
+    }
+    public ValueLookupParameter<DataTable> TardinessValuesParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["TardinessValues"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> TravelTimeParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["TravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentBestTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentBestTravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentAverageTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentAverageTravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentWorstTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentWorstTravelTime"]; }
+    }
+    public ValueLookupParameter<DataTable> TravelTimesParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["TravelTimes"]; }
+    }
+
+    public ValueLookupParameter<VariableCollection> ResultsParameter {
+      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Properties
+    private BestTimeWindowedVRPToursMemorizer BestMemorizer {
+      get { return (BestTimeWindowedVRPToursMemorizer)OperatorGraph.InitialOperator; }
+    }
+    private BestAverageWorstTimeWindowedVRPToursCalculator BestAverageWorstCalculator {
+      get { return (BestAverageWorstTimeWindowedVRPToursCalculator)BestMemorizer.Successor; }
+    }
+    #endregion
+
+    public BestAverageWorstTimeWindowedVRPToursAnalyzer()
+      : base() {
+      #region Create parameters 
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Tardiness", "The tardiness of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTardiness", "The best tardiness value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentBestTardiness", "The current best tardiness value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentAverageTardiness", "The current average tardiness value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentWorstTardiness", "The current worst tardiness value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DataTable>("TardinessValues", "The data table to store the current best, current average, current worst, best and best known tardiness value."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("TravelTime", "The travel time of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTravelTime", "The best travel time value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentBestTravelTime", "The current best travel time value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentAverageTravelTime", "The current average travel time value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentWorstTravelTime", "The current worst travel time value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DataTable>("TravelTimes", "The data table to store the current best, current average, current worst, best and best known travel time value."));
+
+      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The results collection where the analysis values should be stored."));
+      #endregion
+
+      #region Create operators
+      BestTimeWindowedVRPToursMemorizer bestMemorizer = new BestTimeWindowedVRPToursMemorizer();
+      BestAverageWorstTimeWindowedVRPToursCalculator calculator = new BestAverageWorstTimeWindowedVRPToursCalculator();
+      ResultsCollector resultsCollector = new ResultsCollector();
+
+      //tardiness
+      bestMemorizer.BestTardinessParameter.ActualName = BestTardinessParameter.Name;
+      bestMemorizer.TardinessParameter.ActualName = TardinessParameter.Name;
+      bestMemorizer.TardinessParameter.Depth = TardinessParameter.Depth;
+
+      calculator.TardinessParameter.ActualName = TardinessParameter.Name;
+      calculator.TardinessParameter.Depth = TardinessParameter.Depth;
+      calculator.BestTardinessParameter.ActualName = CurrentBestTardinessParameter.Name;
+      calculator.AverageTardinessParameter.ActualName = CurrentAverageTardinessParameter.Name;
+      calculator.WorstTardinessParameter.ActualName = CurrentWorstTardinessParameter.Name;
+
+      DataTableValuesCollector tardinessDataTablesCollector = new DataTableValuesCollector();
+      tardinessDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("BestTardiness", null, BestTardinessParameter.Name));
+      tardinessDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentBestTardiness", null, CurrentBestTardinessParameter.Name));
+      tardinessDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentAverageTardiness", null, CurrentAverageTardinessParameter.Name));
+      tardinessDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentWorstTardiness", null, CurrentWorstTardinessParameter.Name));
+      tardinessDataTablesCollector.DataTableParameter.ActualName = TardinessValuesParameter.Name;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(TardinessValuesParameter.Name));
+
+      //Travel Time
+      bestMemorizer.BestTravelTimeParameter.ActualName = BestTravelTimeParameter.Name;
+      bestMemorizer.TravelTimeParameter.ActualName = TravelTimeParameter.Name;
+      bestMemorizer.TravelTimeParameter.Depth = TravelTimeParameter.Depth;
+
+      calculator.TravelTimeParameter.ActualName = TravelTimeParameter.Name;
+      calculator.TravelTimeParameter.Depth = TravelTimeParameter.Depth;
+      calculator.BestTravelTimeParameter.ActualName = CurrentBestTravelTimeParameter.Name;
+      calculator.AverageTravelTimeParameter.ActualName = CurrentAverageTravelTimeParameter.Name;
+      calculator.WorstTravelTimeParameter.ActualName = CurrentWorstTravelTimeParameter.Name;
+
+      DataTableValuesCollector travelTimeDataTablesCollector = new DataTableValuesCollector();
+      travelTimeDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("BestTravelTime", null, BestTravelTimeParameter.Name));
+      travelTimeDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentBestTravelTime", null, CurrentBestTravelTimeParameter.Name));
+      travelTimeDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentAverageTravelTime", null, CurrentAverageTravelTimeParameter.Name));
+      travelTimeDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentWorstTravelTime", null, CurrentWorstTravelTimeParameter.Name));
+      travelTimeDataTablesCollector.DataTableParameter.ActualName = TravelTimesParameter.Name;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(TravelTimesParameter.Name));
+      #endregion
+
+      #region Create operator graph
+      OperatorGraph.InitialOperator = bestMemorizer;
+      bestMemorizer.Successor = calculator;
+      calculator.Successor = tardinessDataTablesCollector;
+      tardinessDataTablesCollector.Successor = travelTimeDataTablesCollector;
+      travelTimeDataTablesCollector.Successor = resultsCollector;
+      resultsCollector.Successor = null;
+      #endregion
+
+      Initialize();
+    }
+    [StorableConstructor]
+    private BestAverageWorstTimeWindowedVRPToursAnalyzer(bool deserializing) : base() { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      TardinessParameter.DepthChanged += new EventHandler(TardinessParameter_DepthChanged);
+      TravelTimeParameter.DepthChanged += new EventHandler(TravelTimeParameter_DepthChanged);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      BestAverageWorstTimeWindowedVRPToursAnalyzer clone = (BestAverageWorstTimeWindowedVRPToursAnalyzer)base.Clone(cloner);
+      clone.Initialize();
+      return clone;
+    }
+
+    void TardinessParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.TardinessParameter.Depth = TardinessParameter.Depth;
+      BestMemorizer.TardinessParameter.Depth = TardinessParameter.Depth;
+    }
+
+    void TravelTimeParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.TravelTimeParameter.Depth = TravelTimeParameter.Depth;
+      BestMemorizer.TravelTimeParameter.Depth = TravelTimeParameter.Depth;
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestAverageWorstTimeWindowedVRPToursCalculator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestAverageWorstTimeWindowedVRPToursCalculator.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestAverageWorstTimeWindowedVRPToursCalculator.cs	(revision 4374)
@@ -0,0 +1,122 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestAverageWorstTimeWindowedVRPToursCalculator", "An operator which calculates the current best, average and worst properties of VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstTimeWindowedVRPToursCalculator : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<DoubleValue> TardinessParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> AverageTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["AverageTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> WorstTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["WorstTardiness"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> TravelTimeParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["TravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> AverageTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["AverageTravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> WorstTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["WorstTravelTime"]; }
+    }
+
+    public BestAverageWorstTimeWindowedVRPToursCalculator()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Tardiness", "The tardiness of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTardiness", "The best tardiness value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("AverageTardiness", "The average tardiness value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("WorstTardiness", "The worst tardiness value of all solutions."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("TravelTime", "The travel times of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTravelTime", "The best travel time value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("AverageTravelTime", "The average travel time value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("WorstTravelTime", "The worst travel time value of all solutions."));
+    }
+
+    private void UpdateTardiness() {
+      ItemArray<DoubleValue> tardiness = TardinessParameter.ActualValue;
+      if (tardiness.Length > 0) {
+        double min = double.MaxValue, max = double.MinValue, sum = 0.0;
+        for (int i = 0; i < tardiness.Length; i++) {
+          if (tardiness[i].Value < min) min = tardiness[i].Value;
+          if (tardiness[i].Value > max) max = tardiness[i].Value;
+          sum += tardiness[i].Value;
+        }
+
+        DoubleValue best = BestTardinessParameter.ActualValue;
+        if (best == null) BestTardinessParameter.ActualValue = new DoubleValue(min);
+        else best.Value = min;
+        DoubleValue average = AverageTardinessParameter.ActualValue;
+        if (average == null) AverageTardinessParameter.ActualValue = new DoubleValue(sum / tardiness.Length);
+        else average.Value = sum / tardiness.Length;
+        DoubleValue worst = WorstTardinessParameter.ActualValue;
+        if (worst == null) WorstTardinessParameter.ActualValue = new DoubleValue(max);
+        else worst.Value = max;
+      }
+    }
+
+    private void UpdateTravelTimes() {
+      ItemArray<DoubleValue> travelTimes = TravelTimeParameter.ActualValue;
+      if (travelTimes.Length > 0) {
+        double min = double.MaxValue, max = double.MinValue, sum = 0.0;
+        for (int i = 0; i < travelTimes.Length; i++) {
+          if (travelTimes[i].Value < min) min = travelTimes[i].Value;
+          if (travelTimes[i].Value > max) max = travelTimes[i].Value;
+          sum += travelTimes[i].Value;
+        }
+
+        DoubleValue best = BestTravelTimeParameter.ActualValue;
+        if (best == null) BestTravelTimeParameter.ActualValue = new DoubleValue(min);
+        else best.Value = min;
+        DoubleValue average = AverageTravelTimeParameter.ActualValue;
+        if (average == null) AverageTravelTimeParameter.ActualValue = new DoubleValue(sum / travelTimes.Length);
+        else average.Value = sum / travelTimes.Length;
+        DoubleValue worst = WorstTravelTimeParameter.ActualValue;
+        if (worst == null) WorstTravelTimeParameter.ActualValue = new DoubleValue(max);
+        else worst.Value = max;
+      }
+    }
+
+    public override IOperation Apply() {
+      UpdateTardiness();
+      UpdateTravelTimes();
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestTimeWindowedVRPToursMemorizer.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestTimeWindowedVRPToursMemorizer.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestTimeWindowedVRPToursMemorizer.cs	(revision 4374)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestTimeWindowedVRPToursMemorizer", "An operator that updates the best VRP tour found so far in the scope three.")]
+  [StorableClass]
+  public class BestTimeWindowedVRPToursMemorizer : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<DoubleValue> TardinessParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> TravelTimeParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["TravelTime"]; }
+    }
+
+    public ValueLookupParameter<DoubleValue> BestTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTravelTime"]; }
+    }
+
+    public BestTimeWindowedVRPToursMemorizer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Tardiness", "The tardiness of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("TravelTime", "The travel times of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTardiness", "The best tardiness found so far."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTravelTime", "The best travel time found so far."));
+    }
+
+    public override IOperation Apply() {
+      int i = TardinessParameter.ActualValue.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      if (BestTardinessParameter.ActualValue == null)
+        BestTardinessParameter.ActualValue = new DoubleValue(TardinessParameter.ActualValue[i].Value);
+      else if (TardinessParameter.ActualValue[i].Value <= BestTardinessParameter.ActualValue.Value)
+        BestTardinessParameter.ActualValue.Value = TardinessParameter.ActualValue[i].Value;
+
+      i = TravelTimeParameter.ActualValue.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      if (BestTravelTimeParameter.ActualValue == null)
+        BestTravelTimeParameter.ActualValue = new DoubleValue(TravelTimeParameter.ActualValue[i].Value);
+      else if (TravelTimeParameter.ActualValue[i].Value <= BestTravelTimeParameter.ActualValue.Value)
+        BestTravelTimeParameter.ActualValue.Value = TravelTimeParameter.ActualValue[i].Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/BestVRPSolutionAnalyzer.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/BestVRPSolutionAnalyzer.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/BestVRPSolutionAnalyzer.cs	(revision 4374)
@@ -0,0 +1,112 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator for analyzing the best solution of Vehicle Routing Problems.
+  /// </summary>
+  [Item("BestVRPSolutionAnalyzer", "An operator for analyzing the best solution of Vehicle Routing Problems.")]
+  [StorableClass]
+  public sealed class BestVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, IGeneralVRPOperator {
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> DistanceParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> VehiclesUtilizedParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["VehiclesUtilized"]; }
+    }
+
+    public LookupParameter<VRPSolution> BestSolutionParameter {
+      get { return (LookupParameter<VRPSolution>)Parameters["BestSolution"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    [StorableConstructor]
+    private BestVRPSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public BestVRPSolutionAnalyzer()
+      : base() {
+        Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+        Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("VRPTours", "The VRP tours which should be evaluated."));
+
+        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the VRP solutions which should be analyzed."));
+        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Distance", "The distances of the VRP solutions which should be analyzed."));
+        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("VehiclesUtilized", "The utilized vehicles of the VRP solutions which should be analyzed."));
+
+        Parameters.Add(new LookupParameter<VRPSolution>("BestSolution", "The best TSP solution."));
+        Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
+    }
+
+    public override IOperation Apply() {
+      IVRPProblemInstance problemInstance = ProblemInstanceParameter.ActualValue;
+      ItemArray<IVRPEncoding> solutions = VRPToursParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ItemArray<DoubleValue> distances = DistanceParameter.ActualValue;
+      ItemArray<DoubleValue> vehiclesUtilizations = VehiclesUtilizedParameter.ActualValue;
+
+      int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+
+      IVRPEncoding best = solutions[i].Clone() as IVRPEncoding;
+      VRPSolution solution = BestSolutionParameter.ActualValue;
+      if (solution == null) {
+        solution = new VRPSolution(problemInstance, best.Clone() as IVRPEncoding, new DoubleValue(qualities[i].Value));
+        BestSolutionParameter.ActualValue = solution;
+        results.Add(new Result("Best VRP Solution", solution));
+
+        results.Add(new Result("Best VRP Solution Distance", new DoubleValue(distances[i].Value)));
+        results.Add(new Result("Best VRP Solution VehicleUtilization", new DoubleValue(vehiclesUtilizations[i].Value)));
+      } else {
+        if (qualities[i].Value <= solution.Quality.Value) {
+          solution.ProblemInstance = problemInstance;
+          solution.Solution = best.Clone() as IVRPEncoding;
+          solution.Quality.Value = qualities[i].Value;
+          (results["Best VRP Solution Distance"].Value as DoubleValue).Value = distances[i].Value;
+          (results["Best VRP Solution VehicleUtilization"].Value as DoubleValue).Value = vehiclesUtilizations[i].Value;
+        }
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/Capacitated/BestCapacitatedVRPSolutionAnalyzer.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/Capacitated/BestCapacitatedVRPSolutionAnalyzer.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/Capacitated/BestCapacitatedVRPSolutionAnalyzer.cs	(revision 4374)
@@ -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.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator for analyzing the best solution of Vehicle Routing Problems.
+  /// </summary>
+  [Item("BestCapacitatedVRPSolutionAnalyzer", "An operator for analyzing the best solution of capacitated Vehicle Routing Problems.")]
+  [StorableClass]
+  public sealed class BestCapacitatedVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ICapacitatedOperator {
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> OverloadParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+
+    public LookupParameter<VRPSolution> BestSolutionParameter {
+      get { return (LookupParameter<VRPSolution>)Parameters["BestSolution"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    [StorableConstructor]
+    private BestCapacitatedVRPSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public BestCapacitatedVRPSolutionAnalyzer()
+      : base() {
+        Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+        Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("VRPTours", "The VRP tours which should be evaluated."));
+        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the VRP solutions which should be analyzed."));
+
+        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Overload", "The overloads of the VRP solutions which should be analyzed."));
+
+        Parameters.Add(new LookupParameter<VRPSolution>("BestSolution", "The best TSP solution."));
+        Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
+    }
+
+    public override IOperation Apply() {
+      ItemArray<IVRPEncoding> solutions = VRPToursParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ItemArray<DoubleValue> overloads = OverloadParameter.ActualValue;
+
+      int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+
+      IVRPEncoding best = solutions[i] as IVRPEncoding;
+      VRPSolution solution = BestSolutionParameter.ActualValue;
+      if (solution == null) {
+        results.Add(new Result("Best VRP Solution Overload", new DoubleValue(overloads[i].Value)));
+      } else {
+        if (qualities[i].Value <= solution.Quality.Value) {
+          (results["Best VRP Solution Overload"].Value as DoubleValue).Value = overloads[i].Value;
+        }
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/TimeWindowed/BestTimeWindowedVRPSolutionAnalyzer.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/TimeWindowed/BestTimeWindowedVRPSolutionAnalyzer.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/TimeWindowed/BestTimeWindowedVRPSolutionAnalyzer.cs	(revision 4374)
@@ -0,0 +1,104 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator for analyzing the best solution of Vehicle Routing Problems.
+  /// </summary>
+  [Item("BestTimeWindowedVRPSolutionAnalyzer", "An operator for analyzing the best solution of time windowed Vehicle Routing Problems.")]
+  [StorableClass]
+  public sealed class BestTimeWindowedVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ITimeWindowedOperator {
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> TardinessParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> TravelTimeParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["TravelTime"]; }
+    }
+
+    public LookupParameter<VRPSolution> BestSolutionParameter {
+      get { return (LookupParameter<VRPSolution>)Parameters["BestSolution"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    [StorableConstructor]
+    private BestTimeWindowedVRPSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public BestTimeWindowedVRPSolutionAnalyzer()
+      : base() {
+        Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+        Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("VRPTours", "The VRP tours which should be evaluated."));
+        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the VRP solutions which should be analyzed."));
+
+        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Tardiness", "The tardiness of the VRP solutions which should be analyzed."));
+        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("TravelTime", "The travel times of the VRP solutions which should be analyzed."));
+ 
+        Parameters.Add(new LookupParameter<VRPSolution>("BestSolution", "The best TSP solution."));
+        Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
+    }
+
+    public override IOperation Apply() {
+      ItemArray<IVRPEncoding> solutions = VRPToursParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ItemArray<DoubleValue> tardinesses = TardinessParameter.ActualValue;
+      ItemArray<DoubleValue> travelTimes = TravelTimeParameter.ActualValue;
+
+      int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+
+      IVRPEncoding best = solutions[i] as IVRPEncoding;
+      VRPSolution solution = BestSolutionParameter.ActualValue;
+      if (solution == null) {
+        results.Add(new Result("Best VRP Solution Tardiness", new DoubleValue(tardinesses[i].Value)));
+        results.Add(new Result("Best VRP Solution TravelTime", new DoubleValue(travelTimes[i].Value)));
+      } else {
+        if (qualities[i].Value <= solution.Quality.Value) {
+          (results["Best VRP Solution Tardiness"].Value as DoubleValue).Value = tardinesses[i].Value;
+          (results["Best VRP Solution TravelTime"].Value as DoubleValue).Value = travelTimes[i].Value;
+        }
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/VRPSolution.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/VRPSolution.cs	(revision 4374)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/VRPSolution.cs	(revision 4374)
@@ -0,0 +1,162 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// Represents a VRP solution which can be visualized in the GUI.
+  /// </summary>
+  [Item("VRPSolution", "Represents a VRP solution which can be visualized in the GUI.")]
+  [StorableClass]
+  public sealed class VRPSolution : Item {
+    public override Image ItemImage {
+      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Image; }
+    }
+
+    [Storable]
+    private IVRPProblemInstance problemInstance;
+    public IVRPProblemInstance ProblemInstance {
+      get { return problemInstance; }
+      set {
+        if (problemInstance != value) {
+          if (problemInstance != null) DeregisterProblemInstanceEvents();
+          problemInstance = value;
+          if (problemInstance != null) RegisterProblemInstanceEvents();
+          OnProblemInstanceChanged();
+        }
+      }
+    }
+    [Storable]
+    private IVRPEncoding solution;
+    public IVRPEncoding Solution {
+      get { return solution; }
+      set {
+        if (solution != value) {
+          if (solution != null) DeregisterSolutionEvents();
+          solution = value;
+          if (solution != null) RegisterSolutionEvents();
+          OnSolutionChanged();
+        }
+      }
+    }
+    [Storable]
+    private DoubleValue quality;
+    public DoubleValue Quality {
+      get { return quality; }
+      set {
+        if (quality != value) {
+          if (quality != null) DeregisterQualityEvents();
+          quality = value;
+          if (quality != null) RegisterQualityEvents();
+          OnQualityChanged();
+        }
+      }
+    }
+
+    public VRPSolution() : base() { }
+
+    public VRPSolution(IVRPProblemInstance problemInstance, IVRPEncoding solution, DoubleValue quality)
+      : base() {
+      this.problemInstance = problemInstance;
+      this.solution = solution;
+      this.quality = quality;
+      
+      Initialize();
+    }
+    [StorableConstructor]
+    private VRPSolution(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      if (problemInstance != null) RegisterProblemInstanceEvents();
+      if (solution != null) RegisterSolutionEvents();
+      if (quality != null) RegisterQualityEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      VRPSolution clone = new VRPSolution();
+      cloner.RegisterClonedObject(this, clone);
+      clone.problemInstance = (IVRPProblemInstance)cloner.Clone(problemInstance);
+      clone.solution = (IVRPEncoding)cloner.Clone(solution);
+      clone.quality = (DoubleValue)cloner.Clone(quality);
+      
+      clone.Initialize();
+      return clone;
+    }
+
+    #region Events
+    public event EventHandler ProblemInstanceChanged;
+    private void OnProblemInstanceChanged() {
+      var changed = ProblemInstanceChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+    public event EventHandler SolutionChanged;
+    private void OnSolutionChanged() {
+      var changed = SolutionChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+    public event EventHandler QualityChanged;
+    private void OnQualityChanged() {
+      var changed = QualityChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+   
+    private void RegisterProblemInstanceEvents() {
+      ProblemInstance.ToStringChanged += new EventHandler(ProblemInstance_ToStringChanged);
+    }
+    private void DeregisterProblemInstanceEvents() {
+      ProblemInstance.ToStringChanged -= new EventHandler(ProblemInstance_ToStringChanged);
+    }
+    private void RegisterSolutionEvents() {
+      Solution.ToStringChanged += new EventHandler(Solution_ToStringChanged);
+    }
+    private void DeregisterSolutionEvents() {
+      Solution.ToStringChanged -= new EventHandler(Solution_ToStringChanged);
+    }
+    private void RegisterQualityEvents() {
+      Quality.ValueChanged += new EventHandler(Quality_ValueChanged);
+    }
+    private void DeregisterQualityEvents() {
+      Quality.ValueChanged -= new EventHandler(Quality_ValueChanged);
+    }
+
+    private void ProblemInstance_ToStringChanged(object sender, EventArgs e) {
+      OnProblemInstanceChanged();
+    }
+    private void Solution_ToStringChanged(object sender, EventArgs e) {
+      OnSolutionChanged();
+    }
+    private void Quality_ValueChanged(object sender, EventArgs e) {
+      OnQualityChanged();
+    }
+    #endregion
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 4372)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 4374)
@@ -106,4 +106,17 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Analyzer\BestAverageWorstTours\BestAverageWorstVRPToursAnalyzer.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\BestAverageWorstVRPToursCalculator.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\BestVRPToursMemorizer.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\Capacitated\BestAverageWorstCapacitatedVRPToursAnalyzer.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\Capacitated\BestAverageWorstCapacitatedVRPToursCalculator.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\Capacitated\BestCapacitatedVRPToursMemorizer.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\TimeWindowed\BestAverageWorstTimeWindowedVRPToursAnalyzer.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\TimeWindowed\BestAverageWorstTimeWindowedVRPToursCalculator.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\TimeWindowed\BestTimeWindowedVRPToursMemorizer.cs" />
+    <Compile Include="Analyzer\BestSolution\BestVRPSolutionAnalyzer.cs" />
+    <Compile Include="Analyzer\BestSolution\Capacitated\BestCapacitatedVRPSolutionAnalyzer.cs" />
+    <Compile Include="Analyzer\BestSolution\TimeWindowed\BestTimeWindowedVRPSolutionAnalyzer.cs" />
+    <Compile Include="Analyzer\VRPSolution.cs" />
     <Compile Include="Encodings\Alba\AlbaEncoding.cs" />
     <Compile Include="Encodings\Alba\Creators\DefaultRepresentationCreator.cs" />
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPProblemInstance.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPProblemInstance.cs	(revision 4372)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPProblemInstance.cs	(revision 4374)
@@ -52,10 +52,14 @@
       set { OverloadPenaltyParameter.Value = value; }
     }
-    
-    public override IEnumerable<IOperator> Operators {
-      get {
-        return base.Operators
+
+    protected override IEnumerable<IOperator> GetOperators() {
+        return base.GetOperators()
           .Where(o => o is ICapacitatedOperator).Cast<IOperator>();
-      }
+    }
+
+    protected override IEnumerable<IOperator> GetAnalyzers() {
+      return ApplicationManager.Manager.GetInstances<ICapacitatedOperator>()
+        .Where(o => o is IAnalyzer)
+        .Cast<IOperator>().Union(base.GetAnalyzers());
     }
 
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluator.cs	(revision 4372)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluator.cs	(revision 4374)
@@ -40,4 +40,8 @@
     public ILookupParameter<DoubleValue> TardinessParameter {
       get { return (ILookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+
+    public ILookupParameter<DoubleValue> TravelTimeParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["TravelTime"]; }
     }
 
@@ -87,4 +91,6 @@
 
       (eval as CVRPTWEvaluation).Tardiness = tardiness;
+      (eval as CVRPTWEvaluation).TravelTime = time;
+
       double penalty = tardiness * vrptw.TardinessPenalty.Value;
       eval.Penalty += penalty;
@@ -97,4 +103,5 @@
 
       TardinessParameter.ActualValue = new DoubleValue(0);
+      TravelTimeParameter.ActualValue = new DoubleValue(0);
     }
 
@@ -103,4 +110,5 @@
 
       TardinessParameter.ActualValue.Value += (tourEvaluation as CVRPTWEvaluation).Tardiness;
+      TravelTimeParameter.ActualValue.Value += (tourEvaluation as CVRPTWEvaluation).TravelTime;
     }
     
@@ -110,4 +118,5 @@
     public CVRPTWEvaluator() {
       Parameters.Add(new LookupParameter<DoubleValue>("Tardiness", "The tardiness."));
+      Parameters.Add(new LookupParameter<DoubleValue>("TravelTime", "The travel time."));
     }
   }
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWProblemInstance.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWProblemInstance.cs	(revision 4372)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWProblemInstance.cs	(revision 4374)
@@ -74,12 +74,16 @@
       set { TardinessPenaltyParameter.Value = value; }
     }
-    
-    public override IEnumerable<IOperator> Operators {
-      get {
-        return base.Operators
-          .Where(o => o is ITimeWindowedOperator).Cast<IOperator>();
-      }
+
+    protected override IEnumerable<IOperator> GetOperators() {
+      return base.GetOperators()
+        .Where(o => o is ITimeWindowedOperator).Cast<IOperator>();
     }
 
+    protected override IEnumerable<IOperator> GetAnalyzers() {
+      return ApplicationManager.Manager.GetInstances<ITimeWindowedOperator>()
+        .Where(o => o is IAnalyzer)
+        .Cast<IOperator>().Union(base.GetAnalyzers());
+    }
+    
     protected override IVRPEvaluator Evaluator {
       get {
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/SingleDepotVRPProblemInstance.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/SingleDepotVRPProblemInstance.cs	(revision 4372)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/SingleDepotVRPProblemInstance.cs	(revision 4374)
@@ -37,8 +37,12 @@
   [StorableClass]
   public class SingleDepotVRPProblemInstance: VRPProblemInstance, ISingleDepotProblemInstance {
-    public override IEnumerable<IOperator> Operators {
-      get {
-        return ApplicationManager.Manager.GetInstances<ISingleDepotOperator>().Cast<IOperator>();
-      }
+    protected override IEnumerable<IOperator> GetOperators() {
+      return ApplicationManager.Manager.GetInstances<ISingleDepotOperator>().Cast<IOperator>();
+    }
+
+    protected override IEnumerable<IOperator> GetAnalyzers() {
+      return ApplicationManager.Manager.GetInstances<ISingleDepotOperator>()
+        .Where(o => o is IAnalyzer)
+        .Cast<IOperator>();
     }
 
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs	(revision 4372)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs	(revision 4374)
@@ -44,5 +44,12 @@
     }
 
-    public abstract IEnumerable<IOperator> Operators { get; }
+    protected abstract IEnumerable<IOperator> GetOperators();
+    protected abstract IEnumerable<IOperator> GetAnalyzers();
+
+    public IEnumerable<IOperator> Operators {
+      get {
+        return GetOperators().Union(GetAnalyzers());
+      }
+    }
     
     protected ValueParameter<DoubleMatrix> CoordinatesParameter {
