Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting.Views/3.3/VRPSolutionView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting.Views/3.3/VRPSolutionView.Designer.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting.Views/3.3/VRPSolutionView.Designer.cs	(revision 4352)
@@ -50,5 +50,5 @@
       this.valueTabPage = new System.Windows.Forms.TabPage();
       this.tourGroupBox = new System.Windows.Forms.GroupBox();
-      this.tourViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.tourGridView = new System.Windows.Forms.DataGridView();
       this.tabControl.SuspendLayout();
       this.visualizationTabPage.SuspendLayout();
@@ -56,4 +56,5 @@
       this.valueTabPage.SuspendLayout();
       this.tourGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.tourGridView)).BeginInit();
       this.SuspendLayout();
       // 
@@ -100,5 +101,5 @@
       this.valueTabPage.Name = "valueTabPage";
       this.valueTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.valueTabPage.Size = new System.Drawing.Size(415, 398);
+      this.valueTabPage.Size = new System.Drawing.Size(415, 532);
       this.valueTabPage.TabIndex = 1;
       this.valueTabPage.Text = "Value";
@@ -107,26 +108,21 @@
       // tourGroupBox
       // 
-      this.tourGroupBox.Controls.Add(this.tourViewHost);
+      this.tourGroupBox.Controls.Add(this.tourGridView);
       this.tourGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
       this.tourGroupBox.Location = new System.Drawing.Point(3, 3);
       this.tourGroupBox.Name = "tourGroupBox";
-      this.tourGroupBox.Size = new System.Drawing.Size(409, 392);
+      this.tourGroupBox.Size = new System.Drawing.Size(409, 526);
       this.tourGroupBox.TabIndex = 0;
       this.tourGroupBox.TabStop = false;
       this.tourGroupBox.Text = "Tour";
       // 
-      // tourViewHost
+      // tourGridView
       // 
-      this.tourViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.tourViewHost.Caption = "View";
-      this.tourViewHost.Content = null;
-      this.tourViewHost.Location = new System.Drawing.Point(6, 19);
-      this.tourViewHost.Name = "tourViewHost";
-      this.tourViewHost.ReadOnly = false;
-      this.tourViewHost.Size = new System.Drawing.Size(397, 367);
-      this.tourViewHost.TabIndex = 0;
-      this.tourViewHost.ViewType = null;
+      this.tourGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.tourGridView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tourGridView.Location = new System.Drawing.Point(3, 16);
+      this.tourGridView.Name = "tourGridView";
+      this.tourGridView.Size = new System.Drawing.Size(403, 507);
+      this.tourGridView.TabIndex = 0;
       // 
       // VRPSolutionView
@@ -142,4 +138,5 @@
       this.valueTabPage.ResumeLayout(false);
       this.tourGroupBox.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.tourGridView)).EndInit();
       this.ResumeLayout(false);
 
@@ -153,5 +150,5 @@
     private System.Windows.Forms.TabPage valueTabPage;
     private System.Windows.Forms.GroupBox tourGroupBox;
-    private MainForm.WindowsForms.ViewHost tourViewHost;
+    private System.Windows.Forms.DataGridView tourGridView;
 
 
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting.Views/3.3/VRPSolutionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting.Views/3.3/VRPSolutionView.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting.Views/3.3/VRPSolutionView.cs	(revision 4352)
@@ -27,4 +27,6 @@
 using HeuristicLab.MainForm;
 using HeuristicLab.Problems.VehicleRouting.Encodings;
+using HeuristicLab.Parameters;
+using System.Linq;
 
 namespace HeuristicLab.Problems.VehicleRouting.Views {
@@ -67,5 +69,5 @@
       } else {
         GenerateImage();
-        tourViewHost.Content = Content.Solution;
+        UpdateTourView();
       }
     }
@@ -80,4 +82,20 @@
       pictureBox.Enabled = Content != null;
       tourGroupBox.Enabled = Content != null;
+    }
+
+    private void UpdateTourView() {
+      tourGridView.Rows.Clear();
+      tourGridView.ColumnCount = Content.Coordinates.Rows - 1;
+
+      if (Content != null && Content.Solution != null) {
+        foreach (Tour tour in Content.Solution.GetTours(new ValueLookupParameter<DoubleMatrix>("DistanceMatrix", Content.DistanceMatrix))) {
+          int row = tourGridView.Rows.Add();
+          int cell = 0;
+          foreach (int city in tour.Cities) {
+            tourGridView.Rows[row].Cells[cell].Value = city;
+            cell++;
+          }
+        }
+      }
     }
 
@@ -119,5 +137,5 @@
               if (Content.Solution != null) {
                 int currentTour = 0;
-                foreach (Tour tour in Content.Solution.Tours) {
+                foreach (Tour tour in Content.Solution.GetTours(new ValueLookupParameter<DoubleMatrix>("DistanceMatrix", distanceMatrix))) {
                   double t = 0.0;
                   Point[] tourPoints = new Point[tour.Cities.Count + 2];
@@ -202,5 +220,5 @@
       else {
         GenerateImage();
-        tourViewHost.Content = Content.Solution;
+        UpdateTourView();
       }
     }
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting.Views/3.3/VehicleRoutingProblemView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting.Views/3.3/VehicleRoutingProblemView.Designer.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting.Views/3.3/VehicleRoutingProblemView.Designer.cs	(revision 4352)
@@ -29,4 +29,6 @@
       this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
       this.tabPage2 = new System.Windows.Forms.TabPage();
+      this.importButton2 = new System.Windows.Forms.Button();
+      this.importButton3 = new System.Windows.Forms.Button();
       this.vrpSolutionView = new HeuristicLab.Problems.VehicleRouting.Views.VRPSolutionView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
@@ -43,9 +45,7 @@
       // importButton
       // 
-      this.importButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
       this.importButton.Location = new System.Drawing.Point(0, 55);
       this.importButton.Name = "importButton";
-      this.importButton.Size = new System.Drawing.Size(490, 23);
+      this.importButton.Size = new System.Drawing.Size(139, 23);
       this.importButton.TabIndex = 5;
       this.importButton.Text = "Import from Solomon";
@@ -63,5 +63,5 @@
       this.tabControl1.Name = "tabControl1";
       this.tabControl1.SelectedIndex = 0;
-      this.tabControl1.Size = new System.Drawing.Size(490, 338);
+      this.tabControl1.Size = new System.Drawing.Size(490, 265);
       this.tabControl1.TabIndex = 6;
       // 
@@ -72,5 +72,5 @@
       this.tabPage1.Name = "tabPage1";
       this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
-      this.tabPage1.Size = new System.Drawing.Size(482, 312);
+      this.tabPage1.Size = new System.Drawing.Size(482, 239);
       this.tabPage1.TabIndex = 0;
       this.tabPage1.Text = "Parameters";
@@ -85,5 +85,5 @@
       this.parameterCollectionView.Name = "parameterCollectionView";
       this.parameterCollectionView.ReadOnly = false;
-      this.parameterCollectionView.Size = new System.Drawing.Size(476, 306);
+      this.parameterCollectionView.Size = new System.Drawing.Size(476, 233);
       this.parameterCollectionView.TabIndex = 1;
       // 
@@ -94,8 +94,28 @@
       this.tabPage2.Name = "tabPage2";
       this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
-      this.tabPage2.Size = new System.Drawing.Size(482, 312);
+      this.tabPage2.Size = new System.Drawing.Size(482, 239);
       this.tabPage2.TabIndex = 1;
       this.tabPage2.Text = "Visualization";
       this.tabPage2.UseVisualStyleBackColor = true;
+      // 
+      // importButton2
+      // 
+      this.importButton2.Location = new System.Drawing.Point(145, 55);
+      this.importButton2.Name = "importButton2";
+      this.importButton2.Size = new System.Drawing.Size(126, 23);
+      this.importButton2.TabIndex = 7;
+      this.importButton2.Text = "Import from TSPLib";
+      this.importButton2.UseVisualStyleBackColor = true;
+      this.importButton2.Click += new System.EventHandler(this.importButton2_Click);
+      // 
+      // importButton3
+      // 
+      this.importButton3.Location = new System.Drawing.Point(277, 55);
+      this.importButton3.Name = "importButton3";
+      this.importButton3.Size = new System.Drawing.Size(131, 23);
+      this.importButton3.TabIndex = 8;
+      this.importButton3.Text = "Import from ORLib";
+      this.importButton3.UseVisualStyleBackColor = true;
+      this.importButton3.Click += new System.EventHandler(this.importButton3_Click);
       // 
       // vrpSolutionView
@@ -107,5 +127,5 @@
       this.vrpSolutionView.Name = "vrpSolutionView";
       this.vrpSolutionView.ReadOnly = false;
-      this.vrpSolutionView.Size = new System.Drawing.Size(476, 306);
+      this.vrpSolutionView.Size = new System.Drawing.Size(476, 233);
       this.vrpSolutionView.TabIndex = 0;
       // 
@@ -113,8 +133,10 @@
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.importButton3);
+      this.Controls.Add(this.importButton2);
       this.Controls.Add(this.importButton);
       this.Controls.Add(this.tabControl1);
       this.Name = "VehicleRoutingProblemView";
-      this.Size = new System.Drawing.Size(490, 422);
+      this.Size = new System.Drawing.Size(490, 352);
       this.Controls.SetChildIndex(this.tabControl1, 0);
       this.Controls.SetChildIndex(this.importButton, 0);
@@ -123,4 +145,6 @@
       this.Controls.SetChildIndex(this.descriptionLabel, 0);
       this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      this.Controls.SetChildIndex(this.importButton2, 0);
+      this.Controls.SetChildIndex(this.importButton3, 0);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       this.tabControl1.ResumeLayout(false);
@@ -140,4 +164,6 @@
     private Core.Views.ParameterCollectionView parameterCollectionView;
     private VRPSolutionView vrpSolutionView;
+    private System.Windows.Forms.Button importButton2;
+    private System.Windows.Forms.Button importButton3;
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting.Views/3.3/VehicleRoutingProblemView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting.Views/3.3/VehicleRoutingProblemView.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting.Views/3.3/VehicleRoutingProblemView.cs	(revision 4352)
@@ -64,10 +64,10 @@
       parameterCollectionView.Enabled = Content != null;
       vrpSolutionView.Enabled = Content != null;
-      importButton.Enabled = Content != null && !ReadOnly;
+      importButton.Enabled = importButton2.Enabled = importButton3.Enabled = Content != null && !ReadOnly;
     }
 
     private void importButton_Click(object sender, EventArgs e) {
       OpenFileDialog dialog = new OpenFileDialog();
-      dialog.DefaultExt = "txt";
+      dialog.Filter = "Solomon files (*.txt)|*.txt";
 
       if (dialog.ShowDialog() == DialogResult.OK) {
@@ -76,7 +76,25 @@
     }
 
+    private void importButton2_Click(object sender, EventArgs e) {
+      OpenFileDialog dialog = new OpenFileDialog();
+      dialog.Filter = "TSPLib files (*.vrp)|*.vrp";
+
+      if (dialog.ShowDialog() == DialogResult.OK) {
+        Content.ImportFromTSPLib(dialog.FileName);
+      }
+    }
+
+    private void importButton3_Click(object sender, EventArgs e) {
+      OpenFileDialog dialog = new OpenFileDialog();
+      dialog.Filter = "ORLib files (*.txt)|*.txt";
+
+      if (dialog.ShowDialog() == DialogResult.OK) {
+        Content.ImportFromORLib(dialog.FileName);
+      }
+    }  
+
     private void CoordinatesParameter_ValueChanged(object sender, EventArgs e) {
       vrpSolutionView.Content.Coordinates = Content.Coordinates;
-    }
+    }  
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestAverageWorstVRPToursAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestAverageWorstVRPToursAnalyzer.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestAverageWorstVRPToursAnalyzer.cs	(revision 4352)
@@ -0,0 +1,354 @@
+#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;
+
+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 {
+    #region Parameter properties
+    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 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> 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> 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 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 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 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>("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>("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 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();
+
+      //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));
+
+      //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));
+
+      //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));
+
+      //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));
+
+      //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 = overloadDataTablesCollector;
+      overloadDataTablesCollector.Successor = tardinessDataTablesCollector;
+      tardinessDataTablesCollector.Successor = distanceDataTablesCollector;
+      distanceDataTablesCollector.Successor = travelTimeDataTablesCollector;
+      travelTimeDataTablesCollector.Successor = vehiclesUtilizedDataTablesCollector;
+      vehiclesUtilizedDataTablesCollector.Successor = resultsCollector;
+      resultsCollector.Successor = null;
+      #endregion
+
+      Initialize();
+    }
+    [StorableConstructor]
+    private BestAverageWorstVRPToursAnalyzer(bool deserializing) : base() { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      OverloadParameter.DepthChanged += new EventHandler(OverloadParameter_DepthChanged);
+      TardinessParameter.DepthChanged += new EventHandler(TardinessParameter_DepthChanged);
+      DistanceParameter.DepthChanged += new EventHandler(DistanceParameter_DepthChanged);
+      TravelTimeParameter.DepthChanged += new EventHandler(TravelTimeParameter_DepthChanged);
+      VehiclesUtilizedParameter.DepthChanged += new EventHandler(VehiclesUtilizedParameter_DepthChanged);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      BestAverageWorstVRPToursAnalyzer clone = (BestAverageWorstVRPToursAnalyzer)base.Clone(cloner);
+      clone.Initialize();
+      return clone;
+    }
+
+    void OverloadParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.OverloadParameter.Depth = OverloadParameter.Depth;
+      BestMemorizer.OverloadParameter.Depth = OverloadParameter.Depth;
+    }
+
+    void TardinessParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.TardinessParameter.Depth = TardinessParameter.Depth;
+      BestMemorizer.TardinessParameter.Depth = TardinessParameter.Depth;
+    }
+
+    void DistanceParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.DistanceParameter.Depth = DistanceParameter.Depth;
+      BestMemorizer.DistanceParameter.Depth = DistanceParameter.Depth;
+    }
+
+    void TravelTimeParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.TravelTimeParameter.Depth = TravelTimeParameter.Depth;
+      BestMemorizer.TravelTimeParameter.Depth = DistanceParameter.Depth;
+    }
+
+    void VehiclesUtilizedParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.VehiclesUtilizedParameter.Depth = VehiclesUtilizedParameter.Depth;
+      BestMemorizer.VehiclesUtilizedParameter.Depth = DistanceParameter.Depth;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestAverageWorstVRPToursCalculator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestAverageWorstVRPToursCalculator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestAverageWorstVRPToursCalculator.cs	(revision 4352)
@@ -0,0 +1,245 @@
+#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> 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 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> 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> 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 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>("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."));
+
+      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."));
+
+      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 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;
+      }
+    }
+
+    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 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 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;
+      }
+    }
+
+    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() {
+      UpdateOverloads();
+      UpdateTardiness();
+      UpdateDistances();
+      UpdateTravelTimes();
+      UpdateVehiclesUtilized();
+
+      return base.Apply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestVRPSolutionAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestVRPSolutionAnalyzer.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestVRPSolutionAnalyzer.cs	(revision 4352)
@@ -128,19 +128,20 @@
         results.Add(new Result("Best VRP Solution", solution));
 
-        results.Add(new Result("Best TravelTime", new DoubleValue(travelTimes[i].Value)));
-        results.Add(new Result("Best Distance",  new DoubleValue(distances[i].Value)));
-        results.Add(new Result("Best VehicleUtilization", new DoubleValue(vehiclesUtilizations[i].Value)));
-        results.Add(new Result("Best Overload",  new DoubleValue(overloads[i].Value)));
-        results.Add(new Result("Best Tardiness",  new DoubleValue(tardinesses[i].Value)));
+        results.Add(new Result("Best VRP Solution TravelTime", new DoubleValue(travelTimes[i].Value)));
+        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)));
+        results.Add(new Result("Best VRP Solution Overload", new DoubleValue(overloads[i].Value)));
+        results.Add(new Result("Best VRP Solution Tardiness", new DoubleValue(tardinesses[i].Value)));
+
       } else {
-        if (solution.Quality.Value > qualities[i].Value) {
+        if (qualities[i].Value <= solution.Quality.Value) {
           solution.Coordinates = coordinates;
           solution.Solution = best.Clone() as IVRPEncoding;
           solution.Quality.Value = qualities[i].Value;
-          solution.Distance.Value = (results["Best Distance"].Value as DoubleValue).Value = distances[i].Value;
-          solution.Overload.Value = (results["Best Overload"].Value as DoubleValue).Value = overloads[i].Value;
-          solution.Tardiness.Value = (results["Best Tardiness"].Value as DoubleValue).Value = tardinesses[i].Value;
-          solution.TravelTime.Value = (results["Best TravelTime"].Value as DoubleValue).Value = travelTimes[i].Value;
-          solution.VehicleUtilization.Value = (results["Best VehicleUtilization"].Value as DoubleValue).Value = vehiclesUtilizations[i].Value;
+          solution.Distance.Value = (results["Best VRP Solution Distance"].Value as DoubleValue).Value = distances[i].Value;
+          solution.Overload.Value = (results["Best VRP Solution Overload"].Value as DoubleValue).Value = overloads[i].Value;
+          solution.Tardiness.Value = (results["Best VRP Solution Tardiness"].Value as DoubleValue).Value = tardinesses[i].Value;
+          solution.TravelTime.Value = (results["Best VRP Solution TravelTime"].Value as DoubleValue).Value = travelTimes[i].Value;
+          solution.VehicleUtilization.Value = (results["Best VRP Solution VehicleUtilization"].Value as DoubleValue).Value = vehiclesUtilizations[i].Value;
           solution.DistanceMatrix = DistanceMatrixParameter.ActualValue;
           solution.UseDistanceMatrix = UseDistanceMatrixParameter.ActualValue;
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestVRPToursMemorizer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestVRPToursMemorizer.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestVRPToursMemorizer.cs	(revision 4352)
@@ -0,0 +1,115 @@
+﻿#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> OverloadParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> TardinessParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> DistanceParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> TravelTimeParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["TravelTime"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> VehiclesUtilizedParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["VehiclesUtilized"]; }
+    }
+
+    public ValueLookupParameter<DoubleValue> BestOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestOverload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTravelTime"]; }
+    }
+    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>("Overload", "The overloads 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 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>("BestOverload", "The best overload found so far."));
+      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."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestVehiclesUtilized", "The best vehicles utilized 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;
+
+      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 = 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 = 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;
+
+      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: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/AlbaEncoding.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/AlbaEncoding.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/AlbaEncoding.cs	(revision 4352)
@@ -26,36 +26,35 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
   [Item("AlbaEncoding", "Represents an Alba encoding of VRP solutions. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
   [StorableClass]
-  public class AlbaEncoding : Permutation, IVRPEncoding {
+  public class AlbaEncoding : PermutationEncoding {
     [Storable]
     private int cities;
     
     #region IVRPEncoding Members
-    public ItemList<Tour> Tours {
-      get {
-        ItemList<Tour> result = new ItemList<Tour>();
-        
-        Tour tour = new Tour();
-        for (int i = 0; i < this.array.Length; i++) {
-          if (this.array[i] >= cities) {
-            if (tour.Cities.Count > 0) {
-              result.Add(tour);
+    public override List<Tour> GetTours(ILookupParameter<DoubleMatrix> distanceMatrix = null, int maxVehicles = int.MaxValue) {
+      List<Tour> result = new List<Tour>();
 
-              tour = new Tour();
-            }
-          } else {
-            tour.Cities.Add(this.array[i] + 1);
+      Tour tour = new Tour();
+      for (int i = 0; i < this.array.Length; i++) {
+        if (this.array[i] >= cities) {
+          if (tour.Cities.Count > 0) {
+            result.Add(tour);
+
+            tour = new Tour();
           }
+        } else {
+          tour.Cities.Add(this.array[i] + 1);
         }
+      }
 
-        if (tour.Cities.Count > 0) {
-          result.Add(tour);
-        }
+      if (tour.Cities.Count > 0) {
+        result.Add(tour);
+      }
 
-        return result;
-      }
+      return result;
     }
 
@@ -65,5 +64,5 @@
 
     public int MaxVehicles {
-      get { return Length - Cities;  }
+      get { return Length - Cities + 1;  }
     }
 
@@ -79,9 +78,5 @@
 
     public AlbaEncoding(Permutation permutation, int cities)
-      : base(PermutationTypes.RelativeUndirected) {
-      this.array = new int[permutation.Length];
-      for (int i = 0; i < array.Length; i++)
-        this.array[i] = permutation[i];
-
+      : base(permutation) {
       this.cities = cities;
     }
@@ -89,9 +84,9 @@
     [StorableConstructor]
     private AlbaEncoding(bool serializing)
-      : base() {
+      : base(serializing) {
     }
 
-    public static AlbaEncoding ConvertFrom(IVRPEncoding encoding, int vehicles) {
-      ItemList<Tour> tours = encoding.Tours;
+    public static AlbaEncoding ConvertFrom(IVRPEncoding encoding, int vehicles, ILookupParameter<DoubleMatrix> distanceMatrix) {
+      List<Tour> tours = encoding.GetTours(distanceMatrix, vehicles);
 
       int cities = 0;
@@ -132,4 +127,5 @@
     public static AlbaEncoding ConvertFrom(List<int> routeParam) {
       List<int> route = new List<int>(routeParam);
+      route.RemoveAt(routeParam.Count - 1);
       
       int cities = 0;
@@ -156,5 +152,4 @@
 
     internal static void RemoveUnusedParameters(ParameterCollection parameters) {
-      parameters.Remove("DistanceMatrix");
       parameters.Remove("UseDistanceMatrix");
       parameters.Remove("Capacity");
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaCrossover.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaCrossover.cs	(revision 4352)
@@ -53,5 +53,6 @@
 
         if (!(solution is AlbaEncoding)) {
-          parents[i] = AlbaEncoding.ConvertFrom(solution, VehiclesParameter.ActualValue.Value);
+          parents[i] = AlbaEncoding.ConvertFrom(solution, VehiclesParameter.ActualValue.Value,
+            DistanceMatrixParameter);
         } else {
           parents[i] = solution;
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs	(revision 4352)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaPermutationCrossover", "An operator which crosses two VRP representations using a standard permutation operator.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaPermutationCrossover : AlbaCrossover {    
+    public IValueLookupParameter<IPermutationCrossover> InnerCrossoverParameter {
+      get { return (IValueLookupParameter<IPermutationCrossover>)Parameters["InnerCrossover"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaPermutationCrossover(bool deserializing) : base(deserializing) { }
+
+    public AlbaPermutationCrossover()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IPermutationCrossover>("InnerCrossover", "The permutation crossover.", new EdgeRecombinationCrossover()));
+    }
+
+    protected override AlbaEncoding Crossover(IRandom random, AlbaEncoding parent1, AlbaEncoding parent2) {
+      //note - the inner crossover is called here and the result is converted to an alba representation
+      //some refactoring should be done here in the future - the crossover operation should be called directly
+
+      InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(
+        InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope);
+      op.Operator.Execute((IExecutionContext)op);
+
+      string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;
+      if (ExecutionContext.Scope.Variables.ContainsKey(childName)) {
+        Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation;
+        ExecutionContext.Scope.Variables.Remove(childName);
+
+        return new AlbaEncoding(permutation, Cities);
+      } else
+        return null;
+    }
+  }
+}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/PermutationCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/PermutationCrossover.cs	(revision 4351)
+++ 	(revision )
@@ -1,63 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("PermutationCrossover", "An operator which crosses two VRP representations using a standard permutation operator.")]
-  [StorableClass]
-  public sealed class PermutationCrossover : AlbaCrossover {    
-    public IValueLookupParameter<IPermutationCrossover> InnerCrossoverParameter {
-      get { return (IValueLookupParameter<IPermutationCrossover>)Parameters["InnerCrossover"]; }
-    }
-
-    [StorableConstructor]
-    private PermutationCrossover(bool deserializing) : base(deserializing) { }
-
-    public PermutationCrossover()
-      : base() {
-      Parameters.Add(new ValueLookupParameter<IPermutationCrossover>("InnerCrossover", "The permutation crossover.", new EdgeRecombinationCrossover()));
-    }
-
-    protected override AlbaEncoding Crossover(IRandom random, AlbaEncoding parent1, AlbaEncoding parent2) {
-      //note - the inner crossover is called here and the result is converted to an alba representation
-      //some refactoring should be done here in the future - the crossover operation should be called directly
-
-      InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName;
-      IAtomicOperation op = this.ExecutionContext.CreateOperation(
-        InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope);
-      op.Operator.Execute((IExecutionContext)op);
-
-      string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;
-      if (ExecutionContext.Scope.Variables.ContainsKey(childName)) {
-        Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation;
-        ExecutionContext.Scope.Variables.Remove(childName);
-
-        return new AlbaEncoding(permutation, Cities);
-      } else
-        return null;
-    }
-  }
-}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerInsertionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerInsertionManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerInsertionManipulator.cs	(revision 4352)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaCustomerInsertionManipulator", "An operator which manipulates a VRP representation by inserting a customer in another place.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaCustomerInsertionManipulator : AlbaManipulator {
+    [StorableConstructor]
+    private AlbaCustomerInsertionManipulator(bool deserializing) : base(deserializing) { }
+
+    public AlbaCustomerInsertionManipulator()
+      : base() {
+    }
+
+    protected override void Manipulate(IRandom random, AlbaEncoding individual) {
+      AlbaEncoding original = (AlbaEncoding)individual.Clone();
+      int cutIndex, insertIndex, number;
+
+      int customer = random.Next(Cities);
+      cutIndex = FindCustomerLocation(customer, individual);
+
+      insertIndex = random.Next(original.Length);
+      number = original[cutIndex];
+
+      int i = 0;  // index in new permutation
+      int j = 0;  // index in old permutation
+      while (i < original.Length) {
+        if (j == cutIndex) {
+          j++;
+        }
+        if (i == insertIndex) {
+          individual[i] = number;
+          i++;
+        }
+        if ((i < original.Length) && (j < original.Length)) {
+          individual[i] = original[j];
+          i++;
+          j++;
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerInversionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerInversionManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerInversionManipulator.cs	(revision 4352)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaCustomerInversionManipulator", "An operator which manipulates a VRP representation by inverting the order the customers are visited.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaCustomerInversionManipulator : AlbaManipulator {
+    [StorableConstructor]
+    private AlbaCustomerInversionManipulator(bool deserializing) : base(deserializing) { }
+
+    public AlbaCustomerInversionManipulator()
+      : base() {
+    }
+
+    protected override void Manipulate(IRandom random, AlbaEncoding individual) {
+      int breakPoint1, breakPoint2;
+
+      int customer1 = random.Next(Cities);
+      breakPoint1 = FindCustomerLocation(customer1, individual);
+
+      int customer2 = random.Next(Cities);
+      breakPoint2 = FindCustomerLocation(customer1, individual);
+
+      List<int> visitingOrder = new List<int>();
+      for (int i = breakPoint1; i <= breakPoint2; i++) {
+        if (individual[i] != 0)
+          visitingOrder.Add(individual[i]);
+      }
+      visitingOrder.Reverse();
+      for (int i = breakPoint1; i <= breakPoint2; i++) {
+        if (individual[i] != 0) {
+          individual[i] = visitingOrder[0];
+          visitingOrder.RemoveAt(0);
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerSwapManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerSwapManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerSwapManipulator.cs	(revision 4352)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaCustomerSwapManipulator", "An operator which manipulates a VRP representation by swapping two customers.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaCustomerSwapManipulator : AlbaManipulator {
+    [StorableConstructor]
+    private AlbaCustomerSwapManipulator(bool deserializing) : base(deserializing) { }
+
+    public AlbaCustomerSwapManipulator()
+      : base() {
+    }
+
+    protected override void Manipulate(IRandom random, AlbaEncoding individual) {
+      int index1, index2, temp;
+
+      int customer1 = random.Next(Cities);
+      index1 = FindCustomerLocation(customer1, individual);
+
+      int customer2 = random.Next(Cities);
+      index2 = FindCustomerLocation(customer2, individual);
+
+      temp = individual[index1];
+      individual[index1] = individual[index2];
+      individual[index2] = temp;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaIntraRouteInversionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaIntraRouteInversionManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaIntraRouteInversionManipulator.cs	(revision 4352)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaIntraRouteInversionManipulator", "An operator which applies the SLS operation to a VRP representation. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaIntraRouteInversionManipulator : AlbaManipulator {   
+    [StorableConstructor]
+    private AlbaIntraRouteInversionManipulator(bool deserializing) : base(deserializing) { }
+
+    public AlbaIntraRouteInversionManipulator()
+      : base() {
+     }
+
+    public static void Apply(AlbaEncoding individual, int index1, int index2) {
+      if (index1 != -1 && index2 != -1) {
+        int breakPoint1 = index1 + 1;
+        int breakPoint2 = index2;
+        for (int i = 0; i <= (breakPoint2 - breakPoint1) / 2; i++) {  // invert permutation between breakpoints
+          int temp = individual[breakPoint1 + i];
+          individual[breakPoint1 + i] = individual[breakPoint2 - i];
+          individual[breakPoint2 - i] = temp;
+        }
+      }
+    }
+
+    protected override void Manipulate(IRandom rand, AlbaEncoding individual) {
+      int index1 = -1;
+      int index2 = -1;
+
+      List<Tour> validTours = new List<Tour>();
+      foreach (Tour tour in individual.GetTours()) {
+        if (tour.Cities.Count >= 4)
+          validTours.Add(tour);
+      }
+
+      if (validTours.Count > 0) {
+        Tour chosenTour = validTours[rand.Next(validTours.Count)];
+        int currentTourStart = -1;
+        for (int i = 0; i < individual.Length; i++) {
+          if (individual[i] + 1 == chosenTour.Cities[0]) {
+            currentTourStart = i;
+            break;
+          }
+        }
+
+        int currentTourEnd = currentTourStart;
+        while (currentTourEnd < individual.Length && 
+          individual[currentTourEnd] < individual.Cities) {
+          currentTourEnd++;
+        }
+
+        int tourLength = currentTourEnd - currentTourStart;
+        int a = rand.Next(tourLength - 3);
+        index1 = currentTourStart + a;
+        index2 = currentTourStart + rand.Next(a + 2, tourLength - 1);
+      }
+
+      Apply(individual, index1, index2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaLambdaInterchangeManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaLambdaInterchangeManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaLambdaInterchangeManipulator.cs	(revision 4352)
@@ -0,0 +1,125 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaLambdaInterchangeManipulator", "An operator which applies the lambda interchange operation to a VRP representation. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaLambdaInterchangeManipulator : AlbaManipulator {
+    public IValueParameter<IntValue> LambdaParameter {
+      get { return (IValueParameter<IntValue>)Parameters["Lambda"]; }
+    }
+    
+    [StorableConstructor]
+    private AlbaLambdaInterchangeManipulator(bool deserializing) : base(deserializing) { }
+
+    public AlbaLambdaInterchangeManipulator()
+      : base() {
+        Parameters.Add(new ValueParameter<IntValue>("Lambda", "The lambda value.", new IntValue(1)));
+     }
+
+    public static void Apply(AlbaEncoding individual, int tour1Index, int position1, int length1, 
+      int tour2Index, int position2, int length2) {
+      List<Tour> tours = individual.GetTours();
+
+      Tour tour1 = tours[tour1Index];
+      int tour1Start = -1;
+      for (int i = 0; i < individual.Length; i++) {
+        if (individual[i] == tour1.Cities[0] - 1) {
+          tour1Start = i;
+          break;
+        }
+      }
+
+      Tour tour2 = tours[tour2Index];
+      int tour2Start = -1;
+      for (int i = 0; i < individual.Length; i++) {
+        if (individual[i] == tour2.Cities[0] - 1) {
+          tour2Start = i;
+          break;
+        }
+      }
+
+      AlbaEncoding original = individual.Clone() as AlbaEncoding;
+      int index = 0;
+
+      int start1 = tour1Start + position1;
+      int end1 = start1 + length1;
+
+      int start2 = tour2Start + position2;
+      int end2 = start2 + length2;
+
+      for (int i = 0; i < original.Length; i++) {
+        if (index == start1) {
+          if (end2 - start2 == 0)
+            index = end1;
+          else
+            index = start2;
+        } else if (index == start2) {
+          if (end1 - start1 == 0)
+            index = end2;
+          else
+            index = start1;
+        } else if (index == end1) {
+          index = end2;
+        } else if (index == end2) {
+          index = end1;
+        }
+
+        individual[i] = original[index];
+
+        index++;
+      }
+    }
+
+    protected override void Manipulate(IRandom rand, AlbaEncoding individual) {
+      List<Tour> tours = individual.GetTours();
+      int lambda = LambdaParameter.Value.Value;
+
+      int route1Index = rand.Next(tours.Count);
+      Tour route1 = tours[route1Index];
+
+      int route2Index = rand.Next(tours.Count - 1);
+      if (route2Index >= route1Index)
+        route2Index += 1;
+      Tour route2 = tours[route2Index];
+
+      int length1 = rand.Next(Math.Min(lambda + 1, route1.Cities.Count + 1));
+      int index1 = rand.Next(route1.Cities.Count - length1 + 1);
+
+      int l2Min = 0;
+      if (length1 == 0)
+        l2Min = 1;
+      int length2 = rand.Next(l2Min, Math.Min(lambda + 1, route2.Cities.Count + 1));
+      int index2 = rand.Next(route2.Cities.Count - length2 + 1);
+
+      Apply(individual, route1Index, index1, length1,
+        route2Index, index2, length2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaManipulator.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaManipulator.cs	(revision 4352)
@@ -62,5 +62,5 @@
       IVRPEncoding solution = VRPToursParameter.ActualValue;
       if (!(solution is AlbaEncoding)) {
-        VRPToursParameter.ActualValue = AlbaEncoding.ConvertFrom(solution, VehiclesParameter.ActualValue.Value);
+        VRPToursParameter.ActualValue = AlbaEncoding.ConvertFrom(solution, VehiclesParameter.ActualValue.Value, DistanceMatrixParameter);
       }
 
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaPermutationManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaPermutationManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaPermutationManipulator.cs	(revision 4352)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("PermutationManipulator", "An operator which manipulates a VRP representation by using a standard permutation manipulator.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaPermutationManipualtor : AlbaManipulator {
+    public IValueLookupParameter<IPermutationManipulator> InnerManipulatorParameter {
+      get { return (IValueLookupParameter<IPermutationManipulator>)Parameters["InnerManipulator"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaPermutationManipualtor(bool deserializing) : base(deserializing) { }
+
+    public AlbaPermutationManipualtor()
+      : base() {
+        Parameters.Add(new ValueLookupParameter<IPermutationManipulator>("InnerManipulator", "The permutation manipulator.", new TranslocationManipulator()));
+    }
+
+    protected override void Manipulate(IRandom random, AlbaEncoding individual) {
+      InnerManipulatorParameter.ActualValue.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(
+        InnerManipulatorParameter.ActualValue, this.ExecutionContext.Scope);
+      op.Operator.Execute((IExecutionContext)op);
+    }
+  }
+}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/CustomerInsertionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/CustomerInsertionManipulator.cs	(revision 4351)
+++ 	(revision )
@@ -1,67 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("CustomerInsertionManipulator", "An operator which manipulates a VRP representation by inserting a customer in another place.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
-  [StorableClass]
-  public sealed class CustomerInsertionManipulator : AlbaManipulator {
-    [StorableConstructor]
-    private CustomerInsertionManipulator(bool deserializing) : base(deserializing) { }
-
-    public CustomerInsertionManipulator()
-      : base() {
-    }
-
-    protected override void Manipulate(IRandom random, AlbaEncoding individual) {
-      AlbaEncoding original = (AlbaEncoding)individual.Clone();
-      int cutIndex, insertIndex, number;
-
-      int customer = random.Next(Cities);
-      cutIndex = FindCustomerLocation(customer, individual);
-
-      insertIndex = random.Next(original.Length);
-      number = original[cutIndex];
-
-      int i = 0;  // index in new permutation
-      int j = 0;  // index in old permutation
-      while (i < original.Length) {
-        if (j == cutIndex) {
-          j++;
-        }
-        if (i == insertIndex) {
-          individual[i] = number;
-          i++;
-        }
-        if ((i < original.Length) && (j < original.Length)) {
-          individual[i] = original[j];
-          i++;
-          j++;
-        }
-      }
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/CustomerInversionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/CustomerInversionManipulator.cs	(revision 4351)
+++ 	(revision )
@@ -1,63 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("CustomerInversionManipulator", "An operator which manipulates a VRP representation by inverting the order the customers are visited.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
-  [StorableClass]
-  public sealed class CustomerInversionManipulator : AlbaManipulator {
-    [StorableConstructor]
-    private CustomerInversionManipulator(bool deserializing) : base(deserializing) { }
-
-    public CustomerInversionManipulator()
-      : base() {
-    }
-
-    protected override void Manipulate(IRandom random, AlbaEncoding individual) {
-      int breakPoint1, breakPoint2;
-
-      int customer1 = random.Next(Cities);
-      breakPoint1 = FindCustomerLocation(customer1, individual);
-
-      int customer2 = random.Next(Cities);
-      breakPoint2 = FindCustomerLocation(customer1, individual);
-
-      List<int> visitingOrder = new List<int>();
-      for (int i = breakPoint1; i <= breakPoint2; i++) {
-        if (individual[i] != 0)
-          visitingOrder.Add(individual[i]);
-      }
-      visitingOrder.Reverse();
-      for (int i = breakPoint1; i <= breakPoint2; i++) {
-        if (individual[i] != 0) {
-          individual[i] = visitingOrder[0];
-          visitingOrder.RemoveAt(0);
-        }
-      }
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/CustomerSwapManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/CustomerSwapManipulator.cs	(revision 4351)
+++ 	(revision )
@@ -1,53 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("CustomerSwapManipulator", "An operator which manipulates a VRP representation by swapping two customers.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
-  [StorableClass]
-  public sealed class CustomerSwapManipulator : AlbaManipulator {
-    [StorableConstructor]
-    private CustomerSwapManipulator(bool deserializing) : base(deserializing) { }
-
-    public CustomerSwapManipulator()
-      : base() {
-    }
-
-    protected override void Manipulate(IRandom random, AlbaEncoding individual) {
-      int index1, index2, temp;
-
-      int customer1 = random.Next(Cities);
-      index1 = FindCustomerLocation(customer1, individual);
-
-      int customer2 = random.Next(Cities);
-      index2 = FindCustomerLocation(customer2, individual);
-
-      temp = individual[index1];
-      individual[index1] = individual[index2];
-      individual[index2] = temp;
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/IntraRouteInversionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/IntraRouteInversionManipulator.cs	(revision 4351)
+++ 	(revision )
@@ -1,88 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-using System;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("IntraRouteInversionManipulator", "An operator which applies the SLS operation to a VRP representation. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
-  [StorableClass]
-  public sealed class IntraRouteInversionManipulator : AlbaManipulator {   
-    [StorableConstructor]
-    private IntraRouteInversionManipulator(bool deserializing) : base(deserializing) { }
-
-    public IntraRouteInversionManipulator()
-      : base() {
-     }
-
-    public static void Apply(AlbaEncoding individual, int index1, int index2) {
-      if (index1 != -1 && index2 != -1) {
-        int breakPoint1 = index1 + 1;
-        int breakPoint2 = index2;
-        for (int i = 0; i <= (breakPoint2 - breakPoint1) / 2; i++) {  // invert permutation between breakpoints
-          int temp = individual[breakPoint1 + i];
-          individual[breakPoint1 + i] = individual[breakPoint2 - i];
-          individual[breakPoint2 - i] = temp;
-        }
-      }
-    }
-
-    protected override void Manipulate(IRandom rand, AlbaEncoding individual) {
-      int index1 = -1;
-      int index2 = -1;
-
-      List<Tour> validTours = new List<Tour>();
-      foreach (Tour tour in individual.Tours) {
-        if (tour.Cities.Count >= 4)
-          validTours.Add(tour);
-      }
-
-      if (validTours.Count > 0) {
-        Tour chosenTour = validTours[rand.Next(validTours.Count)];
-        int currentTourStart = -1;
-        for (int i = 0; i < individual.Length; i++) {
-          if (individual[i] + 1 == chosenTour.Cities[0]) {
-            currentTourStart = i;
-            break;
-          }
-        }
-
-        int currentTourEnd = currentTourStart;
-        while (currentTourEnd < individual.Length && 
-          individual[currentTourEnd] < individual.Cities) {
-          currentTourEnd++;
-        }
-
-        int tourLength = currentTourEnd - currentTourStart;
-        int a = rand.Next(tourLength - 3);
-        index1 = currentTourStart + a;
-        index2 = currentTourStart + rand.Next(a + 2, tourLength - 1);
-      }
-
-      Apply(individual, index1, index2);
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/LambdaInterchangeManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/LambdaInterchangeManipulator.cs	(revision 4351)
+++ 	(revision )
@@ -1,121 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-using System;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("LambdaInterchangeManipulator", "An operator which applies the lambda interchange operation to a VRP representation. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
-  [StorableClass]
-  public sealed class LambdaInterchangeManipulator : AlbaManipulator {
-    public IValueParameter<IntValue> LambdaParameter {
-      get { return (IValueParameter<IntValue>)Parameters["Lambda"]; }
-    }
-    
-    [StorableConstructor]
-    private LambdaInterchangeManipulator(bool deserializing) : base(deserializing) { }
-
-    public LambdaInterchangeManipulator()
-      : base() {
-        Parameters.Add(new ValueParameter<IntValue>("Lambda", "The lambda value.", new IntValue(1)));
-     }
-
-    public static void Apply(AlbaEncoding individual, int tour1Index, int position1, int length1, 
-      int tour2Index, int position2, int length2) {
-      Tour tour1 = individual.Tours[tour1Index];
-      int tour1Start = -1;
-      for (int i = 0; i < individual.Length; i++) {
-        if (individual[i] == tour1.Cities[0] - 1) {
-          tour1Start = i;
-          break;
-        }
-      }
-
-      Tour tour2 = individual.Tours[tour2Index];
-      int tour2Start = -1;
-      for (int i = 0; i < individual.Length; i++) {
-        if (individual[i] == tour2.Cities[0] - 1) {
-          tour2Start = i;
-          break;
-        }
-      }
-
-      AlbaEncoding original = individual.Clone() as AlbaEncoding;
-      int index = 0;
-
-      int start1 = tour1Start + position1;
-      int end1 = start1 + length1;
-
-      int start2 = tour2Start + position2;
-      int end2 = start2 + length2;
-
-      for (int i = 0; i < original.Length; i++) {
-        if (index == start1) {
-          if (end2 - start2 == 0)
-            index = end1;
-          else
-            index = start2;
-        } else if (index == start2) {
-          if (end1 - start1 == 0)
-            index = end2;
-          else
-            index = start1;
-        } else if (index == end1) {
-          index = end2;
-        } else if (index == end2) {
-          index = end1;
-        }
-
-        individual[i] = original[index];
-
-        index++;
-      }
-    }
-
-    protected override void Manipulate(IRandom rand, AlbaEncoding individual) {
-      int lambda = LambdaParameter.Value.Value;
-      
-      int route1Index = rand.Next(individual.Tours.Count);
-      Tour route1 = individual.Tours[route1Index];
-
-      int route2Index = rand.Next(individual.Tours.Count - 1);
-      if (route2Index >= route1Index)
-        route2Index += 1;
-      Tour route2 = individual.Tours[route2Index];
-
-      int length1 = rand.Next(Math.Min(lambda + 1, route1.Cities.Count + 1));
-      int index1 = rand.Next(route1.Cities.Count - length1 + 1);
-
-      int l2Min = 0;
-      if (length1 == 0)
-        l2Min = 1;
-      int length2 = rand.Next(l2Min, Math.Min(lambda + 1, route2.Cities.Count + 1));
-      int index2 = rand.Next(route2.Cities.Count - length2 + 1);
-
-      Apply(individual, route1Index, index1, length1,
-        route2Index, index2, length2);
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/PermutationManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/PermutationManipulator.cs	(revision 4351)
+++ 	(revision )
@@ -1,52 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("PermutationManipulator", "An operator which manipulates a VRP representation by using a standard permutation manipulator.")]
-  [StorableClass]
-  public sealed class PermutationManipualtor : AlbaManipulator {
-    public IValueLookupParameter<IPermutationManipulator> InnerManipulatorParameter {
-      get { return (IValueLookupParameter<IPermutationManipulator>)Parameters["InnerManipulator"]; }
-    }
-
-    [StorableConstructor]
-    private PermutationManipualtor(bool deserializing) : base(deserializing) { }
-
-    public PermutationManipualtor()
-      : base() {
-        Parameters.Add(new ValueLookupParameter<IPermutationManipulator>("InnerManipulator", "The permutation manipulator.", new TranslocationManipulator()));
-    }
-
-    protected override void Manipulate(IRandom random, AlbaEncoding individual) {
-      InnerManipulatorParameter.ActualValue.PermutationParameter.ActualName = VRPToursParameter.ActualName;
-
-      IAtomicOperation op = this.ExecutionContext.CreateOperation(
-        InnerManipulatorParameter.ActualValue, this.ExecutionContext.Scope);
-      op.Operator.Execute((IExecutionContext)op);
-    }
-  }
-}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaMoveMaker.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaMoveMaker.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaMoveMaker.cs	(revision 4352)
@@ -26,5 +26,5 @@
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("PermutationTranslocationMoveMaker", "An operator which makes translocation moves for the Alba representation.")]
+  [Item("AlbaTranslocationMoveMaker", "An operator which makes translocation moves for the Alba representation.")]
   [StorableClass]
   public abstract class AlbaMoveMaker : AlbaMoveOperator {
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaMoveOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaMoveOperator.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaMoveOperator.cs	(revision 4352)
@@ -41,5 +41,6 @@
       IVRPEncoding solution = VRPToursParameter.ActualValue;
       if (!(solution is AlbaEncoding)) {
-        VRPToursParameter.ActualValue = AlbaEncoding.ConvertFrom(solution, VehiclesParameter.ActualValue.Value);
+        VRPToursParameter.ActualValue = AlbaEncoding.ConvertFrom(solution, VehiclesParameter.ActualValue.Value, 
+          DistanceMatrixParameter);
       }
 
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaPermutationMoveOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaPermutationMoveOperator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaPermutationMoveOperator.cs	(revision 4352)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaPermutationMoveOperator", "A move operator for an Alba VRP representation using an inner permutation move operator.")]
+  [StorableClass]
+  public abstract class AlbaPermutationMoveOperator : AlbaMoveOperator {    
+    [Storable]
+    protected abstract IPermutationMoveOperator PermutationMoveOperatorParameter { get; set; }
+
+    [StorableConstructor]
+    protected AlbaPermutationMoveOperator(bool deserializing) : base(deserializing) { }
+
+    public AlbaPermutationMoveOperator()
+      : base() 
+    {
+    }
+
+    public override IOperation Apply() {
+      IOperation next = base.Apply();
+      
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+
+      PermutationMoveOperatorParameter.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateChildOperation(PermutationMoveOperatorParameter);
+      op.Operator.Execute((IExecutionContext)op);
+
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/Interfaces/IAlbaIntraRouteInversionMoveOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/Interfaces/IAlbaIntraRouteInversionMoveOperator.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/Interfaces/IAlbaIntraRouteInversionMoveOperator.cs	(revision 4352)
@@ -26,5 +26,5 @@
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
   public interface IAlbaIntraRouteInversionMoveOperator : IVRPMoveOperator {
-    ILookupParameter<IntraRouteInversionMove> IntraRouteInversionMoveParameter { get; }
+    ILookupParameter<AlbaIntraRouteInversionMove> IntraRouteInversionMoveParameter { get; }
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/Interfaces/IAlbaLambdaInterchangeMoveOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/Interfaces/IAlbaLambdaInterchangeMoveOperator.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/Interfaces/IAlbaLambdaInterchangeMoveOperator.cs	(revision 4352)
@@ -26,5 +26,5 @@
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
   public interface IAlbaLambdaInterchangeMoveOperator : IVRPMoveOperator {
-    ILookupParameter<LambdaInterchangeMove> LambdaInterchangeMoveParameter { get; }
+    ILookupParameter<AlbaLambdaInterchangeMove> LambdaInterchangeMoveParameter { get; }
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaExhaustiveIntraRouteInversionMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaExhaustiveIntraRouteInversionMoveGenerator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaExhaustiveIntraRouteInversionMoveGenerator.cs	(revision 4352)
@@ -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;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Parameters;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaExhaustiveIntraRouteInversionGenerator", "Generates all possible intra route inversion moves from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaExhaustiveIntraRouteInversionGenerator : AlbaIntraRouteInversionMoveGenerator, IExhaustiveMoveGenerator, IAlbaIntraRouteInversionMoveOperator {
+    [StorableConstructor]
+    private AlbaExhaustiveIntraRouteInversionGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaExhaustiveIntraRouteInversionGenerator()
+      : base() {
+    }
+
+    protected override AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual) {
+      List<AlbaIntraRouteInversionMove> moves = new List<AlbaIntraRouteInversionMove>();
+
+      int currentTourStart = 0;
+      int currentTourEnd = 0;
+      while(currentTourEnd != individual.Length) {
+        currentTourEnd = currentTourStart;
+        while (individual[currentTourEnd] < individual.Cities && 
+          currentTourEnd < individual.Length) {
+          currentTourEnd++;
+        }
+
+        int tourLength = currentTourEnd - currentTourStart;
+        if (tourLength >= 4) {
+          for (int i = 0; i <= tourLength - 4; i++ ) {
+            for (int j = i + 2; j <= tourLength - 2; j++) {
+              AlbaIntraRouteInversionMove move = new AlbaIntraRouteInversionMove(
+                currentTourStart + i, 
+                currentTourStart + j, 
+                individual);
+
+              moves.Add(move);
+            }
+          }
+        }
+
+        currentTourStart = currentTourEnd;
+      }
+
+      return moves.ToArray();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionEvaluator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionEvaluator.cs	(revision 4352)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("AlbaIntraRouteInversionMoveEvaluator", "Evaluates a intra route inversion move for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaIntraRouteInversionMoveEvaluator : VRPMoveEvaluator, IAlbaIntraRouteInversionMoveOperator {
+    public ILookupParameter<AlbaIntraRouteInversionMove> IntraRouteInversionMoveParameter {
+      get { return (ILookupParameter<AlbaIntraRouteInversionMove>)Parameters["AlbaIntraRouteInversionMove"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaIntraRouteInversionMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public AlbaIntraRouteInversionMoveEvaluator()
+      : base() {
+        Parameters.Add(new LookupParameter<AlbaIntraRouteInversionMove>("AlbaIntraRouteInversionMove", "The move to evaluate."));
+    }
+
+    public static TourEvaluation GetMoveQuality(AlbaEncoding individual, AlbaIntraRouteInversionMove move,
+      IntValue vehicles,
+      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray,
+      DoubleArray demandArray, DoubleValue capacity, DoubleMatrix coordinates,
+      DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor,
+      DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
+      ILookupParameter<DoubleMatrix> distanceMatrix, Data.BoolValue useDistanceMatrix) {
+      AlbaEncoding newSolution = individual.Clone() as AlbaEncoding;
+      AlbaIntraRouteInversionMoveMaker.Apply(newSolution, move);
+
+      return VRPEvaluator.Evaluate(
+        newSolution, vehicles, dueTimeArray, serviceTimeArray, readyTimeArray,
+        demandArray, capacity, fleetUsageFactor, timeFactor, distanceFactor,
+        overloadPenalty, tardinessPenalty, coordinates, distanceMatrix, useDistanceMatrix);
+    }
+
+    protected override TourEvaluation GetMoveQuality() {
+      return GetMoveQuality(
+        VRPToursParameter.ActualValue as AlbaEncoding, IntraRouteInversionMoveParameter.ActualValue,
+        VehiclesParameter.ActualValue,
+        DueTimeParameter.ActualValue, ServiceTimeParameter.ActualValue, ReadyTimeParameter.ActualValue,
+        DemandParameter.ActualValue, CapacityParameter.ActualValue, CoordinatesParameter.ActualValue,
+        FleetUsageFactor.ActualValue, TimeFactor.ActualValue, DistanceFactor.ActualValue, OverloadPenalty.ActualValue,
+        TardinessPenalty.ActualValue, DistanceMatrixParameter, UseDistanceMatrixParameter.ActualValue);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMove.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMove.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMove.cs	(revision 4352)
@@ -0,0 +1,82 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("InversionMove", "Item that describes an intra route inversion move on a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public class AlbaIntraRouteInversionMove : TwoIndexMove, IVRPMove {
+    public IVRPEncoding Individual { get { return Permutation as AlbaEncoding; } }
+    
+    public AlbaIntraRouteInversionMove()
+      : base() {
+    }
+
+    public AlbaIntraRouteInversionMove(int index1, int index2)
+      : base(index1, index2, null) {
+    }
+
+    public AlbaIntraRouteInversionMove(int index1, int index2, AlbaEncoding permutation)
+      : base(index1, index2, permutation) {
+        this.Permutation = permutation.Clone() as AlbaEncoding;
+    }
+
+    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
+      AlbaIntraRouteInversionMove clone = new AlbaIntraRouteInversionMove(
+        Index1, Index2);
+
+      if (Permutation != null)
+        clone.Permutation = (AlbaEncoding)cloner.Clone(Permutation);
+
+      cloner.RegisterClonedObject(this, clone);
+      return clone;
+    }
+
+    #region IVRPMove Members
+
+    public TourEvaluation GetMoveQuality(
+      IntValue vehicles,
+      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, 
+      DoubleArray demandArray, DoubleValue capacity, DoubleMatrix coordinates,
+      DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor,
+      DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
+      ILookupParameter<DoubleMatrix> distanceMatrix, Data.BoolValue useDistanceMatrix) {
+        return AlbaIntraRouteInversionMoveEvaluator.GetMoveQuality(Permutation as AlbaEncoding, this, vehicles,
+          dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
+          coordinates, fleetUsageFactor, timeFactor, distanceFactor,
+          overloadPenalty, tardinessPenalty, distanceMatrix, useDistanceMatrix);
+    }
+
+    public IVRPEncoding MakeMove() {
+      AlbaIntraRouteInversionMoveMaker.Apply(Individual as AlbaEncoding, this);
+
+      return Individual;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveGenerator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveGenerator.cs	(revision 4352)
@@ -0,0 +1,68 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Parameters;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaIntraRouteInversionMoveGenerator", "Generates intra route inversion moves from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public abstract class AlbaIntraRouteInversionMoveGenerator : AlbaMoveOperator, IExhaustiveMoveGenerator, IAlbaIntraRouteInversionMoveOperator {
+    public ILookupParameter<AlbaIntraRouteInversionMove> IntraRouteInversionMoveParameter {
+      get { return (ILookupParameter<AlbaIntraRouteInversionMove>)Parameters["AlbaIntraRouteInversionMove"]; }
+    }
+
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected AlbaIntraRouteInversionMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaIntraRouteInversionMoveGenerator()
+      : base() {
+        Parameters.Add(new LookupParameter<AlbaIntraRouteInversionMove>("AlbaIntraRouteInversionMove", "The moves that should be generated in subscopes."));
+        Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    protected abstract AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual);
+
+    public override IOperation Apply() {
+      IOperation next = base.Apply();
+
+      AlbaEncoding individual = VRPToursParameter.ActualValue as AlbaEncoding;
+      AlbaIntraRouteInversionMove[] moves = GenerateMoves(individual);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(IntraRouteInversionMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveMaker.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveMaker.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveMaker.cs	(revision 4352)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaIntraRouteInversionMoveMaker", "Peforms the SLS move on a given VRP encoding and updates the quality.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public class AlbaIntraRouteInversionMoveMaker : AlbaMoveMaker, IAlbaIntraRouteInversionMoveOperator, IMoveMaker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<AlbaIntraRouteInversionMove> IntraRouteInversionMoveParameter {
+      get { return (ILookupParameter<AlbaIntraRouteInversionMove>)Parameters["AlbaIntraRouteInversionMove"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaIntraRouteInversionMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public AlbaIntraRouteInversionMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new LookupParameter<AlbaIntraRouteInversionMove>("AlbaIntraRouteInversionMove", "The move to make."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
+    }
+
+    public static void Apply(AlbaEncoding solution, AlbaIntraRouteInversionMove move) {
+      AlbaIntraRouteInversionManipulator.Apply(solution, move.Index1, move.Index2);
+    }
+
+    public override IOperation Apply() {
+      IOperation next = base.Apply();
+      
+      AlbaIntraRouteInversionMove move = IntraRouteInversionMoveParameter.ActualValue;
+      DoubleValue moveQuality = MoveQualityParameter.ActualValue;
+      DoubleValue quality = QualityParameter.ActualValue;
+     
+      //perform move
+      VRPToursParameter.ActualValue = move.MakeMove();
+
+      quality.Value = moveQuality.Value;
+
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionMutliMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionMutliMoveGenerator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionMutliMoveGenerator.cs	(revision 4352)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Parameters;
+using System.Collections.Generic;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaStochasticIntraRouteInversionMultiMoveGenerator", "Generates multiple random intra route inversion moves from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaStochasticIntraRouteInversionMultiMoveGenerator : AlbaIntraRouteInversionMoveGenerator, IStochasticOperator, IMultiMoveGenerator, IAlbaIntraRouteInversionMoveOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+    
+    [StorableConstructor]
+    private AlbaStochasticIntraRouteInversionMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaStochasticIntraRouteInversionMultiMoveGenerator()
+      : base() {
+        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+        Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    protected override AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual) {
+      int sampleSize = SampleSizeParameter.ActualValue.Value;
+
+      AlbaIntraRouteInversionMove[] moves = new AlbaIntraRouteInversionMove[sampleSize];
+      for (int i = 0; i < sampleSize; i++) {
+        moves[i] = AlbaStochasticIntraRouteInversionSingleMoveGenerator.Apply(
+          individual, Cities, RandomParameter.ActualValue);
+      }
+
+      return moves;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionSingleMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionSingleMoveGenerator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionSingleMoveGenerator.cs	(revision 4352)
@@ -0,0 +1,101 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Parameters;
+using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaStochasticIntraRouteInversionSingleMoveGenerator", "Generates one random intra route inversion move from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaStochasticIntraRouteInversionSingleMoveGenerator : AlbaIntraRouteInversionMoveGenerator,
+    IStochasticOperator, ISingleMoveGenerator, IAlbaIntraRouteInversionMoveOperator, IMultiVRPMoveGenerator {
+    #region IMultiVRPMoveOperator Members
+
+    public ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["AlbaIntraRouteInversionMove"]; }
+    }
+
+    #endregion
+    
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    
+    [StorableConstructor]
+    private AlbaStochasticIntraRouteInversionSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaStochasticIntraRouteInversionSingleMoveGenerator()
+      : base() {
+        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    public static AlbaIntraRouteInversionMove Apply(AlbaEncoding individual, int cities, IRandom rand) {
+      int index1 = -1;
+      int index2 = -1;
+
+      List<Tour> validTours = new List<Tour>();
+      foreach (Tour tour in individual.GetTours()) {
+        if (tour.Cities.Count >= 4)
+          validTours.Add(tour);
+      }
+
+      if (validTours.Count > 0) {
+        Tour chosenTour = validTours[rand.Next(validTours.Count)];
+        int currentTourStart = -1;
+        for (int i = 0; i < individual.Length; i++) {
+          if (individual[i] + 1 == chosenTour.Cities[0]) {
+            currentTourStart = i;
+            break;
+          }
+        }
+
+        int currentTourEnd = currentTourStart;
+        while (currentTourEnd < individual.Length && 
+          individual[currentTourEnd] < individual.Cities) {
+          currentTourEnd++;
+        }
+
+        int tourLength = currentTourEnd - currentTourStart;
+        int a = rand.Next(tourLength - 3);
+        index1 = currentTourStart + a;
+        index2 = currentTourStart + rand.Next(a + 2, tourLength - 1);
+      }
+
+      return new AlbaIntraRouteInversionMove(index1, index2, individual);
+    }
+
+    protected override AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual) {
+      List<AlbaIntraRouteInversionMove> moves = new List<AlbaIntraRouteInversionMove>();
+
+      AlbaIntraRouteInversionMove move = Apply(individual, Cities, RandomParameter.ActualValue);
+      if(move != null)
+        moves.Add(move);
+
+      return moves.ToArray();
+    }
+  }
+}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/ExhaustiveIntraRouteInversionMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/ExhaustiveIntraRouteInversionMoveGenerator.cs	(revision 4351)
+++ 	(revision )
@@ -1,73 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
-using HeuristicLab.Parameters;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("ExhaustiveIntraRouteInversionGenerator", "Generates all possible intra route inversion moves from a given VRP encoding.")]
-  [StorableClass]
-  public sealed class ExhaustiveIntraRouteInversionGenerator : IntraRouteInversionMoveGenerator, IExhaustiveMoveGenerator, IAlbaIntraRouteInversionMoveOperator {
-    [StorableConstructor]
-    private ExhaustiveIntraRouteInversionGenerator(bool deserializing) : base(deserializing) { }
-
-    public ExhaustiveIntraRouteInversionGenerator()
-      : base() {
-    }
-
-    protected override IntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual) {
-      List<IntraRouteInversionMove> moves = new List<IntraRouteInversionMove>();
-
-      int currentTourStart = 0;
-      int currentTourEnd = 0;
-      while(currentTourEnd != individual.Length) {
-        currentTourEnd = currentTourStart;
-        while (individual[currentTourEnd] < individual.Cities && 
-          currentTourEnd < individual.Length) {
-          currentTourEnd++;
-        }
-
-        int tourLength = currentTourEnd - currentTourStart;
-        if (tourLength >= 4) {
-          for (int i = 0; i <= tourLength - 4; i++ ) {
-            for (int j = i + 2; j <= tourLength - 2; j++) {
-              IntraRouteInversionMove move = new IntraRouteInversionMove(
-                currentTourStart + i, 
-                currentTourStart + j, 
-                individual);
-
-              moves.Add(move);
-            }
-          }
-        }
-
-        currentTourStart = currentTourEnd;
-      }
-
-      return moves.ToArray();
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/IntraRouteInversionEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/IntraRouteInversionEvaluator.cs	(revision 4351)
+++ 	(revision )
@@ -1,69 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting {
-  [Item("IntraRouteInversionMoveEvaluator", "Evaluates a intra route inversion move for a VRP representation.")]
-  [StorableClass]
-  public sealed class IntraRouteInversionMoveEvaluator : VRPMoveEvaluator, IAlbaIntraRouteInversionMoveOperator {
-    public ILookupParameter<IntraRouteInversionMove> IntraRouteInversionMoveParameter {
-      get { return (ILookupParameter<IntraRouteInversionMove>)Parameters["IntraRouteInversionMove"]; }
-    }
-
-    [StorableConstructor]
-    private IntraRouteInversionMoveEvaluator(bool deserializing) : base(deserializing) { }
-
-    public IntraRouteInversionMoveEvaluator()
-      : base() {
-        Parameters.Add(new LookupParameter<IntraRouteInversionMove>("IntraRouteInversionMove", "The move to evaluate."));
-    }
-
-    public static TourEvaluation GetMoveQuality(AlbaEncoding individual, IntraRouteInversionMove move,
-      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray,
-      DoubleArray demandArray, DoubleValue capacity, DoubleMatrix coordinates,
-      DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor,
-      DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
-      ILookupParameter<DoubleMatrix> distanceMatrix, Data.BoolValue useDistanceMatrix) {
-      AlbaEncoding newSolution = individual.Clone() as AlbaEncoding;
-      IntraRouteInversionMoveMaker.Apply(newSolution, move);
-
-      return VRPEvaluator.Evaluate(
-        newSolution, dueTimeArray, serviceTimeArray, readyTimeArray,
-        demandArray, capacity, fleetUsageFactor, timeFactor, distanceFactor,
-        overloadPenalty, tardinessPenalty, coordinates, distanceMatrix, useDistanceMatrix);
-    }
-
-    protected override TourEvaluation GetMoveQuality() {
-      return GetMoveQuality(
-        VRPToursParameter.ActualValue as AlbaEncoding, IntraRouteInversionMoveParameter.ActualValue,
-        DueTimeParameter.ActualValue, ServiceTimeParameter.ActualValue, ReadyTimeParameter.ActualValue,
-        DemandParameter.ActualValue, CapacityParameter.ActualValue, CoordinatesParameter.ActualValue,
-        FleetUsageFactor.ActualValue, TimeFactor.ActualValue, DistanceFactor.ActualValue, OverloadPenalty.ActualValue,
-        TardinessPenalty.ActualValue, DistanceMatrixParameter, UseDistanceMatrixParameter.ActualValue);
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/IntraRouteInversionMove.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/IntraRouteInversionMove.cs	(revision 4351)
+++ 	(revision )
@@ -1,77 +1,0 @@
-﻿#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.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Common;
-using HeuristicLab.Problems.VehicleRouting.Encodings.General;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("InversionMove", "Item that describes an intra route inversion move on a VRP representation.")]
-  [StorableClass]
-  public class IntraRouteInversionMove : TwoIndexMove, IVRPMove {
-    public IntraRouteInversionMove()
-      : base() {
-    }
-
-    public IntraRouteInversionMove(int index1, int index2)
-      : base(index1, index2, null) {
-    }
-
-    public IntraRouteInversionMove(int index1, int index2, AlbaEncoding permutation)
-      : base(index1, index2, permutation) {
-    }
-
-    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
-      IntraRouteInversionMove clone = new IntraRouteInversionMove(
-        Index1, Index2);
-
-      if (Permutation != null)
-        clone.Permutation = (AlbaEncoding)cloner.Clone(Permutation);
-
-      cloner.RegisterClonedObject(this, clone);
-      return clone;
-    }
-
-    #region IVRPMove Members
-
-    public TourEvaluation GetMoveQuality(
-      IVRPEncoding individual, 
-      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, 
-      DoubleArray demandArray, DoubleValue capacity, DoubleMatrix coordinates,
-      DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor,
-      DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
-      ILookupParameter<DoubleMatrix> distanceMatrix, Data.BoolValue useDistanceMatrix) {
-        return IntraRouteInversionMoveEvaluator.GetMoveQuality(individual as AlbaEncoding, this,
-          dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
-          coordinates, fleetUsageFactor, timeFactor, distanceFactor,
-          overloadPenalty, tardinessPenalty, distanceMatrix, useDistanceMatrix);
-    }
-
-    public void MakeMove(IRandom random, IVRPEncoding individual) {
-      IntraRouteInversionMoveMaker.Apply(individual as AlbaEncoding, this);
-    }
-
-    #endregion
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/IntraRouteInversionMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/IntraRouteInversionMoveGenerator.cs	(revision 4351)
+++ 	(revision )
@@ -1,68 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
-using HeuristicLab.Parameters;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("IntraRouteInversionMoveGenerator", "Generates intra route inversion moves from a given VRP encoding.")]
-  [StorableClass]
-  public abstract class IntraRouteInversionMoveGenerator : AlbaMoveOperator, IExhaustiveMoveGenerator, IAlbaIntraRouteInversionMoveOperator {
-    public ILookupParameter<IntraRouteInversionMove> IntraRouteInversionMoveParameter {
-      get { return (ILookupParameter<IntraRouteInversionMove>)Parameters["IntraRouteInversionMove"]; }
-    }
-
-    protected ScopeParameter CurrentScopeParameter {
-      get { return (ScopeParameter)Parameters["CurrentScope"]; }
-    }
-
-    [StorableConstructor]
-    protected IntraRouteInversionMoveGenerator(bool deserializing) : base(deserializing) { }
-
-    public IntraRouteInversionMoveGenerator()
-      : base() {
-        Parameters.Add(new LookupParameter<IntraRouteInversionMove>("IntraRouteInversionMove", "The moves that should be generated in subscopes."));
-        Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
-    }
-
-    protected abstract IntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual);
-
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
-
-      AlbaEncoding individual = VRPToursParameter.ActualValue as AlbaEncoding;
-      IntraRouteInversionMove[] moves = GenerateMoves(individual);
-      Scope[] moveScopes = new Scope[moves.Length];
-      for (int i = 0; i < moveScopes.Length; i++) {
-        moveScopes[i] = new Scope(i.ToString());
-        moveScopes[i].Variables.Add(new Variable(IntraRouteInversionMoveParameter.ActualName, moves[i]));
-      }
-      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
-
-      return next;
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/IntraRouteInversionMoveMaker.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/IntraRouteInversionMoveMaker.cs	(revision 4351)
+++ 	(revision )
@@ -1,77 +1,0 @@
-﻿#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.Optimization;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("IntraRouteInversionMoveMaker", "Peforms the SLS move on a given VRP encoding and updates the quality.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
-  [StorableClass]
-  public class IntraRouteInversionMoveMaker : AlbaMoveMaker, IAlbaIntraRouteInversionMoveOperator, IMoveMaker {
-    public override bool CanChangeName {
-      get { return false; }
-    }
-    public ILookupParameter<DoubleValue> QualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
-    }
-    public ILookupParameter<DoubleValue> MoveQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
-    }
-    public ILookupParameter<IntraRouteInversionMove> IntraRouteInversionMoveParameter {
-      get { return (ILookupParameter<IntraRouteInversionMove>)Parameters["IntraRouteInversionMove"]; }
-    }
-
-    [StorableConstructor]
-    private IntraRouteInversionMoveMaker(bool deserializing) : base(deserializing) { }
-
-    public IntraRouteInversionMoveMaker()
-      : base() {
-      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
-      Parameters.Add(new LookupParameter<IntraRouteInversionMove>("IntraRouteInversionMove", "The move to make."));
-      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
-    }
-
-    public static void Apply(AlbaEncoding solution, IntraRouteInversionMove move) {
-      IntraRouteInversionManipulator.Apply(solution, move.Index1, move.Index2);
-    }
-
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
-      
-      AlbaEncoding solution = VRPToursParameter.ActualValue as AlbaEncoding;
-
-      IntraRouteInversionMove move = IntraRouteInversionMoveParameter.ActualValue;
-      DoubleValue moveQuality = MoveQualityParameter.ActualValue;
-      DoubleValue quality = QualityParameter.ActualValue;
-     
-      //perform move
-      Apply(solution, move);
-
-      quality.Value = moveQuality.Value;
-
-      return next;
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/StochasticIntraRouteInversionMutliMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/StochasticIntraRouteInversionMutliMoveGenerator.cs	(revision 4351)
+++ 	(revision )
@@ -1,64 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
-using HeuristicLab.Parameters;
-using System.Collections.Generic;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("StochasticIntraRouteInversionMultiMoveGenerator", "Generates multiple random intra route inversion moves from a given VRP encoding.")]
-  [StorableClass]
-  public sealed class StochasticIntraRouteInversionMultiMoveGenerator : IntraRouteInversionMoveGenerator, IStochasticOperator, IMultiMoveGenerator, IAlbaIntraRouteInversionMoveOperator {
-    public ILookupParameter<IRandom> RandomParameter {
-      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
-    }
-
-    public IValueLookupParameter<IntValue> SampleSizeParameter {
-      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
-    }
-    
-    [StorableConstructor]
-    private StochasticIntraRouteInversionMultiMoveGenerator(bool deserializing) : base(deserializing) { }
-
-    public StochasticIntraRouteInversionMultiMoveGenerator()
-      : base() {
-        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
-        Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
-    }
-
-    protected override IntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual) {
-      int sampleSize = SampleSizeParameter.ActualValue.Value;
-
-      IntraRouteInversionMove[] moves = new IntraRouteInversionMove[sampleSize];
-      for (int i = 0; i < sampleSize; i++) {
-        moves[i] = StochasticIntraRouteInversionSingleMoveGenerator.Apply(
-          individual, Cities, RandomParameter.ActualValue);
-      }
-
-      return moves;
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/StochasticIntraRouteInversionSingleMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/StochasticIntraRouteInversionSingleMoveGenerator.cs	(revision 4351)
+++ 	(revision )
@@ -1,101 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
-using HeuristicLab.Parameters;
-using System.Collections.Generic;
-using HeuristicLab.Problems.VehicleRouting.Encodings.General;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("StochasticIntraRouteInversionSingleMoveGenerator", "Generates one random intra route inversion move from a given VRP encoding.")]
-  [StorableClass]
-  public sealed class StochasticIntraRouteInversionSingleMoveGenerator : IntraRouteInversionMoveGenerator,
-    IStochasticOperator, ISingleMoveGenerator, IAlbaIntraRouteInversionMoveOperator, IMultiVRPMoveGenerator {
-    #region IMultiVRPMoveOperator Members
-
-    public ILookupParameter VRPMoveParameter {
-      get { return (ILookupParameter)Parameters["IntraRouteInversionMove"]; }
-    }
-
-    #endregion
-    
-    public ILookupParameter<IRandom> RandomParameter {
-      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
-    }
-    
-    [StorableConstructor]
-    private StochasticIntraRouteInversionSingleMoveGenerator(bool deserializing) : base(deserializing) { }
-
-    public StochasticIntraRouteInversionSingleMoveGenerator()
-      : base() {
-        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
-    }
-
-    public static IntraRouteInversionMove Apply(AlbaEncoding individual, int cities, IRandom rand) {
-      int index1 = -1;
-      int index2 = -1;
-
-      List<Tour> validTours = new List<Tour>();
-      foreach (Tour tour in individual.Tours) {
-        if (tour.Cities.Count >= 4)
-          validTours.Add(tour);
-      }
-
-      if (validTours.Count > 0) {
-        Tour chosenTour = validTours[rand.Next(validTours.Count)];
-        int currentTourStart = -1;
-        for (int i = 0; i < individual.Length; i++) {
-          if (individual[i] + 1 == chosenTour.Cities[0]) {
-            currentTourStart = i;
-            break;
-          }
-        }
-
-        int currentTourEnd = currentTourStart;
-        while (individual[currentTourEnd] < individual.Cities &&
-            currentTourEnd < individual.Length) {
-          currentTourEnd++;
-        }
-
-        int tourLength = currentTourEnd - currentTourStart;
-        int a = rand.Next(tourLength - 3);
-        index1 = currentTourStart + a;
-        index2 = currentTourStart + rand.Next(a + 2, tourLength - 1);
-      }
-
-      return new IntraRouteInversionMove(index1, index2, individual);
-    }
-
-    protected override IntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual) {
-      List<IntraRouteInversionMove> moves = new List<IntraRouteInversionMove>();
-
-      IntraRouteInversionMove move = Apply(individual, Cities, RandomParameter.ActualValue);
-      if(move != null)
-        moves.Add(move);
-
-      return moves.ToArray();
-    }
-  }
-}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaExhaustiveLambdaInterchangeMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaExhaustiveLambdaInterchangeMoveGenerator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaExhaustiveLambdaInterchangeMoveGenerator.cs	(revision 4352)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Parameters;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaExhaustiveLambdaInterchangeMoveGenerator", "Generates all possible lambda interchange moves from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaExhaustiveLambdaInterchangeMoveGenerator : AlbaLambdaInterchangeMoveGenerator, IExhaustiveMoveGenerator, IAlbaLambdaInterchangeMoveOperator {
+    [StorableConstructor]
+    private AlbaExhaustiveLambdaInterchangeMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaExhaustiveLambdaInterchangeMoveGenerator()
+      : base() {
+    }
+
+    protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda) {
+      List<AlbaLambdaInterchangeMove> moves = new List<AlbaLambdaInterchangeMove>();
+
+      List<Tour> tours = individual.GetTours();
+
+      for (int tour1Index = 0; tour1Index < tours.Count; tour1Index++) {
+        Tour tour1 = tours[tour1Index];
+        for (int tour2Index = tour1Index + 1; tour2Index < tours.Count; tour2Index++) {
+          Tour tour2 = tours[tour2Index];
+
+          for (int length1 = 0; length1 <= Math.Min(lambda, tour1.Cities.Count); length1++) {
+            for(int length2 = 0; length2 <= Math.Min(lambda, tour2.Cities.Count); length2++) {
+              if(length1 != 0 || length2 != 0) {
+                for(int index1 = 0; index1 < tour1.Cities.Count - length1 + 1; index1++) {
+                  for(int index2 = 0; index2 < tour2.Cities.Count - length2 + 1; index2++) {
+                    moves.Add(new AlbaLambdaInterchangeMove(tour1Index, index1, length1, 
+                      tour2Index, index2, length2, individual));
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+
+      return moves.ToArray();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMove.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMove.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMove.cs	(revision 4352)
@@ -0,0 +1,121 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Common;
+using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("InversionMove", "Item that describes a lambda move on a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public class AlbaLambdaInterchangeMove: Item, IVRPMove {
+    [Storable]
+    public IVRPEncoding Individual { get; protected set; }
+    
+    [Storable]
+    public int Tour1 { get; protected set; }
+
+    [Storable]
+    public int Position1 { get; protected set; }
+
+    [Storable]
+    public int Length1 { get; protected set; }
+
+    [Storable]
+    public int Tour2 { get; protected set; }
+
+    [Storable]
+    public int Position2 { get; protected set; }
+
+    [Storable]
+    public int Length2 { get; protected set; }
+    
+    public AlbaLambdaInterchangeMove(): base() {
+      Tour1 = -1;
+      Position1 = -1;
+      Length1 = -1;
+
+      Tour2 = -1;
+      Position2 = -1;
+      Length2 = -1;
+
+      Individual = null;
+    }
+
+    public AlbaLambdaInterchangeMove(int tour1, int position1, int length1, 
+      int tour2, int position2, int length2, AlbaEncoding permutation) {
+        Tour1 = tour1;
+        Position1 = position1;
+        Length1 = length1;
+
+        Tour2 = tour2;
+        Position2 = position2;
+        Length2 = length2;
+
+        this.Individual = permutation.Clone() as AlbaEncoding;
+    }
+
+    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
+      AlbaLambdaInterchangeMove clone = new AlbaLambdaInterchangeMove();
+
+      clone.Tour1 = Tour1;
+      clone.Position1 = Position1;
+      clone.Length1 = Length1;
+
+      clone.Tour2 = Tour2;
+      clone.Position2 = Position2;
+      clone.Length2 = Length2;
+
+      if (Individual != null)
+        clone.Individual = (AlbaEncoding)cloner.Clone(Individual);
+
+      cloner.RegisterClonedObject(this, clone);
+      return clone;
+    }
+
+    #region IVRPMove Members
+
+    public TourEvaluation GetMoveQuality(
+      IntValue vehicles,
+      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, 
+      DoubleArray demandArray, DoubleValue capacity, DoubleMatrix coordinates,
+      DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor,
+      DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
+      ILookupParameter<DoubleMatrix> distanceMatrix, Data.BoolValue useDistanceMatrix) {
+        return AlbaLambdaInterchangeMoveEvaluator.GetMoveQuality(Individual as AlbaEncoding, this, vehicles,
+          dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
+          coordinates, fleetUsageFactor, timeFactor, distanceFactor,
+          overloadPenalty, tardinessPenalty, distanceMatrix, useDistanceMatrix);
+    }
+
+    public IVRPEncoding MakeMove() {
+      AlbaLambdaInterchangeMoveMaker.Apply(Individual as AlbaEncoding, this);
+
+      return Individual;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveEvaluator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveEvaluator.cs	(revision 4352)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("AlbaLambdaInterchangeMoveEvaluator", "Evaluates a lamnbda interchange move for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaLambdaInterchangeMoveEvaluator : VRPMoveEvaluator, IAlbaLambdaInterchangeMoveOperator {
+    public ILookupParameter<AlbaLambdaInterchangeMove> LambdaInterchangeMoveParameter {
+      get { return (ILookupParameter<AlbaLambdaInterchangeMove>)Parameters["AlbaLambdaInterchangeMove"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaLambdaInterchangeMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public AlbaLambdaInterchangeMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<AlbaLambdaInterchangeMove>("AlbaLambdaInterchangeMove", "The move to evaluate."));
+    }
+
+    public static TourEvaluation GetMoveQuality(AlbaEncoding individual, AlbaLambdaInterchangeMove move, 
+      IntValue vehicles, 
+      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, 
+      DoubleArray demandArray, DoubleValue capacity, DoubleMatrix coordinates, 
+      DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor, 
+      DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
+      ILookupParameter<DoubleMatrix> distanceMatrix, Data.BoolValue useDistanceMatrix) {
+      AlbaEncoding newSolution = individual.Clone() as AlbaEncoding;
+      AlbaLambdaInterchangeMoveMaker.Apply(newSolution, move);
+
+      return VRPEvaluator.Evaluate(
+        newSolution, vehicles, dueTimeArray, serviceTimeArray, readyTimeArray, 
+        demandArray, capacity, fleetUsageFactor, timeFactor, distanceFactor, 
+        overloadPenalty, tardinessPenalty, coordinates, distanceMatrix, useDistanceMatrix);
+    }
+
+    protected override TourEvaluation GetMoveQuality() {
+      return GetMoveQuality(
+        VRPToursParameter.ActualValue as AlbaEncoding, LambdaInterchangeMoveParameter.ActualValue, 
+        VehiclesParameter.ActualValue,
+        DueTimeParameter.ActualValue, ServiceTimeParameter.ActualValue, ReadyTimeParameter.ActualValue,
+        DemandParameter.ActualValue, CapacityParameter.ActualValue, CoordinatesParameter.ActualValue, 
+        FleetUsageFactor.ActualValue, TimeFactor.ActualValue, DistanceFactor.ActualValue, OverloadPenalty.ActualValue, 
+        TardinessPenalty.ActualValue, DistanceMatrixParameter, UseDistanceMatrixParameter.ActualValue);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveGenerator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveGenerator.cs	(revision 4352)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Parameters;
+using System.Collections.Generic;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaLambdaInterchangeMoveGenerator", "Generates lambda interchange moves from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public abstract class AlbaLambdaInterchangeMoveGenerator : AlbaMoveOperator, IExhaustiveMoveGenerator, IAlbaLambdaInterchangeMoveOperator {
+    #region IAlbaLambdaInterchangeMoveOperator Members
+
+    public ILookupParameter<AlbaLambdaInterchangeMove> LambdaInterchangeMoveParameter {
+      get { return (ILookupParameter<AlbaLambdaInterchangeMove>)Parameters["AlbaLambdaInterchangeMove"]; }
+    }
+
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    public IValueParameter<IntValue> LambdaParameter {
+      get { return (IValueParameter<IntValue>)Parameters["Lambda"]; }
+    }
+
+    #endregion
+
+    [StorableConstructor]
+    protected AlbaLambdaInterchangeMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaLambdaInterchangeMoveGenerator()
+      : base() {
+        Parameters.Add(new LookupParameter<AlbaLambdaInterchangeMove>("AlbaLambdaInterchangeMove", "The moves that should be generated in subscopes."));
+        Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+        Parameters.Add(new ValueParameter<IntValue>("Lambda", "The lambda value.", new IntValue(1)));
+    }
+
+    protected abstract AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda);
+
+    public override IOperation Apply() {
+      IOperation next = base.Apply();
+
+      AlbaEncoding individual = VRPToursParameter.ActualValue as AlbaEncoding;
+      AlbaLambdaInterchangeMove[] moves = GenerateMoves(individual, LambdaParameter.Value.Value);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(LambdaInterchangeMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveMaker.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveMaker.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveMaker.cs	(revision 4352)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaLambdaInterchangeMoveMaker", "Peforms a lambda interchange moves on a given VRP encoding and updates the quality. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public class AlbaLambdaInterchangeMoveMaker : AlbaMoveMaker, IAlbaLambdaInterchangeMoveOperator, IMoveMaker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<AlbaLambdaInterchangeMove> LambdaInterchangeMoveParameter {
+      get { return (ILookupParameter<AlbaLambdaInterchangeMove>)Parameters["AlbaLambdaInterchangeMove"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaLambdaInterchangeMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public AlbaLambdaInterchangeMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new LookupParameter<AlbaLambdaInterchangeMove>("AlbaLambdaInterchangeMove", "The move to make."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
+    }
+
+    public static void Apply(AlbaEncoding solution, AlbaLambdaInterchangeMove move) {
+      AlbaLambdaInterchangeManipulator.Apply(
+        solution,
+        move.Tour1, move.Position1, move.Length1,
+        move.Tour2, move.Position2, move.Length2);
+    }
+
+    public override IOperation Apply() {
+      IOperation next = base.Apply();
+      
+      AlbaLambdaInterchangeMove move = LambdaInterchangeMoveParameter.ActualValue;
+      DoubleValue moveQuality = MoveQualityParameter.ActualValue;
+      DoubleValue quality = QualityParameter.ActualValue;
+     
+      //perform move
+      VRPToursParameter.ActualValue = move.MakeMove();
+
+      quality.Value = moveQuality.Value;
+
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeMutliMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeMutliMoveGenerator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeMutliMoveGenerator.cs	(revision 4352)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Parameters;
+using System.Collections.Generic;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaStochasticLambdaInterchangeMultiMoveGenerator", "Generates multiple random lambda interchange moves from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaStochasticLambdaInterchangeMultiMoveGenerator : AlbaLambdaInterchangeMoveGenerator, IStochasticOperator, IMultiMoveGenerator, IAlbaLambdaInterchangeMoveOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+    
+    [StorableConstructor]
+    private AlbaStochasticLambdaInterchangeMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaStochasticLambdaInterchangeMultiMoveGenerator()
+      : base() {
+        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+        Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda) {
+      int sampleSize = SampleSizeParameter.ActualValue.Value;
+
+      AlbaLambdaInterchangeMove[] moves = new AlbaLambdaInterchangeMove[sampleSize];
+      for (int i = 0; i < sampleSize; i++) {
+        moves[i] = AlbaStochasticLambdaInterchangeSingleMoveGenerator.Apply(
+          individual, Cities, lambda, RandomParameter.ActualValue);
+      }
+
+      return moves;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeSingleMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeSingleMoveGenerator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeSingleMoveGenerator.cs	(revision 4352)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Parameters;
+using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaStochasticLambdaInterchangeSingleMoveGenerator", "Generates one random lambda interchange move from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaStochasticLambdaInterchangeSingleMoveGenerator : AlbaLambdaInterchangeMoveGenerator,
+    IStochasticOperator, ISingleMoveGenerator, IAlbaLambdaInterchangeMoveOperator, IMultiVRPMoveGenerator {
+    #region IMultiVRPMoveOperator Members
+
+    public ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["AlbaLambdaInterchangeMove"]; }
+    }
+
+    #endregion
+    
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    
+    [StorableConstructor]
+    private AlbaStochasticLambdaInterchangeSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaStochasticLambdaInterchangeSingleMoveGenerator()
+      : base() {
+        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    public static AlbaLambdaInterchangeMove Apply(AlbaEncoding individual, int cities, int lambda, IRandom rand) {
+      List<Tour> tours = individual.GetTours();
+
+      int route1Index = rand.Next(tours.Count);
+      Tour route1 = tours[route1Index];
+
+      int route2Index = rand.Next(tours.Count - 1);
+      if (route2Index >= route1Index)
+        route2Index += 1;
+      Tour route2 = tours[route2Index];
+
+      int length1 = rand.Next(Math.Min(lambda + 1, route1.Cities.Count + 1));
+      int index1 = rand.Next(route1.Cities.Count - length1 + 1);
+
+      int l2Min = 0;
+      if (length1 == 0)
+        l2Min = 1;
+      int length2 = rand.Next(l2Min, Math.Min(lambda + 1, route2.Cities.Count + 1));
+      int index2 = rand.Next(route2.Cities.Count - length2 + 1);
+
+      return new AlbaLambdaInterchangeMove(route1Index, index1, length1, route2Index, index2, length2, individual);
+    }
+
+    protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda) {
+      List<AlbaLambdaInterchangeMove> moves = new List<AlbaLambdaInterchangeMove>();
+
+      AlbaLambdaInterchangeMove move = Apply(individual, Cities, lambda, RandomParameter.ActualValue);
+      if(move != null)
+        moves.Add(move);
+
+      return moves.ToArray();
+    }
+  }
+}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/ExhaustiveLambdaInterchangeMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/ExhaustiveLambdaInterchangeMoveGenerator.cs	(revision 4351)
+++ 	(revision )
@@ -1,67 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
-using HeuristicLab.Parameters;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("ExhaustiveLambdaInterchangeMoveGenerator", "Generates all possible lambda interchange moves from a given VRP encoding.")]
-  [StorableClass]
-  public sealed class ExhaustiveLambdaInterchangeMoveGenerator : LambdaInterchangeMoveGenerator, IExhaustiveMoveGenerator, IAlbaLambdaInterchangeMoveOperator {
-    [StorableConstructor]
-    private ExhaustiveLambdaInterchangeMoveGenerator(bool deserializing) : base(deserializing) { }
-
-    public ExhaustiveLambdaInterchangeMoveGenerator()
-      : base() {
-    }
-
-    protected override LambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda) {
-      List<LambdaInterchangeMove> moves = new List<LambdaInterchangeMove>();
-
-      for (int tour1Index = 0; tour1Index < individual.Tours.Count; tour1Index++) {
-        Tour tour1 = individual.Tours[tour1Index];
-        for (int tour2Index = tour1Index + 1; tour2Index < individual.Tours.Count; tour2Index++) {
-          Tour tour2 = individual.Tours[tour2Index];
-
-          for (int length1 = 0; length1 <= Math.Min(lambda, tour1.Cities.Count); length1++) {
-            for(int length2 = 0; length2 <= Math.Min(lambda, tour2.Cities.Count); length2++) {
-              if(length1 != 0 || length2 != 0) {
-                for(int index1 = 0; index1 < tour1.Cities.Count - length1 + 1; index1++) {
-                  for(int index2 = 0; index2 < tour2.Cities.Count - length2 + 1; index2++) {
-                    moves.Add(new LambdaInterchangeMove(tour1Index, index1, length1, 
-                      tour2Index, index2, length2));
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-
-      return moves.ToArray();
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/LambdaInterchangeMove.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/LambdaInterchangeMove.cs	(revision 4351)
+++ 	(revision )
@@ -1,109 +1,0 @@
-﻿#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.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Common;
-using System.Collections.Generic;
-using HeuristicLab.Problems.VehicleRouting.Encodings.General;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("InversionMove", "Item that describes a lambda move on a VRP representation.")]
-  [StorableClass]
-  public class LambdaInterchangeMove: Item, IVRPMove {
-    [Storable]
-    public int Tour1 { get; protected set; }
-
-    [Storable]
-    public int Position1 { get; protected set; }
-
-    [Storable]
-    public int Length1 { get; protected set; }
-
-    [Storable]
-    public int Tour2 { get; protected set; }
-
-    [Storable]
-    public int Position2 { get; protected set; }
-
-    [Storable]
-    public int Length2 { get; protected set; }
-    
-    public LambdaInterchangeMove(): base() {
-      Tour1 = -1;
-      Position1 = -1;
-      Length1 = -1;
-
-      Tour2 = -1;
-      Position2 = -1;
-      Length2 = -1;
-    }
-
-    public LambdaInterchangeMove(int tour1, int position1, int length1, 
-      int tour2, int position2, int length2) {
-        Tour1 = tour1;
-        Position1 = position1;
-        Length1 = length1;
-
-        Tour2 = tour2;
-        Position2 = position2;
-        Length2 = length2;
-    }
-
-    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
-      LambdaInterchangeMove clone = new LambdaInterchangeMove();
-
-      clone.Tour1 = Tour1;
-      clone.Position1 = Position1;
-      clone.Length1 = Length1;
-
-      clone.Tour2 = Tour2;
-      clone.Position2 = Position2;
-      clone.Length2 = Length2;
-
-      cloner.RegisterClonedObject(this, clone);
-      return clone;
-    }
-
-    #region IVRPMove Members
-
-    public TourEvaluation GetMoveQuality(
-      IVRPEncoding individual, 
-      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, 
-      DoubleArray demandArray, DoubleValue capacity, DoubleMatrix coordinates,
-      DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor,
-      DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
-      ILookupParameter<DoubleMatrix> distanceMatrix, Data.BoolValue useDistanceMatrix) {
-        return LambdaInterchangeMoveEvaluator.GetMoveQuality(individual as AlbaEncoding, this,
-          dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
-          coordinates, fleetUsageFactor, timeFactor, distanceFactor,
-          overloadPenalty, tardinessPenalty, distanceMatrix, useDistanceMatrix);
-    }
-
-    public void MakeMove(IRandom random, IVRPEncoding individual) {
-      LambdaInterchangeMoveMaker.Apply(individual as AlbaEncoding, this);
-    }
-
-    #endregion
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/LambdaInterchangeMoveEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/LambdaInterchangeMoveEvaluator.cs	(revision 4351)
+++ 	(revision )
@@ -1,69 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting {
-  [Item("LambdaInterchangeMoveEvaluator", "Evaluates a lamnbda interchange move for a VRP representation.")]
-  [StorableClass]
-  public sealed class LambdaInterchangeMoveEvaluator : VRPMoveEvaluator, IAlbaLambdaInterchangeMoveOperator {
-    public ILookupParameter<LambdaInterchangeMove> LambdaInterchangeMoveParameter {
-      get { return (ILookupParameter<LambdaInterchangeMove>)Parameters["LambdaInterchangeMove"]; }
-    }
-
-    [StorableConstructor]
-    private LambdaInterchangeMoveEvaluator(bool deserializing) : base(deserializing) { }
-
-    public LambdaInterchangeMoveEvaluator()
-      : base() {
-      Parameters.Add(new LookupParameter<LambdaInterchangeMove>("LambdaInterchangeMove", "The move to evaluate."));
-    }
-
-    public static TourEvaluation GetMoveQuality(AlbaEncoding individual, LambdaInterchangeMove move, 
-      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, 
-      DoubleArray demandArray, DoubleValue capacity, DoubleMatrix coordinates, 
-      DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor, 
-      DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
-      ILookupParameter<DoubleMatrix> distanceMatrix, Data.BoolValue useDistanceMatrix) {
-      AlbaEncoding newSolution = individual.Clone() as AlbaEncoding;
-      LambdaInterchangeMoveMaker.Apply(newSolution, move);
-
-      return VRPEvaluator.Evaluate(
-        newSolution, dueTimeArray, serviceTimeArray, readyTimeArray, 
-        demandArray, capacity, fleetUsageFactor, timeFactor, distanceFactor, 
-        overloadPenalty, tardinessPenalty, coordinates, distanceMatrix, useDistanceMatrix);
-    }
-
-    protected override TourEvaluation GetMoveQuality() {
-      return GetMoveQuality(
-        VRPToursParameter.ActualValue as AlbaEncoding, LambdaInterchangeMoveParameter.ActualValue, 
-        DueTimeParameter.ActualValue, ServiceTimeParameter.ActualValue, ReadyTimeParameter.ActualValue,
-        DemandParameter.ActualValue, CapacityParameter.ActualValue, CoordinatesParameter.ActualValue, 
-        FleetUsageFactor.ActualValue, TimeFactor.ActualValue, DistanceFactor.ActualValue, OverloadPenalty.ActualValue, 
-        TardinessPenalty.ActualValue, DistanceMatrixParameter, UseDistanceMatrixParameter.ActualValue);
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/LambdaInterchangeMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/LambdaInterchangeMoveGenerator.cs	(revision 4351)
+++ 	(revision )
@@ -1,78 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
-using HeuristicLab.Parameters;
-using System.Collections.Generic;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("LambdaInterchangeMoveGenerator", "Generates lambda interchange moves from a given VRP encoding.")]
-  [StorableClass]
-  public abstract class LambdaInterchangeMoveGenerator : AlbaMoveOperator, IExhaustiveMoveGenerator, IAlbaLambdaInterchangeMoveOperator {
-    #region IAlbaLambdaInterchangeMoveOperator Members
-
-    public ILookupParameter<LambdaInterchangeMove> LambdaInterchangeMoveParameter {
-      get { return (ILookupParameter<LambdaInterchangeMove>)Parameters["LambdaInterchangeMove"]; }
-    }
-
-    protected ScopeParameter CurrentScopeParameter {
-      get { return (ScopeParameter)Parameters["CurrentScope"]; }
-    }
-
-    public IValueParameter<IntValue> LambdaParameter {
-      get { return (IValueParameter<IntValue>)Parameters["Lambda"]; }
-    }
-
-    #endregion
-
-    [StorableConstructor]
-    protected LambdaInterchangeMoveGenerator(bool deserializing) : base(deserializing) { }
-
-    public LambdaInterchangeMoveGenerator()
-      : base() {
-        Parameters.Add(new LookupParameter<LambdaInterchangeMove>("LambdaInterchangeMove", "The moves that should be generated in subscopes."));
-        Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
-        Parameters.Add(new ValueParameter<IntValue>("Lambda", "The lambda value.", new IntValue(1)));
-    }
-
-    protected abstract LambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda);
-
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
-
-      AlbaEncoding individual = VRPToursParameter.ActualValue as AlbaEncoding;
-      LambdaInterchangeMove[] moves = GenerateMoves(individual, LambdaParameter.Value.Value);
-      Scope[] moveScopes = new Scope[moves.Length];
-      for (int i = 0; i < moveScopes.Length; i++) {
-        moveScopes[i] = new Scope(i.ToString());
-        moveScopes[i].Variables.Add(new Variable(LambdaInterchangeMoveParameter.ActualName, moves[i]));
-      }
-      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
-
-      return next;
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/LambdaInterchangeMoveMaker.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/LambdaInterchangeMoveMaker.cs	(revision 4351)
+++ 	(revision )
@@ -1,81 +1,0 @@
-﻿#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.Optimization;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("LambdaInterchangeMoveMaker", "Peforms a lambda interchange moves on a given VRP encoding and updates the quality. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
-  [StorableClass]
-  public class LambdaInterchangeMoveMaker : AlbaMoveMaker, IAlbaLambdaInterchangeMoveOperator, IMoveMaker {
-    public override bool CanChangeName {
-      get { return false; }
-    }
-    public ILookupParameter<DoubleValue> QualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
-    }
-    public ILookupParameter<DoubleValue> MoveQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
-    }
-    public ILookupParameter<LambdaInterchangeMove> LambdaInterchangeMoveParameter {
-      get { return (ILookupParameter<LambdaInterchangeMove>)Parameters["LambdaInterchangeMove"]; }
-    }
-
-    [StorableConstructor]
-    private LambdaInterchangeMoveMaker(bool deserializing) : base(deserializing) { }
-
-    public LambdaInterchangeMoveMaker()
-      : base() {
-      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
-      Parameters.Add(new LookupParameter<LambdaInterchangeMove>("LambdaInterchangeMove", "The move to make."));
-      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
-    }
-
-    public static void Apply(AlbaEncoding solution, LambdaInterchangeMove move) {
-      LambdaInterchangeManipulator.Apply(
-        solution,
-        move.Tour1, move.Position1, move.Length1,
-        move.Tour2, move.Position2, move.Length2);
-    }
-
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
-      
-      AlbaEncoding solution = VRPToursParameter.ActualValue as AlbaEncoding;
-
-      LambdaInterchangeMove move = LambdaInterchangeMoveParameter.ActualValue;
-      DoubleValue moveQuality = MoveQualityParameter.ActualValue;
-      DoubleValue quality = QualityParameter.ActualValue;
-     
-      //perform move
-      Apply(solution, move);
-
-      quality.Value = moveQuality.Value;
-
-      return next;
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/StochasticLambdaInterchangeMutliMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/StochasticLambdaInterchangeMutliMoveGenerator.cs	(revision 4351)
+++ 	(revision )
@@ -1,64 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
-using HeuristicLab.Parameters;
-using System.Collections.Generic;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("StochasticLambdaInterchangeMultiMoveGenerator", "Generates multiple random lambda interchange moves from a given VRP encoding.")]
-  [StorableClass]
-  public sealed class StochasticLambdaInterchangeMultiMoveGenerator : LambdaInterchangeMoveGenerator, IStochasticOperator, IMultiMoveGenerator, IAlbaLambdaInterchangeMoveOperator {
-    public ILookupParameter<IRandom> RandomParameter {
-      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
-    }
-
-    public IValueLookupParameter<IntValue> SampleSizeParameter {
-      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
-    }
-    
-    [StorableConstructor]
-    private StochasticLambdaInterchangeMultiMoveGenerator(bool deserializing) : base(deserializing) { }
-
-    public StochasticLambdaInterchangeMultiMoveGenerator()
-      : base() {
-        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
-        Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
-    }
-
-    protected override LambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda) {
-      int sampleSize = SampleSizeParameter.ActualValue.Value;
-
-      LambdaInterchangeMove[] moves = new LambdaInterchangeMove[sampleSize];
-      for (int i = 0; i < sampleSize; i++) {
-        moves[i] = StochasticLambdaInterchangeSingleMoveGenerator.Apply(
-          individual, Cities, lambda, RandomParameter.ActualValue);
-      }
-
-      return moves;
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/StochasticLambdaInterchangeSingleMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/StochasticLambdaInterchangeSingleMoveGenerator.cs	(revision 4351)
+++ 	(revision )
@@ -1,87 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
-using HeuristicLab.Parameters;
-using System.Collections.Generic;
-using HeuristicLab.Problems.VehicleRouting.Encodings.General;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("StochasticLambdaInterchangeSingleMoveGenerator", "Generates one random lambda interchange move from a given VRP encoding.")]
-  [StorableClass]
-  public sealed class StochasticLambdaInterchangeSingleMoveGenerator : LambdaInterchangeMoveGenerator,
-    IStochasticOperator, ISingleMoveGenerator, IAlbaLambdaInterchangeMoveOperator, IMultiVRPMoveGenerator {
-    #region IMultiVRPMoveOperator Members
-
-    public ILookupParameter VRPMoveParameter {
-      get { return (ILookupParameter)Parameters["LambdaInterchangeMove"]; }
-    }
-
-    #endregion
-    
-    public ILookupParameter<IRandom> RandomParameter {
-      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
-    }
-    
-    [StorableConstructor]
-    private StochasticLambdaInterchangeSingleMoveGenerator(bool deserializing) : base(deserializing) { }
-
-    public StochasticLambdaInterchangeSingleMoveGenerator()
-      : base() {
-        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
-    }
-
-    public static LambdaInterchangeMove Apply(AlbaEncoding individual, int cities, int lambda, IRandom rand) {
-      int route1Index = rand.Next(individual.Tours.Count);
-      Tour route1 = individual.Tours[route1Index];
-
-      int route2Index = rand.Next(individual.Tours.Count - 1);
-      if (route2Index >= route1Index)
-        route2Index += 1;
-      Tour route2 = individual.Tours[route2Index];
-
-      int length1 = rand.Next(Math.Min(lambda + 1, route1.Cities.Count + 1));
-      int index1 = rand.Next(route1.Cities.Count - length1 + 1);
-
-      int l2Min = 0;
-      if (length1 == 0)
-        l2Min = 1;
-      int length2 = rand.Next(l2Min, Math.Min(lambda + 1, route2.Cities.Count + 1));
-      int index2 = rand.Next(route2.Cities.Count - length2 + 1);
-
-      return new LambdaInterchangeMove(route1Index, index1, length1, route2Index, index2, length2);
-    }
-
-    protected override LambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda) {
-      List<LambdaInterchangeMove> moves = new List<LambdaInterchangeMove>();
-
-      LambdaInterchangeMove move = Apply(individual, Cities, lambda, RandomParameter.ActualValue);
-      if(move != null)
-        moves.Add(move);
-
-      return moves.ToArray();
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/PermutationMoveOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/PermutationMoveOperator.cs	(revision 4351)
+++ 	(revision )
@@ -1,55 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-using HeuristicLab.Parameters;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("PermutationMoveOperator", "A move operator for an Alba VRP representation using an inner permutation move operator.")]
-  [StorableClass]
-  public abstract class PermutationMoveOperator : AlbaMoveOperator {    
-    [Storable]
-    protected abstract IPermutationMoveOperator PermutationMoveOperatorParameter { get; set; }
-
-    [StorableConstructor]
-    protected PermutationMoveOperator(bool deserializing) : base(deserializing) { }
-
-    public PermutationMoveOperator()
-      : base() 
-    {
-    }
-
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
-      
-      IVRPEncoding solution = VRPToursParameter.ActualValue;
-
-      PermutationMoveOperatorParameter.PermutationParameter.ActualName = VRPToursParameter.ActualName;
-      IAtomicOperation op = this.ExecutionContext.CreateChildOperation(PermutationMoveOperatorParameter);
-      op.Operator.Execute((IExecutionContext)op);
-
-      return next;
-    }
-  }
-}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveEvaluator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveEvaluator.cs	(revision 4352)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("AlbaTranslocationMoveEvaluator", "Evaluates a translocation or insertion move (3-opt) for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaTranslocationMoveEvaluator : VRPMoveEvaluator, IAlbaTranslocationMoveOperator {
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return (ILookupParameter<TranslocationMove>)Parameters["TranslocationMove"]; }
+      set { Parameters["TranslocationMove"].ActualValue = value.ActualValue; }
+    }
+
+    [StorableConstructor]
+    private AlbaTranslocationMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public AlbaTranslocationMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<TranslocationMove>("TranslocationMove", "The move to evaluate."));
+    }
+
+    protected override TourEvaluation GetMoveQuality() {
+      TranslocationMove move = TranslocationMoveParameter.ActualValue;
+      //perform move
+      AlbaEncoding newSolution = VRPToursParameter.ActualValue.Clone() as AlbaEncoding;
+      TranslocationManipulator.Apply(newSolution, move.Index1, move.Index2, move.Index3);
+
+      return VRPEvaluator.Evaluate(
+        newSolution,
+        VehiclesParameter.ActualValue,
+        DueTimeParameter.ActualValue, ServiceTimeParameter.ActualValue, ReadyTimeParameter.ActualValue,
+        DemandParameter.ActualValue, CapacityParameter.ActualValue,
+        FleetUsageFactor.ActualValue, TimeFactor.ActualValue, DistanceFactor.ActualValue, OverloadPenalty.ActualValue, TardinessPenalty.ActualValue,
+        CoordinatesParameter.ActualValue, DistanceMatrixParameter, UseDistanceMatrixParameter.ActualValue);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveGenerator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveGenerator.cs	(revision 4352)
@@ -0,0 +1,91 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaTranslocationMoveGenerator", "An operator which generates translocation moves for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaTranslocationMoveGenerator : AlbaPermutationMoveOperator, IAlbaTranslocationMoveOperator, IMultiMoveGenerator {
+    public IValueLookupParameter<TranslocationMoveGenerator> TranslocationMoveGeneratorParameter {
+      get { return (IValueLookupParameter<TranslocationMoveGenerator>)Parameters["TranslocationMoveGenerator"]; }
+    }
+
+    protected override IPermutationMoveOperator PermutationMoveOperatorParameter {
+      get { return TranslocationMoveGeneratorParameter.Value; }
+      set {
+        TranslocationMoveGeneratorParameter.Value = value as TranslocationMoveGenerator;
+        if (TranslocationMoveGeneratorParameter.Value is IMultiMoveGenerator) {
+          ((IMultiMoveGenerator)TranslocationMoveGeneratorParameter.Value).SampleSizeParameter.ActualName = SampleSizeParameter.Name;
+        }
+      }
+    }
+
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get {
+        if (TranslocationMoveGeneratorParameter.Value != null)
+          return TranslocationMoveGeneratorParameter.Value.TranslocationMoveParameter;
+        else
+          return null;
+      }
+    }
+
+    public ILookupParameter<Permutation> PermutationParameter {
+      get {
+        if (TranslocationMoveGeneratorParameter.Value != null)
+          return TranslocationMoveGeneratorParameter.Value.PermutationParameter;
+        else
+          return null;
+      }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaTranslocationMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaTranslocationMoveGenerator()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<TranslocationMoveGenerator>("TranslocationMoveGenerator", "The move generator.",
+        new StochasticTranslocationMultiMoveGenerator()));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+
+      ((IMultiMoveGenerator)TranslocationMoveGeneratorParameter.Value).SampleSizeParameter.ActualName = SampleSizeParameter.Name;
+    }
+
+    public override IOperation Apply() {
+      IOperation successor = base.Apply();
+
+      Permutation permutation = VRPToursParameter.ActualValue as Permutation;
+      string moveName = TranslocationMoveGeneratorParameter.ActualValue.TranslocationMoveParameter.Name;
+
+      return successor;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveHardTabuCriterion.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveHardTabuCriterion.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveHardTabuCriterion.cs	(revision 4352)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaTranslocationMoveHardTabuCriterion", "An operator which checks if translocation moves are tabu using a hard criterion for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaTranslocationMoveHardTabuCriterion : AlbaPermutationMoveOperator, IAlbaTranslocationMoveOperator, ITabuChecker {
+    private TranslocationMoveHardTabuCriterion tabuChecker;
+    protected override IPermutationMoveOperator PermutationMoveOperatorParameter {
+      get { return tabuChecker; }
+      set { tabuChecker = value as TranslocationMoveHardTabuCriterion; }
+    }
+
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return tabuChecker.TranslocationMoveParameter; }
+    }
+
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return tabuChecker.PermutationParameter; }
+    }
+
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return tabuChecker.MoveTabuParameter; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return tabuChecker.MoveQualityParameter; }
+    }
+
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return tabuChecker.MaximizationParameter; }
+    }
+
+    [StorableConstructor]
+    private AlbaTranslocationMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
+
+    public AlbaTranslocationMoveHardTabuCriterion()
+      : base() {
+      tabuChecker = new TranslocationMoveHardTabuCriterion();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveMaker.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveMaker.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveMaker.cs	(revision 4352)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaTranslocationMoveMaker", "An operator which makes translocation moves for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaTranslocationMoveMaker : AlbaMoveMaker, IAlbaTranslocationMoveOperator, IVRPMoveMaker {
+    private TranslocationMoveMaker moveMaker;
+
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return moveMaker.TranslocationMoveParameter; }
+    }
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return moveMaker.QualityParameter; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return moveMaker.MoveQualityParameter; }
+    }
+
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return moveMaker.PermutationParameter; }
+    }
+
+    [StorableConstructor]
+    private AlbaTranslocationMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public AlbaTranslocationMoveMaker()
+      : base() {
+      moveMaker = new TranslocationMoveMaker();
+    }
+
+    public override IOperation Apply() {
+      IOperation next = base.Apply();
+
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+
+      moveMaker.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateChildOperation(moveMaker);
+      op.Operator.Execute((IExecutionContext)op);
+
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveSoftTabuCriterion.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveSoftTabuCriterion.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveSoftTabuCriterion.cs	(revision 4352)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaTranslocationMoveSoftTabuCriterion", "An operator which checks if translocation moves are tabu using a soft criterion for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaTranslocationMoveSoftTabuCriterion : AlbaPermutationMoveOperator, IAlbaTranslocationMoveOperator, ITabuChecker {
+    private TranslocationMoveSoftTabuCriterion tabuChecker;
+    protected override IPermutationMoveOperator PermutationMoveOperatorParameter {
+      get { return tabuChecker; }
+      set { tabuChecker = value as TranslocationMoveSoftTabuCriterion; }
+    }
+
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return tabuChecker.TranslocationMoveParameter; }
+    }
+
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return tabuChecker.PermutationParameter; }
+    }
+
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return tabuChecker.MoveTabuParameter; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return tabuChecker.MoveQualityParameter; }
+    }
+
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return tabuChecker.MaximizationParameter; }
+    }
+
+    [StorableConstructor]
+    private AlbaTranslocationMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
+
+    public AlbaTranslocationMoveSoftTabuCriterion()
+      : base() {
+      tabuChecker = new TranslocationMoveSoftTabuCriterion();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveTabuMaker.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveTabuMaker.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveTabuMaker.cs	(revision 4352)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaTranslocationMoveTabuMaker", "An operator which makes translocation moves tabu for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaTranslocationMoveTabuMaker : AlbaPermutationMoveOperator, IAlbaTranslocationMoveOperator, ITabuMaker {
+    private TranslocationMoveTabuMaker moveTabuMaker;
+    protected override IPermutationMoveOperator PermutationMoveOperatorParameter {
+      get { return moveTabuMaker; }
+      set { moveTabuMaker = value as TranslocationMoveTabuMaker; }
+    }
+
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return moveTabuMaker.PermutationParameter; }
+    }
+
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return moveTabuMaker.TranslocationMoveParameter; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return moveTabuMaker.MoveQualityParameter; }
+    }
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return moveTabuMaker.QualityParameter; }
+    }
+
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return moveTabuMaker.MaximizationParameter; }
+    }
+
+    [StorableConstructor]
+    private AlbaTranslocationMoveTabuMaker(bool deserializing) : base(deserializing) { }
+
+    public AlbaTranslocationMoveTabuMaker()
+      : base() {
+      moveTabuMaker = new TranslocationMoveTabuMaker();
+    }
+  }
+}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/PermutationTranslocationMoveEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/PermutationTranslocationMoveEvaluator.cs	(revision 4351)
+++ 	(revision )
@@ -1,59 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
-
-namespace HeuristicLab.Problems.VehicleRouting {
-  [Item("PermutationTranslocationMoveEvaluator", "Evaluates a translocation or insertion move (3-opt) for a VRP representation.")]
-  [StorableClass]
-  public sealed class PermutationTranslocationMoveEvaluator : VRPMoveEvaluator, IAlbaTranslocationMoveOperator {
-    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
-      get { return (ILookupParameter<TranslocationMove>)Parameters["TranslocationMove"]; }
-      set { Parameters["TranslocationMove"].ActualValue = value.ActualValue; }
-    }
-
-    [StorableConstructor]
-    private PermutationTranslocationMoveEvaluator(bool deserializing) : base(deserializing) { }
-
-    public PermutationTranslocationMoveEvaluator()
-      : base() {
-      Parameters.Add(new LookupParameter<TranslocationMove>("TranslocationMove", "The move to evaluate."));
-    }
-
-    protected override TourEvaluation GetMoveQuality() {
-      TranslocationMove move = TranslocationMoveParameter.ActualValue;
-      //perform move
-      AlbaEncoding newSolution = VRPToursParameter.ActualValue.Clone() as AlbaEncoding;
-      TranslocationManipulator.Apply(newSolution, move.Index1, move.Index2, move.Index3);
-
-      return VRPEvaluator.Evaluate(
-        newSolution,
-        DueTimeParameter.ActualValue, ServiceTimeParameter.ActualValue, ReadyTimeParameter.ActualValue,
-        DemandParameter.ActualValue, CapacityParameter.ActualValue,
-        FleetUsageFactor.ActualValue, TimeFactor.ActualValue, DistanceFactor.ActualValue, OverloadPenalty.ActualValue, TardinessPenalty.ActualValue,
-        CoordinatesParameter.ActualValue, DistanceMatrixParameter, UseDistanceMatrixParameter.ActualValue);
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/PermutationTranslocationMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/PermutationTranslocationMoveGenerator.cs	(revision 4351)
+++ 	(revision )
@@ -1,91 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System.Collections.Generic;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("PermutationTranslocationMoveGenerator", "An operator which generates translocation moves for a VRP representation.")]
-  [StorableClass]
-  public sealed class PermutationTranslocationMoveGenerator : PermutationMoveOperator, IAlbaTranslocationMoveOperator, IMultiMoveGenerator {
-    public IValueLookupParameter<TranslocationMoveGenerator> TranslocationMoveGeneratorParameter {
-      get { return (IValueLookupParameter<TranslocationMoveGenerator>)Parameters["TranslocationMoveGenerator"]; }
-    }
-
-    protected override IPermutationMoveOperator PermutationMoveOperatorParameter {
-      get { return TranslocationMoveGeneratorParameter.Value; }
-      set {
-        TranslocationMoveGeneratorParameter.Value = value as TranslocationMoveGenerator;
-        if (TranslocationMoveGeneratorParameter.Value is IMultiMoveGenerator) {
-          ((IMultiMoveGenerator)TranslocationMoveGeneratorParameter.Value).SampleSizeParameter.ActualName = SampleSizeParameter.Name;
-        }
-      }
-    }
-
-    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
-      get {
-        if (TranslocationMoveGeneratorParameter.Value != null)
-          return TranslocationMoveGeneratorParameter.Value.TranslocationMoveParameter;
-        else
-          return null;
-      }
-    }
-
-    public ILookupParameter<Permutation> PermutationParameter {
-      get {
-        if (TranslocationMoveGeneratorParameter.Value != null)
-          return TranslocationMoveGeneratorParameter.Value.PermutationParameter;
-        else
-          return null;
-      }
-    }
-
-    public IValueLookupParameter<IntValue> SampleSizeParameter {
-      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
-    }
-
-    [StorableConstructor]
-    private PermutationTranslocationMoveGenerator(bool deserializing) : base(deserializing) { }
-
-    public PermutationTranslocationMoveGenerator()
-      : base() {
-      Parameters.Add(new ValueLookupParameter<TranslocationMoveGenerator>("TranslocationMoveGenerator", "The move generator.",
-        new StochasticTranslocationMultiMoveGenerator()));
-      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
-
-      ((IMultiMoveGenerator)TranslocationMoveGeneratorParameter.Value).SampleSizeParameter.ActualName = SampleSizeParameter.Name;
-    }
-
-    public override IOperation Apply() {
-      IOperation successor = base.Apply();
-
-      Permutation permutation = VRPToursParameter.ActualValue as Permutation;
-      string moveName = TranslocationMoveGeneratorParameter.ActualValue.TranslocationMoveParameter.Name;
-
-      return successor;
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/PermutationTranslocationMoveHardTabuCriterion.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/PermutationTranslocationMoveHardTabuCriterion.cs	(revision 4351)
+++ 	(revision )
@@ -1,66 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("PermutationTranslocationMoveHardTabuCriterion", "An operator which checks if translocation moves are tabu using a hard criterion for a VRP representation.")]
-  [StorableClass]
-  public sealed class PermutationTranslocationMoveHardTabuCriterion : PermutationMoveOperator, IAlbaTranslocationMoveOperator, ITabuChecker {
-    private TranslocationMoveHardTabuCriterion tabuChecker;
-    protected override IPermutationMoveOperator PermutationMoveOperatorParameter {
-      get { return tabuChecker; }
-      set { tabuChecker = value as TranslocationMoveHardTabuCriterion; }
-    }
-
-    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
-      get { return tabuChecker.TranslocationMoveParameter; }
-    }
-
-    public ILookupParameter<Permutation> PermutationParameter {
-      get { return tabuChecker.PermutationParameter; }
-    }
-
-    public ILookupParameter<BoolValue> MoveTabuParameter {
-      get { return tabuChecker.MoveTabuParameter; }
-    }
-
-    public ILookupParameter<DoubleValue> MoveQualityParameter {
-      get { return tabuChecker.MoveQualityParameter; }
-    }
-
-    public IValueLookupParameter<BoolValue> MaximizationParameter {
-      get { return tabuChecker.MaximizationParameter; }
-    }
-
-    [StorableConstructor]
-    private PermutationTranslocationMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
-
-    public PermutationTranslocationMoveHardTabuCriterion()
-      : base() {
-      tabuChecker = new TranslocationMoveHardTabuCriterion();
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/PermutationTranslocationMoveMaker.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/PermutationTranslocationMoveMaker.cs	(revision 4351)
+++ 	(revision )
@@ -1,70 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("PermutationTranslocationMoveMaker", "An operator which makes translocation moves for a VRP representation.")]
-  [StorableClass]
-  public sealed class PermutationTranslocationMoveMaker : AlbaMoveMaker, IAlbaTranslocationMoveOperator, IVRPMoveMaker {
-    private TranslocationMoveMaker moveMaker;
-
-    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
-      get { return moveMaker.TranslocationMoveParameter; }
-    }
-
-    public ILookupParameter<DoubleValue> QualityParameter {
-      get { return moveMaker.QualityParameter; }
-    }
-
-    public ILookupParameter<DoubleValue> MoveQualityParameter {
-      get { return moveMaker.MoveQualityParameter; }
-    }
-
-    public ILookupParameter<Permutation> PermutationParameter {
-      get { return moveMaker.PermutationParameter; }
-    }
-
-    [StorableConstructor]
-    private PermutationTranslocationMoveMaker(bool deserializing) : base(deserializing) { }
-
-    public PermutationTranslocationMoveMaker()
-      : base() {
-      moveMaker = new TranslocationMoveMaker();
-    }
-
-    public override IOperation Apply() {
-      IOperation next = base.Apply();
-
-      IVRPEncoding solution = VRPToursParameter.ActualValue;
-
-      moveMaker.PermutationParameter.ActualName = VRPToursParameter.ActualName;
-      IAtomicOperation op = this.ExecutionContext.CreateChildOperation(moveMaker);
-      op.Operator.Execute((IExecutionContext)op);
-
-      return next;
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/PermutationTranslocationMoveSoftTabuCriterion.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/PermutationTranslocationMoveSoftTabuCriterion.cs	(revision 4351)
+++ 	(revision )
@@ -1,66 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("PermutationTranslocationMoveSoftTabuCriterion", "An operator which checks if translocation moves are tabu using a soft criterion for a VRP representation.")]
-  [StorableClass]
-  public sealed class PermutationTranslocationMoveSoftTabuCriterion : PermutationMoveOperator, IAlbaTranslocationMoveOperator, ITabuChecker {
-    private TranslocationMoveSoftTabuCriterion tabuChecker;
-    protected override IPermutationMoveOperator PermutationMoveOperatorParameter {
-      get { return tabuChecker; }
-      set { tabuChecker = value as TranslocationMoveSoftTabuCriterion; }
-    }
-
-    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
-      get { return tabuChecker.TranslocationMoveParameter; }
-    }
-
-    public ILookupParameter<Permutation> PermutationParameter {
-      get { return tabuChecker.PermutationParameter; }
-    }
-
-    public ILookupParameter<BoolValue> MoveTabuParameter {
-      get { return tabuChecker.MoveTabuParameter; }
-    }
-
-    public ILookupParameter<DoubleValue> MoveQualityParameter {
-      get { return tabuChecker.MoveQualityParameter; }
-    }
-
-    public IValueLookupParameter<BoolValue> MaximizationParameter {
-      get { return tabuChecker.MaximizationParameter; }
-    }
-
-    [StorableConstructor]
-    private PermutationTranslocationMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
-
-    public PermutationTranslocationMoveSoftTabuCriterion()
-      : base() {
-      tabuChecker = new TranslocationMoveSoftTabuCriterion();
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/PermutationTranslocationMoveTabuMaker.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/PermutationTranslocationMoveTabuMaker.cs	(revision 4351)
+++ 	(revision )
@@ -1,66 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Optimization;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
-  [Item("PermutationTranslocationMoveTabuMaker", "An operator which makes translocation moves tabu for a VRP representation.")]
-  [StorableClass]
-  public sealed class PermutationTranslocationMoveTabuMaker : PermutationMoveOperator, IAlbaTranslocationMoveOperator, ITabuMaker {
-    private TranslocationMoveTabuMaker moveTabuMaker;
-    protected override IPermutationMoveOperator PermutationMoveOperatorParameter {
-      get { return moveTabuMaker; }
-      set { moveTabuMaker = value as TranslocationMoveTabuMaker; }
-    }
-
-    public ILookupParameter<Permutation> PermutationParameter {
-      get { return moveTabuMaker.PermutationParameter; }
-    }
-
-    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
-      get { return moveTabuMaker.TranslocationMoveParameter; }
-    }
-
-    public ILookupParameter<DoubleValue> MoveQualityParameter {
-      get { return moveTabuMaker.MoveQualityParameter; }
-    }
-
-    public ILookupParameter<DoubleValue> QualityParameter {
-      get { return moveTabuMaker.QualityParameter; }
-    }
-
-    public IValueLookupParameter<BoolValue> MaximizationParameter {
-      get { return moveTabuMaker.MaximizationParameter; }
-    }
-
-    [StorableConstructor]
-    private PermutationTranslocationMoveTabuMaker(bool deserializing) : base(deserializing) { }
-
-    public PermutationTranslocationMoveTabuMaker()
-      : base() {
-      moveTabuMaker = new TranslocationMoveTabuMaker();
-    }
-  }
-}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Crossovers/GVRCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Crossovers/GVRCrossover.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Crossovers/GVRCrossover.cs	(revision 4352)
@@ -0,0 +1,120 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVRCrossover", "The GVR crossover operation. It is implemented as described in Pereira, F.B. et al (2002). GVR: a New Genetic Representation for the Vehicle Routing Problem. AICS 2002, LNAI 2464, pp. 95-102.")]
+  [StorableClass]
+  public sealed class GVRCrossover : VRPCrossover, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    private GVRCrossover(bool deserializing) : base(deserializing) { }
+
+    public GVRCrossover() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+
+      //remove unused parameters
+      Parameters.Remove("ReadyTime");
+      Parameters.Remove("DueTime");
+      Parameters.Remove("ServiceTime");
+    }
+
+    private GVREncoding Crossover(IRandom random, GVREncoding parent1, GVREncoding parent2) {
+      GVREncoding child = parent1.Clone() as GVREncoding;
+
+      Tour tour = parent2.Tours[random.Next(parent2.Tours.Count)];
+      int breakPoint1 = random.Next(tour.Cities.Count);
+      int length = random.Next(1, tour.Cities.Count - breakPoint1 + 1);
+      List<int> subroute = tour.Cities.GetRange(breakPoint1, length);
+      
+      //remove duplicates
+      List<Tour> toBeRemoved = new List<Tour>();
+
+      foreach (Tour route in child.Tours) {
+        foreach (int city in subroute) {
+          route.Cities.Remove(city);
+        }
+
+        if (route.Cities.Count == 0)
+          toBeRemoved.Add(route);
+      }
+      foreach (Tour route in toBeRemoved) {
+        child.Tours.Remove(route);
+      }
+
+      //choose nearest customer
+      double minDistance = -1;
+      int customer = -1;
+      for (int i = 1; i <= Cities; i++) {
+        if (!subroute.Contains(i)) {
+          double distance = VRPUtilities.GetDistance(subroute[0], i, CoordinatesParameter.ActualValue,
+            DistanceMatrixParameter, UseDistanceMatrixParameter.ActualValue);
+
+          if (customer == -1 || distance < minDistance) {
+            customer = i;
+            minDistance = distance;
+          }
+        }
+      }
+
+      //insert
+      if (customer != -1) {
+        Tour newTour;
+        int newPosition;
+        child.FindCustomer(customer, out newTour, out newPosition);
+        newTour.Cities.InsertRange(newPosition + 1, subroute);
+      } else {
+        //special case -> only one tour, whole tour has been chosen as subroute
+        child = parent1.Clone() as GVREncoding;
+      }
+
+      return child;
+    }
+   
+    public override IOperation Apply() {
+      ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
+      for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
+        IVRPEncoding solution = ParentsParameter.ActualValue[i];
+        if (!(solution is GVREncoding)) {
+          parents[i] = GVREncoding.ConvertFrom(solution, CapacityParameter.ActualValue, DemandParameter.ActualValue,
+            DistanceMatrixParameter);
+        } else {
+          parents[i] = solution;
+        }
+      }
+      ParentsParameter.ActualValue = parents;
+
+      ChildParameter.ActualValue = Crossover(RandomParameter.ActualValue, parents[0] as GVREncoding, parents[1] as GVREncoding);
+
+      return base.Apply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/GVREncoding.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/GVREncoding.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/GVREncoding.cs	(revision 4352)
@@ -0,0 +1,134 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Drawing;
+using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVREncoding", "Represents a potvin encoding of VRP solutions. It is implemented as described in Pereira, F.B. et al (2002). GVR: a New Genetic Representation for the Vehicle Routing Problem. AICS 2002, LNAI 2464, pp. 95-102.")]
+  [StorableClass]
+  public class GVREncoding : TourEncoding {
+    [Storable]
+    private DoubleValue capacity { get; set; }
+
+    [Storable]
+    private DoubleArray demand { get; set; }
+
+    public override List<Tour> GetTours(ILookupParameter<DoubleMatrix> distanceMatrix = null, int maxVehicles = int.MaxValue) {
+      List<Tour> tours = new List<Tour>();    
+
+      foreach (Tour tour in base.Tours) {
+        Tour newTour = new Tour();
+        double currentDemand = 0;
+
+        foreach (int city in tour.Cities) {
+          currentDemand += demand[city];
+
+          if (currentDemand > capacity.Value) {
+            if(newTour.Cities.Count > 0)
+              tours.Add(newTour);
+
+            newTour = new Tour();
+            newTour.Cities.Add(city);
+            currentDemand = demand[city];
+          } else {
+            newTour.Cities.Add(city);
+          }
+        }
+
+        if (newTour.Cities.Count > 0)
+          tours.Add(newTour);
+      }
+
+      //repair if there are too many vehicles used
+      while (tours.Count > maxVehicles) {
+        Tour tour = tours[tours.Count - 1];
+        tours[tours.Count - 2].Cities.AddRange(tour.Cities);
+
+        tours.Remove(tour);
+      } 
+
+      return tours;
+    }
+    
+    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
+      GVREncoding clone = new GVREncoding(capacity, demand);
+      cloner.RegisterClonedObject(this, clone);
+      clone.Tours = (ItemList<Tour>)cloner.Clone(this.Tours);
+     
+      return clone;
+    }
+
+    public GVREncoding(DoubleValue capacity, DoubleArray demand)
+      : base() {
+        this.capacity = capacity;
+        this.demand = demand;
+    }
+
+    [StorableConstructor]
+    private GVREncoding(bool serializing)
+      : base() {
+    }
+
+    public static GVREncoding ConvertFrom(IVRPEncoding encoding, DoubleValue capacity, DoubleArray demand, 
+      ILookupParameter<DoubleMatrix> distanceMatrix) {
+      GVREncoding solution = new GVREncoding(capacity, demand);
+
+      TourEncoding.ConvertFrom(encoding, solution, distanceMatrix);
+
+      return solution;
+    }
+
+    public static GVREncoding ConvertFrom(List<int> route, DoubleValue capacity, DoubleArray demand) {
+      GVREncoding solution = new GVREncoding(capacity, demand);
+
+      TourEncoding.ConvertFrom(route, solution);
+
+      return solution;
+    }
+
+    internal void FindCustomer(int customer, out Tour tour, out int index) {
+      tour = null;
+      index = -1;
+
+      int currentTour = 0;
+      while (tour == null && currentTour < Tours.Count) {
+        int currentCity = 0;
+        while (tour == null && currentCity < Tours[currentTour].Cities.Count) {
+          if (Tours[currentTour].Cities[currentCity] == customer) {
+            tour = Tours[currentTour];
+            index = currentCity;
+          }
+
+          currentCity++;
+        }
+
+        currentTour++;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRDisplacementManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRDisplacementManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRDisplacementManipulator.cs	(revision 4352)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVRDisplacementManipulator", "An operator which manipulates a GVR representation by applying a displacement operation. It is implemented as described in Pereira, F.B. et al (2002). GVR: a New Genetic Representation for the Vehicle Routing Problem. AICS 2002, LNAI 2464, pp. 95-102.")]
+  [StorableClass]
+  public sealed class GVRDisplacementManipulator : GVRManipulator {
+    [StorableConstructor]
+    private GVRDisplacementManipulator(bool deserializing) : base(deserializing) { }
+
+    public GVRDisplacementManipulator()
+      : base() {
+    }
+
+    protected override void Manipulate(IRandom random, GVREncoding individual) {
+      Tour tour = individual.Tours[random.Next(individual.Tours.Count)];
+      int breakPoint1 = random.Next(tour.Cities.Count);
+      int length = random.Next(1, tour.Cities.Count - breakPoint1 + 1);
+
+      List<int> displaced = tour.Cities.GetRange(breakPoint1, length);
+      tour.Cities.RemoveRange(breakPoint1, length);
+      //with a probability of 1/(2*V) create a new tour, else insert at another position
+      if (individual.GetTours().Count > 0 &&
+        individual.GetTours().Count < VehiclesParameter.ActualValue.Value && 
+        random.Next(individual.GetTours().Count * 2) == 0) {
+        Tour newTour = new Tour();
+        newTour.Cities.InsertRange(0, displaced);
+
+        individual.Tours.Add(newTour);
+      } else {
+        Tour newTour = individual.Tours[random.Next(individual.Tours.Count)];
+        int newPosition = newTour.Cities.Count;
+
+        newTour.Cities.InsertRange(newPosition, displaced);
+      }
+
+      if (tour.Cities.Count == 0)
+        individual.Tours.Remove(tour);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRInsertionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRInsertionManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRInsertionManipulator.cs	(revision 4352)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVRInsertionManipulator", "An operator which manipulates a GVR representation by inserting a customer at another location. It is implemented as described in Pereira, F.B. et al (2002). GVR: a New Genetic Representation for the Vehicle Routing Problem. AICS 2002, LNAI 2464, pp. 95-102.")]
+  [StorableClass]
+  public sealed class GVRInsertionManipulator : GVRManipulator {
+    [StorableConstructor]
+    private GVRInsertionManipulator(bool deserializing) : base(deserializing) { }
+
+    public GVRInsertionManipulator()
+      : base() {
+    }
+
+    protected override void Manipulate(IRandom random, GVREncoding individual) {
+      int customer = random.Next(1, individual.Cities + 1);
+      Tour tour;
+      int position;
+      individual.FindCustomer(customer, out tour, out position);
+
+      tour.Cities.RemoveAt(position);
+
+      //with a probability of 1/(2*V) create a new tour, else insert at another position
+      if (individual.GetTours().Count > 0 &&        
+        individual.GetTours().Count < VehiclesParameter.ActualValue.Value && 
+        random.Next(individual.GetTours().Count * 2) == 0) {
+        Tour newTour = new Tour();
+        newTour.Cities.Add(customer);
+       
+        individual.Tours.Add(newTour);
+      } else {
+        Tour newTour = individual.Tours[random.Next(individual.Tours.Count)];
+        int newPosition = random.Next(newTour.Cities.Count + 1);
+
+        newTour.Cities.Insert(newPosition, customer);
+      }
+
+      if (tour.Cities.Count == 0)
+        individual.Tours.Remove(tour);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRInversionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRInversionManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRInversionManipulator.cs	(revision 4352)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVRInversionManipulator", "An operator which manipulates a GVR representation by inverting a subroute. It is implemented as described in Pereira, F.B. et al (2002). GVR: a New Genetic Representation for the Vehicle Routing Problem. AICS 2002, LNAI 2464, pp. 95-102.")]
+  [StorableClass]
+  public sealed class GVRInversionManipulator : GVRManipulator {
+    [StorableConstructor]
+    private GVRInversionManipulator(bool deserializing) : base(deserializing) { }
+
+    public GVRInversionManipulator()
+      : base() {
+    }
+
+    protected override void Manipulate(IRandom random, GVREncoding individual) {
+      Tour tour = individual.Tours[random.Next(individual.Tours.Count)];
+      int breakPoint1 = random.Next(tour.Cities.Count);
+      int length = random.Next(1, tour.Cities.Count - breakPoint1 + 1);
+
+      tour.Cities.Reverse(breakPoint1, length);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRManipulator.cs	(revision 4352)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVRManipulator", "A VRP manipulation operation.")]
+  [StorableClass]
+  public abstract class GVRManipulator : VRPManipulator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected GVRManipulator(bool deserializing) : base(deserializing) { }
+
+    public GVRManipulator() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+
+      //remove unused parameters
+      Parameters.Remove("Coordinates");
+      Parameters.Remove("UseDistanceMatrix");
+      Parameters.Remove("ReadyTime");
+      Parameters.Remove("DueTime");
+      Parameters.Remove("ServiceTime");
+    }
+
+    protected abstract void Manipulate(IRandom random, GVREncoding individual);
+   
+    public override IOperation Apply() {
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      if (!(solution is GVREncoding)) {
+        VRPToursParameter.ActualValue = GVREncoding.ConvertFrom(solution, CapacityParameter.ActualValue, DemandParameter.ActualValue, 
+          DistanceMatrixParameter);
+      }
+
+      Manipulate(RandomParameter.ActualValue, VRPToursParameter.ActualValue as GVREncoding);
+
+      return base.Apply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRSwapManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRSwapManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/GVR/Manipulators/GVRSwapManipulator.cs	(revision 4352)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVRSwapManipulator", "An operator which manipulates a GVR representation by swapping two customers. It is implemented as described in Pereira, F.B. et al (2002). GVR: a New Genetic Representation for the Vehicle Routing Problem. AICS 2002, LNAI 2464, pp. 95-102.")]
+  [StorableClass]
+  public sealed class GVRSwapManipulator : GVRManipulator {
+    [StorableConstructor]
+    private GVRSwapManipulator(bool deserializing) : base(deserializing) { }
+
+    public GVRSwapManipulator()
+      : base() {
+    }
+
+    protected override void Manipulate(IRandom random, GVREncoding individual) {
+      int customer1 = random.Next(1, individual.Cities + 1);
+      int customer2 = random.Next(1, individual.Cities + 1);
+
+      Tour tour1;
+      int pos1;
+      individual.FindCustomer(customer1, out tour1, out pos1);
+
+      Tour tour2;
+      int pos2;
+      individual.FindCustomer(customer2, out tour2, out pos2);
+
+      int temp = tour1.Cities[pos1];
+      tour1.Cities[pos1] = tour2.Cities[pos2];
+      tour2.Cities[pos2] = temp;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/MultiVRPSolutionCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/MultiVRPSolutionCreator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/MultiVRPSolutionCreator.cs	(revision 4352)
@@ -0,0 +1,136 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("MultiVRPSolutionCreator", "Randomly selects and applies one of its creator every time it is called.")]
+  [StorableClass]
+  public class MultiVRPSolutionCreator : StochasticMultiBranch<IVRPCreator>, IVRPCreator, IStochasticOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    protected override bool CreateChildOperation {
+      get { return true; }
+    }
+
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    public int Cities {
+      get { return CoordinatesParameter.ActualValue.Rows - 1; }
+    }
+    public ILookupParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    }
+    public ILookupParameter<DoubleMatrix> DistanceMatrixParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
+    }
+    public ILookupParameter<BoolValue> UseDistanceMatrixParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
+    }
+    public ILookupParameter<IntValue> VehiclesParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["Vehicles"]; }
+    }
+    public ILookupParameter<DoubleValue> CapacityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Capacity"]; }
+    }
+    public ILookupParameter<DoubleArray> DemandParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["Demand"]; }
+    }
+    public ILookupParameter<DoubleArray> ReadyTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["ReadyTime"]; }
+    }
+    public ILookupParameter<DoubleArray> DueTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["DueTime"]; }
+    }
+    public ILookupParameter<DoubleArray> ServiceTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["ServiceTime"]; }
+    }
+
+    [StorableConstructor]
+    private MultiVRPSolutionCreator(bool deserializing) : base(deserializing) { }
+    public MultiVRPSolutionCreator()
+      : base() {
+        Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The new VRP tours."));
+
+        Parameters.Add(new ValueLookupParameter<IntValue>("Cities", "The city count."));
+        Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The coordinates of the cities."));
+        Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
+        Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false."));
+        Parameters.Add(new LookupParameter<IntValue>("Vehicles", "The number of vehicles."));
+        Parameters.Add(new LookupParameter<DoubleValue>("Capacity", "The capacity of each vehicle."));
+        Parameters.Add(new LookupParameter<DoubleArray>("Demand", "The demand of each customer."));
+        Parameters.Add(new LookupParameter<DoubleArray>("ReadyTime", "The ready time of each customer."));
+        Parameters.Add(new LookupParameter<DoubleArray>("DueTime", "The due time of each customer."));
+        Parameters.Add(new LookupParameter<DoubleArray>("ServiceTime", "The service time of each customer."));
+
+        foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IVRPCreator)).OrderBy(op => op.Name)) {
+          if (!typeof(MultiOperator<IVRPCreator>).IsAssignableFrom(type))
+            Operators.Add((IVRPCreator)Activator.CreateInstance(type), true);
+      }
+    }
+
+    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPCreator>> e) {
+      base.Operators_ItemsReplaced(sender, e);
+      ParameterizeManipulators();
+    }
+
+    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPCreator>> e) {
+      base.Operators_ItemsAdded(sender, e);
+      ParameterizeManipulators();
+    }
+
+    private void ParameterizeManipulators() {
+      foreach (IVRPCreator creator in Operators.OfType<IVRPCreator>()) {
+        creator.VRPToursParameter.ActualName = VRPToursParameter.Name;
+
+        if (creator.CoordinatesParameter != null) creator.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        if (creator.DistanceMatrixParameter != null) creator.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
+        if (creator.UseDistanceMatrixParameter != null) creator.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
+        if (creator.VehiclesParameter != null) creator.VehiclesParameter.ActualName = VehiclesParameter.Name;
+        if (creator.CapacityParameter != null) creator.CapacityParameter.ActualName = CapacityParameter.Name;
+        if (creator.DemandParameter != null) creator.DemandParameter.ActualName = DemandParameter.Name;
+        if (creator.ReadyTimeParameter != null) creator.ReadyTimeParameter.ActualName = ReadyTimeParameter.Name;
+        if (creator.DueTimeParameter != null) creator.DueTimeParameter.ActualName = DueTimeParameter.Name;
+        if (creator.ServiceTimeParameter != null) creator.ServiceTimeParameter.ActualName = ServiceTimeParameter.Name;
+      }
+      foreach (IStochasticOperator manipulator in Operators.OfType<IStochasticOperator>()) {
+        manipulator.RandomParameter.ActualName = RandomParameter.Name;
+      }
+    }
+
+    public override IOperation Apply() {
+      if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one VRP creator to choose from.");
+      return base.Apply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/PushForwardInsertionCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/PushForwardInsertionCreator.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/PushForwardInsertionCreator.cs	(revision 4352)
@@ -225,5 +225,5 @@
       int customer = -1;
       int subTourCount = 1;
-      List<int> route = new List<int>(CitiesParameter.ActualValue.Value + VehiclesParameter.ActualValue.Value - 1);
+      List<int> route = new List<int>(Cities + VehiclesParameter.ActualValue.Value - 1);
       minimumCost = double.MaxValue;
       indexOfMinimumCost = -1;
@@ -271,5 +271,5 @@
         customer = -1;
       } while (unroutedList.Count > 0);
-      while (route.Count < CitiesParameter.ActualValue.Value + VehiclesParameter.ActualValue.Value - 1)
+      while (route.Count < Cities + VehiclesParameter.ActualValue.Value - 1)
         route.Add(0);
 
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPCrossover.cs	(revision 4351)
+++ 	(revision )
@@ -1,144 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Linq;
-using HeuristicLab.Collections;
-using HeuristicLab.Core;
-using HeuristicLab.Operators;
-using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.PluginInfrastructure;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
-  [Item("MultiVRPCrossover", "Randomly selects and applies one of its crossovers every time it is called.")]
-  [StorableClass]
-  public class MultiVRPCrossover : StochasticMultiBranch<IVRPCrossover>, IVRPCrossover, IStochasticOperator {
-    public override bool CanChangeName {
-      get { return false; }
-    }
-    protected override bool CreateChildOperation {
-      get { return true; }
-    }
-
-    public ILookupParameter<ItemArray<IVRPEncoding>> ParentsParameter {
-      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["Parents"]; }
-    }
-
-    public ILookupParameter<IVRPEncoding> ChildParameter {
-      get { return (ILookupParameter<IVRPEncoding>)Parameters["Child"]; }
-    }
-
-    public int Cities {
-      get { return CoordinatesParameter.ActualValue.Rows - 1; }
-    }
-    public ILookupParameter<DoubleMatrix> CoordinatesParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
-    }
-    public ILookupParameter<DoubleMatrix> DistanceMatrixParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
-    }
-    public ILookupParameter<BoolValue> UseDistanceMatrixParameter {
-      get { return (ILookupParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
-    }
-    public ILookupParameter<IntValue> VehiclesParameter {
-      get { return (ILookupParameter<IntValue>)Parameters["Vehicles"]; }
-    }
-    public ILookupParameter<DoubleValue> CapacityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["Capacity"]; }
-    }
-    public ILookupParameter<DoubleArray> DemandParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Demand"]; }
-    }
-    public ILookupParameter<DoubleArray> ReadyTimeParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["ReadyTime"]; }
-    }
-    public ILookupParameter<DoubleArray> DueTimeParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["DueTime"]; }
-    }
-    public ILookupParameter<DoubleArray> ServiceTimeParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["ServiceTime"]; }
-    }
-
-    [StorableConstructor]
-    private MultiVRPCrossover(bool deserializing) : base(deserializing) { }
-    public MultiVRPCrossover()
-      : base() {
-       Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("Parents", "The parent permutations which should be crossed."));
-      ParentsParameter.ActualName = "VRPTours";
-      Parameters.Add(new LookupParameter<IVRPEncoding>("Child", "The child permutation resulting from the crossover."));
-      ChildParameter.ActualName = "VRPTours";
-
-      Parameters.Add(new ValueLookupParameter<IntValue>("Cities", "The city count."));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The coordinates of the cities."));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
-      Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false."));
-      Parameters.Add(new LookupParameter<IntValue>("Vehicles", "The number of vehicles."));
-      Parameters.Add(new LookupParameter<DoubleValue>("Capacity", "The capacity of each vehicle."));
-      Parameters.Add(new LookupParameter<DoubleArray>("Demand", "The demand of each customer."));
-      Parameters.Add(new LookupParameter<DoubleArray>("ReadyTime", "The ready time of each customer."));
-      Parameters.Add(new LookupParameter<DoubleArray>("DueTime", "The due time of each customer."));
-      Parameters.Add(new LookupParameter<DoubleArray>("ServiceTime", "The service time of each customer."));
-
-      foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IVRPCrossover))) {
-        if (!typeof(MultiOperator<IVRPCrossover>).IsAssignableFrom(type))
-          Operators.Add((IVRPCrossover)Activator.CreateInstance(type), true);
-      }
-    }
-
-    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPCrossover>> e) {
-      base.Operators_ItemsReplaced(sender, e);
-      ParameterizeCrossovers();
-    }
-
-    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPCrossover>> e) {
-      base.Operators_ItemsAdded(sender, e);
-      ParameterizeCrossovers();
-    }
-
-    private void ParameterizeCrossovers() {
-      foreach (IVRPCrossover crossover in Operators.OfType<IVRPCrossover>()) {
-        crossover.ChildParameter.ActualName = ChildParameter.Name;
-        crossover.ParentsParameter.ActualName = ParentsParameter.Name;
-
-        if (crossover.CoordinatesParameter != null) crossover.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
-        if (crossover.DistanceMatrixParameter != null) crossover.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
-        if (crossover.UseDistanceMatrixParameter != null) crossover.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
-        if (crossover.VehiclesParameter != null) crossover.VehiclesParameter.ActualName = VehiclesParameter.Name;
-        if (crossover.CapacityParameter != null) crossover.CapacityParameter.ActualName = CapacityParameter.Name;
-        if (crossover.DemandParameter != null) crossover.DemandParameter.ActualName = DemandParameter.Name;
-        if (crossover.ReadyTimeParameter != null) crossover.ReadyTimeParameter.ActualName = ReadyTimeParameter.Name;
-        if (crossover.DueTimeParameter != null) crossover.DueTimeParameter.ActualName = DueTimeParameter.Name;
-        if (crossover.ServiceTimeParameter != null) crossover.ServiceTimeParameter.ActualName = ServiceTimeParameter.Name;
-      }
-      foreach (IStochasticOperator crossover in Operators.OfType<IStochasticOperator>()) {
-        crossover.RandomParameter.ActualName = RandomParameter.Name;
-      }
-    }
-
-    public override IOperation Apply() {
-      if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one permutation crossover to choose from.");
-      return base.Apply();
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPManipulator.cs	(revision 4351)
+++ 	(revision )
@@ -1,136 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Linq;
-using HeuristicLab.Collections;
-using HeuristicLab.Core;
-using HeuristicLab.Operators;
-using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.PluginInfrastructure;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
-  [Item("MultiVRPManipulator", "Randomly selects and applies one of its manipulators every time it is called.")]
-  [StorableClass]
-  public class MultiVRPManipulator : StochasticMultiBranch<IVRPManipulator>, IVRPManipulator, IStochasticOperator {
-    public override bool CanChangeName {
-      get { return false; }
-    }
-    protected override bool CreateChildOperation {
-      get { return true; }
-    }
-
-    public ILookupParameter<IVRPEncoding> VRPToursParameter {
-      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
-    }
-
-    public int Cities {
-      get { return CoordinatesParameter.ActualValue.Rows - 1; }
-    }
-    public ILookupParameter<DoubleMatrix> CoordinatesParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
-    }
-    public ILookupParameter<DoubleMatrix> DistanceMatrixParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
-    }
-    public ILookupParameter<BoolValue> UseDistanceMatrixParameter {
-      get { return (ILookupParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
-    }
-    public ILookupParameter<IntValue> VehiclesParameter {
-      get { return (ILookupParameter<IntValue>)Parameters["Vehicles"]; }
-    }
-    public ILookupParameter<DoubleValue> CapacityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["Capacity"]; }
-    }
-    public ILookupParameter<DoubleArray> DemandParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Demand"]; }
-    }
-    public ILookupParameter<DoubleArray> ReadyTimeParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["ReadyTime"]; }
-    }
-    public ILookupParameter<DoubleArray> DueTimeParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["DueTime"]; }
-    }
-    public ILookupParameter<DoubleArray> ServiceTimeParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["ServiceTime"]; }
-    }
-
-    [StorableConstructor]
-    private MultiVRPManipulator(bool deserializing) : base(deserializing) { }
-    public MultiVRPManipulator()
-      : base() {
-      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours to be manipulated."));
-
-      Parameters.Add(new ValueLookupParameter<IntValue>("Cities", "The city count."));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The coordinates of the cities."));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
-      Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false."));
-      Parameters.Add(new LookupParameter<IntValue>("Vehicles", "The number of vehicles."));
-      Parameters.Add(new LookupParameter<DoubleValue>("Capacity", "The capacity of each vehicle."));
-      Parameters.Add(new LookupParameter<DoubleArray>("Demand", "The demand of each customer."));
-      Parameters.Add(new LookupParameter<DoubleArray>("ReadyTime", "The ready time of each customer."));
-      Parameters.Add(new LookupParameter<DoubleArray>("DueTime", "The due time of each customer."));
-      Parameters.Add(new LookupParameter<DoubleArray>("ServiceTime", "The service time of each customer."));
-
-      foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IVRPManipulator))) {
-        if (!typeof(MultiOperator<IVRPManipulator>).IsAssignableFrom(type))
-          Operators.Add((IVRPManipulator)Activator.CreateInstance(type), true);
-      }
-    }
-
-    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPManipulator>> e) {
-      base.Operators_ItemsReplaced(sender, e);
-      ParameterizeManipulators();
-    }
-
-    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPManipulator>> e) {
-      base.Operators_ItemsAdded(sender, e);
-      ParameterizeManipulators();
-    }
-
-    private void ParameterizeManipulators() {
-      foreach (IVRPManipulator manipulator in Operators.OfType<IVRPManipulator>()) {
-        manipulator.VRPToursParameter.ActualName = VRPToursParameter.Name;
-
-        if (manipulator.CoordinatesParameter != null) manipulator.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
-        if (manipulator.DistanceMatrixParameter != null) manipulator.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
-        if (manipulator.UseDistanceMatrixParameter != null) manipulator.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
-        if (manipulator.VehiclesParameter != null) manipulator.VehiclesParameter.ActualName = VehiclesParameter.Name;
-        if (manipulator.CapacityParameter != null) manipulator.CapacityParameter.ActualName = CapacityParameter.Name;
-        if (manipulator.DemandParameter != null) manipulator.DemandParameter.ActualName = DemandParameter.Name;
-        if (manipulator.ReadyTimeParameter != null) manipulator.ReadyTimeParameter.ActualName = ReadyTimeParameter.Name;
-        if (manipulator.DueTimeParameter != null) manipulator.DueTimeParameter.ActualName = DueTimeParameter.Name;
-        if (manipulator.ServiceTimeParameter != null) manipulator.ServiceTimeParameter.ActualName = ServiceTimeParameter.Name;
-      }
-      foreach (IStochasticOperator manipulator in Operators.OfType<IStochasticOperator>()) {
-        manipulator.RandomParameter.ActualName = RandomParameter.Name;
-      }
-    }
-
-    public override IOperation Apply() {
-      if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one permutation manipulator to choose from.");
-      return base.Apply();
-    }
-  }
-}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs	(revision 4352)
@@ -0,0 +1,144 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("MultiVRPSolutionCrossover", "Randomly selects and applies one of its crossovers every time it is called.")]
+  [StorableClass]
+  public class MultiVRPSolutionCrossover : StochasticMultiBranch<IVRPCrossover>, IVRPCrossover, IStochasticOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    protected override bool CreateChildOperation {
+      get { return true; }
+    }
+
+    public ILookupParameter<ItemArray<IVRPEncoding>> ParentsParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["Parents"]; }
+    }
+
+    public ILookupParameter<IVRPEncoding> ChildParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["Child"]; }
+    }
+
+    public int Cities {
+      get { return CoordinatesParameter.ActualValue.Rows - 1; }
+    }
+    public ILookupParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    }
+    public ILookupParameter<DoubleMatrix> DistanceMatrixParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
+    }
+    public ILookupParameter<BoolValue> UseDistanceMatrixParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
+    }
+    public ILookupParameter<IntValue> VehiclesParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["Vehicles"]; }
+    }
+    public ILookupParameter<DoubleValue> CapacityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Capacity"]; }
+    }
+    public ILookupParameter<DoubleArray> DemandParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["Demand"]; }
+    }
+    public ILookupParameter<DoubleArray> ReadyTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["ReadyTime"]; }
+    }
+    public ILookupParameter<DoubleArray> DueTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["DueTime"]; }
+    }
+    public ILookupParameter<DoubleArray> ServiceTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["ServiceTime"]; }
+    }
+
+    [StorableConstructor]
+    private MultiVRPSolutionCrossover(bool deserializing) : base(deserializing) { }
+    public MultiVRPSolutionCrossover()
+      : base() {
+       Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("Parents", "The parent permutations which should be crossed."));
+      ParentsParameter.ActualName = "VRPTours";
+      Parameters.Add(new LookupParameter<IVRPEncoding>("Child", "The child permutation resulting from the crossover."));
+      ChildParameter.ActualName = "VRPTours";
+
+      Parameters.Add(new ValueLookupParameter<IntValue>("Cities", "The city count."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The coordinates of the cities."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
+      Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false."));
+      Parameters.Add(new LookupParameter<IntValue>("Vehicles", "The number of vehicles."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Capacity", "The capacity of each vehicle."));
+      Parameters.Add(new LookupParameter<DoubleArray>("Demand", "The demand of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("ReadyTime", "The ready time of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("DueTime", "The due time of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("ServiceTime", "The service time of each customer."));
+
+      foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IVRPCrossover)).OrderBy(op => op.Name)) {
+        if (!typeof(MultiOperator<IVRPCrossover>).IsAssignableFrom(type))
+          Operators.Add((IVRPCrossover)Activator.CreateInstance(type), true);
+      }
+    }
+
+    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPCrossover>> e) {
+      base.Operators_ItemsReplaced(sender, e);
+      ParameterizeCrossovers();
+    }
+
+    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPCrossover>> e) {
+      base.Operators_ItemsAdded(sender, e);
+      ParameterizeCrossovers();
+    }
+
+    private void ParameterizeCrossovers() {
+      foreach (IVRPCrossover crossover in Operators.OfType<IVRPCrossover>()) {
+        crossover.ChildParameter.ActualName = ChildParameter.Name;
+        crossover.ParentsParameter.ActualName = ParentsParameter.Name;
+
+        if (crossover.CoordinatesParameter != null) crossover.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        if (crossover.DistanceMatrixParameter != null) crossover.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
+        if (crossover.UseDistanceMatrixParameter != null) crossover.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
+        if (crossover.VehiclesParameter != null) crossover.VehiclesParameter.ActualName = VehiclesParameter.Name;
+        if (crossover.CapacityParameter != null) crossover.CapacityParameter.ActualName = CapacityParameter.Name;
+        if (crossover.DemandParameter != null) crossover.DemandParameter.ActualName = DemandParameter.Name;
+        if (crossover.ReadyTimeParameter != null) crossover.ReadyTimeParameter.ActualName = ReadyTimeParameter.Name;
+        if (crossover.DueTimeParameter != null) crossover.DueTimeParameter.ActualName = DueTimeParameter.Name;
+        if (crossover.ServiceTimeParameter != null) crossover.ServiceTimeParameter.ActualName = ServiceTimeParameter.Name;
+      }
+      foreach (IStochasticOperator crossover in Operators.OfType<IStochasticOperator>()) {
+        crossover.RandomParameter.ActualName = RandomParameter.Name;
+      }
+    }
+
+    public override IOperation Apply() {
+      if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one permutation crossover to choose from.");
+      return base.Apply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/RandomParentCloneCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/RandomParentCloneCrossover.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/RandomParentCloneCrossover.cs	(revision 4352)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General.Crossovers {
+  [Item("RandomParentCloneCrossover", "An operator which randomly chooses one parent and returns a clone.")]
+  [StorableClass]
+  public sealed class RandomParentCloneCrossover : VRPCrossover, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    private RandomParentCloneCrossover(bool deserializing) : base(deserializing) { }
+
+    public RandomParentCloneCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+
+      Parameters.Remove("Coordinates");
+      Parameters.Remove("DistanceMatrix");
+      Parameters.Remove("UseDistanceMatrix");
+      Parameters.Remove("Vehicles");
+      Parameters.Remove("Capacity");
+      Parameters.Remove("Demand");
+      Parameters.Remove("ReadyTime");
+      Parameters.Remove("DueTime");
+      Parameters.Remove("ServiceTime");
+    }
+    
+    public override IOperation Apply() {
+      if (RandomParameter.ActualValue.Next() < 0.5)
+        ChildParameter.ActualValue = ParentsParameter.ActualValue[0].Clone() as IVRPEncoding;
+      else
+        ChildParameter.ActualValue = ParentsParameter.ActualValue[1].Clone() as IVRPEncoding;
+
+      return base.Apply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs	(revision 4352)
@@ -0,0 +1,142 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("MultiVRPSolutionManipulator", "Randomly selects and applies one of its manipulators every time it is called.")]
+  [StorableClass]
+  public class MultiVRPSolutionManipulator : StochasticMultiBranch<IVRPManipulator>, IVRPManipulator, IStochasticOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    protected override bool CreateChildOperation {
+      get { return true; }
+    }
+
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    public int Cities {
+      get { return CoordinatesParameter.ActualValue.Rows - 1; }
+    }
+    public ILookupParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    }
+    public ILookupParameter<DoubleMatrix> DistanceMatrixParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
+    }
+    public ILookupParameter<BoolValue> UseDistanceMatrixParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
+    }
+    public ILookupParameter<IntValue> VehiclesParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["Vehicles"]; }
+    }
+    public ILookupParameter<DoubleValue> CapacityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Capacity"]; }
+    }
+    public ILookupParameter<DoubleArray> DemandParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["Demand"]; }
+    }
+    public ILookupParameter<DoubleArray> ReadyTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["ReadyTime"]; }
+    }
+    public ILookupParameter<DoubleArray> DueTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["DueTime"]; }
+    }
+    public ILookupParameter<DoubleArray> ServiceTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["ServiceTime"]; }
+    }
+
+    [StorableConstructor]
+    private MultiVRPSolutionManipulator(bool deserializing) : base(deserializing) { }
+    public MultiVRPSolutionManipulator()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours to be manipulated."));
+
+      Parameters.Add(new ValueLookupParameter<IntValue>("Cities", "The city count."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The coordinates of the cities."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
+      Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false."));
+      Parameters.Add(new LookupParameter<IntValue>("Vehicles", "The number of vehicles."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Capacity", "The capacity of each vehicle."));
+      Parameters.Add(new LookupParameter<DoubleArray>("Demand", "The demand of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("ReadyTime", "The ready time of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("DueTime", "The due time of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("ServiceTime", "The service time of each customer."));
+
+      foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IVRPManipulator)).OrderBy(op => op.Name)) {
+        if (!typeof(MultiOperator<IVRPManipulator>).IsAssignableFrom(type)) {
+          IVRPManipulator op = (IVRPManipulator)Activator.CreateInstance(type);
+          bool operatorChecked = true; 
+          if(op is HeuristicLab.Problems.VehicleRouting.Encodings.Potvin.PotvinLocalSearchManipulator || 
+            op is HeuristicLab.Problems.VehicleRouting.Encodings.Prins.PrinsLSManipulator)
+            operatorChecked = false;
+          Operators.Add(op, operatorChecked);
+        }
+      }
+    }
+
+    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPManipulator>> e) {
+      base.Operators_ItemsReplaced(sender, e);
+      ParameterizeManipulators();
+    }
+
+    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPManipulator>> e) {
+      base.Operators_ItemsAdded(sender, e);
+      ParameterizeManipulators();
+    }
+
+    private void ParameterizeManipulators() {
+      foreach (IVRPManipulator manipulator in Operators.OfType<IVRPManipulator>()) {
+        manipulator.VRPToursParameter.ActualName = VRPToursParameter.Name;
+
+        if (manipulator.CoordinatesParameter != null) manipulator.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        if (manipulator.DistanceMatrixParameter != null) manipulator.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
+        if (manipulator.UseDistanceMatrixParameter != null) manipulator.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
+        if (manipulator.VehiclesParameter != null) manipulator.VehiclesParameter.ActualName = VehiclesParameter.Name;
+        if (manipulator.CapacityParameter != null) manipulator.CapacityParameter.ActualName = CapacityParameter.Name;
+        if (manipulator.DemandParameter != null) manipulator.DemandParameter.ActualName = DemandParameter.Name;
+        if (manipulator.ReadyTimeParameter != null) manipulator.ReadyTimeParameter.ActualName = ReadyTimeParameter.Name;
+        if (manipulator.DueTimeParameter != null) manipulator.DueTimeParameter.ActualName = DueTimeParameter.Name;
+        if (manipulator.ServiceTimeParameter != null) manipulator.ServiceTimeParameter.ActualName = ServiceTimeParameter.Name;
+      }
+      foreach (IStochasticOperator manipulator in Operators.OfType<IStochasticOperator>()) {
+        manipulator.RandomParameter.ActualName = RandomParameter.Name;
+      }
+    }
+
+    public override IOperation Apply() {
+      if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one permutation manipulator to choose from.");
+      return base.Apply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/Interfaces/IVRPMove.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/Interfaces/IVRPMove.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/Interfaces/IVRPMove.cs	(revision 4352)
@@ -27,5 +27,5 @@
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
   public interface IVRPMove : IItem {
-    TourEvaluation GetMoveQuality(IVRPEncoding individual, 
+    TourEvaluation GetMoveQuality(IntValue vehicles,
         DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, 
         DoubleValue capacity,DoubleMatrix coordinates,
@@ -34,5 +34,5 @@
       ILookupParameter<DoubleMatrix> distanceMatrix, BoolValue useDistanceMatrix);
 
-    void MakeMove(IRandom random, IVRPEncoding individual);
+    IVRPEncoding MakeMove();
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveEvaluator.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveEvaluator.cs	(revision 4352)
@@ -46,5 +46,5 @@
 
       return move.GetMoveQuality(
-        VRPToursParameter.ActualValue,
+        VehiclesParameter.ActualValue,
         DueTimeParameter.ActualValue,
         ServiceTimeParameter.ActualValue,
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs	(revision 4352)
@@ -118,5 +118,5 @@
       Parameters.Add(new LookupParameter<IVRPMove>("VRPMove", "The generated moves."));
 
-      foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IMultiVRPMoveGenerator))) {
+      foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IMultiVRPMoveGenerator)).OrderBy(op => op.Name)) {
         if (!typeof(MultiOperator<IMultiVRPMoveGenerator>).IsAssignableFrom(type))
           Operators.Add((IMultiVRPMoveGenerator)Activator.CreateInstance(type), true);
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveMaker.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveMaker.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveMaker.cs	(revision 4352)
@@ -114,5 +114,5 @@
      
       //perform move
-      move.MakeMove(RandomParameter.ActualValue, VRPToursParameter.ActualValue);
+      VRPToursParameter.ActualValue = move.MakeMove();
 
       quality.Value = moveQuality.Value;
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/PermutationEncoding.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/PermutationEncoding.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/PermutationEncoding.cs	(revision 4352)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using System;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("PermutationEncoding", "Represents a base class for permutation encodings of VRP solutions.")]
+  [StorableClass]
+  public abstract class PermutationEncoding : Permutation, IVRPEncoding {
+    #region IVRPEncoding Members
+    public abstract List<Tour> GetTours(ILookupParameter<DoubleMatrix> distanceMatrix = null, int maxVehicles = int.MaxValue);
+    #endregion
+
+    public PermutationEncoding(Permutation permutation)
+      : base(PermutationTypes.RelativeUndirected) {
+      this.array = new int[permutation.Length];
+      for (int i = 0; i < array.Length; i++)
+        this.array[i] = permutation[i];
+    }
+
+    [StorableConstructor]
+    protected PermutationEncoding(bool serializing)
+      : base() {
+    }
+
+    public int IndexOf(int city) {
+      return Array.IndexOf(this.array, city);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/TourEncoding.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/TourEncoding.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/TourEncoding.cs	(revision 4352)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Drawing;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("TourEncoding", "Represents a base class for tour encodings of VRP solutions.")]
+  [StorableClass]
+  public abstract class TourEncoding : Item, IVRPEncoding {
+    public override Image ItemImage {
+      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Class; }
+    }
+    
+    #region IVRPEncoding Members
+    public virtual List<Tour> GetTours(ILookupParameter<DoubleMatrix> distanceMatrix = null, int maxVehicles = int.MaxValue) {
+      List<Tour> result = new List<Tour>(Tours);
+
+      while (result.Count > maxVehicles) {
+        Tour tour = result[result.Count - 1];
+        result[result.Count - 2].Cities.AddRange(tour.Cities);
+
+        result.Remove(tour);
+      }
+
+      return result;
+    }
+
+    public int Cities {
+      get 
+      {
+        int cities = 0;
+
+        foreach (Tour tour in Tours) {
+          cities += tour.Cities.Count;
+        }
+
+        return cities;
+      }
+    }
+    #endregion
+
+    [Storable]
+    public ItemList<Tour> Tours { get; set; }
+
+    public TourEncoding() {
+      Tours = new ItemList<Tour>();
+    }
+
+    [StorableConstructor]
+    protected TourEncoding(bool serializing)
+      : base() {
+    }
+
+    public static void ConvertFrom(IVRPEncoding encoding, TourEncoding solution, ILookupParameter<DoubleMatrix> distanceMatrix) {
+      solution.Tours = new ItemList<Tour>(encoding.GetTours(distanceMatrix));
+    }
+
+    public static void ConvertFrom(List<int> route, TourEncoding solution) {
+      solution.Tours = new ItemList<Tour>();
+      
+      Tour tour = new Tour();
+      for (int i = 0; i < route.Count; i++) {
+        if (route[i] == 0) {
+          if (tour.Cities.Count > 0) {
+            solution.Tours.Add(tour);
+            tour = new Tour();
+          }
+        } else {
+          tour.Cities.Add(route[i]);
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinCrossover.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinCrossover.cs	(revision 4352)
@@ -129,5 +129,5 @@
 
         if (!(solution is PotvinEncoding)) {
-          parents[i] = PotvinEncoding.ConvertFrom(solution);
+          parents[i] = PotvinEncoding.ConvertFrom(solution, DistanceMatrixParameter);
         } else {
           parents[i] = solution;
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs	(revision 4352)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinRouteBasedCrossover", "The RBX crossover for a VRP representations.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
+  [StorableClass]
+  public sealed class PotvinRouteBasedCrossover : PotvinCrossover {
+    [StorableConstructor]
+    private PotvinRouteBasedCrossover(bool deserializing) : base(deserializing) { }
+
+    public PotvinRouteBasedCrossover()
+      : base() { }
+     
+    protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) {
+      PotvinEncoding child = parent2.Clone() as PotvinEncoding;
+
+      int tourParent1 = random.Next(parent1.Tours.Count);
+      Tour replacing = parent1.Tours[tourParent1].Clone() as Tour;
+
+      int tourParent2 = random.Next(child.Tours.Count);
+      Tour replaced = child.Tours[tourParent2];
+
+      child.Tours.Remove(replaced);
+      child.Tours.Add(replacing);
+
+      foreach (int city in replaced.Cities)
+        if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
+          child.Unrouted.Add(city);
+
+      if (Repair(random, child, replacing))
+        return child;
+      else {
+        if(random.NextDouble() < 0.5)
+          return parent1.Clone() as PotvinEncoding;
+        else
+          return parent2.Clone() as PotvinEncoding;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinSequenceBasedCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinSequenceBasedCrossover.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinSequenceBasedCrossover.cs	(revision 4352)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinSequenceBasedCrossover", "The SBX crossover for a VRP representations.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
+  [StorableClass]
+  public sealed class PotvinSequenceBasedCrossover : PotvinCrossover {
+    [StorableConstructor]
+    private PotvinSequenceBasedCrossover(bool deserializing) : base(deserializing) { }
+
+    public PotvinSequenceBasedCrossover()
+      : base() { }
+        
+    protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) {
+      PotvinEncoding child = parent1.Clone() as PotvinEncoding;
+      Tour newTour = new Tour();
+
+      int breakPoint1 = random.Next(1, Cities + 1);
+      Tour tour1 = FindRoute(child, breakPoint1);
+      breakPoint1 = tour1.Cities.IndexOf(breakPoint1);
+
+      for (int i = 0; i < breakPoint1; i++)
+        newTour.Cities.Add(tour1.Cities[i]);
+
+      int breakPoint2 = random.Next(1, Cities + 1);
+      Tour tour2 = FindRoute(parent2, breakPoint2);
+      breakPoint2 = tour2.Cities.IndexOf(breakPoint2);
+
+      for (int i = breakPoint2; i < tour2.Cities.Count; i++)
+        newTour.Cities.Add(tour2.Cities[i]);
+
+      child.Tours.Remove(tour1);
+      child.Tours.Add(newTour);
+
+      foreach (int city in tour1.Cities)
+        if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
+          child.Unrouted.Add(city);
+
+      foreach (int city in tour2.Cities)
+        if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
+          child.Unrouted.Add(city);
+
+      if (Feasible(newTour) &&
+          Repair(random, child, newTour)) {
+        return child;
+      } else {
+        if (random.NextDouble() < 0.5)
+          return parent1.Clone() as PotvinEncoding;
+        else
+          return parent2.Clone() as PotvinEncoding;
+      }
+    }
+  }
+}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/RouteBasedCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/RouteBasedCrossover.cs	(revision 4351)
+++ 	(revision )
@@ -1,64 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
-  [Item("RouteBasedCrossover", "The RBX crossover for a VRP representations.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
-  [StorableClass]
-  public sealed class RouteBasedCrossover : PotvinCrossover {
-    [StorableConstructor]
-    private RouteBasedCrossover(bool deserializing) : base(deserializing) { }
-
-    public RouteBasedCrossover()
-      : base() { }
-     
-    protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) {
-      PotvinEncoding child = parent2.Clone() as PotvinEncoding;
-
-      int tourParent1 = random.Next(parent1.Tours.Count);
-      Tour replacing = parent1.Tours[tourParent1].Clone() as Tour;
-
-      int tourParent2 = random.Next(child.Tours.Count);
-      Tour replaced = child.Tours[tourParent2];
-
-      child.Tours.Remove(replaced);
-      child.Tours.Add(replacing);
-
-      foreach (int city in replaced.Cities)
-        if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
-          child.Unrouted.Add(city);
-
-      if (Repair(random, child, replacing))
-        return child;
-      else {
-        if(random.NextDouble() < 0.5)
-          return parent1.Clone() as PotvinEncoding;
-        else
-          return parent2.Clone() as PotvinEncoding;
-      }
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/SequenceBasedCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/SequenceBasedCrossover.cs	(revision 4351)
+++ 	(revision )
@@ -1,78 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
-  [Item("SequenceBasedCrossover", "The SBX crossover for a VRP representations.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
-  [StorableClass]
-  public sealed class SequenceBasedCrossover : PotvinCrossover {
-    [StorableConstructor]
-    private SequenceBasedCrossover(bool deserializing) : base(deserializing) { }
-
-    public SequenceBasedCrossover()
-      : base() { }
-        
-    protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) {
-      PotvinEncoding child = parent1.Clone() as PotvinEncoding;
-      Tour newTour = new Tour();
-
-      int breakPoint1 = random.Next(1, Cities + 1);
-      Tour tour1 = FindRoute(child, breakPoint1);
-      breakPoint1 = tour1.Cities.IndexOf(breakPoint1);
-
-      for (int i = 0; i < breakPoint1; i++)
-        newTour.Cities.Add(tour1.Cities[i]);
-
-      int breakPoint2 = random.Next(1, Cities + 1);
-      Tour tour2 = FindRoute(parent2, breakPoint2);
-      breakPoint2 = tour2.Cities.IndexOf(breakPoint2);
-
-      for (int i = breakPoint2; i < tour2.Cities.Count; i++)
-        newTour.Cities.Add(tour2.Cities[i]);
-
-      child.Tours.Remove(tour1);
-      child.Tours.Add(newTour);
-
-      foreach (int city in tour1.Cities)
-        if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
-          child.Unrouted.Add(city);
-
-      foreach (int city in tour2.Cities)
-        if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
-          child.Unrouted.Add(city);
-
-      if (Feasible(newTour) &&
-          Repair(random, child, newTour)) {
-        return child;
-      } else {
-        if (random.NextDouble() < 0.5)
-          return parent1.Clone() as PotvinEncoding;
-        else
-          return parent2.Clone() as PotvinEncoding;
-      }
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/LocalSearchManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/LocalSearchManipulator.cs	(revision 4351)
+++ 	(revision )
@@ -1,113 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
-  [Item("LocalSearchManipulator", "The LSM operator which manipulates a VRP representation.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
-  [StorableClass]
-  public sealed class LocalSearchManipulator : PotvinManipulator {
-    [StorableConstructor]
-    private LocalSearchManipulator(bool deserializing) : base(deserializing) { }
-
-    public LocalSearchManipulator() : base() { }
-
-    private bool FindBetterInsertionPlace(
-      PotvinEncoding individual, int tour, int city, int length,
-      out int insertionTour, out int insertionPlace) {
-      bool insertionFound = false;
-      insertionTour = -1;
-      insertionPlace = 1;
-
-      List<int> toBeDeleted = individual.Tours[tour].Cities.GetRange(city, length);
-      double distance = GetLength(individual.Tours[tour]);
-      individual.Tours[tour].Cities.RemoveRange(city, length);
-      double removalBenefit = distance - GetLength(individual.Tours[tour]);
-
-      int currentTour = 0;
-      while (currentTour < individual.Tours.Count && !insertionFound) {
-        int currentCity = 0;
-        while (currentCity <= individual.Tours[currentTour].Cities.Count && !insertionFound) {
-          distance = GetLength(individual.Tours[currentTour]);
-          individual.Tours[currentTour].Cities.InsertRange(currentCity, toBeDeleted);
-          if (Feasible(individual.Tours[currentTour])) {
-            double lengthIncrease =
-              GetLength(individual.Tours[currentTour]) - distance;
-            if (removalBenefit > lengthIncrease) {
-              insertionTour = currentTour;
-              insertionPlace = currentCity;
-
-              insertionFound = true;
-            }
-          }
-          individual.Tours[currentTour].Cities.RemoveRange(currentCity, length);
-          
-          currentCity++;
-        }
-        currentTour++;
-      }
-
-      individual.Tours[tour].Cities.InsertRange(city, toBeDeleted);
-
-      return insertionFound;
-    }
-
-    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
-      //only apply to feasible individuals
-      if (Feasible(individual)) {
-        bool insertionFound;
-
-        do {
-          insertionFound = false;
-          int length = 3;
-          while (length > 0 && !insertionFound) {
-            int tour = 0;
-            while (tour < individual.Tours.Count && !insertionFound) {
-              int city = 0;
-              while (city <= individual.Tours[tour].Cities.Count - length && !insertionFound) {
-                int insertionTour, insertionPlace;
-                if (FindBetterInsertionPlace(individual, tour, city, length,
-                 out insertionTour, out insertionPlace)) {
-                  insertionFound = true;
-
-                  List<int> toBeInserted = individual.Tours[tour].Cities.GetRange(city, length);
-
-                  individual.Tours[tour].Cities.RemoveRange(city, length);
-                  individual.Tours[insertionTour].Cities.InsertRange(
-                    insertionPlace,
-                    toBeInserted);
-                }
-                city++;
-              }
-              tour++;
-            }
-            length--;
-          }
-        } while (insertionFound);
-      }
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/OneLevelExchangeManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/OneLevelExchangeManipulator.cs	(revision 4351)
+++ 	(revision )
@@ -1,65 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
-  [Item("OneLevelExchangeMainpulator", "The 1M operator which manipulates a VRP representation.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
-  [StorableClass]
-  public sealed class OneLevelExchangeMainpulator : PotvinManipulator {
-    [StorableConstructor]
-    private OneLevelExchangeMainpulator(bool deserializing) : base(deserializing) { }
-
-    public OneLevelExchangeMainpulator() : base() { }
-    
-    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
-      int selectedIndex = SelectRandomTourBiasedByLength(random, individual);
-      Tour route1 =
-        individual.Tours[selectedIndex];
-
-      List<int> replaced = new List<int>();
-      for (int i = 0; i < route1.Cities.Count; i++) {
-        int insertedRoute, insertedPlace;
-
-        if (FindInsertionPlace(individual, route1.Cities[i], selectedIndex, out insertedRoute, out insertedPlace)) {
-          individual.Tours[insertedRoute].Cities.Insert(insertedPlace, route1.Cities[i]);
-          replaced.Add(route1.Cities[i]);
-        }
-      }
-
-      route1.Cities.RemoveAll(
-        new System.Predicate<int>( 
-          delegate(int val) {
-            return (replaced.Contains(val)); 
-          }
-        )
-      );
-
-      if (route1.Cities.Count == 0)
-        individual.Tours.Remove(route1);
-    }
-  }
-}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinLocalSearchManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinLocalSearchManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinLocalSearchManipulator.cs	(revision 4352)
@@ -0,0 +1,132 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinLocalSearchManipulator", "The LSM operator which manipulates a VRP representation.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
+  [StorableClass]
+  public sealed class PotvinLocalSearchManipulator : PotvinManipulator {
+    public IValueParameter<IntValue> Iterations {
+      get { return (IValueParameter<IntValue>)Parameters["Iterations"]; }
+    }
+
+    [StorableConstructor]
+    private PotvinLocalSearchManipulator(bool deserializing) : base(deserializing) { }
+
+    public PotvinLocalSearchManipulator() : base() {
+      Parameters.Add(new ValueParameter<IntValue>("Iterations", "The number of max iterations.", new IntValue(100)));
+    }
+
+    private bool FindBetterInsertionPlace(
+      PotvinEncoding individual, int tour, int city, int length,
+      out int insertionTour, out int insertionPlace) {
+      bool insertionFound = false;
+      insertionTour = -1;
+      insertionPlace = 1;
+
+      List<int> toBeDeleted = individual.Tours[tour].Cities.GetRange(city, length);
+      double distance = GetLength(individual.Tours[tour]);
+      individual.Tours[tour].Cities.RemoveRange(city, length);
+      double removalBenefit = distance - GetLength(individual.Tours[tour]);
+
+      int currentTour = 0;
+      while (currentTour < individual.Tours.Count && !insertionFound) {
+        int currentCity = 0;
+        while (currentCity <= individual.Tours[currentTour].Cities.Count && !insertionFound) {
+          distance = GetLength(individual.Tours[currentTour]);
+          individual.Tours[currentTour].Cities.InsertRange(currentCity, toBeDeleted);
+          if (Feasible(individual.Tours[currentTour])) {
+            double lengthIncrease =
+              GetLength(individual.Tours[currentTour]) - distance;
+            if (removalBenefit > lengthIncrease) {
+              insertionTour = currentTour;
+              insertionPlace = currentCity;
+
+              insertionFound = true;
+            }
+          }
+          individual.Tours[currentTour].Cities.RemoveRange(currentCity, length);
+          
+          currentCity++;
+        }
+        currentTour++;
+      }
+
+      individual.Tours[tour].Cities.InsertRange(city, toBeDeleted);
+
+      return insertionFound;
+    }
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      //only apply to feasible individuals
+      if (Feasible(individual)) {
+        bool insertionFound;
+        int iterations = 0;
+
+        do {
+          insertionFound = false;
+          int length = 3;
+          while (length > 0 && !insertionFound) {
+            int tour = 0;
+            while (tour < individual.Tours.Count && !insertionFound) {
+              int city = 0;
+              while (city <= individual.Tours[tour].Cities.Count - length && !insertionFound) {
+                int insertionTour, insertionPlace;
+                if (FindBetterInsertionPlace(individual, tour, city, length,
+                 out insertionTour, out insertionPlace)) {
+                  insertionFound = true;
+
+                  List<int> toBeInserted = individual.Tours[tour].Cities.GetRange(city, length);
+
+                  individual.Tours[tour].Cities.RemoveRange(city, length);
+                  individual.Tours[insertionTour].Cities.InsertRange(
+                    insertionPlace,
+                    toBeInserted); 
+                }
+                city++;
+              }
+              tour++;
+            }
+            length--;
+          }
+          iterations++;
+        } while (insertionFound && 
+          iterations < Iterations.Value.Value);
+
+        IList<Tour> toBeRemoved = new List<Tour>();
+        foreach (Tour tour in individual.Tours) {
+          if (tour.Cities.Count == 0)
+            toBeRemoved.Add(tour);
+        }
+
+        foreach (Tour tour in toBeRemoved) {
+          individual.Tours.Remove(tour);
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinManipulator.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinManipulator.cs	(revision 4352)
@@ -82,5 +82,5 @@
       IVRPEncoding solution = VRPToursParameter.ActualValue;
       if (!(solution is PotvinEncoding)) {
-        VRPToursParameter.ActualValue = PotvinEncoding.ConvertFrom(solution);
+        VRPToursParameter.ActualValue = PotvinEncoding.ConvertFrom(solution, DistanceMatrixParameter);
       }
       
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinOneLevelExchangeManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinOneLevelExchangeManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinOneLevelExchangeManipulator.cs	(revision 4352)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinOneLevelExchangeMainpulator", "The 1M operator which manipulates a VRP representation.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
+  [StorableClass]
+  public sealed class PotvinOneLevelExchangeMainpulator : PotvinManipulator {
+    [StorableConstructor]
+    private PotvinOneLevelExchangeMainpulator(bool deserializing) : base(deserializing) { }
+
+    public PotvinOneLevelExchangeMainpulator() : base() { }
+    
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      int selectedIndex = SelectRandomTourBiasedByLength(random, individual);
+      Tour route1 =
+        individual.Tours[selectedIndex];
+
+      List<int> replaced = new List<int>();
+      for (int i = 0; i < route1.Cities.Count; i++) {
+        int insertedRoute, insertedPlace;
+
+        if (FindInsertionPlace(individual, route1.Cities[i], selectedIndex, out insertedRoute, out insertedPlace)) {
+          individual.Tours[insertedRoute].Cities.Insert(insertedPlace, route1.Cities[i]);
+          replaced.Add(route1.Cities[i]);
+        }
+      }
+
+      route1.Cities.RemoveAll(
+        new System.Predicate<int>( 
+          delegate(int val) {
+            return (replaced.Contains(val)); 
+          }
+        )
+      );
+
+      if (route1.Cities.Count == 0)
+        individual.Tours.Remove(route1);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinTwoLevelExchangeManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinTwoLevelExchangeManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinTwoLevelExchangeManipulator.cs	(revision 4352)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinTwoLevelExchangeManipulator", "The 2M operator which manipulates a VRP representation.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
+  [StorableClass]
+  public sealed class PotvinTwoLevelExchangeManipulator : PotvinManipulator {
+    [StorableConstructor]
+    private PotvinTwoLevelExchangeManipulator(bool deserializing) : base(deserializing) { }
+
+    public PotvinTwoLevelExchangeManipulator() : base() { }
+    
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      int selectedIndex = SelectRandomTourBiasedByLength(random, individual);
+      Tour route1 =
+        individual.Tours[selectedIndex];
+
+      for (int customer1Position = 0; customer1Position < route1.Cities.Count; customer1Position++) {
+        foreach (Tour tour in individual.Tours) {
+          if (tour != route1) {
+            for (int customer2Position = 0; customer2Position < tour.Cities.Count; customer2Position++) {
+              int customer1 = route1.Cities[customer1Position];
+              int customer2 = tour.Cities[customer2Position];
+
+              //customer1 can be feasibly inserted at the location of customer2
+              tour.Cities[customer2Position] = customer1;
+              if (Feasible(tour)) {
+                int route, place;
+                if (FindInsertionPlace(individual,
+                  customer2, selectedIndex, out route, out place)) {
+                    individual.Tours[route].Cities.Insert(place, customer2);
+                  route1.Cities.RemoveAt(customer1Position);
+
+                  if (route1.Cities.Count == 0)
+                    individual.Tours.Remove(route1);
+
+                  //two-level exchange has been performed
+                  return;
+                } else {
+                  tour.Cities[customer2Position] = customer2;
+                }
+              } else {
+                tour.Cities[customer2Position] = customer2;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/TwoLevelExchangeManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/TwoLevelExchangeManipulator.cs	(revision 4351)
+++ 	(revision )
@@ -1,76 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
-  [Item("TwoLevelExchangeManipulator", "The 2M operator which manipulates a VRP representation.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
-  [StorableClass]
-  public sealed class TwoLevelExchangeManipulator : PotvinManipulator {
-    [StorableConstructor]
-    private TwoLevelExchangeManipulator(bool deserializing) : base(deserializing) { }
-
-    public TwoLevelExchangeManipulator() : base() { }
-    
-    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
-      int selectedIndex = SelectRandomTourBiasedByLength(random, individual);
-      Tour route1 =
-        individual.Tours[selectedIndex];
-
-      for (int customer1Position = 0; customer1Position < route1.Cities.Count; customer1Position++) {
-        foreach (Tour tour in individual.Tours) {
-          if (tour != route1) {
-            for (int customer2Position = 0; customer2Position < tour.Cities.Count; customer2Position++) {
-              int customer1 = route1.Cities[customer1Position];
-              int customer2 = tour.Cities[customer2Position];
-
-              //customer1 can be feasibly inserted at the location of customer2
-              tour.Cities[customer2Position] = customer1;
-              if (Feasible(tour)) {
-                int route, place;
-                if (FindInsertionPlace(individual,
-                  customer2, selectedIndex, out route, out place)) {
-                    individual.Tours[route].Cities.Insert(place, customer2);
-                  route1.Cities.RemoveAt(customer1Position);
-
-                  if (route1.Cities.Count == 0)
-                    individual.Tours.Remove(route1);
-
-                  //two-level exchange has been performed
-                  return;
-                } else {
-                  tour.Cities[customer2Position] = customer2;
-                }
-              } else {
-                tour.Cities[customer2Position] = customer2;
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/PotvinEncoding.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/PotvinEncoding.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/PotvinEncoding.cs	(revision 4352)
@@ -27,31 +27,10 @@
 using System.Drawing;
 using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
   [Item("PotvinEncoding", "Represents a potvin encoding of VRP solutions. It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
   [StorableClass]
-  public class PotvinEncoding : Item, IVRPEncoding {
-    public override Image ItemImage {
-      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Class; }
-    }
-    
-    #region IVRPEncoding Members
-    [Storable]
-    public ItemList<Tour> Tours { get; set; }
-
-    public int Cities {
-      get 
-      {
-        int cities = 0;
-
-        foreach (Tour tour in Tours) {
-          cities += tour.Cities.Count;
-        }
-
-        return cities;
-      }
-    }
-    #endregion
-
+  public class PotvinEncoding : TourEncoding {   
     [Storable]
     public List<int> Unrouted { get; set; }
@@ -65,14 +44,17 @@
     }
 
-    public PotvinEncoding() {
-      Tours = new ItemList<Tour>();
+    public PotvinEncoding(): base() {
       Unrouted = new List<int>();
     }
+
+    [StorableConstructor]
+    private PotvinEncoding(bool serializing)
+      : base() {
+    }
     
-    public static PotvinEncoding ConvertFrom(IVRPEncoding encoding) {
+    public static PotvinEncoding ConvertFrom(IVRPEncoding encoding, ILookupParameter<DoubleMatrix> distanceMatrix) {
       PotvinEncoding solution = new PotvinEncoding();
 
-      solution.Tours.AddRange(
-        encoding.Tours);
+      TourEncoding.ConvertFrom(encoding, solution, distanceMatrix);
 
       return solution;
@@ -82,15 +64,5 @@
       PotvinEncoding solution = new PotvinEncoding();
 
-      Tour tour = new Tour();
-      for (int i = 0; i < route.Count; i++) {
-        if (route[i] == 0) {
-          if (tour.Cities.Count > 0) {
-            solution.Tours.Add(tour);
-            tour = new Tour();
-          }
-        } else {
-          tour.Cities.Add(route[i]);
-        }
-      }
+      TourEncoding.ConvertFrom(route, solution);
 
       return solution;
@@ -115,5 +87,5 @@
             if (Tours[tour].Feasible(dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, 
               capacity, coordinates, distanceMatrix, useDistanceMatrix)) {
-              double newLength = Tours[tour].GetLength(coordinates, distanceMatrix, useDistanceMatrix);
+                double newLength = Tours[tour].GetLength(coordinates, distanceMatrix, useDistanceMatrix);
 
               double detour = newLength - length;
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Crossovers/PrinsCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Crossovers/PrinsCrossover.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Crossovers/PrinsCrossover.cs	(revision 4352)
@@ -0,0 +1,102 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsCrossover", "An operator which crosses two VRP representations.")]
+  [StorableClass]
+  public abstract class PrinsCrossover : VRPCrossover, IStochasticOperator {
+    public ILookupParameter<DoubleValue> FleetUsageFactor {
+      get { return (ILookupParameter<DoubleValue>)Parameters["EvalFleetUsageFactor"]; }
+    }
+    public ILookupParameter<DoubleValue> TimeFactor {
+      get { return (ILookupParameter<DoubleValue>)Parameters["EvalTimeFactor"]; }
+    }
+    public ILookupParameter<DoubleValue> DistanceFactor {
+      get { return (ILookupParameter<DoubleValue>)Parameters["EvalDistanceFactor"]; }
+    }
+    public ILookupParameter<DoubleValue> OverloadPenalty {
+      get { return (ILookupParameter<DoubleValue>)Parameters["EvalOverloadPenalty"]; }
+    }
+    public ILookupParameter<DoubleValue> TardinessPenalty {
+      get { return (ILookupParameter<DoubleValue>)Parameters["EvalTardinessPenalty"]; }
+    }
+    
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    
+    [StorableConstructor]
+    protected PrinsCrossover(bool deserializing) : base(deserializing) { }
+
+    public PrinsCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("EvalFleetUsageFactor", "The fleet usage factor considered in the evaluation."));
+      Parameters.Add(new LookupParameter<DoubleValue>("EvalTimeFactor", "The time factor considered in the evaluation."));
+      Parameters.Add(new LookupParameter<DoubleValue>("EvalDistanceFactor", "The distance factor considered in the evaluation."));
+      Parameters.Add(new LookupParameter<DoubleValue>("EvalOverloadPenalty", "The overload penalty considered in the evaluation."));
+      Parameters.Add(new LookupParameter<DoubleValue>("EvalTardinessPenalty", "The tardiness penalty considered in the evaluation."));
+
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+    protected abstract PrinsEncoding Crossover(IRandom random, PrinsEncoding parent1, PrinsEncoding parent2);
+
+    public override IOperation Apply() {
+      ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
+      for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
+        IVRPEncoding solution = ParentsParameter.ActualValue[i];
+
+        if (!(solution is PrinsEncoding)) {
+          parents[i] = PrinsEncoding.ConvertFrom(solution,
+            Cities, 
+            DueTimeParameter.ActualValue,
+            ServiceTimeParameter.ActualValue,
+            ReadyTimeParameter.ActualValue,
+            DemandParameter.ActualValue,
+            CapacityParameter.ActualValue,
+            FleetUsageFactor.ActualValue,
+            TimeFactor.ActualValue,
+            DistanceFactor.ActualValue,
+            OverloadPenalty.ActualValue,
+            TardinessPenalty.ActualValue,
+            CoordinatesParameter.ActualValue,
+            DistanceMatrixParameter,
+            UseDistanceMatrixParameter.ActualValue);
+        } else {
+          parents[i] = solution;
+        }
+      }
+      ParentsParameter.ActualValue = parents;
+
+      ChildParameter.ActualValue =
+        Crossover(RandomParameter.ActualValue, parents[0] as PrinsEncoding, parents[1] as PrinsEncoding);
+
+      return base.Apply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Crossovers/PrinsPermutationCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Crossovers/PrinsPermutationCrossover.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Crossovers/PrinsPermutationCrossover.cs	(revision 4352)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsPermutationCrossover", "An operator which crosses two VRP representations using a standard permutation operator.  It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
+  [StorableClass]
+  public sealed class PrinsPermutationCrossover : PrinsCrossover, IPrinsOperator {    
+    public IValueLookupParameter<IPermutationCrossover> InnerCrossoverParameter {
+      get { return (IValueLookupParameter<IPermutationCrossover>)Parameters["InnerCrossover"]; }
+    }
+
+    [StorableConstructor]
+    private PrinsPermutationCrossover(bool deserializing) : base(deserializing) { }
+
+    public PrinsPermutationCrossover()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IPermutationCrossover>("InnerCrossover", "The permutation crossover.", new OrderCrossover()));
+    }
+
+    protected override PrinsEncoding Crossover(IRandom random, PrinsEncoding parent1, PrinsEncoding parent2) {
+      //note - the inner crossover is called here and the result is converted to a prins representation
+      //some refactoring should be done here in the future - the crossover operation should be called directly
+
+      InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(
+        InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope);
+      op.Operator.Execute((IExecutionContext)op);
+
+      string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;
+      if (ExecutionContext.Scope.Variables.ContainsKey(childName)) {
+        Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation;
+        ExecutionContext.Scope.Variables.Remove(childName);
+
+        return new PrinsEncoding(permutation, Cities,
+          DueTimeParameter.ActualValue,
+            ServiceTimeParameter.ActualValue,
+            ReadyTimeParameter.ActualValue,
+            DemandParameter.ActualValue,
+            CapacityParameter.ActualValue,
+            FleetUsageFactor.ActualValue,
+            TimeFactor.ActualValue,
+            DistanceFactor.ActualValue,
+            OverloadPenalty.ActualValue,
+            TardinessPenalty.ActualValue,
+            CoordinatesParameter.ActualValue,
+            UseDistanceMatrixParameter.ActualValue);
+      } else
+        return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Interfaces/IPrinsOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Interfaces/IPrinsOperator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Interfaces/IPrinsOperator.cs	(revision 4352)
@@ -0,0 +1,37 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  interface IPrinsOperator: IVRPOperator {
+    ILookupParameter<DoubleValue> FleetUsageFactor { get; }
+    ILookupParameter<DoubleValue> TimeFactor { get; }
+    ILookupParameter<DoubleValue> DistanceFactor { get; }
+    ILookupParameter<DoubleValue> OverloadPenalty { get; }
+    ILookupParameter<DoubleValue> TardinessPenalty { get; }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsExhaustiveLSManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsExhaustiveLSManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsExhaustiveLSManipulator.cs	(revision 4352)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsExhaustiveLSManipulator", "An operator which manipulates a VRP representation by using the exhaustive Prins local search.  It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
+  [StorableClass]
+  public sealed class PrinsExhaustiveLSManipulator : PrinsLSManipulator {   
+    [StorableConstructor]
+    private PrinsExhaustiveLSManipulator(bool deserializing) : base(deserializing) { }
+
+    public PrinsExhaustiveLSManipulator()
+      : base() {
+    }
+
+    protected override void Manipulate(IRandom random, PrinsEncoding individual) {
+      List<Tour> tours = individual.GetTours(DistanceMatrixParameter);
+      bool improvement = false;
+      int iterations = 0;
+
+      do {
+        int u = depot;
+        improvement = false;
+        double originalQuality = GetQuality(individual);
+        PrinsEncoding child = null;
+
+        while (!improvement && u < Cities) {
+          int v = depot;
+          while (!improvement && v < Cities) {
+            if (u != v) {
+              child = Manipulate(individual,
+                originalQuality, u, v);
+
+              improvement = child != null;
+            }
+            v++;
+          }
+          u++;
+        }
+
+        if (improvement) {
+          for (int i = 0; i < child.Length; i++) {
+            individual[i] = child[i];
+          }
+        }
+
+        iterations++;
+      } while (improvement && 
+        iterations < Iterations.Value.Value);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsLSManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsLSManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsLSManipulator.cs	(revision 4352)
@@ -0,0 +1,468 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsLSManipulator", "An operator which manipulates a VRP representation by using the Prins local search.  It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
+  [StorableClass]
+  public abstract class PrinsLSManipulator : PrinsManipulator {
+    public IValueParameter<IntValue> Iterations {
+      get { return (IValueParameter<IntValue>)Parameters["Iterations"]; }
+    }
+        
+    [StorableConstructor]
+    protected PrinsLSManipulator(bool deserializing) : base(deserializing) { }
+
+    public PrinsLSManipulator()
+      : base() {
+      Parameters.Add(new ValueParameter<IntValue>("Iterations", "The number of max iterations.", new IntValue(5)));
+    }
+
+    protected double GetQuality(PrinsEncoding individual) {
+      return VRPEvaluator.Evaluate(individual,
+        VehiclesParameter.ActualValue,
+        DueTimeParameter.ActualValue,
+        ServiceTimeParameter.ActualValue,
+        ReadyTimeParameter.ActualValue,
+        DemandParameter.ActualValue,
+        CapacityParameter.ActualValue,
+        FleetUsageFactor.ActualValue,
+        TimeFactor.ActualValue,
+        DistanceFactor.ActualValue,
+        OverloadPenalty.ActualValue,
+        TardinessPenalty.ActualValue,
+        CoordinatesParameter.ActualValue,
+        DistanceMatrixParameter,
+        UseDistanceMatrixParameter.ActualValue).Quality;
+    }
+
+    private int FindCity(PrinsEncoding individual, int city) {
+      int index = -1;
+
+      int i = 0;
+      while (i < individual.Length && index == -1) {
+        if (individual[i] == city)
+          index = i;
+        
+        i++;
+      }
+
+      return index;
+    }
+
+    protected const int depot = -1;
+
+    private Tour FindTour(PrinsEncoding individual, int city) {
+      Tour found = null;
+
+      List<Tour> tours = individual.GetTours(DistanceMatrixParameter);
+      int i = 0;
+
+      while (found == null && i < tours.Count) {
+        if (tours[i].Cities.Contains(city))
+          found = tours[i];
+        
+        i++;
+      }
+
+      return found;
+    }
+
+    //inserts u after v in the child
+    private void InsertAfter(int u, int v, PrinsEncoding parent, PrinsEncoding child) {
+      int pi = 0;
+      int ci = 0;
+
+      while (ci != child.Length) {
+        if (parent[pi] != u) {
+          child[ci] = parent[pi];
+          ci++;
+        }
+        if (parent[pi] == v) {
+          child[ci] = u;
+          ci++;
+        }
+
+        pi++;
+      }
+    }
+
+    //inserts (u, x) after v in the child
+    private void InsertAfter(int u, int x, int v, PrinsEncoding parent, PrinsEncoding child) {
+      int pi = 0;
+      int ci = 0;
+
+      while (ci != child.Length) {
+        if (parent[pi] != u && parent[pi] != x) {
+          child[ci] = parent[pi];
+          ci++;
+        }
+        if (parent[pi] == v) {
+          child[ci] = u;
+          ci++;
+
+          child[ci] = x;
+          ci++;
+        }
+
+        pi++;
+      }
+    }
+
+    //inserts u before v in the child
+    private void InsertBefore(int u, int v, PrinsEncoding parent, PrinsEncoding child) {
+      int pi = 0;
+      int ci = 0;
+
+      while (ci != child.Length) {
+        if (parent[pi] == v) {
+          child[ci] = u;
+          ci++;
+        }
+        if (parent[pi] != u) {
+          child[ci] = parent[pi];
+          ci++;
+        }
+
+        pi++;
+      }
+    }
+
+    //inserts (u, x) before v in the child
+    private void InsertBefore(int u, int x, int v, PrinsEncoding parent, PrinsEncoding child) {
+      int pi = 0;
+      int ci = 0;
+
+      while (ci != child.Length) {
+        if (parent[pi] == v) {
+          child[ci] = u;
+          ci++;
+
+          child[ci] = x;
+          ci++;
+        }
+        if (parent[pi] != u && parent[pi] != x) {
+          child[ci] = parent[pi];
+          ci++;
+        }
+
+        pi++;
+      }
+    }
+
+    //swaps u and v
+    private void Swap(int u, int v, PrinsEncoding parent, PrinsEncoding child) {
+      for (int i = 0; i < child.Length; i++) {
+        if (parent[i] == u)
+          child[i] = v;
+        else if (parent[i] == v)
+          child[i] = u;
+        else
+          child[i] = parent[i];
+      }
+    }
+
+    //swaps (u, x) and v
+    private void Swap(int u, int x, int v, PrinsEncoding parent, PrinsEncoding child) {
+      int childIndex = 0;
+      int parentIndex = 0;
+
+      while(childIndex < child.Length) {
+        if (parent[parentIndex] == u) {
+          child[childIndex] = v;
+          parentIndex++;
+        } else if (parent[parentIndex] == v) {
+          child[childIndex] = u;
+          childIndex++;
+          child[childIndex] = x;
+        } else {
+          child[childIndex] = parent[parentIndex];
+        }
+
+        childIndex++;
+        parentIndex++;
+      }
+    }
+
+    //swaps (u, x) and (v, y)
+    private void Swap(int u, int x, int v, int y, PrinsEncoding parent, PrinsEncoding child) {
+      int i = 0;
+
+      while (i < child.Length) {
+        if (child[i] == u) {
+          child[i] = v;
+          i++;
+          child[i] = y;
+        } else if (child[i] == v) {
+          child[i] = u;
+          i++;
+          child[i] = x;
+        } else {
+          child[i] = parent[i];
+        }
+
+        i++;
+      }
+    }
+
+    //swaps (u, x) and (v, y) by (u, y) and (x, v)
+    private void Swap2(int u, int x, int v, int y, PrinsEncoding parent, PrinsEncoding child) {
+      int i = 0;
+
+      while (i < child.Length) {
+        if(parent[i] == x) {
+          child[i] = y;
+        } else if(parent[i] == v) {
+          child[i] = x;
+        } else if(parent[i] == y) {
+          child[i] = v;
+        } else {
+          child[i] = parent[i];
+        }
+
+        i++;
+      }
+    }
+
+    private void M1(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot) {
+        if (v == depot) {
+          Tour tour = FindTour(child, u + 1);
+          v = tour.Cities[0] - 1;
+          InsertBefore(u, v, parent, child);
+        } else {
+          InsertAfter(u, v, parent, child);
+        }
+      }
+    }
+
+    private void M2(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot) {
+        Tour tour = FindTour(child, u + 1);
+        int iu = tour.Cities.IndexOf(u + 1);
+        if (iu < tour.Cities.Count - 1) {
+          int x = tour.Cities[iu + 1] - 1;
+
+          if (v == depot) {
+            tour = FindTour(child, u + 1);
+            v = tour.Cities[0] - 1;
+            InsertBefore(u, x, v, parent, child);
+          } else {
+            InsertAfter(u, x, v, parent, child);
+          }
+        }
+      }
+    }
+
+    private void M3(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot) {
+        Tour tour = FindTour(child, u + 1);
+        int iu = tour.Cities.IndexOf(u + 1);
+        if (iu < tour.Cities.Count - 1) {
+          int x = tour.Cities[iu + 1] - 1;
+
+          if (v == depot) {
+            tour = FindTour(child, u + 1);
+            v = tour.Cities[0] - 1;
+            InsertBefore(x, u, v, parent, child);
+          } else {
+            InsertAfter(x, u, v, parent, child);
+          }
+        }
+      }
+    }
+
+    private void M4(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot && v != depot) {
+        Swap(u, v, parent, child);
+      }
+    }
+
+    private void M5(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot && v != depot) {
+        Tour tour = FindTour(child, u + 1);
+        int iu = tour.Cities.IndexOf(u + 1);
+        if (iu < tour.Cities.Count - 1) {
+          int x = tour.Cities[iu + 1] - 1;
+
+          if(x != v)
+            Swap(u, x, v, parent, child);
+        }
+      }
+    }
+
+    private void M6(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot && v != depot) {
+        Tour tour = FindTour(child, u + 1);
+        int iu = tour.Cities.IndexOf(u + 1);
+        if (iu < tour.Cities.Count - 1) {
+          int x = tour.Cities[iu + 1] - 1;
+
+          tour = FindTour(child, v + 1);
+          int iv = tour.Cities.IndexOf(v + 1);
+          if (iv < tour.Cities.Count - 1) {
+            int y = tour.Cities[iv + 1] - 1;
+
+            if (x != v && y != u)
+              Swap(u, x, v, y, parent, child);
+          }
+        }
+      }
+    }
+
+    private void M7(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot && v != depot) {
+        Tour tu = FindTour(child, u + 1);
+        Tour tv = FindTour(child, v + 1);
+
+        if (tu.Cities[0] == tv.Cities[0]) {
+          int iu = tu.Cities.IndexOf(u + 1);
+          if (iu < tu.Cities.Count - 1) {
+            int x = tu.Cities[iu + 1] - 1;
+
+            int iv = tv.Cities.IndexOf(v + 1);
+            if (iv < tv.Cities.Count - 1) {
+              int y = tv.Cities[iv + 1] - 1;
+
+              if (x != v && y != u)
+                Swap(x, v, parent, child);
+             }
+           }
+        }
+      }
+    }
+
+    private void M8(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot && v != depot) {
+        Tour tu = FindTour(child, u + 1);
+        Tour tv = FindTour(child, v + 1);
+
+        if (tu.Cities[0] != tv.Cities[0]) {
+          int iu = tu.Cities.IndexOf(u + 1);
+          if (iu < tu.Cities.Count - 1) {
+            int x = tu.Cities[iu + 1] - 1;
+
+            int iv = tv.Cities.IndexOf(v + 1);
+            if (iv < tv.Cities.Count - 1) {
+              int y = tv.Cities[iv + 1] - 1;
+
+              if (x != v && y != u)
+                Swap(x, v, parent, child);
+            }
+          }
+        }
+      }
+    }
+
+    private void M9(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot && v != depot) {
+        Tour tu = FindTour(child, u + 1);
+        Tour tv = FindTour(child, v + 1);
+
+        if (tu.Cities[0] != tv.Cities[0]) {
+          int iu = tu.Cities.IndexOf(u + 1);
+          if (iu < tu.Cities.Count - 1) {
+            int x = tu.Cities[iu + 1] - 1;
+
+            int iv = tv.Cities.IndexOf(v + 1);
+            if (iv < tv.Cities.Count - 1) {
+              int y = tv.Cities[iv + 1] - 1;
+
+              if (x != v && y != u)
+                Swap2(u, x, v, y, parent, child);
+            }
+          }
+        }
+      }
+    }
+
+    protected PrinsEncoding Manipulate(PrinsEncoding individual, 
+      double originalQuality, int u, int v) {
+      PrinsEncoding child = null;
+      bool improvement = false;
+
+      if (u != v) {
+        child = individual.Clone() as PrinsEncoding;
+        M1(individual, child, u, v);
+        improvement = GetQuality(child) < originalQuality;
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M2(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M3(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M4(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M5(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M6(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M7(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M8(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M9(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+      }
+
+      if (improvement)
+        return child;
+      else
+        return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsManipulator.cs	(revision 4352)
@@ -0,0 +1,94 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsManipulator", "An operator which manipulates a VRP representation.")]
+  [StorableClass]
+  public abstract class PrinsManipulator : VRPManipulator, IStochasticOperator, IPrinsOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public ILookupParameter<DoubleValue> FleetUsageFactor {
+      get { return (ILookupParameter<DoubleValue>)Parameters["EvalFleetUsageFactor"]; }
+    }
+    public ILookupParameter<DoubleValue> TimeFactor {
+      get { return (ILookupParameter<DoubleValue>)Parameters["EvalTimeFactor"]; }
+    }
+    public ILookupParameter<DoubleValue> DistanceFactor {
+      get { return (ILookupParameter<DoubleValue>)Parameters["EvalDistanceFactor"]; }
+    }
+    public ILookupParameter<DoubleValue> OverloadPenalty {
+      get { return (ILookupParameter<DoubleValue>)Parameters["EvalOverloadPenalty"]; }
+    }
+    public ILookupParameter<DoubleValue> TardinessPenalty {
+      get { return (ILookupParameter<DoubleValue>)Parameters["EvalTardinessPenalty"]; }
+    }
+
+    [StorableConstructor]
+    protected PrinsManipulator(bool deserializing) : base(deserializing) { }
+
+    public PrinsManipulator()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("EvalFleetUsageFactor", "The fleet usage factor considered in the evaluation."));
+      Parameters.Add(new LookupParameter<DoubleValue>("EvalTimeFactor", "The time factor considered in the evaluation."));
+      Parameters.Add(new LookupParameter<DoubleValue>("EvalDistanceFactor", "The distance factor considered in the evaluation."));
+      Parameters.Add(new LookupParameter<DoubleValue>("EvalOverloadPenalty", "The overload penalty considered in the evaluation."));
+      Parameters.Add(new LookupParameter<DoubleValue>("EvalTardinessPenalty", "The tardiness penalty considered in the evaluation."));
+
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+    protected abstract void Manipulate(IRandom random, PrinsEncoding individual);
+
+    public override IOperation Apply() {
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      if (!(solution is PrinsEncoding)) {
+        VRPToursParameter.ActualValue = PrinsEncoding.ConvertFrom(solution,
+            Cities, 
+            DueTimeParameter.ActualValue,
+            ServiceTimeParameter.ActualValue,
+            ReadyTimeParameter.ActualValue,
+            DemandParameter.ActualValue,
+            CapacityParameter.ActualValue,
+            FleetUsageFactor.ActualValue, 
+            TimeFactor.ActualValue, 
+            DistanceFactor.ActualValue, 
+            OverloadPenalty.ActualValue, 
+            TardinessPenalty.ActualValue,
+            CoordinatesParameter.ActualValue,
+            DistanceMatrixParameter,
+            UseDistanceMatrixParameter.ActualValue);
+      }
+
+      Manipulate(RandomParameter.ActualValue, VRPToursParameter.ActualValue as PrinsEncoding);
+
+      return base.Apply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsPermutationManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsPermutationManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsPermutationManipulator.cs	(revision 4352)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsPermutationManipulator", "An operator which manipulates a VRP representation by using a standard permutation manipulator. It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
+  [StorableClass]
+  public sealed class PrinsPermutationManipulator : PrinsManipulator {
+    public IValueLookupParameter<IPermutationManipulator> InnerManipulatorParameter {
+      get { return (IValueLookupParameter<IPermutationManipulator>)Parameters["InnerManipulator"]; }
+    }
+
+    [StorableConstructor]
+    private PrinsPermutationManipulator(bool deserializing) : base(deserializing) { }
+
+    public PrinsPermutationManipulator()
+      : base() {
+        Parameters.Add(new ValueLookupParameter<IPermutationManipulator>("InnerManipulator", "The permutation manipulator.", new TranslocationManipulator()));
+    }
+
+    protected override void Manipulate(IRandom random, PrinsEncoding individual) {
+      InnerManipulatorParameter.ActualValue.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(
+        InnerManipulatorParameter.ActualValue, this.ExecutionContext.Scope);
+      op.Operator.Execute((IExecutionContext)op);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsStochasticLSManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsStochasticLSManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsStochasticLSManipulator.cs	(revision 4352)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsStochasticLSManipulator", "An operator which manipulates a VRP representation by using the stochastic version of the Prins local search.  It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
+  [StorableClass]
+  public sealed class PrinsStochasticLSManipulator : PrinsLSManipulator {
+    public IValueParameter<IntValue> SampleSize {
+      get { return (IValueParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+    
+    [StorableConstructor]
+    private PrinsStochasticLSManipulator(bool deserializing) : base(deserializing) { }
+
+    public PrinsStochasticLSManipulator()
+      : base() {
+        Parameters.Add(new ValueParameter<IntValue>("SampleSize", "The sample size.", new IntValue(200)));
+    }
+
+    protected override void Manipulate(IRandom random, PrinsEncoding individual) {
+      List<Tour> tours = individual.GetTours(DistanceMatrixParameter);
+      bool improvement = false;
+      int iterations = 0;
+
+      do {
+        improvement = false;
+        double originalQuality = GetQuality(individual);
+        PrinsEncoding child = null;
+
+        int samples = 0;
+        while (!improvement &&
+          samples < SampleSize.Value.Value) {
+            int u = random.Next(Cities);
+            int v = random.Next(Cities);
+
+            child = Manipulate(individual,
+                  originalQuality, u, v);
+
+            improvement = child != null;
+
+            samples++;
+        }
+
+        if (improvement) {
+          for (int i = 0; i < child.Length; i++) {
+            individual[i] = child[i];
+          }
+        }
+
+        iterations++;
+      } while (improvement && 
+        iterations < Iterations.Value.Value);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/PrinsEncoding.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/PrinsEncoding.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/PrinsEncoding.cs	(revision 4352)
@@ -0,0 +1,256 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using System;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsEncoding", "Represents an Prins encoding of VRP solutions. It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
+  [StorableClass]
+  public class PrinsEncoding : PermutationEncoding {
+    [Storable]
+    private int cities;
+
+    [Storable]
+    private DoubleMatrix coordinates;
+
+    [Storable]
+    private BoolValue useDistanceMatrix;
+
+    [Storable]
+    DoubleArray dueTimeArray;
+    
+    [Storable]
+    DoubleArray serviceTimeArray;
+
+    [Storable]
+    DoubleArray readyTimeArray;
+    
+    [Storable]
+    DoubleArray demandArray;
+
+    [Storable]
+    DoubleValue capacity;
+
+    [Storable]
+    DoubleValue fleetUsageFactor;
+
+    [Storable]
+    DoubleValue timeFactor;
+
+    [Storable]
+    DoubleValue distanceFactor;
+
+    [Storable]
+    DoubleValue overloadPenalty;
+
+    [Storable]
+    DoubleValue tardinessPenalty;
+
+    #region IVRPEncoding Members
+    public override List<Tour> GetTours(ILookupParameter<DoubleMatrix> distanceMatrix, int maxVehicles = int.MaxValue) {
+      List<Tour> result = new List<Tour>();
+
+      //Split permutation into vector P
+      int[] P = new int[cities + 1];
+      for (int i = 0; i <= cities; i++)
+        P[i] = -1;
+
+      double[] V = new double[cities + 1];
+      V[0] = 0;
+      for (int i = 1; i <= cities; i++) {
+        V[i] = int.MaxValue;
+      }
+
+      for (int i = 1; i <= cities; i++) {
+        int j = i;
+        Tour tour = new Tour();
+        bool feasible = true;
+
+        do {
+          tour.Cities.Add(this[j-1] + 1);
+
+          TourEvaluation eval = VRPEvaluator.EvaluateTour(tour,
+            dueTimeArray,
+            serviceTimeArray,
+            readyTimeArray,
+            demandArray,
+            capacity,
+            fleetUsageFactor,
+            timeFactor,
+            distanceFactor,
+            overloadPenalty,
+            tardinessPenalty,
+            coordinates,
+            distanceMatrix,
+            useDistanceMatrix);
+
+          double cost = eval.Quality;
+          feasible = eval.Overload < double.Epsilon && eval.Tardiness < double.Epsilon;
+
+          if (feasible) {
+            if (V[i - 1] + cost < V[j]) {
+              V[j] = V[i - 1] + cost;
+              P[j] = i - 1;
+            }
+            j++;
+          }
+
+        } while (j <= cities && feasible);
+      }
+
+      //extract VRP solution from vector P
+      int index = 0;
+      int index2 = cities;
+      Tour trip = null;
+      do {
+        index = P[index2];
+        trip = new Tour();
+
+        for (int k = index + 1; k <= index2; k++) {
+          trip.Cities.Add(this[k - 1] + 1);
+        }
+
+        if (trip.Cities.Count > 0)
+          result.Add(trip);
+
+        index2 = index;
+      } while (index != 0);
+
+      //if there are too many vehicles - repair
+      while (result.Count > maxVehicles) {
+        Tour tour = result[result.Count - 1];
+
+        //find predecessor / successor in permutation
+        int predecessorIndex = Array.IndexOf(this.array, tour.Cities[0] - 1) - 1;
+        if (predecessorIndex >= 0) {
+          int predecessor = this[predecessorIndex] + 1;
+
+          foreach (Tour t in result) {
+            int insertPosition = t.Cities.IndexOf(predecessor) + 1;
+            if (insertPosition != -1) {
+              t.Cities.InsertRange(insertPosition, tour.Cities);
+              break;
+            }
+          }
+        } else {
+          int successorIndex = Array.IndexOf(this.array,
+            tour.Cities[tour.Cities.Count - 1] - 1) + 1;
+          int successor = this[successorIndex] + 1;
+
+          foreach (Tour t in result) {
+            int insertPosition = t.Cities.IndexOf(successor);
+            if (insertPosition != -1) {
+              t.Cities.InsertRange(insertPosition, tour.Cities);
+              break;
+            }
+          }
+        }
+
+        result.Remove(tour);
+      }
+
+      return result;
+    }
+    #endregion
+
+    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
+      PrinsEncoding clone = new PrinsEncoding(
+        new Permutation(this.PermutationType, this.array), cities, 
+        dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
+        fleetUsageFactor, timeFactor, distanceFactor, overloadPenalty, tardinessPenalty,
+        coordinates, useDistanceMatrix);
+
+      cloner.RegisterClonedObject(this, clone);
+      clone.readOnly = readOnly;
+      return clone;
+    }
+
+    public PrinsEncoding(Permutation permutation, int cities,
+      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, DoubleValue capacity,
+      DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor, DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
+      DoubleMatrix coordinates, BoolValue useDistanceMatrix)
+      : base(permutation) {
+        this.cities = cities;
+        this.dueTimeArray = dueTimeArray;
+        this.serviceTimeArray = serviceTimeArray;
+        this.readyTimeArray = readyTimeArray;
+        this.demandArray = demandArray;
+        this.capacity = capacity;
+        this.coordinates = coordinates;
+        this.useDistanceMatrix = useDistanceMatrix;
+        this.fleetUsageFactor = fleetUsageFactor;
+        this.timeFactor = timeFactor;
+        this.distanceFactor = distanceFactor;
+        this.overloadPenalty = overloadPenalty;
+        this.tardinessPenalty = tardinessPenalty;
+    }
+
+    [StorableConstructor]
+    private PrinsEncoding(bool serializing)
+      : base(serializing) {
+    }
+
+    public static PrinsEncoding ConvertFrom(IVRPEncoding encoding, int cities,
+      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, DoubleValue capacity,
+      DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor, DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
+      DoubleMatrix coordinates, ILookupParameter<DoubleMatrix> distanceMatrix, BoolValue useDistanceMatrix) {
+      List<Tour> tours = encoding.GetTours(distanceMatrix);
+      List<int> route = new List<int>();
+
+      foreach (Tour tour in tours) {
+        foreach (int city in tour.Cities)
+          route.Add(city - 1);
+      }
+
+      return new PrinsEncoding(
+        new Permutation(PermutationTypes.RelativeUndirected, route.ToArray()), cities,
+        dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
+        fleetUsageFactor, timeFactor, distanceFactor, overloadPenalty, tardinessPenalty,
+        coordinates, useDistanceMatrix);
+    }
+
+    public static PrinsEncoding ConvertFrom(List<int> routeParam, int cities, 
+      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, DoubleValue capacity,
+      DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor, DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
+      DoubleMatrix coordinates, BoolValue useDistanceMatrix) {
+      List<int> route = new List<int>(routeParam);
+
+      while (route.Remove(0)) { //remove all delimiters (0)
+      }
+
+      for (int i = 0; i < route.Count; i++)
+        route[i]--;
+
+      return new PrinsEncoding(
+        new Permutation(PermutationTypes.RelativeUndirected, route.ToArray()), cities, 
+        dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
+        fleetUsageFactor, timeFactor, distanceFactor, overloadPenalty, tardinessPenalty,
+        coordinates, useDistanceMatrix);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/VRPCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/VRPCreator.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/VRPCreator.cs	(revision 4352)
@@ -39,8 +39,4 @@
     }
     
-    public IValueLookupParameter<IntValue> CitiesParameter {
-	    get { return (IValueLookupParameter<IntValue>)Parameters["Cities"]; }
-	  }
-
     [StorableConstructor]
     protected VRPCreator(bool deserializing) : base(deserializing) { }
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuCrossover.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuCrossover.cs	(revision 4352)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuCrossover", "An operator which crosses two VRP representations.")]
+  [StorableClass]
+  public abstract class ZhuCrossover : VRPCrossover, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    
+    [StorableConstructor]
+    protected ZhuCrossover(bool deserializing) : base(deserializing) { }
+
+    public ZhuCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+    protected abstract ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2);
+
+    public override IOperation Apply() {
+      ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
+      for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
+        IVRPEncoding solution = ParentsParameter.ActualValue[i];
+
+        if (!(solution is ZhuEncoding)) {
+          parents[i] = ZhuEncoding.ConvertFrom(solution,
+            Cities, 
+            DueTimeParameter.ActualValue,
+            ServiceTimeParameter.ActualValue,
+            ReadyTimeParameter.ActualValue,
+            DemandParameter.ActualValue,
+            CapacityParameter.ActualValue,
+            CoordinatesParameter.ActualValue,
+            DistanceMatrixParameter,
+            UseDistanceMatrixParameter.ActualValue);
+        } else {
+          parents[i] = solution;
+        }
+      }
+      ParentsParameter.ActualValue = parents;
+
+      ChildParameter.ActualValue =
+        Crossover(RandomParameter.ActualValue, parents[0] as ZhuEncoding, parents[1] as ZhuEncoding);
+
+      return base.Apply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover1.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover1.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover1.cs	(revision 4352)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuHeuristicCrossover1", "The Zhu Heuristic Crossover (Version 1). It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public sealed class ZhuHeuristicCrossover1 : ZhuCrossover {    
+    [StorableConstructor]
+    private ZhuHeuristicCrossover1(bool deserializing) : base(deserializing) { }
+
+    public ZhuHeuristicCrossover1()
+      : base() {
+    }
+
+    private void Swap(ZhuEncoding individual, int city1, int city2) {
+      int index1 = individual.IndexOf(city1);
+      int index2 = individual.IndexOf(city2);
+
+      int temp = individual[index1];
+      individual[index1] = individual[index2];
+      individual[index2] = temp;
+    }
+
+    protected override ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2) {
+      parent1 = parent1.Clone() as ZhuEncoding;
+      parent2 = parent2.Clone() as ZhuEncoding;
+
+      ZhuEncoding child = parent2.Clone() as ZhuEncoding;
+
+      int breakPoint = random.Next(child.Length);
+      int i = breakPoint;
+      int predecessor = breakPoint - 1;
+      if (predecessor < 0)
+        predecessor = predecessor + child.Length;
+
+      while (i != predecessor) {
+        if (i == breakPoint) {
+          child[i] = parent1[i];
+          Swap(parent2, parent2[i], parent1[i]);
+        }
+
+        if (VRPUtilities.GetDistance(
+          child[i] + 1, parent1[(i + 1) % child.Length] + 1,
+          CoordinatesParameter.ActualValue, DistanceMatrixParameter,
+          UseDistanceMatrixParameter.ActualValue)
+          <
+          VRPUtilities.GetDistance(
+          child[i] + 1, parent2[(i + 1) % child.Length] + 1,
+          CoordinatesParameter.ActualValue, DistanceMatrixParameter,
+          UseDistanceMatrixParameter.ActualValue)) {
+          child[(i + 1) % child.Length] = parent1[(i + 1) % child.Length];
+          Swap(parent2, parent2[(i + 1) % child.Length], parent1[(i + 1) % child.Length]);
+        } else {
+          child[(i + 1) % child.Length] = parent2[(i + 1) % child.Length];
+          Swap(parent1, parent1[(i + 1) % child.Length], parent2[(i + 1) % child.Length]);
+        }
+
+        i = (i + 1) % child.Length;
+      }
+
+      return child;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover2.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover2.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover2.cs	(revision 4352)
@@ -0,0 +1,96 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuHeuristicCrossover2", "The Zhu Heuristic Crossover (Version 2). It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public sealed class ZhuHeuristicCrossover2 : ZhuCrossover {    
+    [StorableConstructor]
+    private ZhuHeuristicCrossover2(bool deserializing) : base(deserializing) { }
+
+    public ZhuHeuristicCrossover2()
+      : base() {
+    }
+
+    protected override ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2) {
+      List<int> p1 = new List<int>(parent1);
+      List<int> p2 = new List<int>(parent2);
+
+      ZhuEncoding child = parent2.Clone() as ZhuEncoding;
+
+      int breakPoint = random.Next(child.Length);
+      int i = breakPoint;
+      int predecessor = breakPoint - 1;
+      if (predecessor < 0)
+        predecessor = predecessor + child.Length;
+      
+      int parent1Index = i;
+      int parent2Index = i;
+
+      while (i != predecessor) {
+        if (i == breakPoint) {
+          child[i] = p1[parent1Index];
+          
+          p1.Remove(child[i]);
+          if (parent1Index >= p1.Count)
+            parent1Index = 0;
+
+          p2.Remove(child[i]);
+          if (parent2Index >= p2.Count)
+            parent2Index = 0;
+        }
+
+        if (VRPUtilities.GetDistance(
+         child[i] + 1, p1[parent1Index] + 1,
+         CoordinatesParameter.ActualValue, DistanceMatrixParameter,
+         UseDistanceMatrixParameter.ActualValue)
+         <
+         VRPUtilities.GetDistance(
+         child[i] + 1, p2[parent2Index] + 1,
+         CoordinatesParameter.ActualValue, DistanceMatrixParameter,
+         UseDistanceMatrixParameter.ActualValue)) {
+          child[(i + 1) % child.Length] = p1[parent1Index];
+        } else {
+          child[(i + 1) % child.Length] = p2[parent2Index];
+        }
+
+        p1.Remove(child[(i + 1) % child.Length]);
+        if (parent1Index >= p1.Count)
+          parent1Index = 0;
+
+        p2.Remove(child[(i + 1) % child.Length]);
+        if (parent2Index >= p2.Count)
+          parent2Index = 0;
+
+        i = (i + 1) % child.Length;
+      }
+
+      return child;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuMergeCrossover1.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuMergeCrossover1.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuMergeCrossover1.cs	(revision 4352)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuMergeCrossover1", "The Zhu Merge Crossover (Version 1). It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public sealed class ZhuMergeCrossover1 : ZhuCrossover {    
+    [StorableConstructor]
+    private ZhuMergeCrossover1(bool deserializing) : base(deserializing) { }
+
+    public ZhuMergeCrossover1()
+      : base() {
+    }
+
+    private void Swap(ZhuEncoding individual, int city1, int city2) {
+      int index1 = individual.IndexOf(city1);
+      int index2 = individual.IndexOf(city2);
+
+      int temp = individual[index1];
+      individual[index1] = individual[index2];
+      individual[index2] = temp;
+    }
+
+    protected override ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2) {
+      parent1 = parent1.Clone() as ZhuEncoding;
+      parent2 = parent2.Clone() as ZhuEncoding;
+
+      ZhuEncoding child = parent2.Clone() as ZhuEncoding;
+
+      int breakPoint = random.Next(child.Length);
+      int i = breakPoint;
+
+      do {
+        if (i == breakPoint) {
+          child[i] = parent1[i];
+          Swap(parent2, parent2[i], parent1[i]);
+        } else {
+          if (DueTimeParameter.ActualValue[parent1[i] + 1] <
+            DueTimeParameter.ActualValue[parent2[i] + 1]) {
+            child[i] = parent1[i];
+            Swap(parent2, parent2[i], parent1[i]);
+          } else {
+            child[i] = parent2[i];
+            Swap(parent1, parent1[i], parent2[i]);
+          }
+        }
+
+        i = (i + 1) % child.Length;
+      } while (i != breakPoint);
+
+      return child;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuMergeCrossover2.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuMergeCrossover2.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuMergeCrossover2.cs	(revision 4352)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuMergeCrossover2", "The Zhu Merge Crossover (Version 2).  It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public sealed class ZhuMergeCrossover2 : ZhuCrossover {    
+    [StorableConstructor]
+    private ZhuMergeCrossover2(bool deserializing) : base(deserializing) { }
+
+    public ZhuMergeCrossover2()
+      : base() {
+    }
+
+    protected override ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2) {
+      List<int> p1 = new List<int>(parent1);
+      List<int> p2 = new List<int>(parent2);
+
+      ZhuEncoding child = parent2.Clone() as ZhuEncoding;
+
+      int breakPoint = random.Next(child.Length);
+      int i = breakPoint;
+
+      int parent1Index = i;
+      int parent2Index = i;
+
+      do {
+        if (i == breakPoint) {
+          child[i] = p1[parent1Index];
+        } else {
+          if (DueTimeParameter.ActualValue[p1[parent1Index] + 1] <
+            DueTimeParameter.ActualValue[p2[parent2Index] + 1]) {
+            child[i] = p1[parent1Index];
+          } else {
+            child[i] = p2[parent2Index];
+          }
+        }
+
+        p1.Remove(child[i]);
+        if (parent1Index >= p1.Count)
+          parent1Index = 0;
+
+        p2.Remove(child[i]);
+        if (parent2Index >= p2.Count)
+          parent2Index = 0;
+
+        i = (i + 1) % child.Length;
+      } while (i != breakPoint);
+
+      return child;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs	(revision 4352)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuPermutationCrossover", "An operator which crosses two VRP representations using a standard permutation operator. It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public sealed class PrinsPermutationCrossover : ZhuCrossover {    
+    public IValueLookupParameter<IPermutationCrossover> InnerCrossoverParameter {
+      get { return (IValueLookupParameter<IPermutationCrossover>)Parameters["InnerCrossover"]; }
+    }
+
+    [StorableConstructor]
+    private PrinsPermutationCrossover(bool deserializing) : base(deserializing) { }
+
+    public PrinsPermutationCrossover()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IPermutationCrossover>("InnerCrossover", "The permutation crossover.", new PartiallyMatchedCrossover()));
+    }
+
+    protected override ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2) {
+      //note - the inner crossover is called here and the result is converted to a prins representation
+      //some refactoring should be done here in the future - the crossover operation should be called directly
+
+      InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(
+        InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope);
+      op.Operator.Execute((IExecutionContext)op);
+
+      string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;
+      if (ExecutionContext.Scope.Variables.ContainsKey(childName)) {
+        Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation;
+        ExecutionContext.Scope.Variables.Remove(childName);
+
+        return new ZhuEncoding(permutation, Cities,
+          DueTimeParameter.ActualValue,
+            ServiceTimeParameter.ActualValue,
+            ReadyTimeParameter.ActualValue,
+            DemandParameter.ActualValue,
+            CapacityParameter.ActualValue,
+            CoordinatesParameter.ActualValue,
+            UseDistanceMatrixParameter.ActualValue);
+      } else
+        return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuManipulator.cs	(revision 4352)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuManipulator", "An operator which manipulates a VRP representation.")]
+  [StorableClass]
+  public abstract class ZhuManipulator : VRPManipulator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected ZhuManipulator(bool deserializing) : base(deserializing) { }
+
+    public ZhuManipulator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+    protected abstract void Manipulate(IRandom random, ZhuEncoding individual);
+
+    public override IOperation Apply() {
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      if (!(solution is ZhuEncoding)) {
+        VRPToursParameter.ActualValue = ZhuEncoding.ConvertFrom(solution,
+            Cities, 
+            DueTimeParameter.ActualValue,
+            ServiceTimeParameter.ActualValue,
+            ReadyTimeParameter.ActualValue,
+            DemandParameter.ActualValue,
+            CapacityParameter.ActualValue,
+            CoordinatesParameter.ActualValue,
+            DistanceMatrixParameter,
+            UseDistanceMatrixParameter.ActualValue);
+      }
+
+      Manipulate(RandomParameter.ActualValue, VRPToursParameter.ActualValue as ZhuEncoding);
+
+      return base.Apply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuPermutationManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuPermutationManipulator.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuPermutationManipulator.cs	(revision 4352)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuPermutationManipulator", "An operator which manipulates a VRP representation by using a standard permutation manipulator. It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public sealed class ZhuPermutationManipulator : ZhuManipulator {
+    public IValueLookupParameter<IPermutationManipulator> InnerManipulatorParameter {
+      get { return (IValueLookupParameter<IPermutationManipulator>)Parameters["InnerManipulator"]; }
+    }
+
+    [StorableConstructor]
+    private ZhuPermutationManipulator(bool deserializing) : base(deserializing) { }
+
+    public ZhuPermutationManipulator()
+      : base() {
+        Parameters.Add(new ValueLookupParameter<IPermutationManipulator>("InnerManipulator", "The permutation manipulator.", new TranslocationManipulator()));
+    }
+
+    protected override void Manipulate(IRandom random, ZhuEncoding individual) {
+      InnerManipulatorParameter.ActualValue.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(
+        InnerManipulatorParameter.ActualValue, this.ExecutionContext.Scope);
+      op.Operator.Execute((IExecutionContext)op);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/ZhuEncoding.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/ZhuEncoding.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/ZhuEncoding.cs	(revision 4352)
@@ -0,0 +1,190 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using System;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuEncoding", "Represents a Zhu encoding of VRP solutions. It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public class ZhuEncoding : PermutationEncoding {
+    [Storable]
+    private int cities;
+
+    [Storable]
+    private DoubleMatrix coordinates;
+
+    [Storable]
+    private BoolValue useDistanceMatrix;
+
+    [Storable]
+    DoubleArray dueTimeArray;
+    
+    [Storable]
+    DoubleArray serviceTimeArray;
+
+    [Storable]
+    DoubleArray readyTimeArray;
+    
+    [Storable]
+    DoubleArray demandArray;
+
+    [Storable]
+    DoubleValue capacity;
+
+    #region IVRPEncoding Members
+    public override List<Tour> GetTours(ILookupParameter<DoubleMatrix> distanceMatrix, int maxVehicles = int.MaxValue) {
+      List<Tour> result = new List<Tour>();
+
+      Tour newTour = new Tour();
+
+      for (int i = 0; i < this.Length; i++) {
+        int city = this[i] + 1;
+        newTour.Cities.Add(city);
+        if (!newTour.Feasible(
+          dueTimeArray,
+          serviceTimeArray,
+          readyTimeArray,
+          demandArray,
+          capacity,
+          coordinates,
+          distanceMatrix,
+          useDistanceMatrix)) {
+            newTour.Cities.Remove(city);
+            if (newTour.Cities.Count > 0)
+              result.Add(newTour);
+
+            newTour = new Tour();
+            newTour.Cities.Add(city);
+        }
+      }
+
+      if (newTour.Cities.Count > 0)
+        result.Add(newTour);
+
+      //if there are too many vehicles - repair
+      while (result.Count > maxVehicles) {
+        Tour tour = result[result.Count - 1];
+
+        //find predecessor / successor in permutation
+        int predecessorIndex = Array.IndexOf(this.array, tour.Cities[0] - 1) - 1;
+        if (predecessorIndex >= 0) {
+          int predecessor = this[predecessorIndex] + 1;
+
+          foreach (Tour t in result) {
+            int insertPosition = t.Cities.IndexOf(predecessor) + 1;
+            if (insertPosition != -1) {
+              t.Cities.InsertRange(insertPosition, tour.Cities);
+              break;
+            }
+          }
+        } else {
+          int successorIndex = Array.IndexOf(this.array,
+            tour.Cities[tour.Cities.Count - 1] - 1) + 1;
+          int successor = this[successorIndex] + 1;
+
+          foreach (Tour t in result) {
+            int insertPosition = t.Cities.IndexOf(successor);
+            if (insertPosition != -1) {
+              t.Cities.InsertRange(insertPosition, tour.Cities);
+              break;
+            }
+          }
+        }
+
+        result.Remove(tour);
+      }
+
+      return result;
+    }
+    #endregion
+
+    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
+      ZhuEncoding clone = new ZhuEncoding(
+        new Permutation(this.PermutationType, this.array), cities, 
+        dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
+        coordinates, useDistanceMatrix);
+
+      cloner.RegisterClonedObject(this, clone);
+      clone.readOnly = readOnly;
+      return clone;
+    }
+
+    public ZhuEncoding(Permutation permutation, int cities,
+      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, DoubleValue capacity,
+      DoubleMatrix coordinates, BoolValue useDistanceMatrix)
+      : base(permutation) {
+        this.cities = cities;
+        this.dueTimeArray = dueTimeArray;
+        this.serviceTimeArray = serviceTimeArray;
+        this.readyTimeArray = readyTimeArray;
+        this.demandArray = demandArray;
+        this.capacity = capacity;
+        this.coordinates = coordinates;
+        this.useDistanceMatrix = useDistanceMatrix;
+    }
+
+    [StorableConstructor]
+    private ZhuEncoding(bool serializing)
+      : base(serializing) {
+    }
+
+    public static ZhuEncoding ConvertFrom(IVRPEncoding encoding, int cities,
+      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, DoubleValue capacity,
+      DoubleMatrix coordinates, ILookupParameter<DoubleMatrix> distanceMatrix, BoolValue useDistanceMatrix) {
+      List<Tour> tours = encoding.GetTours(distanceMatrix);
+      List<int> route = new List<int>();
+
+      foreach (Tour tour in tours) {
+        foreach (int city in tour.Cities)
+          route.Add(city - 1);
+      }
+
+      return new ZhuEncoding(
+        new Permutation(PermutationTypes.RelativeUndirected, route.ToArray()), cities,
+        dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
+        coordinates, useDistanceMatrix);
+    }
+
+    public static ZhuEncoding ConvertFrom(List<int> routeParam, int cities, 
+      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, DoubleValue capacity,
+      DoubleMatrix coordinates, BoolValue useDistanceMatrix) {
+      List<int> route = new List<int>(routeParam);
+
+      while (route.Remove(0)) { //remove all delimiters (0)
+      }
+
+      for (int i = 0; i < route.Count; i++)
+        route[i]--;
+
+      return new ZhuEncoding(
+        new Permutation(PermutationTypes.RelativeUndirected, route.ToArray()), cities, 
+        dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
+        coordinates, useDistanceMatrix);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Evaluators/VRPEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Evaluators/VRPEvaluator.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Evaluators/VRPEvaluator.cs	(revision 4352)
@@ -101,5 +101,5 @@
       IVRPEncoding vrpSolution = VRPToursParameter.ActualValue;
 
-      return vrpSolution.Tours.Count;
+      return vrpSolution.GetTours(DistanceMatrixParameter, VehiclesParameter.ActualValue.Value).Count;
     }
 
@@ -178,5 +178,5 @@
     }
 
-    public static TourEvaluation Evaluate(IVRPEncoding solution, DoubleArray dueTimeArray,
+    public static TourEvaluation Evaluate(IVRPEncoding solution, IntValue vehicles, DoubleArray dueTimeArray, 
       DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, DoubleValue capacity,
       DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor, DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
@@ -190,5 +190,5 @@
       sumEval.Tardiness = 0;
 
-      foreach (Tour tour in solution.Tours) {
+      foreach (Tour tour in solution.GetTours(distanceMatrix)) {
         TourEvaluation eval = EvaluateTour(tour, dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
           fleetUsageFactor, timeFactor, distanceFactor, overloadPenalty, tardinessPenalty,
@@ -208,5 +208,5 @@
       IVRPEncoding solution = VRPToursParameter.ActualValue;
 
-      TourEvaluation sumEval = Evaluate(solution, DueTimeParameter.ActualValue, ServiceTimeParameter.ActualValue, ReadyTimeParameter.ActualValue,
+      TourEvaluation sumEval = Evaluate(solution, VehiclesParameter.ActualValue, DueTimeParameter.ActualValue, ServiceTimeParameter.ActualValue, ReadyTimeParameter.ActualValue,
         DemandParameter.ActualValue, CapacityParameter.ActualValue,
         FleetUsageFactor.ActualValue, TimeFactor.ActualValue, DistanceFactor.ActualValue, OverloadPenalty.ActualValue, TardinessPenalty.ActualValue,
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/HeuristicLab.Problems.VehicleRouting-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/HeuristicLab.Problems.VehicleRouting-3.3.csproj	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/HeuristicLab.Problems.VehicleRouting-3.3.csproj	(revision 4352)
@@ -106,31 +106,37 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Analyzers\BestAverageWorstVRPToursAnalyzer.cs" />
+    <Compile Include="Analyzers\BestAverageWorstVRPToursCalculator.cs" />
+    <Compile Include="Analyzers\BestVRPToursMemorizer.cs" />
     <Compile Include="Analyzers\BestVRPSolutionAnalyzer.cs" />
-    <Compile Include="Encodings\Alba\Crossovers\PermutationCrossover.cs" />
-    <Compile Include="Encodings\Alba\Manipulators\IntraRouteInversionManipulator.cs" />
-    <Compile Include="Encodings\Alba\Manipulators\LambdaInterchangeManipulator.cs" />
+    <Compile Include="Encodings\Alba\Crossovers\AlbaPermutationCrossover.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaIntraRouteInversionManipulator.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaLambdaInterchangeManipulator.cs" />
     <Compile Include="Encodings\Alba\Moves\Interfaces\IAlbaLambdaInterchangeMoveOperator.cs" />
     <Compile Include="Encodings\Alba\Moves\Interfaces\IAlbaIntraRouteInversionMoveOperator.cs" />
-    <Compile Include="Encodings\Alba\Manipulators\CustomerInversionManipulator.cs" />
-    <Compile Include="Encodings\Alba\Manipulators\CustomerSwapManipulator.cs" />
-    <Compile Include="Encodings\Alba\Manipulators\CustomerInsertionManipulator.cs" />
-    <Compile Include="Encodings\Alba\Manipulators\PermutationManipulator.cs" />
-    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\ExhaustiveLambdaInterchangeMoveGenerator.cs" />
-    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\LambdaInterchangeMove.cs" />
-    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\LambdaInterchangeMoveGenerator.cs" />
-    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\LambdaInterchangeMoveEvaluator.cs" />
-    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\LambdaInterchangeMoveMaker.cs" />
-    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\StochasticLambdaInterchangeSingleMoveGenerator.cs" />
-    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\StochasticLambdaInterchangeMutliMoveGenerator.cs" />
-    <Compile Include="Encodings\Alba\Moves\PermutationMoveOperator.cs" />
-    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\StochasticIntraRouteInversionMutliMoveGenerator.cs" />
-    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\StochasticIntraRouteInversionSingleMoveGenerator.cs" />
-    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\IntraRouteInversionMoveGenerator.cs" />
-    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\IntraRouteInversionEvaluator.cs" />
-    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\ExhaustiveIntraRouteInversionMoveGenerator.cs" />
-    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\IntraRouteInversionMoveMaker.cs" />
-    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\IntraRouteInversionMove.cs" />
-    <Compile Include="Encodings\General\Crossovers\MultiVRPManipulator.cs" />
-    <Compile Include="Encodings\General\Crossovers\MultiVRPCrossover.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaCustomerInversionManipulator.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaCustomerSwapManipulator.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaCustomerInsertionManipulator.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaPermutationManipulator.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaExhaustiveLambdaInterchangeMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaLambdaInterchangeMove.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaLambdaInterchangeMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaLambdaInterchangeMoveEvaluator.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaLambdaInterchangeMoveMaker.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaStochasticLambdaInterchangeSingleMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaStochasticLambdaInterchangeMutliMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\AlbaPermutationMoveOperator.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaStochasticIntraRouteInversionMutliMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaStochasticIntraRouteInversionSingleMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaIntraRouteInversionMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaIntraRouteInversionEvaluator.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaExhaustiveIntraRouteInversionMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaIntraRouteInversionMoveMaker.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaIntraRouteInversionMove.cs" />
+    <Compile Include="Encodings\General\Crossovers\RandomParentCloneCrossover.cs" />
+    <Compile Include="Encodings\General\PermutationEncoding.cs" />
+    <Compile Include="Encodings\General\Creators\MultiVRPSolutionCreator.cs" />
+    <Compile Include="Encodings\General\Manipulators\MultiVRPSolutionManipulator.cs" />
+    <Compile Include="Encodings\General\Crossovers\MultiVRPSolutionCrossover.cs" />
     <Compile Include="Encodings\General\Creators\RandomCreator.cs" />
     <Compile Include="Encodings\General\Moves\Interfaces\IMultiVRPMoveGenerator.cs" />
@@ -140,12 +146,40 @@
     <Compile Include="Encodings\General\Moves\MultiVRPMoveOperator\MultiVRPMoveMaker.cs" />
     <Compile Include="Encodings\General\Moves\MultiVRPMoveOperator\MultiVRPMoveGenerator.cs" />
-    <Compile Include="Encodings\Potvin\Crossovers\RouteBasedCrossover.cs" />
-    <Compile Include="Encodings\Potvin\Crossovers\SequenceBasedCrossover.cs" />
+    <Compile Include="Encodings\General\TourEncoding.cs" />
+    <Compile Include="Encodings\GVR\Crossovers\GVRCrossover.cs" />
+    <Compile Include="Encodings\GVR\GVREncoding.cs" />
+    <Compile Include="Encodings\GVR\Manipulators\GVRDisplacementManipulator.cs" />
+    <Compile Include="Encodings\GVR\Manipulators\GVRInsertionManipulator.cs" />
+    <Compile Include="Encodings\GVR\Manipulators\GVRInversionManipulator.cs" />
+    <Compile Include="Encodings\GVR\Manipulators\GVRSwapManipulator.cs" />
+    <Compile Include="Encodings\GVR\Manipulators\GVRManipulator.cs" />
+    <Compile Include="Encodings\Potvin\Crossovers\PotvinRouteBasedCrossover.cs" />
+    <Compile Include="Encodings\Potvin\Crossovers\PotvinSequenceBasedCrossover.cs" />
     <Compile Include="Encodings\Potvin\Crossovers\PotvinCrossover.cs" />
-    <Compile Include="Encodings\Potvin\Manipulators\LocalSearchManipulator.cs" />
-    <Compile Include="Encodings\Potvin\Manipulators\TwoLevelExchangeManipulator.cs" />
-    <Compile Include="Encodings\Potvin\Manipulators\OneLevelExchangeManipulator.cs" />
+    <Compile Include="Encodings\Potvin\Manipulators\PotvinLocalSearchManipulator.cs" />
+    <Compile Include="Encodings\Potvin\Manipulators\PotvinTwoLevelExchangeManipulator.cs" />
+    <Compile Include="Encodings\Potvin\Manipulators\PotvinOneLevelExchangeManipulator.cs" />
     <Compile Include="Encodings\Potvin\Manipulators\PotvinManipulator.cs" />
+    <Compile Include="Encodings\Prins\Crossovers\PrinsCrossover.cs" />
+    <Compile Include="Encodings\Prins\Crossovers\PrinsPermutationCrossover.cs" />
+    <Compile Include="Encodings\Prins\Interfaces\IPrinsOperator.cs" />
+    <Compile Include="Encodings\Prins\Manipulators\PrinsStochasticLSManipulator.cs" />
+    <Compile Include="Encodings\Prins\Manipulators\PrinsExhaustiveLSManipulator.cs" />
+    <Compile Include="Encodings\Prins\Manipulators\PrinsLSManipulator.cs" />
+    <Compile Include="Encodings\Prins\Manipulators\PrinsManipulator.cs" />
+    <Compile Include="Encodings\Prins\Manipulators\PrinsPermutationManipulator.cs" />
+    <Compile Include="Encodings\Prins\PrinsEncoding.cs" />
+    <Compile Include="Encodings\Zhu\Crossovers\ZhuMergeCrossover2.cs" />
+    <Compile Include="Encodings\Zhu\Crossovers\ZhuMergeCrossover1.cs" />
+    <Compile Include="Encodings\Zhu\Crossovers\ZhuHeuristicCrossover2.cs" />
+    <Compile Include="Encodings\Zhu\Crossovers\ZhuHeuristicCrossover1.cs" />
+    <Compile Include="Encodings\Zhu\Crossovers\ZhuCrossover.cs" />
+    <Compile Include="Encodings\Zhu\Crossovers\ZhuPermutationCrossover.cs" />
+    <Compile Include="Encodings\Zhu\Manipulators\ZhuPermutationManipulator.cs" />
+    <Compile Include="Encodings\Zhu\Manipulators\ZhuManipulator.cs" />
+    <Compile Include="Encodings\Zhu\ZhuEncoding.cs" />
     <Compile Include="Interfaces\IVRPMoveMaker.cs" />
+    <Compile Include="ORLIBParser.cs" />
+    <Compile Include="TSPLIBParser.cs" />
     <Compile Include="VRPUtilities.cs" />
     <Compile Include="VRPOperator.cs" />
@@ -157,9 +191,9 @@
     <Compile Include="Encodings\Alba\Moves\AlbaMoveOperator.cs" />
     <Compile Include="Encodings\Alba\Moves\AlbaMoveMaker.cs" />
-    <Compile Include="Encodings\Alba\Moves\ThreeOpt\PermutationTranslocationMoveGenerator.cs" />
-    <Compile Include="Encodings\Alba\Moves\ThreeOpt\PermutationTranslocationMoveMaker.cs" />
-    <Compile Include="Encodings\Alba\Moves\ThreeOpt\PermutationTranslocationMoveTabuMaker.cs" />
-    <Compile Include="Encodings\Alba\Moves\ThreeOpt\PermutationTranslocationMoveSoftTabuCriterion.cs" />
-    <Compile Include="Encodings\Alba\Moves\ThreeOpt\PermutationTranslocationMoveHardTabuCriterion.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMoveMaker.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMoveTabuMaker.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMoveSoftTabuCriterion.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMoveHardTabuCriterion.cs" />
     <Compile Include="Encodings\Potvin\PotvinEncoding.cs" />
     <Compile Include="Encodings\VRPMoveOperator.cs" />
@@ -179,5 +213,5 @@
     <Compile Include="Interfaces\IVRPCreator.cs" />
     <Compile Include="Interfaces\IVRPOperator.cs" />
-    <Compile Include="Encodings\Alba\Moves\ThreeOpt\PermutationTranslocationMoveEvaluator.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMoveEvaluator.cs" />
     <Compile Include="MoveEvaluators\VRPMoveEvaluator.cs" />
     <Compile Include="VRPSolution.cs" />
@@ -187,4 +221,8 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
+      <Project>{887425B4-4348-49ED-A457-B7D2C26DDBF9}</Project>
+      <Name>HeuristicLab.Analysis-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
       <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/HeuristicLabProblemsVehicleRoutingPlugin.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/HeuristicLabProblemsVehicleRoutingPlugin.cs.frame	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/HeuristicLabProblemsVehicleRoutingPlugin.cs.frame	(revision 4352)
@@ -28,4 +28,5 @@
   [Plugin("HeuristicLab.Problems.VehicleRouting", "3.3.0.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.VehicleRouting-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Interfaces/IVRPCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Interfaces/IVRPCreator.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Interfaces/IVRPCreator.cs	(revision 4352)
@@ -26,5 +26,4 @@
 namespace HeuristicLab.Problems.VehicleRouting {
   public interface IVRPCreator : IVRPOperator, ISolutionCreator {
-    IValueLookupParameter<IntValue> CitiesParameter { get; }
     ILookupParameter<IVRPEncoding> VRPToursParameter { get; }
   }
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Interfaces/IVRPEncoding.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Interfaces/IVRPEncoding.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Interfaces/IVRPEncoding.cs	(revision 4352)
@@ -22,10 +22,10 @@
 using HeuristicLab.Core;
 using HeuristicLab.Problems.VehicleRouting.Encodings;
+using System.Collections.Generic;
+using HeuristicLab.Data;
 
 namespace HeuristicLab.Problems.VehicleRouting {
   public interface IVRPEncoding : IItem {
-    ItemList<Tour> Tours {
-      get;
-    }
+    List<Tour> GetTours(ILookupParameter<DoubleMatrix> distanceMatrix, int maxVehicles = int.MaxValue);
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/ORLIBParser.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/ORLIBParser.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/ORLIBParser.cs	(revision 4352)
@@ -0,0 +1,120 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+using System.Globalization;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  class ORLIBParser {
+    private StreamReader source;
+    CultureInfo culture = new CultureInfo("en-US");
+    
+    private string name;
+    public string Name {
+      get {
+        return name;
+      }
+    }
+
+    private double[,] vertices;
+    public double[,] Vertices {
+      get { 
+        return vertices; 
+      }
+    }
+
+    private double capacity;
+    public double Capacity {
+      get {
+        return capacity;
+      }
+    }
+
+    private double maxRouteTime;
+    public double MaxRouteTime {
+      get {
+        return maxRouteTime;
+      }
+    }
+
+    private double serviceTime;
+    public double ServiceTime {
+      get {
+        return serviceTime;
+      }
+    }
+
+    private double[] demands;
+    public double[] Demands {
+      get {
+        return demands;
+      }
+    }
+
+    public ORLIBParser(String path) {
+      source = null;
+      
+      name = path;
+      vertices = null;
+      capacity = -1;
+      maxRouteTime = -1;
+      serviceTime = -1;
+      demands = null;
+    }
+
+    public void Parse() {
+      using (source = new StreamReader(name)) {
+        //Read header
+        string line = source.ReadLine();
+        string[] tokens = line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+        int customers = int.Parse(tokens[0]);
+        demands = new double[customers + 1];
+        demands[0] = 0;
+        vertices = new double[customers + 1, 2];
+
+        capacity = int.Parse(tokens[1]);
+        maxRouteTime = int.Parse(tokens[2]);
+        serviceTime = int.Parse(tokens[3]);
+
+        //Read depot
+        line = source.ReadLine();
+        tokens = line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+        vertices[0, 0] = double.Parse(tokens[0], culture.NumberFormat);
+        vertices[0, 1] = double.Parse(tokens[1], culture.NumberFormat);
+
+        for (int i = 0; i < customers; i++) {
+          line = source.ReadLine();
+          tokens = line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+          vertices[i + 1, 0] = double.Parse(tokens[0], culture.NumberFormat);
+          vertices[i + 1, 1] = double.Parse(tokens[1], culture.NumberFormat);
+          demands[i + 1] = double.Parse(tokens[2], culture.NumberFormat);
+        }
+      }
+
+      source = null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/TSPLIBParser.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/TSPLIBParser.cs	(revision 4352)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/TSPLIBParser.cs	(revision 4352)
@@ -0,0 +1,402 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Globalization;
+using System.IO;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// Parses a *.vrp file in TSPLIB format and extracts its information about a VRP.
+  /// </summary>
+  public class TSPLIBParser {
+    #region Inner Enum TSPLIBEdgeWeightType
+    public enum TSPLIBEdgeWeightType {
+      UNDEFINED,
+      EUC_2D,
+      GEO
+    }
+    #endregion
+
+    private const int EOF = 0;
+    private const int NAME = 1;
+    private const int TYPE = 2;
+    private const int COMMENT = 3;
+    private const int DIM = 4;
+    private const int WEIGHTTYPE = 5;
+    private const int WEIGHTFORMAT = 11;
+    private const int NODETYPE = 6;
+    private const int NODESECTION = 7;
+    private const int CAPACITY = 8;
+    private const int DISTANCE = 12;
+    private const int VEHICLES = 13;
+    private const int DEPOTSECTION = 9;
+    private const int DEMANDSECTION = 10;
+
+    private StreamReader source;
+    private bool alternateFormat;
+    CultureInfo culture = new CultureInfo("en-US");
+
+    private string name;
+    /// <summary>
+    /// Gets the name of the parsed VRP.
+    /// </summary>
+    public string Name {
+      get { return name; }
+    }
+    private string comment;
+    /// <summary>
+    /// Gets the comment of the parsed VRP.
+    /// </summary>
+    public string Comment {
+      get { return comment; }
+    }
+    private double[,] vertices;
+    /// <summary>
+    /// Gets the vertices of the parsed VRP.
+    /// </summary>
+    public double[,] Vertices {
+      get { return vertices; }
+    }
+    private TSPLIBEdgeWeightType weightType;
+    /// <summary>
+    /// Gets the weight format of the parsed VRP.
+    /// </summary>
+    public TSPLIBEdgeWeightType WeightType {
+      get { return weightType; }
+    }
+
+    private double capacity;
+    public double Capacity {
+      get {
+        return capacity;
+      }
+    }
+
+    private double distance;
+    public double Distance {
+      get {
+        return distance;
+      }
+    }
+
+    private int vehicles;
+    public int Vehicles {
+      get {
+        return vehicles;
+      }
+    }
+
+    private int depot;
+    public int Depot {
+      get {
+        return depot;
+      }
+    }
+
+    private double[] demands;
+    public double[] Demands {
+      get {
+        return demands;
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="TSPLIBParser"/> with the given <paramref name="path"/>.
+    /// </summary>
+    /// <exception cref="ArgumentException">Thrown if the input file is not a TSPLIB TSP file (*.vrp)
+    /// </exception>
+    /// <param name="path">The path where the VRP is stored.</param>
+    public TSPLIBParser(String path) {
+      if (!path.EndsWith(".vrp"))
+        throw new ArgumentException("Input file has to be a TSPLIB CVRP file (*.vrp, *.txt).");
+
+      source = null;
+      name = path;
+      comment = string.Empty;
+      vertices = null;
+      weightType = TSPLIBEdgeWeightType.UNDEFINED;
+      capacity = -1;
+      distance = -1;
+      vehicles = -1;
+      depot = -1;
+      demands = null;
+      alternateFormat = false;
+    }
+
+    /// <summary>
+    /// Reads the TSPLIB VRP file and parses the elements.
+    /// </summary>
+    /// <exception cref="InvalidDataException">Thrown if the file has an invalid format or contains invalid data.</exception>
+    public void Parse() {
+      using (source = new StreamReader(name)) {
+        int section = -1;
+        string str = null;
+        bool typeIsChecked = false;
+        bool weightTypeIsChecked = false;
+        bool weightFormatIsChecked = false;
+
+        do {
+          str = source.ReadLine();
+          section = GetSection(str);
+
+          if (section != -1) {
+            switch (section) {
+              case NAME:
+                ReadName(str);
+                break;
+              case TYPE:
+                CheckType(str);
+                typeIsChecked = true;
+                break;
+              case COMMENT:
+                ReadComment(str);
+                break;
+              case DIM:
+                InitArrays(str);
+                break;
+              case WEIGHTTYPE:
+                ReadWeightType(str);
+                weightTypeIsChecked = true;
+                break;
+              case WEIGHTFORMAT:
+                ReadWeightFormat(str);
+                weightFormatIsChecked = true;
+                break;
+              case NODETYPE:
+                CheckNodeType(str);
+                break;
+              case NODESECTION:
+                ReadVertices();
+                break;
+              case CAPACITY:
+                ReadCapacity(str);
+                break;
+              case DISTANCE:
+                ReadDistance(str);
+                break;
+              case VEHICLES:
+                ReadVehicles(str);
+                break;
+              case DEPOTSECTION:
+                ReadDepot();
+                break;
+              case DEMANDSECTION:
+                ReadDemands();
+                break;
+            }
+          }
+        } while (!((section == EOF) || (str == null)));
+
+        if (!typeIsChecked || !weightTypeIsChecked || 
+          (alternateFormat && !weightFormatIsChecked) || 
+          weightType == TSPLIBEdgeWeightType.UNDEFINED)
+          throw new InvalidDataException("Input file does not contain format or edge weight format information.");
+      }
+      source = null;
+    }
+
+    private int GetSection(string str) {
+      if (str == null)
+        return EOF;
+
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      if (tokens.Length == 0)
+        return -1;
+
+      string token = tokens[0].Trim();
+      if (token.Equals("eof", StringComparison.OrdinalIgnoreCase))
+        return EOF;
+      if (token.Equals("name", StringComparison.OrdinalIgnoreCase))
+        return NAME;
+      if (token.Equals("type", StringComparison.OrdinalIgnoreCase))
+        return TYPE;
+      if (token.Equals("comment", StringComparison.OrdinalIgnoreCase))
+        return COMMENT;
+      if (token.Equals("dimension", StringComparison.OrdinalIgnoreCase))
+        return DIM;
+      if (token.Equals("edge_weight_type", StringComparison.OrdinalIgnoreCase))
+        return WEIGHTTYPE;
+      if (token.Equals("edge_weight_format", StringComparison.OrdinalIgnoreCase))
+        return WEIGHTFORMAT;
+      if (token.Equals("node_coord_type", StringComparison.OrdinalIgnoreCase))
+        return NODETYPE;
+      if (token.Equals("node_coord_section", StringComparison.OrdinalIgnoreCase))
+        return NODESECTION;
+      if (token.Equals("capacity", StringComparison.OrdinalIgnoreCase))
+        return CAPACITY;
+      if (token.Equals("distance", StringComparison.OrdinalIgnoreCase))
+        return DISTANCE;
+      if (token.Equals("vehicles", StringComparison.OrdinalIgnoreCase))
+        return VEHICLES;
+      if (token.Equals("depot_section", StringComparison.OrdinalIgnoreCase))
+        return DEPOTSECTION;
+      if (token.Equals("demand_section", StringComparison.OrdinalIgnoreCase))
+        return DEMANDSECTION;
+
+      return -1;
+    }
+
+    private void ReadName(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      name = tokens[tokens.Length - 1].Trim();
+    }
+
+    private void CheckType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+
+      string type = tokens[tokens.Length - 1].Trim();
+      if (!type.Equals("cvrp", StringComparison.OrdinalIgnoreCase))
+        throw new InvalidDataException("Input file format is not \"CVRP\"");
+    }
+
+    private void ReadComment(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      comment = tokens[tokens.Length - 1].Trim();
+    }
+
+    private void InitArrays(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string dimension = tokens[tokens.Length - 1].Trim();
+
+      int dim = Int32.Parse(dimension);
+      vertices = new double[dim, 2];
+      demands = new double[dim];
+    }
+
+    private void ReadWeightType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string type = tokens[tokens.Length - 1].Trim();
+
+      if (type.Equals("euc_2d", StringComparison.OrdinalIgnoreCase))
+        weightType = TSPLIBEdgeWeightType.EUC_2D;
+      else if (type.Equals("geo", StringComparison.OrdinalIgnoreCase))
+        weightType = TSPLIBEdgeWeightType.GEO;
+      else if (type.Equals("function", StringComparison.OrdinalIgnoreCase)) {
+        weightType = TSPLIBEdgeWeightType.UNDEFINED;
+        alternateFormat = true;
+      } else
+        throw new InvalidDataException("Input file contains an unsupported edge weight format (only \"EUC_2D\" and \"GEO\" are supported).");
+    }
+
+    private void ReadWeightFormat(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string format = tokens[tokens.Length - 1].Trim();
+
+      if (alternateFormat && format.Equals("euc_2d", StringComparison.OrdinalIgnoreCase))
+        weightType = TSPLIBEdgeWeightType.EUC_2D;
+      else if (format.Equals("geo", StringComparison.OrdinalIgnoreCase))
+        weightType = TSPLIBEdgeWeightType.GEO;
+      else
+        throw new InvalidDataException("Input file contains an unsupported edge weight format.");
+    }
+
+    private void CheckNodeType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string type = tokens[tokens.Length - 1].Trim();
+
+      if (!type.Equals("twod_coords", StringComparison.OrdinalIgnoreCase))
+        throw new InvalidDataException("Input file contains an unsupported node coordinates format (only \"TWOD_COORDS\" is supported).");
+    }
+
+    private void ReadVertices() {
+      if (vertices == null)
+        throw new InvalidDataException("Input file does not contain dimension information.");
+
+      for (int i = 0; i < (vertices.Length / 2); i++) {
+        if (!(alternateFormat && i == 0)) {
+          string str = source.ReadLine();
+          string[] tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+          if (tokens.Length != 3)
+            throw new InvalidDataException("Input file contains invalid node coordinates.");
+
+          vertices[i, 0] = double.Parse(tokens[1], culture.NumberFormat);
+          vertices[i, 1] = double.Parse(tokens[2], culture.NumberFormat);
+        }
+      }
+    }
+
+    private void ReadCapacity(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      capacity = double.Parse(tokens[tokens.Length - 1].Trim(), culture.NumberFormat);
+    }
+
+    private void ReadDistance(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      distance = double.Parse(tokens[tokens.Length - 1].Trim(), culture.NumberFormat);
+    }
+
+    private void ReadVehicles(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      vehicles = int.Parse(tokens[tokens.Length - 1].Trim());
+    }
+
+    private void ReadDepot() {
+      if (alternateFormat) {
+        string[] tokens;
+        do { 
+          string str = source.ReadLine();
+          tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+          if (tokens.Length == 2) {
+            vertices[0, 0] = double.Parse(tokens[0], culture.NumberFormat);
+            vertices[0, 1] = double.Parse(tokens[1], culture.NumberFormat);
+            depot = 1;
+          }
+        } while(tokens.Length == 2);
+      } else {
+        int read;
+        do {
+          string str = source.ReadLine();
+          read = int.Parse(str);
+          if (read != -1)
+            depot = read;
+        } while (read != -1);
+      }
+    }
+
+    private void ReadDemands() {
+      if (demands == null)
+        throw new InvalidDataException("Input file does not contain dimension information.");
+
+      for (int i = 0; i < demands.Length; i++) {
+        if (!(alternateFormat && i == 0)) {
+          string str = source.ReadLine();
+          string[] tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+          if (tokens.Length != 2)
+            throw new InvalidDataException("Input file contains invalid demands.");
+
+          int index = int.Parse(tokens[0]);
+          double value = double.Parse(tokens[1]);
+
+          if (alternateFormat)
+            demands[index] = value;
+          else
+            demands[index - 1] = value;
+        } else {
+          demands[0] = 0;
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/VRPOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/VRPOperator.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/VRPOperator.cs	(revision 4352)
@@ -113,5 +113,4 @@
     public VRPOperator()
       : base() {
-      Parameters.Add(new ValueLookupParameter<IntValue>("Cities", "The city count."));
       Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The coordinates of the cities."));
       Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
@@ -140,5 +139,5 @@
       bool feasible = true;
 
-      foreach (Tour tour in solution.Tours) {
+      foreach (Tour tour in solution.GetTours(DistanceMatrixParameter)) {
         if (!Feasible(tour)) {
           feasible = false;
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/VRPUtilities.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/VRPUtilities.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/VRPUtilities.cs	(revision 4352)
@@ -60,9 +60,14 @@
 
       if (useDistanceMatrix.Value) {
-        if (distanceMatrix.ActualValue == null) {
-          distanceMatrix.ActualValue = CreateDistanceMatrix(coordinates);
-        }
+        if (distanceMatrix is IValueLookupParameter<DoubleMatrix> &&
+          (distanceMatrix as IValueLookupParameter<DoubleMatrix>).Value != null) {
+            distance = (distanceMatrix as IValueLookupParameter<DoubleMatrix>).Value[start, end];
+        } else {
+          if (distanceMatrix.ActualValue == null) {
+            distanceMatrix.ActualValue = CreateDistanceMatrix(coordinates);
+          }
 
-        distance = distanceMatrix.ActualValue[start, end];
+          distance = distanceMatrix.ActualValue[start, end];
+        }       
       } else {
         distance = CalculateDistance(start, end, coordinates);
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/VehicleRoutingProblem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/VehicleRoutingProblem.cs	(revision 4351)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/VehicleRoutingProblem.cs	(revision 4352)
@@ -34,4 +34,5 @@
 using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
 using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Prins;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -176,4 +177,7 @@
     private BestVRPSolutionAnalyzer BestVRPSolutionAnalyzer {
       get { return operators.OfType<BestVRPSolutionAnalyzer>().FirstOrDefault(); }
+    }
+    private BestAverageWorstVRPToursAnalyzer BestAverageWorstVRPToursAnalyzer {
+      get { return operators.OfType<BestAverageWorstVRPToursAnalyzer>().FirstOrDefault(); }
     }
     #endregion
@@ -314,6 +318,7 @@
       operators = new List<IOperator>();
       operators.Add(new BestVRPSolutionAnalyzer());
+      operators.Add(new BestAverageWorstVRPToursAnalyzer());
       ParameterizeAnalyzer();
-      operators.AddRange(ApplicationManager.Manager.GetInstances<IVRPOperator>().Cast<IOperator>());
+      operators.AddRange(ApplicationManager.Manager.GetInstances<IVRPOperator>().Cast<IOperator>().OrderBy(op => op.Name));
       ParameterizeOperators();
       UpdateMoveEvaluators();
@@ -333,5 +338,4 @@
     }
     private void ParameterizeSolutionCreator() {
-      SolutionCreator.CitiesParameter.Value = new IntValue(Coordinates.Rows - 1);
       SolutionCreator.VehiclesParameter.ActualName = VehiclesParameter.Name;
       SolutionCreator.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
@@ -367,6 +371,15 @@
       BestVRPSolutionAnalyzer.OverloadParameter.ActualName = Evaluator.OverloadParameter.ActualName;
       BestVRPSolutionAnalyzer.TardinessParameter.ActualName = Evaluator.TardinessParameter.ActualName;
+      BestVRPSolutionAnalyzer.TravelTimeParameter.ActualName = Evaluator.TravelTimeParameter.ActualName;
+      BestVRPSolutionAnalyzer.VehiclesUtilizedParameter.ActualName = Evaluator.VehcilesUtilizedParameter.ActualName;
       BestVRPSolutionAnalyzer.VRPToursParameter.ActualName = SolutionCreator.VRPToursParameter.ActualName;
       BestVRPSolutionAnalyzer.ResultsParameter.ActualName = "Results";
+
+      BestAverageWorstVRPToursAnalyzer.DistanceParameter.ActualName = Evaluator.DistanceParameter.ActualName;
+      BestAverageWorstVRPToursAnalyzer.OverloadParameter.ActualName = Evaluator.OverloadParameter.ActualName;
+      BestAverageWorstVRPToursAnalyzer.TardinessParameter.ActualName = Evaluator.TardinessParameter.ActualName;
+      BestAverageWorstVRPToursAnalyzer.TravelTimeParameter.ActualName = Evaluator.TravelTimeParameter.ActualName;
+      BestAverageWorstVRPToursAnalyzer.VehiclesUtilizedParameter.ActualName = Evaluator.VehcilesUtilizedParameter.ActualName;
+      BestAverageWorstVRPToursAnalyzer.ResultsParameter.ActualName = "Results";
     }
     private void ParameterizeOperators() {
@@ -387,4 +400,12 @@
       }
 
+      foreach (IPrinsOperator op in Operators.OfType<IPrinsOperator>()) {
+        op.FleetUsageFactor.ActualName = FleetUsageFactor.Name;
+        op.TimeFactor.ActualName = TimeFactor.Name;
+        op.DistanceFactor.ActualName = DistanceFactor.Name;
+        op.OverloadPenalty.ActualName = OverloadPenalty.Name;
+        op.TardinessPenalty.ActualName = TardinessPenalty.Name;
+      }
+
       foreach (IVRPMoveEvaluator op in Operators.OfType<IVRPMoveEvaluator>()) {
         op.FleetUsageFactor.ActualName = FleetUsageFactor.Name;
@@ -427,4 +448,70 @@
       DueTime = new DoubleArray(parser.Duetimes);
       ServiceTime = new DoubleArray(parser.Servicetimes);
+
+      OnReset();
+    }
+
+    public void ImportFromTSPLib(string tspFileName) {
+      TSPLIBParser parser = new TSPLIBParser(tspFileName);
+      parser.Parse();
+
+      this.Name = parser.Name;
+
+      int problemSize = parser.Demands.Length;
+
+      Coordinates = new DoubleMatrix(parser.Vertices);
+      if (parser.Vehicles != -1)
+        Vehicles.Value = parser.Vehicles;
+      else 
+        Vehicles.Value = problemSize - 1;
+      Capacity.Value = parser.Capacity;
+      Demand = new DoubleArray(parser.Demands);
+      ReadyTime = new DoubleArray(problemSize);
+      DueTime = new DoubleArray(problemSize);
+      ServiceTime = new DoubleArray(problemSize);
+
+      for (int i = 0; i < problemSize; i++) {
+        ReadyTime[i] = 0;
+        DueTime[i] = int.MaxValue;
+        ServiceTime[i] = 0;
+      }
+
+      if (parser.Distance != -1) {
+        DueTime[0] = parser.Distance;
+      }
+
+      if (parser.Depot != 1)
+        throw new Exception("Invalid depot specification");
+
+      if (parser.WeightType != TSPLIBParser.TSPLIBEdgeWeightType.EUC_2D)
+        throw new Exception("Invalid weight type");
+
+      OnReset();
+    }
+
+    public void ImportFromORLib(string orFileName) {
+      ORLIBParser parser = new ORLIBParser(orFileName);
+      parser.Parse();
+
+      this.Name = parser.Name;
+      int problemSize = parser.Demands.Length;
+
+      Coordinates = new DoubleMatrix(parser.Vertices);
+      Vehicles.Value = problemSize - 1;
+      Capacity.Value = parser.Capacity;
+      Demand = new DoubleArray(parser.Demands);
+      ReadyTime = new DoubleArray(problemSize);
+      DueTime = new DoubleArray(problemSize);
+      ServiceTime = new DoubleArray(problemSize);
+
+      ReadyTime[0] = 0;
+      DueTime[0] = parser.MaxRouteTime;
+      ServiceTime[0] = 0;
+
+      for (int i = 1; i < problemSize; i++) {
+        ReadyTime[i] = 0;
+        DueTime[i] = int.MaxValue;
+        ServiceTime[i] = parser.ServiceTime;
+      }
 
       OnReset();
