Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs	(revision 6857)
@@ -0,0 +1,150 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("IterativeInsertionCreator", "Creates a randomly initialized VRP solution.")]
+  [StorableClass]
+  public sealed class IterativeInsertionCreator : PotvinCreator, IStochasticOperator {
+    #region IStochasticOperator Members
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    #endregion
+
+    public IValueParameter<BoolValue> AdhereTimeWindowsParameter {
+      get { return (IValueParameter<BoolValue>)Parameters["AdhereTimeWindows"]; }
+    }
+
+    [StorableConstructor]
+    private IterativeInsertionCreator(bool deserializing) : base(deserializing) { }
+
+    public IterativeInsertionCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
+      Parameters.Add(new ValueParameter<BoolValue>("AdhereTimeWindows", "Specifies if the time windows should be considered during construction.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IterativeInsertionCreator(this, cloner);
+    }
+
+    private IterativeInsertionCreator(IterativeInsertionCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    private static double CalculateAngleToDepot(IVRPProblemInstance instance, int city) {
+      double dx = instance.GetCoordinates(0)[0];
+      double dy = instance.GetCoordinates(0)[1];
+
+      double cx = instance.GetCoordinates(city)[0];
+      double cy = instance.GetCoordinates(city)[1];
+
+      double alpha = Math.Atan((cx - dx) / (dy - cy)) * (180.0 / Math.PI);
+      if (cx > dx && cy > dy)
+        alpha = (90.0 + alpha) + 90.0;
+      else if (cx < dx && cy > dy)
+        alpha = alpha + 180.0;
+      else if (cx < dx && cy < dy)
+        alpha = (90.0 + alpha) + 270.0;
+
+      return alpha;
+    }
+
+    private static PotvinEncoding CreateSolution(IVRPProblemInstance instance, IRandom random, bool adhereTimeWindows) {
+      PotvinEncoding result = new PotvinEncoding(instance);
+
+      IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance; 
+
+      List<int> customers = new List<int>();
+      for (int i = 1; i <= instance.Cities.Value; i++)
+        if(pdp == null || pdp.GetDemand(i) >= 0)
+          customers.Add(i);
+
+      customers.Sort(delegate(int city1, int city2)
+          {
+            double angle1 = CalculateAngleToDepot(instance, city1);
+            double angle2 = CalculateAngleToDepot(instance, city2);
+
+            return angle1.CompareTo(angle2);
+          });
+
+      Tour currentTour = new Tour();
+      result.Tours.Add(currentTour);
+
+      int j = random.Next(customers.Count);
+      for (int i = 0; i < customers.Count; i++) {
+        int index = (i + j) % customers.Count;
+
+        int stopIdx = 0;
+        if(currentTour.Stops.Count > 0)
+          result.FindBestInsertionPlace(currentTour, customers[index]);
+        currentTour.Stops.Insert(stopIdx, customers[index]);
+
+        if (pdp != null) {
+          stopIdx = result.FindBestInsertionPlace(currentTour, pdp.GetPickupDeliveryLocation(customers[index]));
+          currentTour.Stops.Insert(stopIdx, pdp.GetPickupDeliveryLocation(customers[index]));
+        }
+
+        CVRPEvaluation evaluation = instance.EvaluateTour(currentTour, result) as CVRPEvaluation;
+        if (result.Tours.Count < instance.Vehicles.Value && 
+          ((adhereTimeWindows && !instance.Feasible(evaluation)) || ((!adhereTimeWindows) && evaluation.Overload > double.Epsilon))) {
+            currentTour.Stops.Remove(customers[index]);
+            if (pdp != null)
+              currentTour.Stops.Remove(pdp.GetPickupDeliveryLocation(customers[index]));
+
+          if (currentTour.Stops.Count == 0)
+            result.Tours.Remove(currentTour);
+          currentTour = new Tour();
+          result.Tours.Add(currentTour);
+          
+          currentTour.Stops.Add(customers[index]);
+          if (pdp != null) {
+            currentTour.Stops.Add(pdp.GetPickupDeliveryLocation(customers[index]));
+          }
+        }
+      }
+
+      if (currentTour.Stops.Count == 0)
+        result.Tours.Remove(currentTour);
+
+      return result;
+    }
+
+    public override IOperation Apply() {
+      VRPToursParameter.ActualValue = CreateSolution(ProblemInstance, RandomParameter.ActualValue, AdhereTimeWindowsParameter.Value.Value);
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PushForwardInsertionCreator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PushForwardInsertionCreator.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PushForwardInsertionCreator.cs	(revision 6857)
@@ -0,0 +1,320 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PushForwardInsertionCreator", "Creates a randomly initialized VRP solution.")]
+  [StorableClass]
+  public sealed class PushForwardInsertionCreator : PotvinCreator, IStochasticOperator {
+    #region IStochasticOperator Members
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    #endregion
+
+    public IValueParameter<DoubleValue> Alpha {
+      get { return (IValueParameter<DoubleValue>)Parameters["Alpha"]; }
+    }
+    public IValueParameter<DoubleValue> AlphaVariance {
+      get { return (IValueParameter<DoubleValue>)Parameters["AlphaVariance"]; }
+    }
+    public IValueParameter<DoubleValue> Beta {
+      get { return (IValueParameter<DoubleValue>)Parameters["Beta"]; }
+    }
+    public IValueParameter<DoubleValue> BetaVariance {
+      get { return (IValueParameter<DoubleValue>)Parameters["BetaVariance"]; }
+    }
+    public IValueParameter<DoubleValue> Gamma {
+      get { return (IValueParameter<DoubleValue>)Parameters["Gamma"]; }
+    }
+    public IValueParameter<DoubleValue> GammaVariance {
+      get { return (IValueParameter<DoubleValue>)Parameters["GammaVariance"]; }
+    }
+
+    [StorableConstructor]
+    private PushForwardInsertionCreator(bool deserializing) : base(deserializing) { }
+
+    public PushForwardInsertionCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
+      Parameters.Add(new ValueParameter<DoubleValue>("Alpha", "The alpha value.", new DoubleValue(0.7)));
+      Parameters.Add(new ValueParameter<DoubleValue>("AlphaVariance", "The alpha variance.", new DoubleValue(0.5)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Beta", "The beta value.", new DoubleValue(0.1)));
+      Parameters.Add(new ValueParameter<DoubleValue>("BetaVariance", "The beta variance.", new DoubleValue(0.07)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Gamma", "The gamma value.", new DoubleValue(0.2)));
+      Parameters.Add(new ValueParameter<DoubleValue>("GammaVariance", "The gamma variance.", new DoubleValue(0.14)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PushForwardInsertionCreator(this, cloner);
+    }
+
+    private PushForwardInsertionCreator(PushForwardInsertionCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    // use the Box-Mueller transform in the polar form to generate a N(0,1) random variable out of two uniformly distributed random variables
+    private static double Gauss(IRandom random) {
+      double u = 0.0, v = 0.0, s = 0.0;
+      do {
+        u = (random.NextDouble() * 2) - 1;
+        v = (random.NextDouble() * 2) - 1;
+        s = Math.Sqrt(u * u + v * v);
+      } while (s < Double.Epsilon || s > 1);
+      return u * Math.Sqrt((-2.0 * Math.Log(s)) / s);
+    }
+
+    private static double N(double mu, double sigma, IRandom random) {
+      return mu + (sigma * Gauss(random)); // transform the random variable sampled from N(0,1) to N(mu,sigma)
+    }
+
+    private static double GetDistance(int start, int end, IVRPProblemInstance problemInstance) {
+      double distance = 0.0;
+
+      double startX = problemInstance.Coordinates[start, 0];
+      double startY = problemInstance.Coordinates[start, 1];
+
+      double endX = problemInstance.Coordinates[end, 0];
+      double endY = problemInstance.Coordinates[end, 1];
+
+      distance =
+          Math.Sqrt(
+            Math.Pow(startX - endX, 2) +
+            Math.Pow(startY - endY, 2));
+
+      return distance;
+    }
+
+    private static PotvinEncoding CreateSolution(IVRPProblemInstance problemInstance, IRandom random,
+      double alphaValue = 0.7, double betaValue = 0.1, double gammaValue = 0.2,
+      double alphaVariance = 0.5, double betaVariance = 0.07, double gammaVariance = 0.14) {
+      PotvinEncoding result = new PotvinEncoding(problemInstance);
+
+      double alpha, beta, gamma;
+      alpha = N(alphaValue, Math.Sqrt(alphaVariance), random);
+      beta = N(betaValue, Math.Sqrt(betaVariance), random);
+      gamma = N(gammaValue, Math.Sqrt(gammaVariance), random);
+
+      int totalTours = 0;
+
+      double distance = 0;
+      double cost = 0;
+      List<int> unroutedList = new List<int>();
+      List<double> costList = new List<double>();
+
+      IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
+      IMultiDepotProblemInstance mdp = problemInstance as IMultiDepotProblemInstance;
+
+      int depots = 1;
+      if (mdp != null) {
+        depots = mdp.Depots.Value;
+        for (int i = 0; i < result.VehicleAssignment.Length; i++)
+          result.VehicleAssignment[i] = -1;
+      }
+
+      List<int> unrouted = new List<int>();
+      for (int i = 1; i <= problemInstance.Cities.Value; i++)
+        if (pdp == null || problemInstance.GetDemand(i) >= 0)
+          unrouted.Add(i);
+
+      for (int depot = 0; depot < depots; depot++) {
+        int vehicleCount = problemInstance.Vehicles.Value;
+        List<int> vehicles = new List<int>();
+        if (mdp != null) {
+          vehicleCount = 0;
+          for (int i = 0; i < mdp.VehicleDepotAssignment.Length; i++) {
+            if (mdp.VehicleDepotAssignment[i] == depot) {
+              vehicleCount++;
+              vehicles.Add(i);
+            }
+          }
+        } else {
+          for (int i = 0; i < problemInstance.Vehicles.Value; i++)
+            vehicles.Add(i);
+        }
+
+        costList.Clear();
+        unroutedList.Clear();
+
+        double x0 = problemInstance.Coordinates[depot, 0];
+        double y0 = problemInstance.Coordinates[depot, 1];
+
+        /*-----------------------------------------------------------------------------
+        * generate cost list
+        *-----------------------------------------------------------------------------
+        */
+        for (int i = 1; i <= problemInstance.Cities.Value; i++) {
+          //only insert sources
+          if (unrouted.Contains(i) && (pdp == null || problemInstance.GetDemand(i) >= 0)) {
+            distance = GetDistance(i + depots - 1, depot, problemInstance);
+            if (problemInstance.Coordinates[i + depots - 1, 0] < x0) distance = -distance;
+
+            double dueTime = 0;
+            if (problemInstance is ITimeWindowedProblemInstance)
+              dueTime = (problemInstance as ITimeWindowedProblemInstance).DueTime[i + depots - 1];
+
+            cost = -alpha * distance + // distance 0 <-> City[i]
+                   beta * dueTime + // latest arrival time
+                   gamma * (Math.Asin((problemInstance.Coordinates[i + depots - 1, 0] - y0) / distance) / 360 * distance); // polar angle
+
+            int index = 0;
+            while (index < costList.Count && costList[index] < cost) index++;
+
+            costList.Insert(index, cost);
+
+            unroutedList.Insert(index, i);
+          }
+        }
+
+        int tours = 0;
+        double minimumCost = double.MaxValue;
+        int indexOfMinimumCost = -1;
+        int indexOfMinimumCost2 = -1;
+        int indexOfCustomer = -1;
+
+        Tour tour = new Tour();
+        result.Tours.Add(tour);
+        result.VehicleAssignment[totalTours] = vehicles[0];
+        vehicles.RemoveAt(0);
+        tours++;
+        totalTours++;
+
+        tour.Stops.Add(unroutedList[0]);
+
+        if (pdp != null) {
+          tour.Stops.Add(pdp.GetPickupDeliveryLocation(unroutedList[0]));
+        }
+
+        unrouted.Remove(unroutedList[0]);
+        unroutedList.RemoveAt(0);
+
+        while (unroutedList.Count > 0 && (tours < vehicleCount || depot == depots - 1)) {
+          for (int c = 0; c < unroutedList.Count; c++) {
+            VRPEvaluation eval = problemInstance.EvaluateTour(tour, result);
+            double originalCosts = eval.Quality;
+            int customer = unroutedList[c];
+
+            for (int i = 0; i <= tour.Stops.Count; i++) {
+              tour.Stops.Insert(i, customer);
+              eval = problemInstance.EvaluateTour(tour, result);
+              double tourCost = eval.Quality - originalCosts;
+
+              if (pdp != null) {
+                for (int j = i + 1; j <= tour.Stops.Count; j++) {
+                  bool feasible;
+                  cost = tourCost +
+                    problemInstance.GetInsertionCosts(eval, result, pdp.GetPickupDeliveryLocation(unroutedList[c]), 0, j, out feasible);
+                  if (cost < minimumCost && feasible) {
+                    minimumCost = cost;
+                    indexOfMinimumCost = i;
+                    indexOfMinimumCost2 = j;
+                    indexOfCustomer = c;
+                  }
+                }
+              } else {
+                cost = tourCost;
+                bool feasible = problemInstance.Feasible(eval);
+                if (cost < minimumCost && feasible) {
+                  minimumCost = cost;
+                  indexOfMinimumCost = i;
+                  indexOfCustomer = c;
+                }
+              }
+
+              tour.Stops.RemoveAt(i);
+            }
+          }
+
+          // insert customer if found
+          if (indexOfMinimumCost != -1) {
+            tour.Stops.Insert(indexOfMinimumCost, unroutedList[indexOfCustomer]);
+            if (pdp != null) {
+              tour.Stops.Insert(indexOfMinimumCost2, pdp.GetPickupDeliveryLocation(unroutedList[indexOfCustomer]));
+            }
+
+            unrouted.Remove(unroutedList[indexOfCustomer]);
+            unroutedList.RemoveAt(indexOfCustomer);
+          } else if (tours < vehicleCount || depot == depots - 1) { // no feasible customer found
+            tour = new Tour();
+            result.Tours.Add(tour);
+            result.VehicleAssignment[totalTours] = vehicles[0];
+            vehicles.RemoveAt(0);
+            tours++;
+            totalTours++;
+
+            tour.Stops.Add(unroutedList[0]);
+            if (pdp != null) {
+              tour.Stops.Add(pdp.GetPickupDeliveryLocation(unroutedList[0]));
+            }
+
+            unrouted.Remove(unroutedList[0]);
+            unroutedList.RemoveAt(0);
+          }
+          // reset minimum		
+          minimumCost = double.MaxValue;
+          indexOfMinimumCost = -1;
+          indexOfMinimumCost2 = -1;
+          indexOfCustomer = -1;
+        }
+      }
+
+      if (mdp != null) {
+        List<int> availableVehicles = new List<int>();
+        for (int i = 0; i < mdp.Vehicles.Value; i++)
+          availableVehicles.Add(i);
+
+        for (int i = 0; i < result.VehicleAssignment.Length; i++) {
+          if (result.VehicleAssignment[i] != -1)
+            availableVehicles.Remove(result.VehicleAssignment[i]);
+        }
+
+        for (int i = 0; i < result.VehicleAssignment.Length; i++) {
+          if (result.VehicleAssignment[i] == -1) {
+            result.VehicleAssignment[i] = availableVehicles[0];
+            availableVehicles.RemoveAt(0);
+          }
+        }
+      }
+
+      return result;
+    }
+
+    public override IOperation Apply() {
+      VRPToursParameter.ActualValue = CreateSolution(ProblemInstance, RandomParameter.ActualValue,
+        Alpha.Value.Value, Beta.Value.Value, Gamma.Value.Value,
+        AlphaVariance.Value.Value, BetaVariance.Value.Value, GammaVariance.Value.Value);
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs	(revision 6856)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs	(revision 6857)
@@ -26,5 +26,4 @@
 using HeuristicLab.Data;
 using HeuristicLab.Common;
-using HeuristicLab.Problems.VehicleRouting.Encodings.ExtendedPotvin;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
@@ -60,9 +59,8 @@
       child.Tours.Insert(tourParent2, replacing);
 
-      if (parent1 is ExtendedPotvinEncoding && child is ExtendedPotvinEncoding) {
-        Permutation vehicleAssignment = (child as ExtendedPotvinEncoding).VehicleAssignment;
+        Permutation vehicleAssignment = child.VehicleAssignment;
 
         int vehicle = vehicleAssignment[tourParent2];
-        int vehicle2 = (parent1 as ExtendedPotvinEncoding).VehicleAssignment[tourParent1];
+        int vehicle2 = parent1.VehicleAssignment[tourParent1];
         vehicleAssignment[tourParent2] = vehicle2;
 
@@ -73,5 +71,4 @@
           }
         }        
-      }
 
       foreach (int city in replaced.Stops)
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/IPotvinOperator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/IPotvinOperator.cs	(revision 6856)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/IPotvinOperator.cs	(revision 6857)
@@ -32,6 +32,7 @@
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
-  public interface IPotvinOperator : 
-    ISingleDepotOperator, IHomogenousCapacitatedOperator, ITimeWindowedOperator {    
+  public interface IPotvinOperator :
+    ISingleDepotOperator, IHomogenousCapacitatedOperator, ITimeWindowedOperator, 
+    IMultiDepotOperator, IHeterogenousCapacitatedOperator {    
   }
 }
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinVehicleAssignmentManipulator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinVehicleAssignmentManipulator.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinVehicleAssignmentManipulator.cs	(revision 6857)
@@ -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.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMainpulator", "A manipulator that changes the vehicle assignment")]
+  [StorableClass]
+  public sealed class PotvinVehicleAssignmentMainpulator : VRPManipulator, ITimeWindowedOperator,
+    IMultiDepotOperator, IHeterogenousCapacitatedOperator {
+    public IValueParameter<IPermutationManipulator> VehicleAssignmentManipuator {
+      get { return (IValueParameter<IPermutationManipulator>)Parameters["VehicleAssignmentManipuator"]; }
+    }
+
+    public ILookupParameter<Permutation> VehicleAssignmentParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["VehicleAssignment"]; }
+    }
+
+    [StorableConstructor]
+    private PotvinVehicleAssignmentMainpulator(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentMainpulator()
+      : base() {
+      Parameters.Add(new ValueParameter<IPermutationManipulator>("VehicleAssignmentManipuator",
+      "The operator used to menipulate the vehicle assignments.", new Swap2Manipulator()));
+      Parameters.Add(new LookupParameter<Permutation>("VehicleAssignment"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMainpulator(this, cloner);
+    }
+
+    private PotvinVehicleAssignmentMainpulator(PotvinVehicleAssignmentMainpulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation Apply() {
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      if (!(solution is PotvinEncoding)) {
+        VRPToursParameter.ActualValue = PotvinEncoding.ConvertFrom(solution, ProblemInstance);
+      }
+
+      OperationCollection next = new OperationCollection(base.Apply());
+
+      VehicleAssignmentParameter.ActualValue = (VRPToursParameter.ActualValue as PotvinEncoding).VehicleAssignment;
+      VehicleAssignmentManipuator.Value.PermutationParameter.ActualName = VehicleAssignmentParameter.ActualName;
+      next.Insert(0, ExecutionContext.CreateOperation(VehicleAssignmentManipuator.Value));
+
+      return next;
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveMaker.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveMaker.cs	(revision 6856)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveMaker.cs	(revision 6857)
@@ -89,4 +89,5 @@
       PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;
       Apply(newSolution, move, ProblemInstance);
+      newSolution.Repair();
       VRPToursParameter.ActualValue = newSolution;
 
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveMaker.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveMaker.cs	(revision 6856)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveMaker.cs	(revision 6857)
@@ -98,9 +98,6 @@
       PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;
       Apply(newSolution, move, ProblemInstance);
+      newSolution.Repair();
       VRPToursParameter.ActualValue = newSolution;
-
-      //reset move quality
-      VRPEvaluation eval = ProblemInstance.Evaluate(newSolution);
-      MoveQualityParameter.ActualValue.Value = eval.Quality;
     }
   }
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuCriterion.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuCriterion.cs	(revision 6856)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuCriterion.cs	(revision 6857)
@@ -116,37 +116,39 @@
         PotvinPDRelocateMoveAttribute attribute = tabuMove as PotvinPDRelocateMoveAttribute;
 
-        double distance = 0;
-        if (MoveDistanceParameter.ActualValue != null)
-          distance = MoveDistanceParameter.ActualValue.Value;
+        if (attribute != null) {
+          double distance = 0;
+          if (MoveDistanceParameter.ActualValue != null)
+            distance = MoveDistanceParameter.ActualValue.Value;
 
-        double overload = 0;
-        if (MoveOverloadParameter.ActualValue != null)
-          overload = MoveOverloadParameter.ActualValue.Value;
+          double overload = 0;
+          if (MoveOverloadParameter.ActualValue != null)
+            overload = MoveOverloadParameter.ActualValue.Value;
 
-        double tardiness = 0;
-        if (MoveTardinessParameter.ActualValue != null)
-          tardiness = MoveTardinessParameter.ActualValue.Value;
+          double tardiness = 0;
+          if (MoveTardinessParameter.ActualValue != null)
+            tardiness = MoveTardinessParameter.ActualValue.Value;
 
-        IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
-        double quality = attribute.Distance * instance.DistanceFactor.Value;
+          IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
+          double quality = attribute.Distance * instance.DistanceFactor.Value;
 
-        IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
-        if (cvrp != null)
-          quality += attribute.Overload * cvrp.OverloadPenalty.Value;
+          IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
+          if (cvrp != null)
+            quality += attribute.Overload * cvrp.OverloadPenalty.Value;
 
-        ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
-        if (vrptw != null)
-          quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
+          ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+          if (vrptw != null)
+            quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
 
-        if (!useAspiration || moveQuality >= quality) {
-          if ((attribute.City == move.City && attribute.Tour == move.Tour) ||
-            (attribute.City == move.Replaced && attribute.Tour == move.OldTour)) {
-            isTabu = true;
-            break;
-          }
+          if (!useAspiration || moveQuality >= quality) {
+            if ((attribute.City == move.City && attribute.Tour == move.Tour) ||
+              (attribute.City == move.Replaced && attribute.Tour == move.OldTour)) {
+              isTabu = true;
+              break;
+            }
 
-          if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
-            isTabu = true;
-            break;
+            if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
+              isTabu = true;
+              break;
+            }
           }
         }
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveMaker.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveMaker.cs	(revision 6856)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveMaker.cs	(revision 6857)
@@ -117,9 +117,6 @@
       PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;
       Apply(newSolution, move, ProblemInstance);
+      newSolution.Repair();
       VRPToursParameter.ActualValue = newSolution;
-
-      //reset move quality
-      VRPEvaluation eval = ProblemInstance.Evaluate(newSolution);
-      MoveQualityParameter.ActualValue.Value = eval.Quality;
     }
   }
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveTabuCriterion.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveTabuCriterion.cs	(revision 6856)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveTabuCriterion.cs	(revision 6857)
@@ -116,36 +116,38 @@
         PotvinPDRelocateMoveAttribute attribute = tabuMove as PotvinPDRelocateMoveAttribute;
 
-        double distance = 0;
-        if (MoveDistanceParameter.ActualValue != null)
-          distance = MoveDistanceParameter.ActualValue.Value;
+        if (attribute != null) {
+          double distance = 0;
+          if (MoveDistanceParameter.ActualValue != null)
+            distance = MoveDistanceParameter.ActualValue.Value;
 
-        double overload = 0;
-        if (MoveOverloadParameter.ActualValue != null)
-          overload = MoveOverloadParameter.ActualValue.Value;
+          double overload = 0;
+          if (MoveOverloadParameter.ActualValue != null)
+            overload = MoveOverloadParameter.ActualValue.Value;
 
-        double tardiness = 0;
-        if (MoveTardinessParameter.ActualValue != null)
-          tardiness = MoveTardinessParameter.ActualValue.Value;
+          double tardiness = 0;
+          if (MoveTardinessParameter.ActualValue != null)
+            tardiness = MoveTardinessParameter.ActualValue.Value;
 
-        IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
-        double quality = attribute.Distance * instance.DistanceFactor.Value;
+          IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
+          double quality = attribute.Distance * instance.DistanceFactor.Value;
 
-        IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
-        if (cvrp != null)
-          quality += attribute.Overload * cvrp.OverloadPenalty.Value;
+          IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
+          if (cvrp != null)
+            quality += attribute.Overload * cvrp.OverloadPenalty.Value;
 
-        ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
-        if (vrptw != null)
-          quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
+          ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+          if (vrptw != null)
+            quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
 
-        if (!useAspiration || moveQuality >= quality) {
-          if (attribute.City == move.City && attribute.Tour == move.Tour) {
-            isTabu = true;
-            break;
-          }
+          if (!useAspiration || moveQuality >= quality) {
+            if (attribute.City == move.City && attribute.Tour == move.Tour) {
+              isTabu = true;
+              break;
+            }
 
-          if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
-            isTabu = true;
-            break;
+            if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
+              isTabu = true;
+              break;
+            }
           }
         }
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveMaker.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveMaker.cs	(revision 6856)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveMaker.cs	(revision 6857)
@@ -86,9 +86,6 @@
       PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;
       Apply(newSolution, move, ProblemInstance);
+      newSolution.Repair();
       VRPToursParameter.ActualValue = newSolution;
-
-      //reset move quality
-      VRPEvaluation eval = ProblemInstance.Evaluate(newSolution);
-      MoveQualityParameter.ActualValue.Value = eval.Quality;
     }
   }
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveTabuCriterion.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveTabuCriterion.cs	(revision 6856)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveTabuCriterion.cs	(revision 6857)
@@ -116,36 +116,38 @@
         PotvinPDRelocateMoveAttribute attribute = tabuMove as PotvinPDRelocateMoveAttribute;
 
-        double distance = 0;
-        if (MoveDistanceParameter.ActualValue != null)
-          distance = MoveDistanceParameter.ActualValue.Value;
+        if (attribute != null) {
+          double distance = 0;
+          if (MoveDistanceParameter.ActualValue != null)
+            distance = MoveDistanceParameter.ActualValue.Value;
 
-        double overload = 0;
-        if (MoveOverloadParameter.ActualValue != null)
-          overload = MoveOverloadParameter.ActualValue.Value;
+          double overload = 0;
+          if (MoveOverloadParameter.ActualValue != null)
+            overload = MoveOverloadParameter.ActualValue.Value;
 
-        double tardiness = 0;
-        if (MoveTardinessParameter.ActualValue != null)
-          tardiness = MoveTardinessParameter.ActualValue.Value;
+          double tardiness = 0;
+          if (MoveTardinessParameter.ActualValue != null)
+            tardiness = MoveTardinessParameter.ActualValue.Value;
 
-        IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
-        double quality = attribute.Distance * instance.DistanceFactor.Value;
+          IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
+          double quality = attribute.Distance * instance.DistanceFactor.Value;
 
-        IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
-        if (cvrp != null)
-          quality += attribute.Overload * cvrp.OverloadPenalty.Value;
+          IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
+          if (cvrp != null)
+            quality += attribute.Overload * cvrp.OverloadPenalty.Value;
 
-        ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
-        if (vrptw != null)
-          quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
+          ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+          if (vrptw != null)
+            quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
 
-        if (!useAspiration || moveQuality >= quality) {
-          if (attribute.City == move.City && attribute.Tour == move.Tour) {
-            isTabu = true;
-            break;
-          }
+          if (!useAspiration || moveQuality >= quality) {
+            if (attribute.City == move.City && attribute.Tour == move.Tour) {
+              isTabu = true;
+              break;
+            }
 
-          if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
-            isTabu = true;
-            break;
+            if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
+              isTabu = true;
+              break;
+            }
           }
         }
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/IPotvinVehicleAssignmentMoveOperator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/IPotvinVehicleAssignmentMoveOperator.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/IPotvinVehicleAssignmentMoveOperator.cs	(revision 6857)
@@ -0,0 +1,31 @@
+﻿#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.Optimization;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  public interface IPotvinVehicleAssignmentMoveOperator : IVRPMoveOperator {
+    ILookupParameter<PotvinVehicleAssignmentMove> VehicleAssignmentMoveParameter { get; }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentExhaustiveMoveGenerator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentExhaustiveMoveGenerator.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentExhaustiveMoveGenerator.cs	(revision 6857)
@@ -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 System;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Parameters;
+using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentExhaustiveMoveGenerator", "Generates vehicle assignment moves from a given VRP encoding.")]
+  [StorableClass]
+  public sealed class PotvinVehicleAssignmentExhaustiveMoveGenerator : PotvinVehicleAssignmentMoveGenerator, IExhaustiveMoveGenerator {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentExhaustiveMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinVehicleAssignmentExhaustiveMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentExhaustiveMoveGenerator()
+      : base() {
+    }
+
+    private PotvinVehicleAssignmentExhaustiveMoveGenerator(PotvinVehicleAssignmentMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinVehicleAssignmentMove> result = new List<PotvinVehicleAssignmentMove>();
+
+      for (int i = 0; i < individual.Tours.Count; i++) {
+        for (int j = i + 1; j < problemInstance.Vehicles.Value; j++) {
+          result.Add(new PotvinVehicleAssignmentMove(i, j, individual));
+        }
+
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMove.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMove.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMove.cs	(revision 6857)
@@ -0,0 +1,99 @@
+﻿#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;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMove", "Item that describes a relocation move on a VRP representation.")]
+  [StorableClass]
+  public class PotvinVehicleAssignmentMove: Item, IVRPMove {
+    [Storable]
+    public IVRPEncoding Individual { get; protected set; }
+    
+    [Storable]
+    public int Tour1 { get; protected set; }
+
+    [Storable]
+    public int Tour2 { get; protected set; }
+
+   
+    public PotvinVehicleAssignmentMove(): base() {
+      Tour1 = -1;
+      Tour2 = -1;
+
+      Individual = null;
+    }
+
+    public PotvinVehicleAssignmentMove(int tour1, int tour2, PotvinEncoding individual) {
+      Tour1 = tour1;
+      Tour2 = tour2;
+
+      this.Individual = individual.Clone() as PotvinEncoding;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMove(this, cloner);
+    }
+
+    protected PotvinVehicleAssignmentMove(PotvinVehicleAssignmentMove original, Cloner cloner)
+      : base(original, cloner) {
+        this.Tour1 = original.Tour1;
+        this.Tour2 = original.Tour2;
+
+      this.Individual = cloner.Clone(Individual) as PotvinEncoding;
+    }
+
+    #region IVRPMove Members
+
+    public VRPMoveEvaluator GetMoveEvaluator() {
+      return new PotvinVehicleAssignmentMoveEvaluator();
+    }
+
+    public VRPMoveMaker GetMoveMaker() {
+      return new PotvinVehicleAssignmentMoveMaker();
+    }
+
+    public ITabuMaker GetTabuMaker() {
+      return new PotvinVehicleAssignmentMoveTabuMaker();
+    }
+
+    public ITabuChecker GetTabuChecker() {
+      return new PotvinVehicleAssignmentMoveTabuCriterion();
+    }
+
+    public ITabuChecker GetSoftTabuChecker() {
+      PotvinVehicleAssignmentMoveTabuCriterion tabuChecker = new PotvinVehicleAssignmentMoveTabuCriterion();
+      tabuChecker.UseAspirationCriterion.Value = true;
+
+      return tabuChecker;
+    }
+
+    #endregion
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveAttribute.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveAttribute.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveAttribute.cs	(revision 6857)
@@ -0,0 +1,81 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMoveAttribute", "vehicle assignment move attribute")]
+  [StorableClass]
+  public class PotvinVehicleAssignmentMoveAttribute : VRPMoveAttribute {
+    [Storable]
+    public int Tour { get; private set; }
+    [Storable]
+    public int Vehicle { get; private set; }
+
+    [Storable]
+    public double Distance { get; private set; }
+    [Storable]
+    public double Overload { get; private set; }
+    [Storable]
+    public double Tardiness { get; private set; }
+
+    [StorableConstructor]
+    protected PotvinVehicleAssignmentMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected PotvinVehicleAssignmentMoveAttribute(PotvinVehicleAssignmentMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+        this.Tour = original.Tour;
+        this.Vehicle = original.Vehicle;
+        this.Distance = original.Distance;
+        this.Overload = original.Overload;
+        this.Tardiness = original.Tardiness;
+    }
+    public PotvinVehicleAssignmentMoveAttribute(double moveQuality, int tour, int vehicle,
+      double distance, double overload, double tardiness)
+      : base(moveQuality) {
+      Tour = tour;
+      Vehicle = vehicle;
+      Distance = distance;
+      Overload = overload;
+      Tardiness = tardiness;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMoveAttribute(this, cloner);
+    }
+
+    public override int GetHashCode() {
+      return Tour.GetHashCode() + Vehicle.GetHashCode();
+    }
+
+    public override bool Equals(object obj) {
+      if (obj is PotvinVehicleAssignmentMoveAttribute) {
+        PotvinVehicleAssignmentMoveAttribute other = obj as PotvinVehicleAssignmentMoveAttribute;
+
+        return Tour == other.Tour && Vehicle == other.Vehicle;
+      } else {
+        return base.Equals(obj);
+      }
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveEvaluator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveEvaluator.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveEvaluator.cs	(revision 6857)
@@ -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.Common;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMoveEvaluator", "Evaluates a vehicle assignment move for a VRP representation. ")]
+  [StorableClass]
+  public sealed class PotvinVehicleAssignmentMoveEvaluator : PotvinMoveEvaluator, IPotvinVehicleAssignmentMoveOperator {
+    public ILookupParameter<PotvinVehicleAssignmentMove> VehicleAssignmentMoveParameter {
+      get { return (ILookupParameter<PotvinVehicleAssignmentMove>)Parameters["PotvinVehicleAssignmentMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return VehicleAssignmentMoveParameter; }
+    }
+
+    [StorableConstructor]
+    private PotvinVehicleAssignmentMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentMoveEvaluator()
+      : base() {
+       Parameters.Add(new LookupParameter<PotvinVehicleAssignmentMove>("PotvinVehicleAssignmentMove", "The move that should be evaluated."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMoveEvaluator(this, cloner);
+    }
+
+    private PotvinVehicleAssignmentMoveEvaluator(PotvinVehicleAssignmentMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void EvaluateMove() {
+      PotvinVehicleAssignmentMove move = VehicleAssignmentMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = VehicleAssignmentMoveParameter.ActualValue.Individual.Clone() as PotvinEncoding;
+      PotvinVehicleAssignmentMoveMaker.Apply(newSolution, move, ProblemInstance);
+
+      UpdateEvaluation(newSolution);
+    } 
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveGenerator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveGenerator.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveGenerator.cs	(revision 6857)
@@ -0,0 +1,77 @@
+﻿#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.Parameters;
+using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMoveGenerator", "Generates vehicle assignment moves from a given VRP encoding.")]
+  [StorableClass]
+  public abstract class PotvinVehicleAssignmentMoveGenerator : PotvinMoveGenerator, IPotvinVehicleAssignmentMoveOperator {
+    public ILookupParameter<PotvinVehicleAssignmentMove> VehicleAssignmentMoveParameter {
+      get { return (ILookupParameter<PotvinVehicleAssignmentMove>)Parameters["PotvinVehicleAssignmentMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return VehicleAssignmentMoveParameter; }
+    }
+
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinVehicleAssignmentMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentMoveGenerator()
+      : base() {
+        Parameters.Add(new LookupParameter<PotvinVehicleAssignmentMove>("PotvinVehicleAssignmentMove", "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 PotvinVehicleAssignmentMoveGenerator(PotvinVehicleAssignmentMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
+
+    public override IOperation Apply() {
+      IOperation next = base.Apply();
+
+      PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
+      PotvinVehicleAssignmentMove[] moves = GenerateMoves(individual, ProblemInstance);
+      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(VehicleAssignmentMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+
+      return next;
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveMaker.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveMaker.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveMaker.cs	(revision 6857)
@@ -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 HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMoveMaker", "Peforms the vehicle assignment move on a given VRP encoding and updates the quality.")]
+  [StorableClass]
+  public class PotvinVehicleAssignmentMoveMaker : PotvinMoveMaker, IPotvinVehicleAssignmentMoveOperator, IMoveMaker {
+    public ILookupParameter<PotvinVehicleAssignmentMove> VehicleAssignmentMoveParameter {
+      get { return (ILookupParameter<PotvinVehicleAssignmentMove>)Parameters["PotvinVehicleAssignmentMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+         get { return VehicleAssignmentMoveParameter; }
+    }
+
+    public ILookupParameter<VariableCollection> MemoriesParameter {
+      get { return (ILookupParameter<VariableCollection>)Parameters["Memories"]; } 
+    }
+
+    public IValueParameter<StringValue> AdditionFrequencyMemoryKeyParameter {
+      get { return (IValueParameter<StringValue>)Parameters["AdditionFrequencyMemoryKey"]; }
+    }
+
+    [StorableConstructor]
+    private PotvinVehicleAssignmentMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinVehicleAssignmentMove>("PotvinVehicleAssignmentMove", "The moves that should be made."));
+
+      Parameters.Add(new LookupParameter<VariableCollection>("Memories", "The TS memory collection."));
+      Parameters.Add(new ValueParameter<StringValue>("AdditionFrequencyMemoryKey", "The key that is used for the addition frequency in the TS memory.", new StringValue("AdditionFrequency")));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMoveMaker(this, cloner);
+    }
+
+    protected PotvinVehicleAssignmentMoveMaker(PotvinVehicleAssignmentMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void Apply(PotvinEncoding solution, PotvinVehicleAssignmentMove move, IVRPProblemInstance problemInstance) {
+      int vehicle1 = solution.VehicleAssignment[move.Tour1];
+      int vehicle2 = solution.VehicleAssignment[move.Tour2];
+
+      solution.VehicleAssignment[move.Tour1] = vehicle2;
+      solution.VehicleAssignment[move.Tour2] = vehicle1;
+    }
+
+    protected override void PerformMove() {
+      PotvinVehicleAssignmentMove move = VehicleAssignmentMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;
+      Apply(newSolution, move, ProblemInstance);
+      newSolution.Repair();
+      VRPToursParameter.ActualValue = newSolution;
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuCriterion.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuCriterion.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuCriterion.cs	(revision 6857)
@@ -0,0 +1,165 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMoveTabuCriterion", @"Checks if a certain vehicle assignment move is tabu.")]
+  [StorableClass]
+  public class PotvinVehicleAssignmentMoveTabuCriterion : SingleSuccessorOperator, IPotvinVehicleAssignmentMoveOperator, ITabuChecker, IPotvinOperator, IVRPMoveOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<PotvinVehicleAssignmentMove> VehicleAssignmentMoveParameter {
+      get { return (ILookupParameter<PotvinVehicleAssignmentMove>)Parameters["PotvinVehicleAssignmentMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return VehicleAssignmentMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }  
+
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveDistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveDistance"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveOverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverload"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveTardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveTardiness"]; }
+    }
+
+    public BoolValue UseAspirationCriterion {
+      get { return UseAspirationCriterionParameter.Value; }
+      set { UseAspirationCriterionParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected PotvinVehicleAssignmentMoveTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected PotvinVehicleAssignmentMoveTabuCriterion(PotvinVehicleAssignmentMoveTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public PotvinVehicleAssignmentMoveTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinVehicleAssignmentMove>("PotvinVehicleAssignmentMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveDistance", "The distance of the move"));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveOverload", "The overload of the move"));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveTardiness", "The tardiness of the move"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMoveTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterion.Value;
+      bool isTabu = false;
+      PotvinVehicleAssignmentMove move = VehicleAssignmentMoveParameter.ActualValue;
+
+      foreach (IItem tabuMove in tabuList) {
+        PotvinVehicleAssignmentMoveAttribute attribute = tabuMove as PotvinVehicleAssignmentMoveAttribute;
+
+        if (attribute != null) {
+          double distance = 0;
+          if (MoveDistanceParameter.ActualValue != null)
+            distance = MoveDistanceParameter.ActualValue.Value;
+
+          double overload = 0;
+          if (MoveOverloadParameter.ActualValue != null)
+            overload = MoveOverloadParameter.ActualValue.Value;
+
+          double tardiness = 0;
+          if (MoveTardinessParameter.ActualValue != null)
+            tardiness = MoveTardinessParameter.ActualValue.Value;
+
+          IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
+          double quality = attribute.Distance * instance.DistanceFactor.Value;
+
+          IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
+          if (cvrp != null)
+            quality += attribute.Overload * cvrp.OverloadPenalty.Value;
+
+          ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+          if (vrptw != null)
+            quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
+
+          if (!useAspiration || moveQuality >= quality) {
+            if (attribute.Tour == move.Tour1 && attribute.Vehicle == move.Individual.GetVehicleAssignment(move.Tour2)) {
+              isTabu = true;
+              break;
+            }
+
+            if (attribute.Tour == move.Tour2 && attribute.Vehicle == move.Individual.GetVehicleAssignment(move.Tour1)) {
+              isTabu = true;
+              break;
+            }
+
+            if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
+              isTabu = true;
+              break;
+            }
+          }
+        }
+      }
+      
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuMaker.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuMaker.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuMaker.cs	(revision 6857)
@@ -0,0 +1,138 @@
+﻿#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.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Operators;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMoveTabuMaker", "Declares a given vehicle assignment move as tabu.")]
+  [StorableClass]
+  public class PotvinVehicleAssignmentMoveTabuMaker : SingleSuccessorOperator, ITabuMaker, IPotvinVehicleAssignmentMoveOperator, IPotvinOperator, IVRPMoveOperator {
+    public LookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (LookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ValueLookupParameter<IntValue> TabuTenureParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["TabuTenure"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+    
+    public ILookupParameter<PotvinVehicleAssignmentMove> VehicleAssignmentMoveParameter {
+      get { return (ILookupParameter<PotvinVehicleAssignmentMove>)Parameters["PotvinVehicleAssignmentMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return VehicleAssignmentMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<DoubleValue> DistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ILookupParameter<DoubleValue> OverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+    public ILookupParameter<DoubleValue> TardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinVehicleAssignmentMoveTabuMaker(bool deserializing) : base(deserializing) { }
+    protected PotvinVehicleAssignmentMoveTabuMaker(PotvinVehicleAssignmentMoveTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public PotvinVehicleAssignmentMoveTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list where move attributes are stored."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("TabuTenure", "The tenure of the tabu list."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the move."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+
+        Parameters.Add(new LookupParameter<PotvinVehicleAssignmentMove>("PotvinVehicleAssignmentMove", "The moves that should be made."));
+        Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+        Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+        Parameters.Add(new LookupParameter<DoubleValue>("Distance", "The distance of the individual"));
+        Parameters.Add(new LookupParameter<DoubleValue>("Overload", "The overload of the individual"));
+        Parameters.Add(new LookupParameter<DoubleValue>("Tardiness", "The tardiness of the individual"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMoveTabuMaker(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      int tabuTenure = TabuTenureParameter.ActualValue.Value;
+
+      int overlength = tabuList.Count - tabuTenure;
+      if (overlength >= 0) {
+        for (int i = 0; i < tabuTenure - 1; i++)
+          tabuList[i] = tabuList[i + overlength + 1];
+        while (tabuList.Count >= tabuTenure)
+          tabuList.RemoveAt(tabuList.Count - 1);
+      }
+
+      PotvinVehicleAssignmentMove move = VehicleAssignmentMoveParameter.ActualValue;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      double quality = QualityParameter.ActualValue.Value;
+      double baseQuality = moveQuality;
+      if (quality < moveQuality) baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
+
+      double distance = 0;
+      if (DistanceParameter.ActualValue != null)
+        distance = DistanceParameter.ActualValue.Value;
+
+      double overload = 0;
+      if (OverloadParameter.ActualValue != null)
+        overload = OverloadParameter.ActualValue.Value;
+
+      double tardiness = 0;
+      if (TardinessParameter.ActualValue != null)
+        tardiness = TardinessParameter.ActualValue.Value;
+
+      tabuList.Add(new PotvinVehicleAssignmentMoveAttribute(baseQuality, move.Tour1, move.Individual.GetVehicleAssignment(move.Tour1), 
+        distance, overload, tardiness));
+      tabuList.Add(new PotvinVehicleAssignmentMoveAttribute(baseQuality, move.Tour2, move.Individual.GetVehicleAssignment(move.Tour2),
+        distance, overload, tardiness));
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMultiMoveGenerator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMultiMoveGenerator.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMultiMoveGenerator.cs	(revision 6857)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Parameters;
+using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMultiMoveGenerator", "Generates vehicle assignment moves from a given VRP encoding.")]
+  [StorableClass]
+  public sealed class PotvinVehicleAssignmentMultiMoveGenerator : PotvinVehicleAssignmentMoveGenerator, IMultiMoveGenerator, IMultiVRPMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMultiMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinVehicleAssignmentMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentMultiMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    private PotvinVehicleAssignmentMultiMoveGenerator(PotvinVehicleAssignmentMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinVehicleAssignmentMove> result = new List<PotvinVehicleAssignmentMove>();
+
+      for (int i = 0; i < SampleSizeParameter.ActualValue.Value; i++) {
+        result.Add(PotvinVehicleAssignmentSingleMoveGenerator.Apply(individual, ProblemInstance, RandomParameter.ActualValue));
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentSingleMoveGenerator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentSingleMoveGenerator.cs	(revision 6857)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentSingleMoveGenerator.cs	(revision 6857)
@@ -0,0 +1,86 @@
+﻿#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.Parameters;
+using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentSingleMoveGenerator", "Generates a single vehicle assignment move from a given VRP encoding.")]
+  [StorableClass]
+  public sealed class PotvinVehicleAssignmentSingleMoveGenerator : PotvinVehicleAssignmentMoveGenerator,
+    ISingleMoveGenerator {
+    #region IMultiVRPMoveOperator Members
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["PotvinVehicleAssignmentMove"]; }
+    }
+
+    #endregion
+    
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentSingleMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinVehicleAssignmentSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentSingleMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    private PotvinVehicleAssignmentSingleMoveGenerator(PotvinVehicleAssignmentMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static PotvinVehicleAssignmentMove Apply(PotvinEncoding individual, IVRPProblemInstance problemInstance, IRandom rand) {
+      int tour1 = rand.Next(individual.Tours.Count);
+      int tour2 = rand.Next(problemInstance.Vehicles.Value);
+
+      while (tour2 == tour1)
+        tour2 = rand.Next(problemInstance.Vehicles.Value);
+
+      return new PotvinVehicleAssignmentMove(tour1, tour2, individual);
+    }
+
+    protected override PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinVehicleAssignmentMove> result = new List<PotvinVehicleAssignmentMove>();
+
+      PotvinVehicleAssignmentMove move = Apply(individual, ProblemInstance, RandomParameter.ActualValue);
+      if (move != null)
+        result.Add(move);
+
+      return result.ToArray();
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/PotvinEncoding.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/PotvinEncoding.cs	(revision 6856)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/PotvinEncoding.cs	(revision 6857)
@@ -39,7 +39,11 @@
     public List<int> Unrouted { get; set; }
 
+    [Storable]
+    public Permutation VehicleAssignment { get; private set; }
+
     public PotvinEncoding(IVRPProblemInstance instance)
       : base(instance) {
       Unrouted = new List<int>();
+      VehicleAssignment = new Permutation(PermutationTypes.Absolute, instance.Vehicles.Value);
     }
 
@@ -56,4 +60,9 @@
       : base(original, cloner) {
         this.Unrouted = new List<int>(original.Unrouted);
+        this.VehicleAssignment = cloner.Clone<Permutation>(original.VehicleAssignment);
+    }
+
+    public override int GetVehicleAssignment(int tour) {
+      return VehicleAssignment[tour];
     }
 
@@ -62,4 +71,28 @@
 
       TourEncoding.ConvertFrom(encoding, solution, instance);
+
+      List<int> vehicles = new List<int>();
+      for (int i = 0; i < instance.Vehicles.Value; i++)
+        vehicles.Add(i);
+
+      int[] assignment = new int[instance.Vehicles.Value];
+      for (int i = 0; i < assignment.Length; i++)
+        assignment[i] = -1;
+
+      for (int i = 0; i < solution.Tours.Count; i++) {
+        int vehicle = encoding.GetVehicleAssignment(i);
+        assignment[i] = vehicle;
+        vehicles.Remove(vehicle);
+      }
+
+      for (int i = 0; i < instance.Vehicles.Value; i++) {
+        if (assignment[i] == -1) {
+          int vehicle = vehicles[0];
+          assignment[i] = vehicle;
+          vehicles.RemoveAt(0);
+        }
+      }
+
+      solution.VehicleAssignment = new Permutation(PermutationTypes.Absolute, assignment);
 
       return solution;
@@ -79,4 +112,7 @@
 
     public int FindBestInsertionPlace(Tour tour, int city, int positionToAvoid = -1) {
+      if (tour.Stops.Count == 0)
+        return 0;
+      
       int place = -1;
       double minQuality = -1;
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 6856)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 6857)
@@ -170,9 +170,6 @@
     <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaStochasticTranslocationSingleMoveGenerator.cs" />
     <Compile Include="Encodings\Alba\Moves\ThreeOpt\IAlbaTranslocationMoveOperator.cs" />
-    <Compile Include="Encodings\ExtendedPotvin\Creators\ExtendedPotvinCreator.cs" />
-    <Compile Include="Encodings\ExtendedPotvin\Crossovers\ExtendedPotvinCrossover.cs" />
-    <Compile Include="Encodings\ExtendedPotvin\IExtendedPotvinOperator.cs" />
-    <Compile Include="Encodings\ExtendedPotvin\ExtendedPotvinEncoding.cs" />
-    <Compile Include="Encodings\ExtendedPotvin\Manipulators\ExtendedPotvinManipulator.cs" />
+    <Compile Include="Encodings\Potvin\Creators\IterativeInsertionCreator.cs" />
+    <Compile Include="Encodings\Potvin\Creators\PushForwardInsertionCreator.cs" />
     <Compile Include="Encodings\General\Creators\MultiVRPSolutionCreator.cs" />
     <Compile Include="Encodings\General\Creators\VRPCreator.cs" />
@@ -207,7 +204,5 @@
     <Compile Include="Encodings\GVR\Manipulators\GVRManipulator.cs" />
     <Compile Include="Encodings\GVR\Manipulators\GVRSwapManipulator.cs" />
-    <Compile Include="Encodings\ExtendedPotvin\Creators\PushForwardInsertionCreator.cs" />
     <Compile Include="Encodings\Potvin\Creators\PotvinCreator.cs" />
-    <Compile Include="Encodings\ExtendedPotvin\Creators\IterativeInsertionCreator.cs" />
     <Compile Include="Encodings\Potvin\Crossovers\PotvinCrossover.cs" />
     <Compile Include="Encodings\Potvin\Crossovers\PotvinInsertionBasedCrossover.cs" />
@@ -215,4 +210,5 @@
     <Compile Include="Encodings\Potvin\Crossovers\PotvinSequenceBasedCrossover.cs" />
     <Compile Include="Encodings\Potvin\IPotvinOperator.cs" />
+    <Compile Include="Encodings\Potvin\Manipulators\PotvinVehicleAssignmentManipulator.cs" />
     <Compile Include="Encodings\Potvin\Manipulators\PotvinCustomerRelocationManipulator.cs" />
     <Compile Include="Encodings\Potvin\Manipulators\PotvinLocalSearchManipulator.cs" />
@@ -266,4 +262,15 @@
     <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\PotvinCustomerRelocationMoveGenerator.cs" />
     <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\PotvinCustomerRelocationMove.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\IPotvinVehicleAssignmentMoveOperator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMoveTabuCriterion.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMoveTabuMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentExhaustiveMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMove.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMoveAttribute.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMoveEvaluator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMoveMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMultiMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentSingleMoveGenerator.cs" />
     <Compile Include="Encodings\Potvin\PotvinEncoding.cs" />
     <Compile Include="Encodings\Prins\Crossovers\PrinsCrossover.cs" />
