Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/BiasedMultiVRPSolutionCrossover.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/BiasedMultiVRPSolutionCrossover.cs	(revision 6716)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/BiasedMultiVRPSolutionCrossover.cs	(revision 6716)
@@ -0,0 +1,174 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Analysis;
+using HeuristicLab.Parameters;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+using HeuristicLab.Collections;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("BiasedMultiVRPSolutionCrossover", "Randomly selects and applies one of its crossovers every time it is called based on the success progress.")]
+  [StorableClass]
+  public class BiasedMultiVRPSolutionCrossover : MultiVRPSolutionCrossover {
+    public ValueLookupParameter<DoubleArray> ActualProbabilitiesParameter {
+      get { return (ValueLookupParameter<DoubleArray>)Parameters["ActualProbabilities"]; }
+    }
+
+    public ValueLookupParameter<StringValue> SuccessProgressAnalyisis {
+      get { return (ValueLookupParameter<StringValue>)Parameters["SuccessProgressAnalysis"]; }
+    }
+
+    public ValueLookupParameter<DoubleValue> Factor {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["Factor"]; }
+    }
+
+    public ValueParameter<DoubleValue> LowerBoundParameter {
+      get { return (ValueParameter<DoubleValue>)Parameters["LowerBound"]; }
+    }
+
+    public ValueParameter<IntValue> DepthParameter {
+      get { return (ValueParameter<IntValue>)Parameters["Depth"]; }
+    }
+
+    [StorableConstructor]
+    protected BiasedMultiVRPSolutionCrossover(bool deserializing) : base(deserializing) { }
+    protected BiasedMultiVRPSolutionCrossover(BiasedMultiVRPSolutionCrossover original, Cloner cloner) : base(original, cloner) { }
+    public BiasedMultiVRPSolutionCrossover()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<DoubleArray>("ActualProbabilities", "The array of relative probabilities for each operator."));
+      Parameters.Add(new ValueLookupParameter<StringValue>("SuccessProgressAnalysis", "The success progress analyisis to be considered",
+        new StringValue("ExecutedCrossoverOperator")));
+
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("Factor", "The factor with which the probabilities should be updated", new DoubleValue(0.2)));
+      Parameters.Add(new ValueParameter<DoubleValue>("LowerBound", "The depth of the individuals in the scope tree.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<IntValue>("Depth", "The depth of the individuals in the scope tree.", new IntValue(1)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BiasedMultiVRPSolutionCrossover(this, cloner);
+    }
+
+    public override void InitializeState() {
+      base.InitializeState();
+
+      ActualProbabilitiesParameter.Value = null;
+    }
+
+    public override IOperation Apply() {
+      IOperator successor = null;
+
+      if (ActualProbabilitiesParameter.ActualValue == null) {
+        ActualProbabilitiesParameter.Value = ProbabilitiesParameter.ActualValue.Clone() as DoubleArray;
+      } else {
+        String key = "SuccessfulOffspringAnalyzer Results";
+
+        ResultCollection results = null;
+        IScope scope = ExecutionContext.Parent.Scope;
+        int depth = 1;
+        while (scope != null && depth < DepthParameter.Value.Value) {
+          scope = scope.Parent;
+          depth++;
+        }
+        if (scope != null)
+          results = scope.Variables["Results"].Value as ResultCollection;
+
+        if (results != null && results.ContainsKey(key)) {
+          ResultCollection successProgressAnalysisResult = results[key].Value as ResultCollection;
+          key = SuccessProgressAnalyisis.Value.Value;
+
+          if (successProgressAnalysisResult.ContainsKey(key)) {
+            DataTable successProgressAnalysis = successProgressAnalysisResult[key].Value as DataTable;
+
+            for (int i = 0; i < Operators.Count; i++) {
+              IOperator current = Operators[i];
+
+              if (successProgressAnalysis.Rows.ContainsKey(current.Name)) {
+                DataRow row = successProgressAnalysis.Rows[current.Name];
+
+                double sum = 0.0;
+                ObservableList<double> usages = row.Values;
+
+                sum += (double)usages.Last();
+
+                ActualProbabilitiesParameter.ActualValue[i] += (sum / ActualProbabilitiesParameter.ActualValue[i]) * Factor.Value.Value;
+              }
+            }
+          }
+        }
+
+        //normalize
+        double max = ActualProbabilitiesParameter.ActualValue.Max();
+        for (int i = 0; i < ActualProbabilitiesParameter.ActualValue.Length; i++) {
+          ActualProbabilitiesParameter.ActualValue[i] /= max;
+          ActualProbabilitiesParameter.ActualValue[i] =
+            Math.Max(LowerBoundParameter.Value.Value,
+            ActualProbabilitiesParameter.ActualValue[i]);
+        }
+      }
+
+      ////////////////
+      IRandom random = RandomParameter.ActualValue;
+      DoubleArray probabilities = ActualProbabilitiesParameter.ActualValue;
+      if (probabilities.Length != Operators.Count) {
+        throw new InvalidOperationException(Name + ": The list of probabilities has to match the number of operators");
+      }
+      var checkedOperators = Operators.CheckedItems;
+      if (checkedOperators.Count() > 0) {
+        // select a random operator from the checked operators
+        double sum = (from indexedItem in checkedOperators select probabilities[indexedItem.Index]).Sum();
+        if (sum == 0) throw new InvalidOperationException(Name + ": All selected operators have zero probability.");
+        double r = random.NextDouble() * sum;
+        sum = 0;
+        foreach (var indexedItem in checkedOperators) {
+          sum += probabilities[indexedItem.Index];
+          if (sum > r) {
+            successor = indexedItem.Value;
+            break;
+          }
+        }
+      }
+
+      IOperation successorOp = null;
+      if (Successor != null)
+        successorOp = ExecutionContext.CreateOperation(Successor);
+      OperationCollection next = new OperationCollection(successorOp);
+      if (successor != null) {
+        SelectedOperatorParameter.ActualValue = new StringValue(successor.GetType().Name);
+
+        if (CreateChildOperation)
+          next.Insert(0, ExecutionContext.CreateChildOperation(successor));
+        else next.Insert(0, ExecutionContext.CreateOperation(successor));
+      } else {
+        SelectedOperatorParameter.ActualValue = new StringValue("");
+      }
+
+      return next;
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs	(revision 6715)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs	(revision 6716)
@@ -60,5 +60,5 @@
 
     [StorableConstructor]
-    private MultiVRPSolutionCrossover(bool deserializing) : base(deserializing) { }
+    protected MultiVRPSolutionCrossover(bool deserializing) : base(deserializing) { }
     public MultiVRPSolutionCrossover()
       : base() {
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/BiasedMultiVRPSolutionManipulator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/BiasedMultiVRPSolutionManipulator.cs	(revision 6716)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/BiasedMultiVRPSolutionManipulator.cs	(revision 6716)
@@ -0,0 +1,174 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Analysis;
+using HeuristicLab.Parameters;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+using HeuristicLab.Collections;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("BiasedMultiVRPSolutionManipulator", "Randomly selects and applies one of its crossovers every time it is called based on the success progress.")]
+  [StorableClass]
+  public class BiasedMultiVRPSolutionManipulator : MultiVRPSolutionManipulator {
+    public ValueLookupParameter<DoubleArray> ActualProbabilitiesParameter {
+      get { return (ValueLookupParameter<DoubleArray>)Parameters["ActualProbabilities"]; }
+    }
+    
+    public ValueLookupParameter<StringValue> SuccessProgressAnalyisis {
+      get { return (ValueLookupParameter<StringValue>)Parameters["SuccessProgressAnalysis"]; }
+    }
+
+    public ValueLookupParameter<DoubleValue> Factor {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["Factor"]; }
+    }
+
+    public ValueParameter<DoubleValue> LowerBoundParameter {
+      get { return (ValueParameter<DoubleValue>)Parameters["LowerBound"]; }
+    }
+
+    public ValueParameter<IntValue> DepthParameter {
+      get { return (ValueParameter<IntValue>)Parameters["Depth"]; }
+    }
+
+    [StorableConstructor]
+    protected BiasedMultiVRPSolutionManipulator(bool deserializing) : base(deserializing) { }
+    protected BiasedMultiVRPSolutionManipulator(BiasedMultiVRPSolutionManipulator original, Cloner cloner) : base(original, cloner) { }
+    public BiasedMultiVRPSolutionManipulator()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<DoubleArray>("ActualProbabilities", "The array of relative probabilities for each operator."));
+      Parameters.Add(new ValueLookupParameter<StringValue>("SuccessProgressAnalysis", "The success progress analyisis to be considered", 
+        new StringValue("ExecutedMutationOperator")));
+
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("Factor", "The factor with which the probabilities should be updated", new DoubleValue(0.2)));
+      Parameters.Add(new ValueParameter<DoubleValue>("LowerBound", "The depth of the individuals in the scope tree.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<IntValue>("Depth", "The depth of the individuals in the scope tree.", new IntValue(1)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BiasedMultiVRPSolutionManipulator(this, cloner);
+    }
+
+    public override void InitializeState() {
+      base.InitializeState();
+
+      ActualProbabilitiesParameter.Value = null;
+    }
+
+    public override IOperation Apply() {
+      IOperator successor = null;
+
+      if (ActualProbabilitiesParameter.ActualValue == null) {
+        ActualProbabilitiesParameter.Value = ProbabilitiesParameter.ActualValue.Clone() as DoubleArray;
+      } else {
+        String key = "SuccessfulOffspringAnalyzer Results";
+
+        ResultCollection results = null;
+        IScope scope = ExecutionContext.Parent.Scope;
+        int depth = 1;
+        while (scope != null && depth < DepthParameter.Value.Value) {
+          scope = scope.Parent;
+          depth++;
+        }
+        if (scope != null)
+          results = scope.Variables["Results"].Value as ResultCollection;
+
+        if (results != null && results.ContainsKey(key)) {
+          ResultCollection successProgressAnalysisResult = results[key].Value as ResultCollection;
+          key = SuccessProgressAnalyisis.Value.Value;
+
+          if (successProgressAnalysisResult.ContainsKey(key)) {
+            DataTable successProgressAnalysis = successProgressAnalysisResult[key].Value as DataTable;
+
+            for (int i = 0; i < Operators.Count; i++) {
+              IOperator current = Operators[i];
+
+              if (successProgressAnalysis.Rows.ContainsKey(current.Name)) {
+                DataRow row = successProgressAnalysis.Rows[current.Name];
+
+                double sum = 0.0;
+                ObservableList<double> usages = row.Values;
+
+                sum += usages.Last();
+
+                ActualProbabilitiesParameter.ActualValue[i] += (sum / ActualProbabilitiesParameter.ActualValue[i]) * Factor.Value.Value;
+              }
+            }
+          }
+        }
+
+        //normalize
+        double max = ActualProbabilitiesParameter.ActualValue.Max();
+        for (int i = 0; i < ActualProbabilitiesParameter.ActualValue.Length; i++) {
+          ActualProbabilitiesParameter.ActualValue[i] /= max;
+          ActualProbabilitiesParameter.ActualValue[i] =
+            Math.Max(LowerBoundParameter.Value.Value,
+            ActualProbabilitiesParameter.ActualValue[i]);
+        }
+      }
+
+      ////////////////
+      IRandom random = RandomParameter.ActualValue;
+      DoubleArray probabilities = ActualProbabilitiesParameter.ActualValue;
+      if (probabilities.Length != Operators.Count) {
+        throw new InvalidOperationException(Name + ": The list of probabilities has to match the number of operators");
+      }
+      var checkedOperators = Operators.CheckedItems;
+      if (checkedOperators.Count() > 0) {
+        // select a random operator from the checked operators
+        double sum = (from indexedItem in checkedOperators select probabilities[indexedItem.Index]).Sum();
+        if (sum == 0) throw new InvalidOperationException(Name + ": All selected operators have zero probability.");
+        double r = random.NextDouble() * sum;
+        sum = 0;
+        foreach (var indexedItem in checkedOperators) {
+          sum += probabilities[indexedItem.Index];
+          if (sum > r) {
+            successor = indexedItem.Value;
+            break;
+          }
+        }
+      }
+
+      IOperation successorOp = null;
+      if (Successor != null)
+        successorOp = ExecutionContext.CreateOperation(Successor);
+      OperationCollection next = new OperationCollection(successorOp);
+      if (successor != null) {
+        SelectedOperatorParameter.ActualValue = new StringValue(successor.GetType().Name);
+
+        if (CreateChildOperation)
+          next.Insert(0, ExecutionContext.CreateChildOperation(successor));
+        else next.Insert(0, ExecutionContext.CreateOperation(successor));
+      } else {
+        SelectedOperatorParameter.ActualValue = new StringValue("");
+      }
+
+      return next;
+    }
+  }
+}
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs	(revision 6715)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs	(revision 6716)
@@ -56,5 +56,5 @@
 
     [StorableConstructor]
-    private MultiVRPSolutionManipulator(bool deserializing) : base(deserializing) { }
+    protected MultiVRPSolutionManipulator(bool deserializing) : base(deserializing) { }
     public MultiVRPSolutionManipulator()
       : base() {
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 6715)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 6716)
@@ -173,7 +173,9 @@
     <Compile Include="Encodings\General\Creators\MultiVRPSolutionCreator.cs" />
     <Compile Include="Encodings\General\Creators\VRPCreator.cs" />
+    <Compile Include="Encodings\General\Crossovers\BiasedMultiVRPSolutionCrossover.cs" />
     <Compile Include="Encodings\General\Crossovers\MultiVRPSolutionCrossover.cs" />
     <Compile Include="Encodings\General\Crossovers\RandomParentCloneCrossover.cs" />
     <Compile Include="Encodings\General\Crossovers\VRPCrossover.cs" />
+    <Compile Include="Encodings\General\Manipulators\BiasedMultiVRPSolutionManipulator.cs" />
     <Compile Include="Encodings\General\Manipulators\MultiVRPSolutionManipulator.cs" />
     <Compile Include="Encodings\General\Manipulators\VRPManipulator.cs" />
