Index: branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/HeuristicLab.PDPSimulation-3.3.csproj
===================================================================
--- branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/HeuristicLab.PDPSimulation-3.3.csproj	(revision 8807)
+++ branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/HeuristicLab.PDPSimulation-3.3.csproj	(revision 8808)
@@ -135,4 +135,5 @@
       <Private>False</Private>
     </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Operators-3.3">
       <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
@@ -159,4 +160,6 @@
       <Private>false</Private>
     </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Problems.Instances-3.3">
       <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
@@ -185,12 +188,16 @@
     <Compile Include="DistanceMeasures\EuclideanDistanceMeasure.cs" />
     <Compile Include="DomainModel\SimulationObject.cs" />
+    <Compile Include="Operators\TreePriorityDispatchingMetaOptEvaluator.cs" />
+    <Compile Include="Operators\PriorityDispatchingMetaOptEvaluator.cs" />
     <Compile Include="Operators\DialARideEvaluator.cs" />
     <Compile Include="Operators\DynPDPEvaluator.cs" />
     <Compile Include="Operators\DynPushForwardInsertionCreator.cs" />
     <Compile Include="Operators\DynPDPProblemInstance.cs" />
-    <Compile Include="Operators\PriorityDispatchingMetaOptEvaluator.cs" />
+    <Compile Include="Operators\LinearPriorityDispatchingMetaOptEvaluator.cs" />
     <Compile Include="Optimizers\DynamicPDProblemInstance.cs" />
     <Compile Include="Optimizers\DynamicPDPOptimization.cs" />
     <Compile Include="Optimizers\LocalUpdate\BestInsertion.cs" />
+    <Compile Include="Optimizers\LocalUpdate\TreePriorityDispatching.cs" />
+    <Compile Include="Optimizers\LocalUpdate\LinearPriorityDispatching.cs" />
     <Compile Include="Optimizers\LocalUpdate\PriorityDispatching.cs" />
     <Compile Include="Optimizers\Reoptimization\PFIHReoptimization.cs" />
Index: branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Operators/LinearPriorityDispatchingMetaOptEvaluator.cs
===================================================================
--- branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Operators/LinearPriorityDispatchingMetaOptEvaluator.cs	(revision 8808)
+++ branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Operators/LinearPriorityDispatchingMetaOptEvaluator.cs	(revision 8808)
@@ -0,0 +1,45 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Data;
+using HeuristicLab.Common;
+using System.Threading;
+using System.Threading.Tasks;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using System.Diagnostics;
+
+namespace HeuristicLab.PDPSimulation.Operators {
+  [Item("LinearPriorityDispatchingMetaOptEvaluator", "Metaoptimization of the priority dispatching parameters for the PDP simulation.")]
+  [StorableClass]
+  public class LinearPriorityDispatchingMetaOptEvaluator : PriorityDispatchingMetaOptEvaluator {
+    public IValueLookupParameter<DoubleArray> VectorParameter {
+      get { return (IValueLookupParameter<DoubleArray>)Parameters["Vector"]; }
+    }
+
+    public LinearPriorityDispatchingMetaOptEvaluator() {
+      Parameters.Add(new ValueLookupParameter<DoubleArray>("Vector", "The priority dispatching parameters."));
+    }
+
+    [StorableConstructor]
+    protected LinearPriorityDispatchingMetaOptEvaluator(bool deserializing) : base(deserializing) { }
+    protected LinearPriorityDispatchingMetaOptEvaluator(LinearPriorityDispatchingMetaOptEvaluator original, Cloner cloner) : base(original, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LinearPriorityDispatchingMetaOptEvaluator(this, cloner);
+    }
+
+    protected override void Parameterize(PriorityDispatching dispatching) {
+      DoubleArray vector = VectorParameter.ActualValue;
+
+      LinearPriorityDispatching linearDispatching = dispatching as LinearPriorityDispatching;
+      linearDispatching.WeightsParameter.Value = new RealVector(vector.ToArray());
+    }
+  }
+}
Index: branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Operators/PriorityDispatchingMetaOptEvaluator.cs
===================================================================
--- branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Operators/PriorityDispatchingMetaOptEvaluator.cs	(revision 8807)
+++ branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Operators/PriorityDispatchingMetaOptEvaluator.cs	(revision 8808)
@@ -19,11 +19,7 @@
   [Item("PriorityDispatchingMetaOptEvaluator", "Metaoptimization of the priority dispatching parameters for the PDP simulation.")]
   [StorableClass]
-  public class PriorityDispatchingMetaOptEvaluator : SingleSuccessorOperator, ISingleObjectiveEvaluator {
+  public abstract class PriorityDispatchingMetaOptEvaluator : SingleSuccessorOperator, ISingleObjectiveEvaluator {
     public ILookupParameter<DoubleValue> QualityParameter {
       get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
-    }
-
-    public IValueLookupParameter<DoubleArray> VectorParameter {
-      get { return (IValueLookupParameter<DoubleArray>)Parameters["Vector"]; }
     }
 
@@ -38,5 +34,4 @@
     public PriorityDispatchingMetaOptEvaluator() {
       Parameters.Add(new LookupParameter<DoubleValue>("Quality", "Result of the evaluation of a solution."));
-      Parameters.Add(new ValueLookupParameter<DoubleArray>("Vector", "The priority dispatching parameters."));
       Parameters.Add(new ValueParameter<ItemList<PickupDeliverySimulation>>("Simulation", "The PDP simulation"));
       Parameters.Add(new ValueParameter<IntValue>("Repetitions", "The number of repetitions", new IntValue(1)));
@@ -47,7 +42,5 @@
     protected PriorityDispatchingMetaOptEvaluator(PriorityDispatchingMetaOptEvaluator original, Cloner cloner) : base(original, cloner) { }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new PriorityDispatchingMetaOptEvaluator(this, cloner);
-    }
+    protected abstract void Parameterize(PriorityDispatching dispatching);
 
     public override IOperation Apply() {
@@ -56,6 +49,4 @@
       ItemList<PickupDeliverySimulation> simulations = SimulationParameter.Value;
       int repetitions = 0;
-
-      DoubleArray vector = VectorParameter.ActualValue;
 
       object locker = new object();
@@ -67,5 +58,5 @@
         PickupDeliverySimulation simulation = originalSimulation.Clone() as PickupDeliverySimulation;
         PriorityDispatching dispatching = simulation.OptimizationParameter.Value as PriorityDispatching;
-        dispatching.WeightsParameter.Value = new RealVector(vector.ToArray());
+        Parameterize(dispatching);
        
         EventWaitHandle waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
Index: branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Operators/TreePriorityDispatchingMetaOptEvaluator.cs
===================================================================
--- branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Operators/TreePriorityDispatchingMetaOptEvaluator.cs	(revision 8808)
+++ branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Operators/TreePriorityDispatchingMetaOptEvaluator.cs	(revision 8808)
@@ -0,0 +1,54 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Data;
+using HeuristicLab.Common;
+using System.Threading;
+using System.Threading.Tasks;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using System.Diagnostics;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.PDPSimulation.Operators {
+  [Item("TreePriorityDispatchingMetaOptEvaluator", "Metaoptimization of the priority dispatching parameters for the PDP simulation.")]
+  [StorableClass]
+  public class TreePriorityDispatchingMetaOptEvaluator : PriorityDispatchingMetaOptEvaluator {
+    public IValueLookupParameter<ISymbolicExpressionTree> SymbolicExpressionTreeParameter {
+      get { return (IValueLookupParameter<ISymbolicExpressionTree>)Parameters["SymbolicExpressionTree"]; }
+    }
+
+    public IValueLookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter> SymbolicDataAnalysisTreeInterpreterParameter {
+      get { return (IValueLookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>)Parameters["SymbolicExpressionTreeInterpreter"]; }
+    }
+
+    public TreePriorityDispatchingMetaOptEvaluator() {
+      Parameters.Add(new ValueLookupParameter<ISymbolicExpressionTree>("SymbolicExpressionTree", "The symbolic data analysis solution encoded as a symbolic expression tree."));
+      Parameters.Add(new ValueLookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>("SymbolicExpressionTreeInterpreter", "The interpreter that should be used to calculate the output values of the symbolic data analysis tree.")); 
+    }
+
+    [StorableConstructor]
+    protected TreePriorityDispatchingMetaOptEvaluator(bool deserializing) : base(deserializing) { }
+    protected TreePriorityDispatchingMetaOptEvaluator(TreePriorityDispatchingMetaOptEvaluator original, Cloner cloner) : base(original, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TreePriorityDispatchingMetaOptEvaluator(this, cloner);
+    }
+
+    protected override void Parameterize(PriorityDispatching dispatching) {
+      var tree = SymbolicExpressionTreeParameter.ActualValue;
+      var interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue;
+
+      TreePriorityDispatching treeDispatching = dispatching as TreePriorityDispatching;
+      treeDispatching.SymbolicExpressionTreeParameter.Value = tree;
+      treeDispatching.SymbolicDataAnalysisTreeInterpreterParameter.Value = interpreter;
+    }
+  }
+}
Index: branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Optimizers/LocalUpdate/LinearPriorityDispatching.cs
===================================================================
--- branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Optimizers/LocalUpdate/LinearPriorityDispatching.cs	(revision 8808)
+++ branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Optimizers/LocalUpdate/LinearPriorityDispatching.cs	(revision 8808)
@@ -0,0 +1,61 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.PDPSimulation.DomainModel;
+using HeuristicLab.PDPSimulation.Operators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.PDPSimulation {
+  [Item("LinearPriorityDispatching", "")]
+  [StorableClass]
+  public class LinearPriorityDispatching : PriorityDispatching {
+
+    public IValueLookupParameter<RealVector> WeightsParameter {
+      get { return (IValueLookupParameter<RealVector>)Parameters["Weights"]; }
+    }
+
+    [StorableConstructor]
+    protected LinearPriorityDispatching(bool deserializing) : base(deserializing) { }
+    protected LinearPriorityDispatching(PriorityDispatching original, Cloner cloner) : base(original, cloner) { }
+    public LinearPriorityDispatching() {
+      Parameters.Add(new ValueLookupParameter<RealVector>("Weights", "The weights for the individual priorities."));
+      WeightsParameter.Value = new RealVector(new double[] {
+         100.000, 100.000,  22.349,  74.573,  18.424,  28.913,   0.331,  91.323,  36.969,  44.992,  64.892,  30.736,  23.113,  36.458,   6.178,  99.065, 100.0, 100.0
+      });
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LinearPriorityDispatching(this, cloner);
+    }
+
+    protected override double CalculatePriority(IDictionary<string, double> variables) {
+      var weights = WeightsParameter.Value;
+      
+      double prio = weights[0] * variables["DueDate"]
+             + weights[1] * variables["StartDate"]
+             + weights[2] * variables["PickupOrdersAtTarget"]
+             + weights[3] * variables["Distance"]
+             + weights[4] * variables["AverageDistanceToDestinations"]
+             + weights[5] * variables["MinimumDistanceToDestinations"]
+             + weights[6] * variables["MaximumDistanceToDestinations"]
+             + weights[7] * variables["NumberOfOtherCouriersToTarget"]
+             + weights[8] * variables["AverageDistanceToOtherCouriers"]
+             + weights[9] * variables["EarliestTimeOfArrival"]
+             + weights[10] * variables["DeliveryOrdersAtTarget"]
+             + weights[11] * variables["PickupOrderItemsAtTarget"]
+             + weights[12] * variables["DeliveryOrderItemsAtTarget"]
+             + weights[13] * variables["MinimumDistanceToOtherCouriers"]
+             + weights[14] * variables["MaximumDistanceToOtherCouriers"]
+             + weights[15] * variables["DemandSize"]
+             + weights[16] * variables["EDD"]
+             + weights[17] * variables["LeadTime"];
+
+      return prio;
+    }
+  }
+}
Index: branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Optimizers/LocalUpdate/PriorityDispatching.cs
===================================================================
--- branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Optimizers/LocalUpdate/PriorityDispatching.cs	(revision 8807)
+++ branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Optimizers/LocalUpdate/PriorityDispatching.cs	(revision 8808)
@@ -14,5 +14,5 @@
   [Item("PriorityDispatching", "")]
   [StorableClass]
-  public sealed class PriorityDispatching : DynamicPDPOptimization {
+  public abstract class PriorityDispatching : DynamicPDPOptimization {
 
     private bool IsIdle(Vehicle v) {
@@ -27,20 +27,9 @@
     }
 
-    public IValueLookupParameter<RealVector> WeightsParameter {
-      get { return (IValueLookupParameter<RealVector>)Parameters["Weights"]; }
-    }
 
     [StorableConstructor]
-    private PriorityDispatching(bool deserializing) : base(deserializing) { }
-    private PriorityDispatching(PriorityDispatching original, Cloner cloner) : base(original, cloner) { }
-    public PriorityDispatching() {
-      Parameters.Add(new ValueLookupParameter<RealVector>("Weights", "The weights for the individual priorities."));
-      WeightsParameter.Value = new RealVector(new double[] {
-         100.000, 100.000,  22.349,  74.573,  18.424,  28.913,   0.331,  91.323,  36.969,  44.992,  64.892,  30.736,  23.113,  36.458,   6.178,  99.065, 100.0, 100.0
-      });
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new PriorityDispatching(this, cloner);
+    protected PriorityDispatching(bool deserializing) : base(deserializing) { }
+    protected PriorityDispatching(PriorityDispatching original, Cloner cloner) : base(original, cloner) { }
+    protected PriorityDispatching() {
     }
 
@@ -112,6 +101,7 @@
     }
 
+    protected abstract double CalculatePriority(IDictionary<string, double> variables);
+
     private void GetHighestPriorityOrder(DynPDPProblemInstance instance, Vehicle vehicle, IEnumerable<Order> orders, out Order order, out double priority) {
-      var weights = WeightsParameter.Value;
       Order best = null;
       double bestPriority = double.MinValue;
@@ -165,23 +155,5 @@
            variables.Add("LeadTime", o.PickupReadyTime - GetSimulationTime());
 
-           prio =
-               weights[0] * variables["DueDate"]
-             + weights[1] * variables["StartDate"]
-             + weights[2] * variables["PickupOrdersAtTarget"]
-             + weights[3] * variables["Distance"]
-             + weights[4] * variables["AverageDistanceToDestinations"]
-             + weights[5] * variables["MinimumDistanceToDestinations"]
-             + weights[6] * variables["MaximumDistanceToDestinations"]
-             + weights[7] * variables["NumberOfOtherCouriersToTarget"]
-             + weights[8] * variables["AverageDistanceToOtherCouriers"]
-             + weights[9] * variables["EarliestTimeOfArrival"]
-             + weights[10] * variables["DeliveryOrdersAtTarget"]
-             + weights[11] * variables["PickupOrderItemsAtTarget"]
-             + weights[12] * variables["DeliveryOrderItemsAtTarget"]
-             + weights[13] * variables["MinimumDistanceToOtherCouriers"]
-             + weights[14] * variables["MaximumDistanceToOtherCouriers"]
-             + weights[15] * variables["DemandSize"]
-             + weights[16] * variables["EDD"]
-             + weights[17] * variables["LeadTime"];
+           prio = CalculatePriority(variables);
          }
 
Index: branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Optimizers/LocalUpdate/TreePriorityDispatching.cs
===================================================================
--- branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Optimizers/LocalUpdate/TreePriorityDispatching.cs	(revision 8808)
+++ branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Optimizers/LocalUpdate/TreePriorityDispatching.cs	(revision 8808)
@@ -0,0 +1,54 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.PDPSimulation.DomainModel;
+using HeuristicLab.PDPSimulation.Operators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.PDPSimulation {
+  [Item("TreePriorityDispatching", "")]
+  [StorableClass]
+  public class TreePriorityDispatching : PriorityDispatching {
+    public IValueLookupParameter<ISymbolicExpressionTree> SymbolicExpressionTreeParameter {
+      get { return (IValueLookupParameter<ISymbolicExpressionTree>)Parameters["SymbolicExpressionTree"]; }
+    }
+
+    public IValueLookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter> SymbolicDataAnalysisTreeInterpreterParameter {
+      get { return (IValueLookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>)Parameters["SymbolicExpressionTreeInterpreter"]; }
+    }
+
+    [StorableConstructor]
+    protected TreePriorityDispatching(bool deserializing) : base(deserializing) { }
+    protected TreePriorityDispatching(PriorityDispatching original, Cloner cloner) : base(original, cloner) { }
+    public TreePriorityDispatching() {
+      Parameters.Add(new ValueLookupParameter<ISymbolicExpressionTree>("SymbolicExpressionTree", "The symbolic data analysis solution encoded as a symbolic expression tree."));
+      Parameters.Add(new ValueLookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>("SymbolicExpressionTreeInterpreter", "The interpreter that should be used to calculate the output values of the symbolic data analysis tree.")); 
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TreePriorityDispatching(this, cloner);
+    }
+
+    protected override double CalculatePriority(IDictionary<string, double> variables) {
+      var tree = SymbolicExpressionTreeParameter.Value;
+      var interpreter = SymbolicDataAnalysisTreeInterpreterParameter.Value;
+
+      Dataset ds = new Dataset(variables.Keys, variables.Values.Select(v => new List<double>(new double[] { v })));
+
+      List<int> rows = new List<int>();
+      rows.Add(0);
+
+      double prio = interpreter.GetSymbolicExpressionTreeValues(tree, ds, rows).First();
+
+      return prio;
+    }
+  }
+}
