Index: /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3.csproj
===================================================================
--- /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3.csproj	(revision 5681)
+++ /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3.csproj	(revision 5682)
@@ -116,5 +116,5 @@
     <Compile Include="OffspringSelectionGeneticAlgorithmMainOperator.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="SuccessProgressAnalysis\SuccessProgressAnalyzer.cs" />
+    <Compile Include="SuccessfulOffspringAnalysis\SuccessfulOffspringAnalyzer.cs" />
   </ItemGroup>
   <ItemGroup>
Index: /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithm.cs
===================================================================
--- /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithm.cs	(revision 5681)
+++ /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithm.cs	(revision 5682)
@@ -249,4 +249,6 @@
     [Storable]
     private ValueAnalyzer selectionPressureAnalyzer;
+    [Storable]
+    private SuccessfulOffspringAnalyzer successfulOffspringAnalyzer;
     #endregion
 
@@ -255,4 +257,9 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
+      #region Backwards Compatibility
+      if (successfulOffspringAnalyzer == null)
+        successfulOffspringAnalyzer = new SuccessfulOffspringAnalyzer();
+      #endregion
+      
       Initialize();
     }
@@ -263,4 +270,5 @@
       islandSelectionPressureAnalyzer = cloner.Clone(original.islandSelectionPressureAnalyzer);
       selectionPressureAnalyzer = cloner.Clone(original.selectionPressureAnalyzer);
+      successfulOffspringAnalyzer = cloner.Clone(original.successfulOffspringAnalyzer);
       Initialize();
     }
@@ -386,4 +394,5 @@
       selectionPressureAnalyzer = new ValueAnalyzer();
       islandSelectionPressureAnalyzer = new ValueAnalyzer();
+      successfulOffspringAnalyzer = new SuccessfulOffspringAnalyzer();
       ParameterizeAnalyzers();
       UpdateAnalyzers();
@@ -554,4 +563,9 @@
       selectionPressureAnalyzer.ValuesParameter.ActualName = "Selection Pressure History";
 
+      successfulOffspringAnalyzer.ResultsParameter.ActualName = "Results";
+      successfulOffspringAnalyzer.GenerationsParameter.ActualName = "Generations";
+      successfulOffspringAnalyzer.SuccessfulOffspringFlag.Value.Value = "SuccessfulOffspring";
+      successfulOffspringAnalyzer.DepthParameter.Value = new IntValue(2);
+
       if (Problem != null) {
         islandQualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
@@ -616,4 +630,6 @@
       Analyzer.Operators.Add(qualityAnalyzer);
       Analyzer.Operators.Add(selectionPressureAnalyzer);
+      Analyzer.Operators.Add(successfulOffspringAnalyzer);
+      Analyzer.Operators.SetItemCheckedState(successfulOffspringAnalyzer, false);
     }
     private IslandOffspringSelectionGeneticAlgorithmMainLoop FindMainLoop(IOperator start) {
Index: /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs
===================================================================
--- /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs	(revision 5681)
+++ /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs	(revision 5682)
@@ -197,4 +197,6 @@
     [Storable]
     private ValueAnalyzer selectionPressureAnalyzer;
+    [Storable]
+    private SuccessfulOffspringAnalyzer successfulOffspringAnalyzer;
     #endregion
 
@@ -203,4 +205,9 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
+      #region Backwards Compatibility
+      if (successfulOffspringAnalyzer == null)
+        successfulOffspringAnalyzer = new SuccessfulOffspringAnalyzer();
+      #endregion
+      
       Initialize();
     }
@@ -209,4 +216,5 @@
       qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
       selectionPressureAnalyzer = cloner.Clone(original.selectionPressureAnalyzer);
+      successfulOffspringAnalyzer = cloner.Clone(original.successfulOffspringAnalyzer);
       Initialize();
     }
@@ -291,4 +299,5 @@
       qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
       selectionPressureAnalyzer = new ValueAnalyzer();
+      successfulOffspringAnalyzer = new SuccessfulOffspringAnalyzer();
       ParameterizeAnalyzers();
       UpdateAnalyzers();
@@ -407,4 +416,8 @@
       selectionPressureAnalyzer.ValueParameter.Depth = 0;
       selectionPressureAnalyzer.ValuesParameter.ActualName = "Selection Pressure History";
+      successfulOffspringAnalyzer.ResultsParameter.ActualName = "Results";
+      successfulOffspringAnalyzer.GenerationsParameter.ActualName = "Generations";
+      successfulOffspringAnalyzer.SuccessfulOffspringFlag.Value.Value = "SuccessfulOffspring";
+      successfulOffspringAnalyzer.DepthParameter.Value = new IntValue(1);
       if (Problem != null) {
         qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
@@ -462,4 +475,6 @@
       Analyzer.Operators.Add(qualityAnalyzer);
       Analyzer.Operators.Add(selectionPressureAnalyzer);
+      Analyzer.Operators.Add(successfulOffspringAnalyzer);
+      Analyzer.Operators.SetItemCheckedState(successfulOffspringAnalyzer, false);
     }
     private OffspringSelectionGeneticAlgorithmMainLoop FindMainLoop(IOperator start) {
Index: /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASA.cs
===================================================================
--- /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASA.cs	(revision 5681)
+++ /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASA.cs	(revision 5682)
@@ -225,4 +225,6 @@
     [Storable]
     private ValueAnalyzer selectionPressureAnalyzer;
+    [Storable]
+    private SuccessfulOffspringAnalyzer successfulOffspringAnalyzer;
     #endregion
 
@@ -231,4 +233,9 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
+      #region Backwards Compatibility
+      if (successfulOffspringAnalyzer == null)
+        successfulOffspringAnalyzer = new SuccessfulOffspringAnalyzer();
+      #endregion
+
       Initialize();
     }
@@ -239,4 +246,5 @@
       selectionPressureAnalyzer = cloner.Clone(original.selectionPressureAnalyzer);
       villageSelectionPressureAnalyzer = cloner.Clone(original.villageSelectionPressureAnalyzer);
+      successfulOffspringAnalyzer = cloner.Clone(original.successfulOffspringAnalyzer);
       Initialize();
     }
@@ -344,4 +352,5 @@
       selectionPressureAnalyzer = new ValueAnalyzer();
       villageSelectionPressureAnalyzer = new ValueAnalyzer();
+      successfulOffspringAnalyzer = new SuccessfulOffspringAnalyzer();
       ParameterizeAnalyzers();
       UpdateAnalyzers();
@@ -492,4 +501,9 @@
       selectionPressureAnalyzer.ValuesParameter.ActualName = "Selection Pressure History";
 
+      successfulOffspringAnalyzer.ResultsParameter.ActualName = "Results";
+      successfulOffspringAnalyzer.GenerationsParameter.ActualName = "Generations";
+      successfulOffspringAnalyzer.SuccessfulOffspringFlag.Value.Value = "SuccessfulOffspring";
+      successfulOffspringAnalyzer.DepthParameter.Value = new IntValue(2);
+
       if (Problem != null) {
         villageQualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
@@ -554,4 +568,6 @@
       Analyzer.Operators.Add(qualityAnalyzer);
       Analyzer.Operators.Add(selectionPressureAnalyzer);
+      Analyzer.Operators.Add(successfulOffspringAnalyzer);
+      Analyzer.Operators.SetItemCheckedState(successfulOffspringAnalyzer, false);
     }
     private SASEGASAMainLoop FindMainLoop(IOperator start) {
Index: /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SuccessfulOffspringAnalysis/SuccessfulOffspringAnalyzer.cs
===================================================================
--- /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SuccessfulOffspringAnalysis/SuccessfulOffspringAnalyzer.cs	(revision 5682)
+++ /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SuccessfulOffspringAnalysis/SuccessfulOffspringAnalyzer.cs	(revision 5682)
@@ -0,0 +1,148 @@
+﻿#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.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Common;
+using HeuristicLab.Parameters;
+using HeuristicLab.Data;
+using HeuristicLab.Analysis;
+
+namespace HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm {
+  /// <summary>
+  /// An operator for analyzing the solution diversity in a population.
+  /// </summary>
+  [Item("SuccessfulOffspringAnalyzer", "An operator for analyzing certain properties in the successful offspring. The properties to be analyzed can be specified in the CollectedValues parameter.")]
+  [StorableClass]
+  public sealed class SuccessfulOffspringAnalyzer : SingleSuccessorOperator, IAnalyzer {
+    public ValueParameter<StringValue> SuccessfulOffspringFlag {
+      get { return (ValueParameter<StringValue>)Parameters["SuccessfulOffspringFlag"]; }
+    }
+
+    public ValueParameter<ItemCollection<StringValue>> CollectedValues {
+      get { return (ValueParameter<ItemCollection<StringValue>>)Parameters["CollectedValues"]; }
+    }
+
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public ILookupParameter<IntValue> GenerationsParameter {
+      get { return (LookupParameter<IntValue>)Parameters["Generations"]; }
+    }
+
+    public ValueParameter<IntValue> DepthParameter {
+      get { return (ValueParameter<IntValue>)Parameters["Depth"]; }
+    }
+    
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SuccessfulOffspringAnalyzer(this, cloner);
+    }    
+    [StorableConstructor]
+    private SuccessfulOffspringAnalyzer(bool deserializing) : base(deserializing) { }
+    private SuccessfulOffspringAnalyzer(SuccessfulOffspringAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public SuccessfulOffspringAnalyzer()
+      : base() {
+        Parameters.Add(new ValueParameter<StringValue>("SuccessfulOffspringFlag", "The name of the flag which indicates if the individual was successful.", new StringValue("SuccessfulOffspring")));
+        Parameters.Add(new ValueParameter<ItemCollection<StringValue>>("CollectedValues", "The properties of the successful offspring that should be collected.", new ItemCollection<StringValue>()));
+        Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the succedd progress analysis results should be stored."));
+        Parameters.Add(new LookupParameter<IntValue>("Generations", "The current number of generations."));
+        Parameters.Add(new ValueParameter<IntValue>("Depth", "The depth of the individuals in the scope tree.", new IntValue(1)));
+    }
+
+    public override IOperation Apply() {
+      ResultCollection results = ResultsParameter.ActualValue;
+
+      List<IScope> scopes = new List<IScope>() { ExecutionContext.Scope };
+      for (int i = 0; i < DepthParameter.Value.Value; i++)
+        scopes = scopes.Select(x => (IEnumerable<IScope>)x.SubScopes).Aggregate((a, b) => a.Concat(b)).ToList();
+
+      ItemCollection<StringValue> collectedValues = CollectedValues.Value;
+        foreach (StringValue collected in collectedValues) {
+          //collect the values of the successful offspring
+          Dictionary<String, int> counts = new Dictionary<String, int>();
+          for (int i = 0; i < scopes.Count; i++) {
+            IScope child = scopes[i];
+            string successfulOffspringFlag = SuccessfulOffspringFlag.Value.Value;
+            if (child.Variables.ContainsKey(collected.Value) && 
+                child.Variables.ContainsKey(successfulOffspringFlag) && 
+                (child.Variables[successfulOffspringFlag].Value is BoolValue) &&
+                (child.Variables[successfulOffspringFlag].Value as BoolValue).Value) {
+              String key = child.Variables[collected.Value].Value.ToString();
+
+              if (!counts.ContainsKey(key))
+                counts.Add(key, 1);
+              else
+                counts[key]++;
+            }
+          }
+
+          //create a data table containing the collected values
+          DataTable successProgressAnalysis;
+          string resultKey = "Success Progress " + collected.Value;
+          if (!results.ContainsKey(resultKey)) {
+            successProgressAnalysis = new DataTable();
+            successProgressAnalysis.Name = "Success Progress Analysis";
+            results.Add(new Result(resultKey, successProgressAnalysis));
+          } else {
+            successProgressAnalysis = results[resultKey].Value as DataTable;
+          }
+
+          int successfulCount = 0;
+          foreach (string key in counts.Keys) {
+            successfulCount += counts[key];
+          }
+
+          foreach(String value in counts.Keys) {            
+            DataRow row;
+            if (!successProgressAnalysis.Rows.ContainsKey(value)) {
+              row = new DataRow(value);
+              int iterations = GenerationsParameter.ActualValue.Value;
+
+              //fill up all values seen the first time
+              for (int i = 1; i < iterations; i++)
+                row.Values.Add(0);
+
+              successProgressAnalysis.Rows.Add(row);
+            } else {
+              row = successProgressAnalysis.Rows[value];
+            }
+
+            row.Values.Add(counts[value] / (double)successfulCount);
+          }
+
+          //fill up all values that are not present in the current generation
+          foreach (DataRow row in successProgressAnalysis.Rows) {
+            if (!counts.ContainsKey(row.Name))
+              row.Values.Add(0);
+          }
+        }  
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/SuccessProgressAnalysis/HeuristicLab.Operators/3.3/StochasticMultiBranch.cs
===================================================================
--- /branches/SuccessProgressAnalysis/HeuristicLab.Operators/3.3/StochasticMultiBranch.cs	(revision 5681)
+++ /branches/SuccessProgressAnalysis/HeuristicLab.Operators/3.3/StochasticMultiBranch.cs	(revision 5682)
@@ -49,9 +49,9 @@
       get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
     }
-    public ValueParameter<BoolValue> ReportExecutedOperatorParameter {
-      get { return (ValueParameter<BoolValue>)Parameters["ReportExecutedOperator"]; }
+    public ValueParameter<BoolValue> TraceSelectedOperatorParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["TraceSelectedOperator"]; }
     }
-    public ValueLookupParameter<StringValue> ExecutedOperatorParameter {
-      get { return (ValueLookupParameter<StringValue>)Parameters["ExecutedOperator"]; }
+    public ValueLookupParameter<StringValue> SelectedOperatorParameter {
+      get { return (ValueLookupParameter<StringValue>)Parameters["SelectedOperator"]; }
     }
 
@@ -64,9 +64,9 @@
     private void AfterDeserializationHook() {
       #region Backwards Compatibility
-      if (!Parameters.ContainsKey("ExecutedOperator")) {
-        Parameters.Add(new ValueLookupParameter<StringValue>("ExecutedOperator", "The operator that was executed."));
+      if (!Parameters.ContainsKey("SelectedOperator")) {
+        Parameters.Add(new ValueLookupParameter<StringValue>("SelectedOperator", "If the TraceSelectedOperator flag is set, the name of the operator is traced in this parameter."));
       }
-      if (!Parameters.ContainsKey("ReportExecutedOperator")) {
-        Parameters.Add(new ValueParameter<BoolValue>("ReportExecutedOperator", "Report the executed operator", new BoolValue(false)));
+      if (!Parameters.ContainsKey("TraceSelectedOperator")) {
+        Parameters.Add(new ValueParameter<BoolValue>("TraceSelectedOperator", "Indicates, if the selected operator should be traced.", new BoolValue(false)));
       }
       #endregion
@@ -86,6 +86,6 @@
       Parameters.Add(new ValueLookupParameter<DoubleArray>("Probabilities", "The array of relative probabilities for each operator.", new DoubleArray()));
       Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
-      Parameters.Add(new ValueLookupParameter<StringValue>("ExecutedOperator", "The operator that was executed."));
-      Parameters.Add(new ValueParameter<BoolValue>("ReportExecutedOperator", "Report the executed operator", new BoolValue(false)));
+      Parameters.Add(new ValueLookupParameter<StringValue>("SelectedOperator", "If the TraceSelectedOperator flag is set, the name of the operator is traced in this parameter."));
+      Parameters.Add(new ValueParameter<BoolValue>("TraceSelectedOperator", "Indicates, if the selected operator should be traced.", new BoolValue(false)));
     }
 
@@ -136,4 +136,5 @@
       }
       IOperator successor = null;
+      int index = -1;
       var checkedOperators = Operators.CheckedItems;
       if (checkedOperators.Count() > 0) {
@@ -147,4 +148,5 @@
           if (sum > r) {
             successor = indexedItem.Value;
+            index = indexedItem.Index;
             break;
           }
@@ -153,6 +155,6 @@
       OperationCollection next = new OperationCollection(base.Apply());
       if (successor != null) {
-        if(ReportExecutedOperatorParameter.Value.Value)
-          ExecutedOperatorParameter.ActualValue = new StringValue(successor.Name);
+        if (TraceSelectedOperatorParameter.Value.Value)
+          SelectedOperatorParameter.ActualValue = new StringValue(index + ": " + successor.Name);
 
         if (CreateChildOperation)
@@ -160,6 +162,6 @@
         else next.Insert(0, ExecutionContext.CreateOperation(successor));
       } else {
-        if (ReportExecutedOperatorParameter.Value.Value)
-          ExecutedOperatorParameter.ActualValue = new StringValue("");
+        if (TraceSelectedOperatorParameter.Value.Value)
+          SelectedOperatorParameter.ActualValue = new StringValue("");
       }
       return next;
Index: /branches/SuccessProgressAnalysis/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/BiasedMultiVRPSolutionCrossover.cs
===================================================================
--- /branches/SuccessProgressAnalysis/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/BiasedMultiVRPSolutionCrossover.cs	(revision 5681)
+++ /branches/SuccessProgressAnalysis/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/BiasedMultiVRPSolutionCrossover.cs	(revision 5682)
@@ -156,5 +156,5 @@
       OperationCollection next = new OperationCollection(successorOp);
       if (successor != null) {
-        ExecutedOperatorParameter.ActualValue = new StringValue(successor.GetType().Name);
+        SelectedOperatorParameter.ActualValue = new StringValue(successor.GetType().Name);
 
         if (CreateChildOperation)
@@ -162,5 +162,5 @@
         else next.Insert(0, ExecutionContext.CreateOperation(successor));
       } else {
-        ExecutedOperatorParameter.ActualValue = new StringValue("");
+        SelectedOperatorParameter.ActualValue = new StringValue("");
       }
 
Index: /branches/SuccessProgressAnalysis/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Manipulators/BiasedMultiVRPSolutionManipulator.cs
===================================================================
--- /branches/SuccessProgressAnalysis/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Manipulators/BiasedMultiVRPSolutionManipulator.cs	(revision 5681)
+++ /branches/SuccessProgressAnalysis/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Manipulators/BiasedMultiVRPSolutionManipulator.cs	(revision 5682)
@@ -156,5 +156,5 @@
       OperationCollection next = new OperationCollection(successorOp);
       if (successor != null) {
-        ExecutedOperatorParameter.ActualValue = new StringValue(successor.GetType().Name);
+        SelectedOperatorParameter.ActualValue = new StringValue(successor.GetType().Name);
 
         if (CreateChildOperation)
@@ -162,5 +162,5 @@
         else next.Insert(0, ExecutionContext.CreateOperation(successor));
       } else {
-        ExecutedOperatorParameter.ActualValue = new StringValue("");
+        SelectedOperatorParameter.ActualValue = new StringValue("");
       }
 
