Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/HeuristicLab.EvolutionTracking.Views-3.4.csproj
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/HeuristicLab.EvolutionTracking.Views-3.4.csproj	(revision 11226)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/HeuristicLab.EvolutionTracking.Views-3.4.csproj	(revision 11227)
@@ -105,5 +105,7 @@
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="GenealogyGraphView.cs" />
+    <Compile Include="GenealogyGraphView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="GenealogyGraphView.Designer.cs">
       <DependentUpon>GenealogyGraphView.cs</DependentUpon>
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 11226)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 11227)
@@ -21,4 +21,5 @@
 
 using System.Linq;
+using HeuristicLab.Analysis;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -34,4 +35,5 @@
   public class GenealogyAnalyzer<T> : SingleSuccessorOperator, IAnalyzer
   where T : class,IItem {
+    #region parameter names
     private const string GenerationsParameterName = "Generations";
     private const string ResultsParameterName = "Results";
@@ -53,4 +55,5 @@
     private const string EnableManipulatorTrackingParameterName = "EnableManipulatorTracking";
     private const string EnableSolutionCreatorTrackingParameterName = "EnableSolutionCreatorTracking"; // should always be enabled. maybe superfluous
+    #endregion
 
     #region parameter properties
@@ -140,4 +143,5 @@
 
     public GenealogyAnalyzer() {
+      #region add parameters
       // the instrumented operators
       Parameters.Add(new LookupParameter<ICrossover>(CrossoverParameterName, "The crossover operator."));
@@ -157,4 +161,5 @@
       Parameters.Add(new ValueParameter<IManipulatorOperator<T>>(BeforeManipulatorOperatorParameterName));
       Parameters.Add(new ValueParameter<IManipulatorOperator<T>>(AfterManipulatorOperatorParameterName));
+      #endregion
     }
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -164,4 +169,8 @@
       : base(original, cloner) {
     }
+
+    [StorableConstructor]
+    protected GenealogyAnalyzer(bool deserializing) : base(deserializing) { }
+
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
@@ -232,14 +241,14 @@
 
     public override IOperation Apply() {
-      var population = PopulationParameter.ActualValue.ToList();
+      var population = PopulationParameter.ActualValue;
       var qualities = QualityParameter.ActualValue.ToList();
 
-      int currentGeneration = GenerationsParameter.ActualValue.Value;
-      if (currentGeneration == 0) {
+      int generation = GenerationsParameter.ActualValue.Value;
+      if (generation == 0) {
         ConfigureTrackingOperators();
 
-        for (int i = 0; i < population.Count; ++i) {
+        for (int i = 0; i < population.Length; ++i) {
           var individual = population[i];
-          var vertex = new GenealogyGraphNode<T>(individual) { Rank = currentGeneration };
+          var vertex = new GenealogyGraphNode<T>(individual) { Rank = generation };
           GenealogyGraph.AddVertex(vertex);
           // save the vertex id in the individual scope (so that we can identify graph indices)
@@ -249,12 +258,13 @@
         int index = 0;
         T elite = null;
-        for (int i = 0; i < population.Count; ++i) {
+        for (int i = 0; i < population.Length; ++i) {
           if (GenealogyGraph.Contains(population[i])) {
             elite = population[i];
             index = i;
-          }
-          break;
-        }
-
+            break;
+          }
+        }
+
+        #region add elite in the graph and connect it with the previous elite
         if (elite != null) {
           var prevVertex = (IGenealogyGraphNode<T>)GenealogyGraph.GetVertex(elite);
@@ -264,5 +274,5 @@
 
           var vertex = new GenealogyGraphNode<T>(prevVertex.Content) {
-            Rank = currentGeneration,
+            Rank = generation,
             Quality = prevVertex.Quality,
             IsElite = false
@@ -272,7 +282,5 @@
           // inject the graph node unique id to the scope
           ExecutionContext.Scope.SubScopes[index].Variables["Id"].Value = new StringValue(vertex.Id);
-
           GenealogyGraph.AddVertex(vertex);
-
           GenealogyGraph.AddArc(prevVertex, vertex); // connect current elite with previous elite
 
@@ -281,7 +289,10 @@
           }
         }
+        #endregion
+
+        ComputeSuccessRatios();
       }
       // update qualities
-      for (int i = 0; i < population.Count; ++i) {
+      for (int i = 0; i < population.Length; ++i) {
         var vertex = (IGenealogyGraphNode)GenealogyGraph.GetVertex(population[i]);
         vertex.Quality = qualities[i].Value;
@@ -289,11 +300,37 @@
 
       // remove extra graph nodes (added by the instrumented operators in the case of offspring selection)
-      var discardedOffspring = GenealogyGraph.Ranks[currentGeneration].Select(x => (T)x.Content).Except(population).ToList();
-      foreach (var individual in discardedOffspring) {
-        var vertex = GenealogyGraph.GetVertex(individual);
+      var discardedOffspring = GenealogyGraph.Ranks[generation].Select(x => (T)x.Content).Except(population).ToList();
+      foreach (var vertex in discardedOffspring.Select(individual => GenealogyGraph.GetVertex(individual))) {
         GenealogyGraph.RemoveVertex(vertex);
       }
 
       return base.Apply();
+    }
+
+    private void ComputeSuccessRatios() {
+      var population = PopulationParameter.ActualValue;
+      var generation = GenerationsParameter.ActualValue.Value;
+      // compute the weight of each genealogy graph node as the ratio (produced offspring) / (surviving offspring)
+      foreach (var ind in population) {
+        var v = (IGenealogyGraphNode)GenealogyGraph.GetVertex(ind);
+        foreach (var p in v.Parents)
+          p.Weight++;
+      }
+      foreach (var v in GenealogyGraph.Ranks[generation - 1]) {
+        if (v.OutDegree > 0)
+          v.Weight /= v.OutDegree;
+      }
+
+      var results = ResultsParameter.ActualValue;
+      DataTable table;
+      if (!results.ContainsKey("Successful offspring ratio")) {
+        table = new DataTable("Successful offspring ratio");
+        results.Add(new Result("Successful offspring ratio", table));
+        table.Rows.Add(new DataRow("Successful offspring ratio") { VisualProperties = { ChartType = DataRowVisualProperties.DataRowChartType.Columns, StartIndexZero = true } });
+      } else {
+        table = (DataTable)results["Successful offspring ratio"].Value;
+      }
+      var row = table.Rows["Successful offspring ratio"];
+      row.Values.Replace(GenealogyGraph.Ranks[generation - 1].OrderByDescending(x => x.Quality).Select(x => x.Weight));
     }
   }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/HeuristicLab.EvolutionTracking-3.4.csproj
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/HeuristicLab.EvolutionTracking-3.4.csproj	(revision 11226)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/HeuristicLab.EvolutionTracking-3.4.csproj	(revision 11227)
@@ -56,4 +56,9 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Collections-3.3">
       <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterCrossoverOperator.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterCrossoverOperator.cs	(revision 11226)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterCrossoverOperator.cs	(revision 11227)
@@ -45,4 +45,6 @@
       return new AfterCrossoverOperator<T>(this, cloner);
     }
+    [StorableConstructor]
+    protected AfterCrossoverOperator(bool deserializing) : base(deserializing) { }
 
     public AfterCrossoverOperator() {
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterManipulatorOperator.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterManipulatorOperator.cs	(revision 11226)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterManipulatorOperator.cs	(revision 11227)
@@ -41,4 +41,6 @@
       return new AfterManipulatorOperator<T>(this, cloner);
     }
+    [StorableConstructor]
+    protected AfterManipulatorOperator(bool deserializing) : base(deserializing) { }
 
     public AfterManipulatorOperator() {
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs	(revision 11226)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs	(revision 11227)
@@ -54,4 +54,7 @@
     }
 
+    [StorableConstructor]
+    protected BeforeCrossoverOperator(bool deserializing) : base(deserializing) { }
+
     public BeforeCrossoverOperator() {
       Parameters.Add(new ScopeTreeLookupParameter<T>(ParentsParameterName));
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 11226)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 11227)
@@ -30,5 +30,4 @@
   [Item("AfterCrossoverOperator", "Performs an action after the crossover operator is applied.")]
   public class BeforeManipulatorOperator<T> : EvolutionTrackingOperator<T>, IManipulatorOperator<T> where T : class,IItem {
-
     private const string ChildParameterName = "Child";
 
@@ -43,4 +42,6 @@
       return new BeforeManipulatorOperator<T>(this, cloner);
     }
+    [StorableConstructor]
+    protected BeforeManipulatorOperator(bool deserializing) : base(deserializing) { }
 
     public BeforeManipulatorOperator() {
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/EvolutionTrackingOperator.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/EvolutionTrackingOperator.cs	(revision 11226)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/EvolutionTrackingOperator.cs	(revision 11227)
@@ -26,6 +26,9 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.EvolutionTracking {
+  [Item("EvolutionTrackingOperator", "A base operator which facilitates access to the genealogy graph.")]
+  [StorableClass]
   public class EvolutionTrackingOperator<T> : SingleSuccessorOperator where T : class,IItem {
     // evolution tracking-related parameters
@@ -69,4 +72,6 @@
       return new EvolutionTrackingOperator<T>(this, cloner);
     }
+    [StorableConstructor]
+    protected EvolutionTrackingOperator(bool deserializing) : base(deserializing) { }
   }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisGenealogyAnalyzer.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisGenealogyAnalyzer.cs	(revision 11226)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisGenealogyAnalyzer.cs	(revision 11227)
@@ -4,8 +4,12 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
-namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Analyzers {
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
+  [Item("SymbolicDataAnalysisGenealogyAnalyzer", "")]
   [StorableClass]
-  [Item("SymbolicDataAnalysisGenealogyAnalyzer", "")]
   public class SymbolicDataAnalysisGenealogyAnalyzer : GenealogyAnalyzer<ISymbolicExpressionTree> {
+    public SymbolicDataAnalysisGenealogyAnalyzer() { }
+
+    [StorableConstructor]
+    protected SymbolicDataAnalysisGenealogyAnalyzer(bool deserializing) : base(deserializing) { }
   }
 }
