Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/DefaultRepresentationCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/DefaultRepresentationCreator.cs	(revision 4183)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/DefaultRepresentationCreator.cs	(revision 4183)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+using HeuristicLab.Problems.VehicleRouting.Encodings;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("DefaultRepresentationCreator", "An operator which creates a VRP solution in the default representation.")]
+  [StorableClass]
+  public abstract class DefaultRepresentationCreator : VRPCreator {
+    protected abstract List<int> CreateSolution();
+
+    [StorableConstructor]
+    protected DefaultRepresentationCreator(bool deserializing) : base(deserializing) { }
+
+    public DefaultRepresentationCreator() : base() { }
+
+    public override IOperation Apply() {
+      //choose default encoding here
+      VRPToursParameter.ActualValue = PotvinEncoding.ConvertFrom(CreateSolution());
+
+      return base.Apply();
+    }    
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/PushForwardInsertionCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/PushForwardInsertionCreator.cs	(revision 4183)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/PushForwardInsertionCreator.cs	(revision 4183)
@@ -0,0 +1,279 @@
+﻿#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;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("PushForwardCreator", "The push forward insertion heuristic.  It is implemented as described in Sam, and Thangiah, R. (1999). A Hybrid Genetic Algorithms, Simulated Annealing and Tabu Search Heuristic for Vehicle Routing Problems with Time Windows. Practical Handbook of Genetic Algorithms, Volume III, pp 347–381.")]
+  [StorableClass]
+  public sealed class PushForwardCreator : DefaultRepresentationCreator, 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 PushForwardCreator(bool deserializing) : base(deserializing) { }
+
+    public PushForwardCreator()
+      : 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)));
+    }
+
+    // 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 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 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 double CalculateDistance(int start, int end) {
+      double distance = 0.0;
+      DoubleMatrix coordinates = CoordinatesParameter.ActualValue;
+
+      distance =
+          Math.Sqrt(
+            Math.Pow(coordinates[start, 0] - coordinates[end, 0], 2) +
+            Math.Pow(coordinates[start, 1] - coordinates[end, 1], 2));
+
+      return distance;
+    }
+
+    private DoubleMatrix CreateDistanceMatrix() {
+      DoubleMatrix coordinates = CoordinatesParameter.ActualValue;
+      DoubleMatrix distanceMatrix = new DoubleMatrix(coordinates.Rows, coordinates.Rows);
+
+      for (int i = 0; i < distanceMatrix.Rows; i++) {
+        for (int j = i; j < distanceMatrix.Columns; j++) {
+          double distance = CalculateDistance(i, j);
+
+          distanceMatrix[i, j] = distance;
+          distanceMatrix[j, i] = distance;
+        }
+      }
+
+      return distanceMatrix;
+    }
+
+    private double Distance(int start, int end) {
+      double distance = 0.0;
+
+      if (UseDistanceMatrixParameter.ActualValue.Value) {
+        if (DistanceMatrixParameter.ActualValue == null) {
+          DistanceMatrixParameter.ActualValue = CreateDistanceMatrix();
+        }
+
+        distance = DistanceMatrixParameter.ActualValue[start, end];
+      } else {
+        distance = CalculateDistance(start, end);
+      }
+
+      return distance;
+    }
+
+    private double TravelDistance(List<int> route, int begin) {
+      double distance = 0;
+      for (int i = begin; i < route.Count - 1 && (i == begin || route[i] != 0); i++) {
+        distance += Distance(route[i], route[i + 1]);
+      }
+      return distance;
+    }
+
+    private bool SubrouteConstraintsOK(List<int> route, int begin) {
+      double t = 0.0, o = 0.0;
+      for (int i = begin + 1; i < route.Count; i++) {
+        t += Distance(route[i - 1], route[i]);
+        if (route[i] == 0) return (t < DueTimeParameter.ActualValue[0]); // violation on capacity constraint is handled below
+        else {
+          if (t > DueTimeParameter.ActualValue[route[i]]) return false;
+          t = Math.Max(ReadyTimeParameter.ActualValue[route[i]], t);
+          t += ServiceTimeParameter.ActualValue[route[i]];
+          o += DemandParameter.ActualValue[route[i]];
+          if (o > CapacityParameter.ActualValue.Value) return false; // premature exit on capacity constraint violation
+        }
+      }
+      return true;
+    }
+
+    private bool SubrouteTardinessOK(List<int> route, int begin) {
+      double t = 0.0;
+      for (int i = begin + 1; i < route.Count; i++) {
+        t += Distance(route[i - 1], route[i]);
+        if (route[i] == 0) {
+          if (t < DueTimeParameter.ActualValue[0]) return true;
+          else return false;
+        } else {
+          if (t > DueTimeParameter.ActualValue[route[i]]) return false;
+          t = Math.Max(ReadyTimeParameter.ActualValue[route[i]], t);
+          t += ServiceTimeParameter.ActualValue[route[i]];
+        }
+      }
+      return true;
+    }
+
+    private bool SubrouteLoadOK(List<int> route, int begin) {
+      double o = 0.0;
+      for (int i = begin + 1; i < route.Count; i++) {
+        if (route[i] == 0) return (o < CapacityParameter.ActualValue.Value);
+        else {
+          o += DemandParameter.ActualValue[route[i]];
+        }
+      }
+      return (o < CapacityParameter.ActualValue.Value);
+    }
+
+    protected override List<int> CreateSolution() {
+      double alpha, beta, gamma;
+      alpha = N(Alpha.Value.Value, Math.Sqrt(AlphaVariance.Value.Value), RandomParameter.ActualValue);
+      beta = N(Beta.Value.Value, Math.Sqrt(BetaVariance.Value.Value), RandomParameter.ActualValue);
+      gamma = N(Gamma.Value.Value, Math.Sqrt(GammaVariance.Value.Value), RandomParameter.ActualValue);
+
+      double x0 = CoordinatesParameter.ActualValue[0, 0];
+      double y0 = CoordinatesParameter.ActualValue[0, 1];
+      double distance = 0;
+      double cost = 0;
+      double minimumCost = double.MaxValue;
+      List<int> unroutedList = new List<int>();
+      List<double> costList = new List<double>();
+      int index;
+      int indexOfMinimumCost = -1;
+      int indexOfCustomer = -1;
+
+      /*-----------------------------------------------------------------------------
+       * generate cost list
+       *-----------------------------------------------------------------------------
+       */
+      for (int i = 1; i <= Cities; i++) {
+        distance = Distance(i, 0);
+        if (CoordinatesParameter.ActualValue[i, 0] < x0) distance = -distance;
+        cost = -alpha * distance + // distance 0 <-> City[i]
+                 beta * (DueTimeParameter.ActualValue[i]) + // latest arrival time
+                 gamma * (Math.Asin((CoordinatesParameter.ActualValue[i, 1] - y0) / distance) / 360 * distance); // polar angle
+
+        index = 0;
+        while (index < costList.Count && costList[index] < cost) index++;
+        costList.Insert(index, cost);
+        unroutedList.Insert(index, i);
+      }
+
+      /*------------------------------------------------------------------------------
+       * route customers according to cost list
+       *------------------------------------------------------------------------------
+       */
+      int routeIndex = 0;
+      int currentRoute = 0;
+      int c;
+      int customer = -1;
+      int subTourCount = 1;
+      List<int> route = new List<int>(CitiesParameter.ActualValue.Value + VehiclesParameter.ActualValue.Value - 1);
+      minimumCost = double.MaxValue;
+      indexOfMinimumCost = -1;
+      route.Add(0);
+      route.Add(0);
+      route.Insert(1, unroutedList[0]);
+      unroutedList.RemoveAt(0);
+      currentRoute = routeIndex;
+      routeIndex++;
+
+      do {
+        for (c = 0; c < unroutedList.Count; c++) {
+          for (int i = currentRoute + 1; i < route.Count; i++) {
+            route.Insert(i, (int)unroutedList[c]);
+            if (route[currentRoute] != 0) { throw new Exception("currentRoute not depot"); }
+            cost = TravelDistance(route, currentRoute);
+            if (cost < minimumCost && SubrouteConstraintsOK(route, currentRoute)) {
+              minimumCost = cost;
+              indexOfMinimumCost = i;
+              customer = (int)unroutedList[c];
+              indexOfCustomer = c;
+            }
+            route.RemoveAt(i);
+          }
+        }
+        // insert customer if found
+        if (indexOfMinimumCost != -1) {
+          route.Insert(indexOfMinimumCost, customer);
+          routeIndex++;
+          unroutedList.RemoveAt(indexOfCustomer);
+          costList.RemoveAt(indexOfCustomer);
+        } else { // no feasible customer found
+          routeIndex++;
+          route.Insert(routeIndex, 0);
+          currentRoute = routeIndex;
+          route.Insert(route.Count - 1, (int)unroutedList[0]);
+          unroutedList.RemoveAt(0);
+          routeIndex++;
+          subTourCount++;
+        }
+        // reset minimum		
+        minimumCost = double.MaxValue;
+        indexOfMinimumCost = -1;
+        indexOfCustomer = -1;
+        customer = -1;
+      } while (unroutedList.Count > 0);
+      while (route.Count < CitiesParameter.ActualValue.Value + VehiclesParameter.ActualValue.Value - 1)
+        route.Add(0);
+
+      return route;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/RandomCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/RandomCreator.cs	(revision 4183)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/RandomCreator.cs	(revision 4183)
@@ -0,0 +1,82 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using 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;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("RandomCreator", "Creates a randomly initialized VRP solution.")]
+  [StorableClass]
+  public sealed class RandomCreator : DefaultRepresentationCreator, IStochasticOperator {
+    #region IStochasticOperator Members
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private RandomCreator(bool deserializing) : base(deserializing) { }
+
+    public RandomCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
+    }
+
+    protected override List<int> CreateSolution() {
+      int cities = Cities;
+      int vehicles = VehiclesParameter.ActualValue.Value;
+
+      int[] perm = new int[cities + vehicles];
+      int[] sortingArray = new int[perm.Length - 2];
+      for (int i = 0; i < cities; i++)
+        perm[i] = i + 1;
+      for (int i = cities; i < cities + vehicles; i++)
+        perm[i] = 0;
+      for (int i = 0; i < perm.Length - 2; i++) {
+        sortingArray[i] = RandomParameter.ActualValue.Next(perm.Length * 2);
+      }
+      // shuffle perm from 1...n-1 by sorting sortingArray (perm[0] and perm[n] must stay 0)
+      bool done;
+      do {
+        done = true;
+        for (int i = 0; i < perm.Length - 3; i++) {
+          if (sortingArray[i] > sortingArray[i + 1]) {
+            int h = sortingArray[i];
+            sortingArray[i] = sortingArray[i + 1];
+            sortingArray[i + 1] = h;
+            h = perm[i + 1];
+            perm[i + 1] = perm[i + 2];
+            perm[i + 2] = h;
+            done = false;
+          }
+        }
+      } while (!done);
+
+      return new List<int>(perm);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPCrossover.cs	(revision 4183)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPCrossover.cs	(revision 4183)
@@ -0,0 +1,144 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("MultiVRPCrossover", "Randomly selects and applies one of its crossovers every time it is called.")]
+  [StorableClass]
+  public class MultiVRPCrossover : StochasticMultiBranch<IVRPCrossover>, IVRPCrossover, IStochasticOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    protected override bool CreateChildOperation {
+      get { return true; }
+    }
+
+    public ILookupParameter<ItemArray<IVRPEncoding>> ParentsParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["Parents"]; }
+    }
+
+    public ILookupParameter<IVRPEncoding> ChildParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["Child"]; }
+    }
+
+    public int Cities {
+      get { return CoordinatesParameter.ActualValue.Rows - 1; }
+    }
+    public ILookupParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    }
+    public ILookupParameter<DoubleMatrix> DistanceMatrixParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
+    }
+    public ILookupParameter<BoolValue> UseDistanceMatrixParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
+    }
+    public ILookupParameter<IntValue> VehiclesParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["Vehicles"]; }
+    }
+    public ILookupParameter<DoubleValue> CapacityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Capacity"]; }
+    }
+    public ILookupParameter<DoubleArray> DemandParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["Demand"]; }
+    }
+    public ILookupParameter<DoubleArray> ReadyTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["ReadyTime"]; }
+    }
+    public ILookupParameter<DoubleArray> DueTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["DueTime"]; }
+    }
+    public ILookupParameter<DoubleArray> ServiceTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["ServiceTime"]; }
+    }
+
+    [StorableConstructor]
+    private MultiVRPCrossover(bool deserializing) : base(deserializing) { }
+    public MultiVRPCrossover()
+      : base() {
+       Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("Parents", "The parent permutations which should be crossed."));
+      ParentsParameter.ActualName = "VRPTours";
+      Parameters.Add(new LookupParameter<IVRPEncoding>("Child", "The child permutation resulting from the crossover."));
+      ChildParameter.ActualName = "VRPTours";
+
+      Parameters.Add(new ValueLookupParameter<IntValue>("Cities", "The city count."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The coordinates of the cities."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
+      Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false."));
+      Parameters.Add(new LookupParameter<IntValue>("Vehicles", "The number of vehicles."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Capacity", "The capacity of each vehicle."));
+      Parameters.Add(new LookupParameter<DoubleArray>("Demand", "The demand of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("ReadyTime", "The ready time of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("DueTime", "The due time of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("ServiceTime", "The service time of each customer."));
+
+      foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IVRPCrossover))) {
+        if (!typeof(MultiOperator<IVRPCrossover>).IsAssignableFrom(type))
+          Operators.Add((IVRPCrossover)Activator.CreateInstance(type), true);
+      }
+    }
+
+    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPCrossover>> e) {
+      base.Operators_ItemsReplaced(sender, e);
+      ParameterizeCrossovers();
+    }
+
+    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPCrossover>> e) {
+      base.Operators_ItemsAdded(sender, e);
+      ParameterizeCrossovers();
+    }
+
+    private void ParameterizeCrossovers() {
+      foreach (IVRPCrossover crossover in Operators.OfType<IVRPCrossover>()) {
+        crossover.ChildParameter.ActualName = ChildParameter.Name;
+        crossover.ParentsParameter.ActualName = ParentsParameter.Name;
+
+        if (crossover.CoordinatesParameter != null) crossover.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        if (crossover.DistanceMatrixParameter != null) crossover.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
+        if (crossover.UseDistanceMatrixParameter != null) crossover.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
+        if (crossover.VehiclesParameter != null) crossover.VehiclesParameter.ActualName = VehiclesParameter.Name;
+        if (crossover.CapacityParameter != null) crossover.CapacityParameter.ActualName = CapacityParameter.Name;
+        if (crossover.DemandParameter != null) crossover.DemandParameter.ActualName = DemandParameter.Name;
+        if (crossover.ReadyTimeParameter != null) crossover.ReadyTimeParameter.ActualName = ReadyTimeParameter.Name;
+        if (crossover.DueTimeParameter != null) crossover.DueTimeParameter.ActualName = DueTimeParameter.Name;
+        if (crossover.ServiceTimeParameter != null) crossover.ServiceTimeParameter.ActualName = ServiceTimeParameter.Name;
+      }
+      foreach (IStochasticOperator crossover in Operators.OfType<IStochasticOperator>()) {
+        crossover.RandomParameter.ActualName = RandomParameter.Name;
+      }
+    }
+
+    public override IOperation Apply() {
+      if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one permutation crossover to choose from.");
+      return base.Apply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPManipulator.cs	(revision 4183)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPManipulator.cs	(revision 4183)
@@ -0,0 +1,136 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("MultiVRPManipulator", "Randomly selects and applies one of its manipulators every time it is called.")]
+  [StorableClass]
+  public class MultiVRPManipulator : StochasticMultiBranch<IVRPManipulator>, IVRPManipulator, IStochasticOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    protected override bool CreateChildOperation {
+      get { return true; }
+    }
+
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    public int Cities {
+      get { return CoordinatesParameter.ActualValue.Rows - 1; }
+    }
+    public ILookupParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    }
+    public ILookupParameter<DoubleMatrix> DistanceMatrixParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
+    }
+    public ILookupParameter<BoolValue> UseDistanceMatrixParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
+    }
+    public ILookupParameter<IntValue> VehiclesParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["Vehicles"]; }
+    }
+    public ILookupParameter<DoubleValue> CapacityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Capacity"]; }
+    }
+    public ILookupParameter<DoubleArray> DemandParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["Demand"]; }
+    }
+    public ILookupParameter<DoubleArray> ReadyTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["ReadyTime"]; }
+    }
+    public ILookupParameter<DoubleArray> DueTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["DueTime"]; }
+    }
+    public ILookupParameter<DoubleArray> ServiceTimeParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["ServiceTime"]; }
+    }
+
+    [StorableConstructor]
+    private MultiVRPManipulator(bool deserializing) : base(deserializing) { }
+    public MultiVRPManipulator()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours to be manipulated."));
+
+      Parameters.Add(new ValueLookupParameter<IntValue>("Cities", "The city count."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The coordinates of the cities."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
+      Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false."));
+      Parameters.Add(new LookupParameter<IntValue>("Vehicles", "The number of vehicles."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Capacity", "The capacity of each vehicle."));
+      Parameters.Add(new LookupParameter<DoubleArray>("Demand", "The demand of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("ReadyTime", "The ready time of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("DueTime", "The due time of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("ServiceTime", "The service time of each customer."));
+
+      foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IVRPManipulator))) {
+        if (!typeof(MultiOperator<IVRPManipulator>).IsAssignableFrom(type))
+          Operators.Add((IVRPManipulator)Activator.CreateInstance(type), true);
+      }
+    }
+
+    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPManipulator>> e) {
+      base.Operators_ItemsReplaced(sender, e);
+      ParameterizeManipulators();
+    }
+
+    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPManipulator>> e) {
+      base.Operators_ItemsAdded(sender, e);
+      ParameterizeManipulators();
+    }
+
+    private void ParameterizeManipulators() {
+      foreach (IVRPManipulator manipulator in Operators.OfType<IVRPManipulator>()) {
+        manipulator.VRPToursParameter.ActualName = VRPToursParameter.Name;
+
+        if (manipulator.CoordinatesParameter != null) manipulator.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        if (manipulator.DistanceMatrixParameter != null) manipulator.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
+        if (manipulator.UseDistanceMatrixParameter != null) manipulator.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
+        if (manipulator.VehiclesParameter != null) manipulator.VehiclesParameter.ActualName = VehiclesParameter.Name;
+        if (manipulator.CapacityParameter != null) manipulator.CapacityParameter.ActualName = CapacityParameter.Name;
+        if (manipulator.DemandParameter != null) manipulator.DemandParameter.ActualName = DemandParameter.Name;
+        if (manipulator.ReadyTimeParameter != null) manipulator.ReadyTimeParameter.ActualName = ReadyTimeParameter.Name;
+        if (manipulator.DueTimeParameter != null) manipulator.DueTimeParameter.ActualName = DueTimeParameter.Name;
+        if (manipulator.ServiceTimeParameter != null) manipulator.ServiceTimeParameter.ActualName = ServiceTimeParameter.Name;
+      }
+      foreach (IStochasticOperator manipulator in Operators.OfType<IStochasticOperator>()) {
+        manipulator.RandomParameter.ActualName = RandomParameter.Name;
+      }
+    }
+
+    public override IOperation Apply() {
+      if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one permutation manipulator to choose from.");
+      return base.Apply();
+    }
+  }
+}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/DefaultRepresentationCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/DefaultRepresentationCreator.cs	(revision 4182)
+++ 	(revision )
@@ -1,50 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Collections.Generic;
-using HeuristicLab.Problems.VehicleRouting.Encodings;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
-  [Item("DefaultRepresentationCreator", "An operator which creates a VRP solution in the default representation.")]
-  [StorableClass]
-  public abstract class DefaultRepresentationCreator : VRPCreator {
-    protected abstract List<int> CreateSolution();
-
-    [StorableConstructor]
-    protected DefaultRepresentationCreator(bool deserializing) : base(deserializing) { }
-
-    public DefaultRepresentationCreator() : base() { }
-
-    public override IOperation Apply() {
-      //choose default encoding here
-      VRPToursParameter.ActualValue = PotvinEncoding.ConvertFrom(CreateSolution());
-
-      return base.Apply();
-    }    
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/PushForwardInsertionCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/PushForwardInsertionCreator.cs	(revision 4182)
+++ 	(revision )
@@ -1,279 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
-  [Item("PushForwardCreator", "The push forward insertion heuristic.  It is implemented as described in Sam, and Thangiah, R. (1999). A Hybrid Genetic Algorithms, Simulated Annealing and Tabu Search Heuristic for Vehicle Routing Problems with Time Windows. Practical Handbook of Genetic Algorithms, Volume III, pp 347–381.")]
-  [StorableClass]
-  public sealed class PushForwardCreator : DefaultRepresentationCreator, 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 PushForwardCreator(bool deserializing) : base(deserializing) { }
-
-    public PushForwardCreator()
-      : 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)));
-    }
-
-    // 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 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 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 double CalculateDistance(int start, int end) {
-      double distance = 0.0;
-      DoubleMatrix coordinates = CoordinatesParameter.ActualValue;
-
-      distance =
-          Math.Sqrt(
-            Math.Pow(coordinates[start, 0] - coordinates[end, 0], 2) +
-            Math.Pow(coordinates[start, 1] - coordinates[end, 1], 2));
-
-      return distance;
-    }
-
-    private DoubleMatrix CreateDistanceMatrix() {
-      DoubleMatrix coordinates = CoordinatesParameter.ActualValue;
-      DoubleMatrix distanceMatrix = new DoubleMatrix(coordinates.Rows, coordinates.Rows);
-
-      for (int i = 0; i < distanceMatrix.Rows; i++) {
-        for (int j = i; j < distanceMatrix.Columns; j++) {
-          double distance = CalculateDistance(i, j);
-
-          distanceMatrix[i, j] = distance;
-          distanceMatrix[j, i] = distance;
-        }
-      }
-
-      return distanceMatrix;
-    }
-
-    private double Distance(int start, int end) {
-      double distance = 0.0;
-
-      if (UseDistanceMatrixParameter.ActualValue.Value) {
-        if (DistanceMatrixParameter.ActualValue == null) {
-          DistanceMatrixParameter.ActualValue = CreateDistanceMatrix();
-        }
-
-        distance = DistanceMatrixParameter.ActualValue[start, end];
-      } else {
-        distance = CalculateDistance(start, end);
-      }
-
-      return distance;
-    }
-
-    private double TravelDistance(List<int> route, int begin) {
-      double distance = 0;
-      for (int i = begin; i < route.Count - 1 && (i == begin || route[i] != 0); i++) {
-        distance += Distance(route[i], route[i + 1]);
-      }
-      return distance;
-    }
-
-    private bool SubrouteConstraintsOK(List<int> route, int begin) {
-      double t = 0.0, o = 0.0;
-      for (int i = begin + 1; i < route.Count; i++) {
-        t += Distance(route[i - 1], route[i]);
-        if (route[i] == 0) return (t < DueTimeParameter.ActualValue[0]); // violation on capacity constraint is handled below
-        else {
-          if (t > DueTimeParameter.ActualValue[route[i]]) return false;
-          t = Math.Max(ReadyTimeParameter.ActualValue[route[i]], t);
-          t += ServiceTimeParameter.ActualValue[route[i]];
-          o += DemandParameter.ActualValue[route[i]];
-          if (o > CapacityParameter.ActualValue.Value) return false; // premature exit on capacity constraint violation
-        }
-      }
-      return true;
-    }
-
-    private bool SubrouteTardinessOK(List<int> route, int begin) {
-      double t = 0.0;
-      for (int i = begin + 1; i < route.Count; i++) {
-        t += Distance(route[i - 1], route[i]);
-        if (route[i] == 0) {
-          if (t < DueTimeParameter.ActualValue[0]) return true;
-          else return false;
-        } else {
-          if (t > DueTimeParameter.ActualValue[route[i]]) return false;
-          t = Math.Max(ReadyTimeParameter.ActualValue[route[i]], t);
-          t += ServiceTimeParameter.ActualValue[route[i]];
-        }
-      }
-      return true;
-    }
-
-    private bool SubrouteLoadOK(List<int> route, int begin) {
-      double o = 0.0;
-      for (int i = begin + 1; i < route.Count; i++) {
-        if (route[i] == 0) return (o < CapacityParameter.ActualValue.Value);
-        else {
-          o += DemandParameter.ActualValue[route[i]];
-        }
-      }
-      return (o < CapacityParameter.ActualValue.Value);
-    }
-
-    protected override List<int> CreateSolution() {
-      double alpha, beta, gamma;
-      alpha = N(Alpha.Value.Value, Math.Sqrt(AlphaVariance.Value.Value), RandomParameter.ActualValue);
-      beta = N(Beta.Value.Value, Math.Sqrt(BetaVariance.Value.Value), RandomParameter.ActualValue);
-      gamma = N(Gamma.Value.Value, Math.Sqrt(GammaVariance.Value.Value), RandomParameter.ActualValue);
-
-      double x0 = CoordinatesParameter.ActualValue[0, 0];
-      double y0 = CoordinatesParameter.ActualValue[0, 1];
-      double distance = 0;
-      double cost = 0;
-      double minimumCost = double.MaxValue;
-      List<int> unroutedList = new List<int>();
-      List<double> costList = new List<double>();
-      int index;
-      int indexOfMinimumCost = -1;
-      int indexOfCustomer = -1;
-
-      /*-----------------------------------------------------------------------------
-       * generate cost list
-       *-----------------------------------------------------------------------------
-       */
-      for (int i = 1; i <= Cities; i++) {
-        distance = Distance(i, 0);
-        if (CoordinatesParameter.ActualValue[i, 0] < x0) distance = -distance;
-        cost = -alpha * distance + // distance 0 <-> City[i]
-                 beta * (DueTimeParameter.ActualValue[i]) + // latest arrival time
-                 gamma * (Math.Asin((CoordinatesParameter.ActualValue[i, 1] - y0) / distance) / 360 * distance); // polar angle
-
-        index = 0;
-        while (index < costList.Count && costList[index] < cost) index++;
-        costList.Insert(index, cost);
-        unroutedList.Insert(index, i);
-      }
-
-      /*------------------------------------------------------------------------------
-       * route customers according to cost list
-       *------------------------------------------------------------------------------
-       */
-      int routeIndex = 0;
-      int currentRoute = 0;
-      int c;
-      int customer = -1;
-      int subTourCount = 1;
-      List<int> route = new List<int>(CitiesParameter.ActualValue.Value + VehiclesParameter.ActualValue.Value - 1);
-      minimumCost = double.MaxValue;
-      indexOfMinimumCost = -1;
-      route.Add(0);
-      route.Add(0);
-      route.Insert(1, unroutedList[0]);
-      unroutedList.RemoveAt(0);
-      currentRoute = routeIndex;
-      routeIndex++;
-
-      do {
-        for (c = 0; c < unroutedList.Count; c++) {
-          for (int i = currentRoute + 1; i < route.Count; i++) {
-            route.Insert(i, (int)unroutedList[c]);
-            if (route[currentRoute] != 0) { throw new Exception("currentRoute not depot"); }
-            cost = TravelDistance(route, currentRoute);
-            if (cost < minimumCost && SubrouteConstraintsOK(route, currentRoute)) {
-              minimumCost = cost;
-              indexOfMinimumCost = i;
-              customer = (int)unroutedList[c];
-              indexOfCustomer = c;
-            }
-            route.RemoveAt(i);
-          }
-        }
-        // insert customer if found
-        if (indexOfMinimumCost != -1) {
-          route.Insert(indexOfMinimumCost, customer);
-          routeIndex++;
-          unroutedList.RemoveAt(indexOfCustomer);
-          costList.RemoveAt(indexOfCustomer);
-        } else { // no feasible customer found
-          routeIndex++;
-          route.Insert(routeIndex, 0);
-          currentRoute = routeIndex;
-          route.Insert(route.Count - 1, (int)unroutedList[0]);
-          unroutedList.RemoveAt(0);
-          routeIndex++;
-          subTourCount++;
-        }
-        // reset minimum		
-        minimumCost = double.MaxValue;
-        indexOfMinimumCost = -1;
-        indexOfCustomer = -1;
-        customer = -1;
-      } while (unroutedList.Count > 0);
-      while (route.Count < CitiesParameter.ActualValue.Value + VehiclesParameter.ActualValue.Value - 1)
-        route.Add(0);
-
-      return route;
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/RandomCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/RandomCreator.cs	(revision 4182)
+++ 	(revision )
@@ -1,82 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
-  [Item("RandomCreator", "Creates a randomly initialized VRP solution.")]
-  [StorableClass]
-  public sealed class RandomCreator : DefaultRepresentationCreator, IStochasticOperator {
-    #region IStochasticOperator Members
-    public ILookupParameter<IRandom> RandomParameter {
-      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
-    }
-    #endregion
-
-    [StorableConstructor]
-    private RandomCreator(bool deserializing) : base(deserializing) { }
-
-    public RandomCreator()
-      : base() {
-      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
-    }
-
-    protected override List<int> CreateSolution() {
-      int cities = Cities;
-      int vehicles = VehiclesParameter.ActualValue.Value;
-
-      int[] perm = new int[cities + vehicles];
-      int[] sortingArray = new int[perm.Length - 2];
-      for (int i = 0; i < cities; i++)
-        perm[i] = i + 1;
-      for (int i = cities; i < cities + vehicles; i++)
-        perm[i] = 0;
-      for (int i = 0; i < perm.Length - 2; i++) {
-        sortingArray[i] = RandomParameter.ActualValue.Next(perm.Length * 2);
-      }
-      // shuffle perm from 1...n-1 by sorting sortingArray (perm[0] and perm[n] must stay 0)
-      bool done;
-      do {
-        done = true;
-        for (int i = 0; i < perm.Length - 3; i++) {
-          if (sortingArray[i] > sortingArray[i + 1]) {
-            int h = sortingArray[i];
-            sortingArray[i] = sortingArray[i + 1];
-            sortingArray[i + 1] = h;
-            h = perm[i + 1];
-            perm[i + 1] = perm[i + 2];
-            perm[i + 2] = h;
-            done = false;
-          }
-        }
-      } while (!done);
-
-      return new List<int>(perm);
-    }
-  }
-}
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/VRPManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/VRPManipulator.cs	(revision 4182)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/VRPManipulator.cs	(revision 4183)
@@ -43,5 +43,5 @@
     public VRPManipulator()
       : base() {
-      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The new VRP tours."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours to be manipulated."));
     }
   }
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/HeuristicLab.Problems.VehicleRouting-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/HeuristicLab.Problems.VehicleRouting-3.3.csproj	(revision 4182)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/HeuristicLab.Problems.VehicleRouting-3.3.csproj	(revision 4183)
@@ -107,5 +107,7 @@
   <ItemGroup>
     <Compile Include="Analyzers\BestVRPSolutionAnalyzer.cs" />
-    <Compile Include="Encodings\General\RandomCreator.cs" />
+    <Compile Include="Encodings\General\Crossovers\MultiVRPManipulator.cs" />
+    <Compile Include="Encodings\General\Crossovers\MultiVRPCrossover.cs" />
+    <Compile Include="Encodings\General\Creators\RandomCreator.cs" />
     <Compile Include="Encodings\Potvin\Crossovers\SequenceBasedCrossover.cs" />
     <Compile Include="Encodings\Potvin\Crossovers\PotvinCrossover.cs" />
@@ -116,6 +118,6 @@
     <Compile Include="VRPUtilities.cs" />
     <Compile Include="VRPOperator.cs" />
-    <Compile Include="Encodings\General\PushForwardInsertionCreator.cs" />
-    <Compile Include="Encodings\General\DefaultRepresentationCreator.cs" />
+    <Compile Include="Encodings\General\Creators\PushForwardInsertionCreator.cs" />
+    <Compile Include="Encodings\General\Creators\DefaultRepresentationCreator.cs" />
     <Compile Include="Encodings\Alba\Crossovers\AlbaCrossover.cs" />
     <Compile Include="Encodings\Alba\Interfaces\IAlbaTranslocationMoveOperator.cs" />
