Index: /trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs	(revision 3649)
+++ /trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs	(revision 3650)
@@ -34,4 +34,5 @@
 using HeuristicLab.Random;
 using HeuristicLab.Selection;
+using HeuristicLab.Analysis;
 
 namespace HeuristicLab.Algorithms.GeneticAlgorithm {
@@ -103,4 +104,10 @@
       get { return (ValueParameter<BoolValue>)Parameters["Parallel"]; }
     }
+    private ValueParameter<MultiAnalyzer<IMultiPopulationAnalyzer>> AnalyzerParameter {
+      get { return (ValueParameter<MultiAnalyzer<IMultiPopulationAnalyzer>>)Parameters["Analyzer"]; }
+    }
+    private ValueParameter<MultiAnalyzer<IPopulationAnalyzer>> IslandAnalyzerParameter {
+      get { return (ValueParameter<MultiAnalyzer<IPopulationAnalyzer>>)Parameters["IslandAnalyzer"]; }
+    }
     #endregion
 
@@ -169,4 +176,12 @@
       get { return ParallelParameter.Value; }
       set { ParallelParameter.Value = value; }
+    }
+    public MultiAnalyzer<IMultiPopulationAnalyzer> Analyzer {
+      get { return AnalyzerParameter.Value; }
+      set { AnalyzerParameter.Value = value; }
+    }
+    public MultiAnalyzer<IPopulationAnalyzer> IslandAnalyzer {
+      get { return IslandAnalyzerParameter.Value; }
+      set { IslandAnalyzerParameter.Value = value; }
     }
     private List<ISelector> selectors;
@@ -189,4 +204,6 @@
       get { return (IslandGeneticAlgorithmMainLoop)IslandProcessor.Successor; }
     }
+    private PopulationBestAverageWorstQualityAnalyzer islandQualityAnalyzer;
+    //private MultipopulationBestAverageWorstQualityAnalyzer qualityAnalyzer;
     #endregion
 
@@ -211,5 +228,7 @@
       Parameters.Add(new ValueParameter<IntValue>("Elites", "The numer of elite solutions which are kept in each generation.", new IntValue(1)));
       Parameters.Add(new ValueParameter<BoolValue>("Parallel", "True if the islands should be run in parallel (also requires a parallel engine)", new BoolValue(false)));
-
+      Parameters.Add(new ValueParameter<MultiAnalyzer<IMultiPopulationAnalyzer>>("Analyzer", "The operator used to analyze the islands.", new MultiAnalyzer<IMultiPopulationAnalyzer>()));
+      Parameters.Add(new ValueParameter<MultiAnalyzer<IPopulationAnalyzer>>("IslandAnalyzer", "The operator used to analyze each island.", new MultiAnalyzer<IPopulationAnalyzer>()));
+      
       RandomCreator randomCreator = new RandomCreator();
       SubScopesCreator populationCreator = new SubScopesCreator();
@@ -251,4 +270,6 @@
       mainLoop.RandomParameter.ActualName = randomCreator.RandomParameter.ActualName;
       mainLoop.ResultsParameter.ActualName = "Results";
+      mainLoop.AnalyzerParameter.ActualName = AnalyzerParameter.Name;
+      mainLoop.IslandAnalyzerParameter.ActualName = IslandAnalyzerParameter.Name;
 
       mainLoop.Successor = null;
@@ -275,6 +296,8 @@
       ParameterizeMainLoop();
       ParameterizeSelectors();
+      ParameterizeAnalyzers();
       UpdateCrossovers();
       UpdateMutators();
+      UpdateAnalyzers();
       Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
       base.OnProblemChanged();
@@ -291,4 +314,5 @@
       ParameterizeMainLoop();
       ParameterizeSelectors();
+      ParameterizeAnalyzers();
       Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
       base.Problem_EvaluatorChanged(sender, e);
@@ -298,4 +322,5 @@
       UpdateCrossovers();
       UpdateMutators();
+      UpdateAnalyzers();
       base.Problem_OperatorsChanged(sender, e);
     }
@@ -317,4 +342,5 @@
       ParameterizeMainLoop();
       ParameterizeSelectors();
+      ParameterizeAnalyzers();
     }
     private void MigrationRateParameter_ValueChanged(object sender, EventArgs e) {
@@ -331,5 +357,7 @@
     private void Initialize() {
       InitializeSelectors();
+      InitializeAnalyzers();
       UpdateSelectors();
+      UpdateAnalyzers();
       InitializeMigrators();
       UpdateMigrators();
@@ -368,4 +396,9 @@
       immigrationReplacers.AddRange(ApplicationManager.Manager.GetInstances<IReplacer>().OrderBy(x => x.Name));
       ParameterizeSelectors();
+    }
+    private void InitializeAnalyzers() {
+      islandQualityAnalyzer = new PopulationBestAverageWorstQualityAnalyzer();
+      //qualityAnalyzer = new MultipopulationBestAverageWorstQualityAnalyzer();
+      ParameterizeAnalyzers();
     }
     private void InitializeMigrators() {
@@ -403,4 +436,13 @@
       }
     }
+    private void ParameterizeAnalyzers() {
+      islandQualityAnalyzer.ResultsParameter.ActualName = "Results";
+      //qualityAnalyzer.ResultsParameter.ActualName = "Results";
+      if (Problem != null) {
+        islandQualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
+        islandQualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
+        islandQualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
+      }
+    }
     private void UpdateSelectors() {
       ISelector oldSelector = SelectorParameter.Value;
@@ -465,4 +507,17 @@
       }
     }
+    private void UpdateAnalyzers() {
+      IslandAnalyzer.Operators.Clear();
+      Analyzer.Operators.Clear();
+      IslandAnalyzer.Operators.Add(islandQualityAnalyzer);
+      //Analyzer.Operators.Add(qualityAnalyzer);
+      if (Problem != null) {
+        foreach (IPopulationAnalyzer analyzer in Problem.Operators.OfType<IPopulationAnalyzer>().OrderBy(x => x.Name)) {
+          IslandAnalyzer.Operators.Add(analyzer);
+        }
+        foreach (IMultiPopulationAnalyzer analyzer in Problem.Operators.OfType<IMultiPopulationAnalyzer>().OrderBy(x => x.Name))
+          Analyzer.Operators.Add(analyzer);
+      }
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithmMainLoop.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithmMainLoop.cs	(revision 3649)
+++ /trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithmMainLoop.cs	(revision 3650)
@@ -102,4 +102,7 @@
     public ValueLookupParameter<IOperator> AnalyzerParameter {
       get { return (ValueLookupParameter<IOperator>)Parameters["Analyzer"]; }
+    }
+    public ValueLookupParameter<IOperator> IslandAnalyzerParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["IslandAnalyzer"]; }
     }
     #endregion
@@ -129,5 +132,6 @@
       Parameters.Add(new ValueLookupParameter<IntValue>("Elites", "The numer of elite solutions which are kept in each generation."));
       Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The results collection to store the results."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("Analyzer", "The operator used to analyze each island."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Analyzer", "The operator used to the analyze the islands."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("IslandAnalyzer", "The operator used to analyze each island."));
       #endregion
 
@@ -136,16 +140,8 @@
       UniformSubScopesProcessor uniformSubScopesProcessor0 = new UniformSubScopesProcessor();
       VariableCreator islandVariableCreator = new VariableCreator();
-      BestQualityMemorizer islandBestQualityMemorizer1 = new BestQualityMemorizer();
-      BestAverageWorstQualityCalculator islandBestAverageWorstQualityCalculator1 = new BestAverageWorstQualityCalculator();
-      DataTableValuesCollector islandDataTableValuesCollector1 = new DataTableValuesCollector();
-      QualityDifferenceCalculator islandQualityDifferenceCalculator1 = new QualityDifferenceCalculator();
       Placeholder islandAnalyzer1 = new Placeholder();
-      ResultsCollector islandResultsCollector = new ResultsCollector();
-      BestQualityMemorizer bestQualityMemorizer1 = new BestQualityMemorizer();
-      BestQualityMemorizer bestQualityMemorizer2 = new BestQualityMemorizer();
-      BestAverageWorstQualityCalculator bestAverageWorstQualityCalculator1 = new BestAverageWorstQualityCalculator();
-      DataTableValuesCollector dataTableValuesCollector1 = new DataTableValuesCollector();
-      QualityDifferenceCalculator qualityDifferenceCalculator1 = new QualityDifferenceCalculator();
-      ResultsCollector resultsCollector = new ResultsCollector();
+      Placeholder analyzer1 = new Placeholder();
+      ResultsCollector resultsCollector1 = new ResultsCollector();
+      ResultsCollector resultsCollector2 = new ResultsCollector();
       UniformSubScopesProcessor uniformSubScopesProcessor1 = new UniformSubScopesProcessor();
       Placeholder selector = new Placeholder();
@@ -162,8 +158,4 @@
       RightReducer rightReducer = new RightReducer();
       MergingReducer mergingReducer = new MergingReducer();
-      BestQualityMemorizer islandBestQualityMemorizer2 = new BestQualityMemorizer();
-      BestAverageWorstQualityCalculator islandBestAverageWorstQualityCalculator2 = new BestAverageWorstQualityCalculator();
-      DataTableValuesCollector islandDataTableValuesCollector2 = new DataTableValuesCollector();
-      QualityDifferenceCalculator islandQualityDifferenceCalculator2 = new QualityDifferenceCalculator();
       Placeholder islandAnalyzer2 = new Placeholder();
       IntCounter generationsCounter = new IntCounter();
@@ -179,9 +171,6 @@
       Placeholder immigrationReplacer = new Placeholder();
       Comparator generationsComparator = new Comparator();
-      BestQualityMemorizer bestQualityMemorizer3 = new BestQualityMemorizer();
-      BestQualityMemorizer bestQualityMemorizer4 = new BestQualityMemorizer();
-      BestAverageWorstQualityCalculator bestAverageWorstQualityCalculator2 = new BestAverageWorstQualityCalculator();
-      DataTableValuesCollector dataTableValuesCollector2 = new DataTableValuesCollector();
-      QualityDifferenceCalculator qualityDifferenceCalculator2 = new QualityDifferenceCalculator();
+      Placeholder analyzer2 = new Placeholder();
+      ResultsCollector resultsCollector3 = new ResultsCollector();
       ConditionalBranch generationsTerminationCondition = new ConditionalBranch();
 
@@ -190,79 +179,20 @@
       variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Generations", new IntValue(0)));
 
-      islandVariableCreator.CollectedValues.Add(new ValueParameter<ResultCollection>("IslandResults", new ResultCollection()));
-
-      islandBestQualityMemorizer1.BestQualityParameter.ActualName = "BestQuality";
-      islandBestQualityMemorizer1.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      islandBestQualityMemorizer1.QualityParameter.ActualName = QualityParameter.Name;
-
-      islandBestAverageWorstQualityCalculator1.AverageQualityParameter.ActualName = "CurrentAverageQuality";
-      islandBestAverageWorstQualityCalculator1.BestQualityParameter.ActualName = "CurrentBestQuality";
-      islandBestAverageWorstQualityCalculator1.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      islandBestAverageWorstQualityCalculator1.QualityParameter.ActualName = QualityParameter.Name;
-      islandBestAverageWorstQualityCalculator1.WorstQualityParameter.ActualName = "CurrentWorstQuality";
-
-      islandDataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best Quality", null, "CurrentBestQuality"));
-      islandDataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Average Quality", null, "CurrentAverageQuality"));
-      islandDataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Worst Quality", null, "CurrentWorstQuality"));
-      islandDataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
-      islandDataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Known Quality", null, "BestKnownQuality"));
-      islandDataTableValuesCollector1.DataTableParameter.ActualName = "Qualities";
-
-      islandQualityDifferenceCalculator1.AbsoluteDifferenceParameter.ActualName = "AbsoluteDifferenceBestKnownToBest";
-      islandQualityDifferenceCalculator1.FirstQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      islandQualityDifferenceCalculator1.RelativeDifferenceParameter.ActualName = "RelativeDifferenceBestKnownToBest";
-      islandQualityDifferenceCalculator1.SecondQualityParameter.ActualName = "BestQuality";
-
-      islandAnalyzer1.Name = "Analyzer";
-      islandAnalyzer1.OperatorParameter.ActualName = "Analyzer";
-
-      islandResultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Generations"));
-      islandResultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best Quality", null, "CurrentBestQuality"));
-      islandResultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Average Quality", null, "CurrentAverageQuality"));
-      islandResultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Worst Quality", null, "CurrentWorstQuality"));
-      islandResultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
-      islandResultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Known Quality", null, "BestKnownQuality"));
-      islandResultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Absolute Difference of Best Known Quality to Best Quality", null, "AbsoluteDifferenceBestKnownToBest"));
-      islandResultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Relative Difference of Best Known Quality to Best Quality", null, "RelativeDifferenceBestKnownToBest"));
-      islandResultsCollector.CollectedValues.Add(new LookupParameter<DataTable>("Qualities"));
-      islandResultsCollector.ResultsParameter.ActualName = "IslandResults";
-
-      bestQualityMemorizer1.BestQualityParameter.ActualName = "BestQuality";
-      bestQualityMemorizer1.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestQualityMemorizer1.QualityParameter.ActualName = "BestQuality";
-
-      bestQualityMemorizer2.BestQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      bestQualityMemorizer2.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestQualityMemorizer2.QualityParameter.ActualName = "BestQuality";
-
-      bestAverageWorstQualityCalculator1.AverageQualityParameter.ActualName = "CurrentAverageBestQuality";
-      bestAverageWorstQualityCalculator1.BestQualityParameter.ActualName = "CurrentBestBestQuality";
-      bestAverageWorstQualityCalculator1.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestAverageWorstQualityCalculator1.QualityParameter.ActualName = "CurrentBestQuality";
-      bestAverageWorstQualityCalculator1.WorstQualityParameter.ActualName = "CurrentWorstBestQuality";
-
-      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best BestQuality", null, "CurrentBestBestQuality"));
-      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Average BestQuality", null, "CurrentAverageBestQuality"));
-      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Worst BestQuality", null, "CurrentWorstBestQuality"));
-      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
-      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Known Quality", null, BestKnownQualityParameter.Name));
-      dataTableValuesCollector1.DataTableParameter.ActualName = "BestQualities";
-
-      qualityDifferenceCalculator1.AbsoluteDifferenceParameter.ActualName = "AbsoluteDifferenceBestKnownToBest";
-      qualityDifferenceCalculator1.FirstQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      qualityDifferenceCalculator1.RelativeDifferenceParameter.ActualName = "RelativeDifferenceBestKnownToBest";
-      qualityDifferenceCalculator1.SecondQualityParameter.ActualName = "BestQuality";
-
-      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Migrations"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best BestQuality", null, "CurrentBestBestQuality"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Average BestQuality", null, "CurrentAverageBestQuality"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Worst BestQuality", null, "CurrentWorstBestQuality"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Known Quality", null, BestKnownQualityParameter.Name));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Absolute Difference of Best Known Quality to Best Quality", null, "AbsoluteDifferenceBestKnownToBest"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Relative Difference of Best Known Quality to Best Quality", null, "RelativeDifferenceBestKnownToBest"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>("BestQualities"));
-      resultsCollector.CollectedValues.Add(new SubScopesLookupParameter<ResultCollection>("IslandResults", "Result set for each island"));
-      resultsCollector.ResultsParameter.ActualName = ResultsParameter.Name;
+      islandVariableCreator.CollectedValues.Add(new ValueParameter<ResultCollection>("Results", new ResultCollection()));
+
+      islandAnalyzer1.Name = "Island Analyzer (placeholder)";
+      islandAnalyzer1.OperatorParameter.ActualName = IslandAnalyzerParameter.Name;
+
+      analyzer1.Name = "Analyzer (placeholder)";
+      analyzer1.OperatorParameter.ActualName = AnalyzerParameter.Name;
+
+      resultsCollector1.CollectedValues.Add(new LookupParameter<IntValue>("Migrations"));
+      resultsCollector1.CollectedValues.Add(new LookupParameter<IntValue>("Generations"));
+      resultsCollector1.ResultsParameter.ActualName = ResultsParameter.Name;
+
+      resultsCollector2.Name = "Reference Island Results";
+      resultsCollector2.CopyValue = new BoolValue(false);
+      resultsCollector2.CollectedValues.Add(new SubScopesLookupParameter<ResultCollection>("IslandResults", "Result set for each island", "Results"));
+      resultsCollector2.ResultsParameter.ActualName = ResultsParameter.Name;
 
       selector.Name = "Selector (placeholder)";
@@ -290,28 +220,6 @@
       bestSelector.QualityParameter.ActualName = QualityParameter.Name;
 
-      islandBestQualityMemorizer2.BestQualityParameter.ActualName = "BestQuality";
-      islandBestQualityMemorizer2.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      islandBestQualityMemorizer2.QualityParameter.ActualName = QualityParameter.Name;
-
-      islandBestAverageWorstQualityCalculator2.AverageQualityParameter.ActualName = "CurrentAverageQuality";
-      islandBestAverageWorstQualityCalculator2.BestQualityParameter.ActualName = "CurrentBestQuality";
-      islandBestAverageWorstQualityCalculator2.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      islandBestAverageWorstQualityCalculator2.QualityParameter.ActualName = QualityParameter.Name;
-      islandBestAverageWorstQualityCalculator2.WorstQualityParameter.ActualName = "CurrentWorstQuality";
-
-      islandDataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best Quality", null, "CurrentBestQuality"));
-      islandDataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Average Quality", null, "CurrentAverageQuality"));
-      islandDataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Worst Quality", null, "CurrentWorstQuality"));
-      islandDataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
-      islandDataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Known Quality", null, BestKnownQualityParameter.Name));
-      islandDataTableValuesCollector2.DataTableParameter.ActualName = "Qualities";
-
-      islandQualityDifferenceCalculator2.AbsoluteDifferenceParameter.ActualName = "AbsoluteDifferenceBestKnownToBest";
-      islandQualityDifferenceCalculator2.FirstQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      islandQualityDifferenceCalculator2.RelativeDifferenceParameter.ActualName = "RelativeDifferenceBestKnownToBest";
-      islandQualityDifferenceCalculator2.SecondQualityParameter.ActualName = "BestQuality";
-
-      islandAnalyzer2.Name = "Analyzer";
-      islandAnalyzer2.OperatorParameter.ActualName = "Analyzer";
+      islandAnalyzer2.Name = "Island Analyzer (placeholder)";
+      islandAnalyzer2.OperatorParameter.ActualName = IslandAnalyzerParameter.Name;
 
       generationsCounter.Name = "Generations + 1";
@@ -355,29 +263,10 @@
       generationsComparator.RightSideParameter.ActualName = MaximumGenerationsParameter.Name;
 
-      bestQualityMemorizer3.BestQualityParameter.ActualName = "BestQuality";
-      bestQualityMemorizer3.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestQualityMemorizer3.QualityParameter.ActualName = "BestQuality";
-
-      bestQualityMemorizer4.BestQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      bestQualityMemorizer4.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestQualityMemorizer4.QualityParameter.ActualName = "BestQuality";
-
-      bestAverageWorstQualityCalculator2.AverageQualityParameter.ActualName = "CurrentAverageBestQuality";
-      bestAverageWorstQualityCalculator2.BestQualityParameter.ActualName = "CurrentBestBestQuality";
-      bestAverageWorstQualityCalculator2.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestAverageWorstQualityCalculator2.QualityParameter.ActualName = "CurrentBestQuality";
-      bestAverageWorstQualityCalculator2.WorstQualityParameter.ActualName = "CurrentWorstBestQuality";
-
-      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best BestQuality", null, "CurrentBestBestQuality"));
-      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Average BestQuality", null, "CurrentAverageBestQuality"));
-      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Worst BestQuality", null, "CurrentWorstBestQuality"));
-      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
-      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Known Quality", null, BestKnownQualityParameter.Name));
-      dataTableValuesCollector2.DataTableParameter.ActualName = "BestQualities";
-
-      qualityDifferenceCalculator2.AbsoluteDifferenceParameter.ActualName = "AbsoluteDifferenceBestKnownToBest";
-      qualityDifferenceCalculator2.FirstQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      qualityDifferenceCalculator2.RelativeDifferenceParameter.ActualName = "RelativeDifferenceBestKnownToBest";
-      qualityDifferenceCalculator2.SecondQualityParameter.ActualName = "BestQuality";
+      analyzer2.Name = "Analyzer (placeholder)";
+      analyzer2.OperatorParameter.ActualName = AnalyzerParameter.Name;
+
+      resultsCollector3.CollectedValues.Add(new LookupParameter<IntValue>("Migrations"));
+      resultsCollector3.CollectedValues.Add(new LookupParameter<IntValue>("Generations"));
+      resultsCollector3.ResultsParameter.ActualName = ResultsParameter.Name;
 
       generationsTerminationCondition.Name = "Terminate?";
@@ -389,17 +278,10 @@
       variableCreator.Successor = uniformSubScopesProcessor0;
       uniformSubScopesProcessor0.Operator = islandVariableCreator;
-      uniformSubScopesProcessor0.Successor = bestQualityMemorizer1;
-      islandVariableCreator.Successor = islandBestQualityMemorizer1;
-      islandBestQualityMemorizer1.Successor = islandBestAverageWorstQualityCalculator1;
-      islandBestAverageWorstQualityCalculator1.Successor = islandDataTableValuesCollector1;
-      islandDataTableValuesCollector1.Successor = islandQualityDifferenceCalculator1;
-      islandQualityDifferenceCalculator1.Successor = islandAnalyzer1;
-      islandAnalyzer1.Successor = islandResultsCollector;
-      bestQualityMemorizer1.Successor = bestQualityMemorizer2;
-      bestQualityMemorizer2.Successor = bestAverageWorstQualityCalculator1;
-      bestAverageWorstQualityCalculator1.Successor = dataTableValuesCollector1;
-      dataTableValuesCollector1.Successor = qualityDifferenceCalculator1;
-      qualityDifferenceCalculator1.Successor = resultsCollector;
-      resultsCollector.Successor = uniformSubScopesProcessor1;
+      uniformSubScopesProcessor0.Successor = analyzer1;
+      islandVariableCreator.Successor = islandAnalyzer1;
+      islandAnalyzer1.Successor = null;
+      analyzer1.Successor = resultsCollector1;
+      resultsCollector1.Successor = resultsCollector2;
+      resultsCollector2.Successor = uniformSubScopesProcessor1;
       uniformSubScopesProcessor1.Operator = selector;
       uniformSubScopesProcessor1.Successor = generationsCounter;
@@ -423,9 +305,5 @@
       bestSelector.Successor = rightReducer;
       rightReducer.Successor = null;
-      mergingReducer.Successor = islandBestQualityMemorizer2;
-      islandBestQualityMemorizer2.Successor = islandBestAverageWorstQualityCalculator2;
-      islandBestAverageWorstQualityCalculator2.Successor = islandDataTableValuesCollector2;
-      islandDataTableValuesCollector2.Successor = islandQualityDifferenceCalculator2;
-      islandQualityDifferenceCalculator2.Successor = islandAnalyzer2;
+      mergingReducer.Successor = islandAnalyzer2;
       islandAnalyzer2.Successor = null;
       generationsCounter.Successor = generationsSinceLastMigrationCounter;
@@ -442,10 +320,7 @@
       uniformSubScopesProcessor4.Operator = immigrationReplacer;
       uniformSubScopesProcessor4.Successor = null;
-      generationsComparator.Successor = bestQualityMemorizer3;
-      bestQualityMemorizer3.Successor = bestQualityMemorizer4;
-      bestQualityMemorizer4.Successor = bestAverageWorstQualityCalculator2;
-      bestAverageWorstQualityCalculator2.Successor = dataTableValuesCollector2;
-      dataTableValuesCollector2.Successor = qualityDifferenceCalculator2;
-      qualityDifferenceCalculator2.Successor = generationsTerminationCondition;
+      generationsComparator.Successor = analyzer2;
+      analyzer2.Successor = resultsCollector3;
+      resultsCollector3.Successor = generationsTerminationCondition;
       generationsTerminationCondition.TrueBranch = null;
       generationsTerminationCondition.FalseBranch = uniformSubScopesProcessor1;
Index: /trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs	(revision 3649)
+++ /trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs	(revision 3650)
@@ -23,7 +23,7 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Analysis;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
 using HeuristicLab.Optimization.Operators;
@@ -101,4 +101,7 @@
       get { return (ValueLookupParameter<IntValue>)Parameters["SelectedParents"]; }
     }
+    private ValueParameter<MultiAnalyzer<IPopulationAnalyzer>> AnalyzerParameter {
+      get { return (ValueParameter<MultiAnalyzer<IPopulationAnalyzer>>)Parameters["Analyzer"]; }
+    }
     #endregion
 
@@ -167,4 +170,8 @@
       get { return SelectedParentsParameter.Value; }
       set { SelectedParentsParameter.Value = value; }
+    }
+    public MultiAnalyzer<IPopulationAnalyzer> Analyzer {
+      get { return AnalyzerParameter.Value; }
+      set { AnalyzerParameter.Value = value; }
     }
     private RandomCreator RandomCreator {
@@ -204,5 +211,6 @@
       Parameters.Add(new ValueLookupParameter<BoolValue>("OffspringSelectionBeforeMutation", "True if the offspring selection step should be applied before mutation, false if it should be applied after mutation.", new BoolValue(false)));
       Parameters.Add(new ValueLookupParameter<IntValue>("SelectedParents", "Should be about 2 * PopulationSize, for large problems use a smaller value to decrease memory footprint.", new IntValue(200)));
-
+      Parameters.Add(new ValueParameter<MultiAnalyzer<IPopulationAnalyzer>>("Analyzer", "The operator used to analyze each generation.", new MultiAnalyzer<IPopulationAnalyzer>()));
+      
       RandomCreator randomCreator = new RandomCreator();
       SolutionsCreator solutionsCreator = new SolutionsCreator();
@@ -250,6 +258,8 @@
       ParameterizMainLoop();
       ParameterizeSelectors();
+      ParameterizeAnalyzers();
       UpdateCrossovers();
       UpdateMutators();
+      UpdateAnalyzers();
       Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
       base.OnProblemChanged();
@@ -266,4 +276,5 @@
       ParameterizMainLoop();
       ParameterizeSelectors();
+      ParameterizeAnalyzers();
       Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
       base.Problem_EvaluatorChanged(sender, e);
@@ -273,4 +284,5 @@
       UpdateCrossovers();
       UpdateMutators();
+      UpdateAnalyzers();
       base.Problem_OperatorsChanged(sender, e);
     }
@@ -292,4 +304,5 @@
       ParameterizMainLoop();
       ParameterizeSelectors();
+      ParameterizeAnalyzers();
     }
     #endregion
@@ -299,5 +312,7 @@
     private void Initialize() {
       InitializeSelectors();
+      InitializeAnalyzers();
       UpdateSelectors();
+      UpdateAnalyzers();
       InitializeComparisonFactorModifiers();
       UpdateComparisonFactorModifiers();
@@ -317,5 +332,4 @@
     }
     private void ParameterizMainLoop() {
-      MainLoop.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
       MainLoop.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
       MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
@@ -330,4 +344,8 @@
       selectors.AddRange(ApplicationManager.Manager.GetInstances<ISelector>().Where(x => !(x is IMultiObjectiveSelector)).OrderBy(x => x.Name));
       ParameterizeSelectors();
+    }
+    private void InitializeAnalyzers() {
+      //qualityAnalyzer = new PopulationBestAverageWorstQualityAnalyzer();
+      ParameterizeAnalyzers();
     }
     private void InitializeComparisonFactorModifiers() {
@@ -348,4 +366,12 @@
           selector.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
         }
+      }
+    }
+    private void ParameterizeAnalyzers() {
+      //qualityAnalyzer.ResultsParameter.ActualName = "Results";
+      if (Problem != null) {
+        //qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
+        //qualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
+        //qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
       }
     }
@@ -406,4 +432,12 @@
       }
     }
+    private void UpdateAnalyzers() {
+      Analyzer.Operators.Clear();
+      //Analyzer.Operators.Add(qualityAnalyzer);
+      if (Problem != null) {
+        foreach (IPopulationAnalyzer analyzer in Problem.Operators.OfType<IPopulationAnalyzer>().OrderBy(x => x.Name))
+          Analyzer.Operators.Add(analyzer);
+      }
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainLoop.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainLoop.cs	(revision 3649)
+++ /trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainLoop.cs	(revision 3650)
@@ -46,7 +46,4 @@
       get { return (SubScopesLookupParameter<DoubleValue>)Parameters["Quality"]; }
     }
-    public ValueLookupParameter<DoubleValue> BestKnownQualityParameter {
-      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
-    }
     public ValueLookupParameter<IOperator> SelectorParameter {
       get { return (ValueLookupParameter<IOperator>)Parameters["Selector"]; }
@@ -73,9 +70,6 @@
       get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
     }
-    public ValueLookupParameter<IOperator> VisualizerParameter {
-      get { return (ValueLookupParameter<IOperator>)Parameters["Visualizer"]; }
-    }
-    public LookupParameter<IItem> VisualizationParameter {
-      get { return (LookupParameter<IItem>)Parameters["Visualization"]; }
+    public ValueLookupParameter<IOperator> AnalyzerParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["Analyzer"]; }
     }
     public ValueLookupParameter<DoubleValue> SuccessRatioParameter {
@@ -120,6 +114,5 @@
       Parameters.Add(new ValueLookupParameter<IntValue>("MaximumGenerations", "The maximum number of generations which should be processed."));
       Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The variable collection where results should be stored."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("Visualizer", "The operator used to visualize solutions."));
-      Parameters.Add(new LookupParameter<IItem>("Visualization", "The item which represents the visualization of solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Analyzer", "The operator used to analyze each generation."));
       Parameters.Add(new ValueLookupParameter<DoubleValue>("SuccessRatio", "The ratio of successful to total children that should be achieved."));
       Parameters.Add(new ValueLookupParameter<DoubleValue>("ComparisonFactorLowerBound", "The lower bound of the comparison factor (start)."));
@@ -131,245 +124,74 @@
 
       #region Create operators
-      ConditionalBranch initializationBranch = new ConditionalBranch();
       VariableCreator variableCreator = new VariableCreator();
-      Assigner variableAssigner = new Assigner();
-      BestQualityMemorizer bestQualityMemorizer1 = new BestQualityMemorizer();
-      BestQualityMemorizer bestQualityMemorizer2 = new BestQualityMemorizer();
-      BestAverageWorstQualityCalculator bestAverageWorstQualityCalculator1 = new BestAverageWorstQualityCalculator();
-      DataTableValuesCollector dataTableValuesCollector1 = new DataTableValuesCollector();
-      DataTableValuesCollector selPressDataTableValuesCollector1 = new DataTableValuesCollector();
-      QualityDifferenceCalculator qualityDifferenceCalculator1 = new QualityDifferenceCalculator();
-      Placeholder visualizer1 = new Placeholder();
-      ResultsCollector resultsCollector = new ResultsCollector();
-      Placeholder selector = new Placeholder();
-      SubScopesProcessor subScopesProcessor1 = new SubScopesProcessor();
-      ChildrenCreator childrenCreator = new ChildrenCreator();
-      UniformSubScopesProcessor uniformSubScopesProcessor = new UniformSubScopesProcessor();
-      Placeholder crossover = new Placeholder();
-      ConditionalBranch osBeforeMutationBranch = new ConditionalBranch();
-      Placeholder evaluator1 = new Placeholder();
-      IntCounter evaluationCounter1 = new IntCounter();
-      WeightedParentsQualityComparator qualityComparer1 = new WeightedParentsQualityComparator();
-      StochasticBranch mutationBranch1 = new StochasticBranch();
-      Placeholder mutator1 = new Placeholder();
-      Placeholder evaluator2 = new Placeholder();
-      IntCounter evaluationCounter2 = new IntCounter();
-      StochasticBranch mutationBranch2 = new StochasticBranch();
-      Placeholder mutator2 = new Placeholder();
-      Placeholder evaluator3 = new Placeholder();
-      IntCounter evaluationCounter3 = new IntCounter();
-      WeightedParentsQualityComparator qualityComparer2 = new WeightedParentsQualityComparator();
-      SubScopesRemover subScopesRemover = new SubScopesRemover();
-      ConditionalSelector conditionalSelector = new ConditionalSelector();
-      OffspringSelector offspringSelector = new OffspringSelector();
-      SubScopesProcessor subScopesProcessor2 = new SubScopesProcessor();
-      BestSelector bestSelector = new BestSelector();
-      RightReducer rightReducer = new RightReducer();
-      MergingReducer mergingReducer = new MergingReducer();
-      IntCounter intCounter = new IntCounter();
       Placeholder comparisonFactorModifier = new Placeholder();
-      Comparator comparator1 = new Comparator();
-      Comparator comparator2 = new Comparator();
-      Assigner evaluatedSolutionsAssigner = new Assigner();
-      ResultsCollector evalSolCollector = new ResultsCollector();
-      BestQualityMemorizer bestQualityMemorizer3 = new BestQualityMemorizer();
-      BestQualityMemorizer bestQualityMemorizer4 = new BestQualityMemorizer();
-      BestAverageWorstQualityCalculator bestAverageWorstQualityCalculator2 = new BestAverageWorstQualityCalculator();
-      DataTableValuesCollector dataTableValuesCollector2 = new DataTableValuesCollector();
-      DataTableValuesCollector selPressDataTableValuesCollector2 = new DataTableValuesCollector();
-      QualityDifferenceCalculator qualityDifferenceCalculator2 = new QualityDifferenceCalculator();
-      Placeholder visualizer2 = new Placeholder();
+      Placeholder analyzer1 = new Placeholder();
+      ResultsCollector resultsCollector1 = new ResultsCollector();
+      OffspringSelectionGeneticAlgorithmMainOperator mainOperator = new OffspringSelectionGeneticAlgorithmMainOperator();
+      IntCounter generationsCounter = new IntCounter();
+      Comparator maxGenerationsComparator = new Comparator();
+      Comparator maxSelectionPressureComparator = new Comparator();
+      Placeholder analyzer2 = new Placeholder();
+      ResultsCollector resultsCollector2 = new ResultsCollector();
       ConditionalBranch conditionalBranch1 = new ConditionalBranch();
       ConditionalBranch conditionalBranch2 = new ConditionalBranch();
 
-      initializationBranch.ConditionParameter.ActualName = "IsInitialized";
-
-      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Generations", new IntValue(0))); // this variable is referenced in SASEGASAMainLoop, do not change!
+      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Generations", new IntValue(0)));
       variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("EvaluatedSolutions", new IntValue(0)));
       variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>("SelectionPressure", new DoubleValue(0)));
       variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>("CurrentSuccessRatio", new DoubleValue(0)));
-      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("EvaluatedSolutionsResult", new IntValue(0)));
-      variableCreator.CollectedValues.Add(new ValueParameter<BoolValue>("IsInitialized", new BoolValue(true)));
-
-      variableAssigner.LeftSideParameter.ActualName = "ComparisonFactor"; // this variable is referenced in SASEGASA, OffspringSelectionGeneticAlgorithm, do not change!
-      variableAssigner.RightSideParameter.ActualName = ComparisonFactorLowerBoundParameter.Name;
-
-      bestQualityMemorizer1.BestQualityParameter.ActualName = "BestQuality";
-      bestQualityMemorizer1.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestQualityMemorizer1.QualityParameter.ActualName = QualityParameter.Name;
-
-      bestQualityMemorizer2.BestQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      bestQualityMemorizer2.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestQualityMemorizer2.QualityParameter.ActualName = QualityParameter.Name;
-
-      bestAverageWorstQualityCalculator1.AverageQualityParameter.ActualName = "CurrentAverageQuality";
-      bestAverageWorstQualityCalculator1.BestQualityParameter.ActualName = "CurrentBestQuality";
-      bestAverageWorstQualityCalculator1.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestAverageWorstQualityCalculator1.QualityParameter.ActualName = QualityParameter.Name;
-      bestAverageWorstQualityCalculator1.WorstQualityParameter.ActualName = "CurrentWorstQuality";
-
-      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best Quality", null, "CurrentBestQuality"));
-      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Average Quality", null, "CurrentAverageQuality"));
-      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Worst Quality", null, "CurrentWorstQuality"));
-      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
-      dataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Known Quality", null, BestKnownQualityParameter.Name));
-      dataTableValuesCollector1.DataTableParameter.ActualName = "Qualities";
-
-      selPressDataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Selection Pressure", null, "SelectionPressure"));
-      selPressDataTableValuesCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Maximum Selection Pressure", null, MaximumSelectionPressureParameter.Name));
-      selPressDataTableValuesCollector1.DataTableParameter.ActualName = "SelectionPressures";
-
-      qualityDifferenceCalculator1.AbsoluteDifferenceParameter.ActualName = "AbsoluteDifferenceBestKnownToBest";
-      qualityDifferenceCalculator1.FirstQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      qualityDifferenceCalculator1.RelativeDifferenceParameter.ActualName = "RelativeDifferenceBestKnownToBest";
-      qualityDifferenceCalculator1.SecondQualityParameter.ActualName = "BestQuality";
-
-      visualizer1.Name = "Visualizer (placeholder)";
-      visualizer1.OperatorParameter.ActualName = VisualizerParameter.Name;
-
-      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Generations"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best Quality", null, "CurrentBestQuality"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Average Quality", null, "CurrentAverageQuality"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Worst Quality", null, "CurrentWorstQuality"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Known Quality", null, BestKnownQualityParameter.Name));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Absolute Difference of Best Known Quality to Best Quality", null, "AbsoluteDifferenceBestKnownToBest"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Relative Difference of Best Known Quality to Best Quality", null, "RelativeDifferenceBestKnownToBest"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Evaluated Solutions", null, "EvaluatedSolutionsResult"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Curent Comparison Factor", null, "ComparisonFactor"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Selection Pressure", null, "SelectionPressure"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Success Ratio", null, "CurrentSuccessRatio"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<IItem>("Solution Visualization", null, VisualizationParameter.Name));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>("Qualities"));
-      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>("SelectionPressures"));
-      resultsCollector.ResultsParameter.ActualName = ResultsParameter.Name;
-
-      selector.Name = "Selector (placeholder)";
-      selector.OperatorParameter.ActualName = SelectorParameter.Name;
-
-      childrenCreator.ParentsPerChild = new IntValue(2);
-
-      crossover.Name = "Crossover (placeholder)";
-      crossover.OperatorParameter.ActualName = CrossoverParameter.Name;
-
-      osBeforeMutationBranch.Name = "Apply OS before mutation?";
-      osBeforeMutationBranch.ConditionParameter.ActualName = OffspringSelectionBeforeMutationParameter.Name;
-
-      evaluator1.Name = "Evaluator (placeholder)";
-      evaluator1.OperatorParameter.ActualName = EvaluatorParameter.Name;
-
-      evaluationCounter1.Name = "EvaluatedSolutions++";
-      evaluationCounter1.Increment = new IntValue(1);
-      evaluationCounter1.ValueParameter.ActualName = "EvaluatedSolutions";
-
-      qualityComparer1.ComparisonFactorParameter.ActualName = "ComparisonFactor";
-      qualityComparer1.LeftSideParameter.ActualName = QualityParameter.Name;
-      qualityComparer1.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      qualityComparer1.RightSideParameter.ActualName = QualityParameter.Name;
-      qualityComparer1.ResultParameter.ActualName = "SuccessfulOffspring";
-
-      mutationBranch1.ProbabilityParameter.ActualName = MutationProbabilityParameter.Name;
-      mutationBranch1.RandomParameter.ActualName = RandomParameter.Name;
-
-      mutator1.Name = "Mutator (placeholder)";
-      mutator1.OperatorParameter.ActualName = MutatorParameter.Name;
-
-      evaluator2.Name = "Evaluator (placeholder)";
-      evaluator2.OperatorParameter.ActualName = EvaluatorParameter.Name;
-
-      evaluationCounter2.Name = "EvaluatedSolutions++";
-      evaluationCounter2.Increment = new IntValue(1);
-      evaluationCounter2.ValueParameter.ActualName = "EvaluatedSolutions";
-
-      mutationBranch2.ProbabilityParameter.ActualName = MutationProbabilityParameter.Name;
-      mutationBranch2.RandomParameter.ActualName = RandomParameter.Name;
-
-      mutator2.Name = "Mutator (placeholder)";
-      mutator2.OperatorParameter.ActualName = MutatorParameter.Name;
-
-      evaluator3.Name = "Evaluator (placeholder)";
-      evaluator3.OperatorParameter.ActualName = EvaluatorParameter.Name;
-
-      evaluationCounter3.Name = "EvaluatedSolutions++";
-      evaluationCounter3.Increment = new IntValue(1);
-      evaluationCounter3.ValueParameter.ActualName = "EvaluatedSolutions";
-
-      qualityComparer2.ComparisonFactorParameter.ActualName = "ComparisonFactor";
-      qualityComparer2.LeftSideParameter.ActualName = QualityParameter.Name;
-      qualityComparer2.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      qualityComparer2.RightSideParameter.ActualName = QualityParameter.Name;
-      qualityComparer2.ResultParameter.ActualName = "SuccessfulOffspring";
-
-      subScopesRemover.RemoveAllSubScopes = true;
-
-      conditionalSelector.CopySelected = new BoolValue(false);
-      conditionalSelector.ConditionParameter.ActualName = "SuccessfulOffspring";
-
-      offspringSelector.CurrentSuccessRatioParameter.ActualName = "CurrentSuccessRatio";
-      offspringSelector.LuckyLosersParameter.ActualName = "OSLuckyLosers";
-      offspringSelector.MaximumSelectionPressureParameter.ActualName = MaximumSelectionPressureParameter.Name;
-      offspringSelector.SelectionPressureParameter.ActualName = "SelectionPressure";
-      offspringSelector.SuccessRatioParameter.ActualName = SuccessRatioParameter.Name;
-      offspringSelector.WinnersParameter.ActualName = "OSWinners";
-
-      bestSelector.CopySelected = new BoolValue(false);
-      bestSelector.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestSelector.NumberOfSelectedSubScopesParameter.ActualName = ElitesParameter.Name;
-      bestSelector.QualityParameter.ActualName = QualityParameter.Name;
-
-      intCounter.Increment = new IntValue(1);
-      intCounter.ValueParameter.ActualName = "Generations";
 
       comparisonFactorModifier.Name = "Modify ComparisonFactor (placeholder)";
       comparisonFactorModifier.OperatorParameter.ActualName = ComparisonFactorModifierParameter.Name;
 
-      comparator1.Comparison = new Comparison(ComparisonType.GreaterOrEqual);
-      comparator1.LeftSideParameter.ActualName = "Generations";
-      comparator1.ResultParameter.ActualName = "TerminateMaximumGenerations";
-      comparator1.RightSideParameter.ActualName = MaximumGenerationsParameter.Name;
-
-      comparator2.Comparison = new Comparison(ComparisonType.GreaterOrEqual);
-      comparator2.LeftSideParameter.ActualName = "SelectionPressure";
-      comparator2.ResultParameter.ActualName = "TerminateSelectionPressure";
-      comparator2.RightSideParameter.ActualName = MaximumSelectionPressureParameter.Name;
-
-      evaluatedSolutionsAssigner.LeftSideParameter.ActualName = "EvaluatedSolutionsResult";
-      evaluatedSolutionsAssigner.RightSideParameter.ActualName = "EvaluatedSolutions";
-
-      evalSolCollector.CollectedValues.Add(new LookupParameter<IntValue>("Evaluated Solutions", null, "EvaluatedSolutionsResult"));
-      evalSolCollector.ResultsParameter.ActualName = ResultsParameter.Name;
-
-      bestQualityMemorizer3.BestQualityParameter.ActualName = "BestQuality";
-      bestQualityMemorizer3.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestQualityMemorizer3.QualityParameter.ActualName = QualityParameter.Name;
-
-      bestQualityMemorizer4.BestQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      bestQualityMemorizer4.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestQualityMemorizer4.QualityParameter.ActualName = QualityParameter.Name;
-
-      bestAverageWorstQualityCalculator2.AverageQualityParameter.ActualName = "CurrentAverageQuality";
-      bestAverageWorstQualityCalculator2.BestQualityParameter.ActualName = "CurrentBestQuality";
-      bestAverageWorstQualityCalculator2.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      bestAverageWorstQualityCalculator2.QualityParameter.ActualName = QualityParameter.Name;
-      bestAverageWorstQualityCalculator2.WorstQualityParameter.ActualName = "CurrentWorstQuality";
-
-      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Best Quality", null, "CurrentBestQuality"));
-      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Average Quality", null, "CurrentAverageQuality"));
-      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Worst Quality", null, "CurrentWorstQuality"));
-      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Quality", null, "BestQuality"));
-      dataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Known Quality", null, BestKnownQualityParameter.Name));
-      dataTableValuesCollector2.DataTableParameter.ActualName = "Qualities";
-
-      selPressDataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Selection Pressure", null, "SelectionPressure"));
-      selPressDataTableValuesCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Maximum Selection Pressure", null, MaximumSelectionPressureParameter.Name));
-      selPressDataTableValuesCollector2.DataTableParameter.ActualName = "SelectionPressures";
-
-      qualityDifferenceCalculator2.AbsoluteDifferenceParameter.ActualName = "AbsoluteDifferenceBestKnownToBest";
-      qualityDifferenceCalculator2.FirstQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      qualityDifferenceCalculator2.RelativeDifferenceParameter.ActualName = "RelativeDifferenceBestKnownToBest";
-      qualityDifferenceCalculator2.SecondQualityParameter.ActualName = "BestQuality";
-
-      visualizer2.Name = "Visualizer (placeholder)";
-      visualizer2.OperatorParameter.ActualName = VisualizerParameter.Name;
+      analyzer1.Name = "Analyzer (placeholder)";
+      analyzer1.OperatorParameter.ActualName = AnalyzerParameter.Name;
+
+      resultsCollector1.CollectedValues.Add(new LookupParameter<IntValue>("Generations"));
+      resultsCollector1.CollectedValues.Add(new LookupParameter<IntValue>("Evaluated Solutions", null, "EvaluatedSolutions"));
+      resultsCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Curent Comparison Factor", null, "ComparisonFactor"));
+      resultsCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Selection Pressure", null, "SelectionPressure"));
+      resultsCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Success Ratio", null, "CurrentSuccessRatio"));
+      resultsCollector1.ResultsParameter.ActualName = ResultsParameter.Name;
+
+      mainOperator.ComparisonFactorParameter.ActualName = "ComparisonFactor";
+      mainOperator.CrossoverParameter.ActualName = CrossoverParameter.Name;
+      mainOperator.CurrentSuccessRatioParameter.ActualName = "CurrentSuccessRatio";
+      mainOperator.ElitesParameter.ActualName = ElitesParameter.Name;
+      mainOperator.EvaluatedSolutionsParameter.ActualName = "EvaluatedSolutions";
+      mainOperator.EvaluatorParameter.ActualName = EvaluatorParameter.Name;
+      mainOperator.MaximizationParameter.ActualName = MaximizationParameter.Name;
+      mainOperator.MaximumSelectionPressureParameter.ActualName = MaximumSelectionPressureParameter.Name;
+      mainOperator.MutationProbabilityParameter.ActualName = MutationProbabilityParameter.Name;
+      mainOperator.MutatorParameter.ActualName = MutatorParameter.Name;
+      mainOperator.OffspringSelectionBeforeMutationParameter.ActualName = OffspringSelectionBeforeMutationParameter.Name;
+      mainOperator.QualityParameter.ActualName = QualityParameter.Name;
+      mainOperator.RandomParameter.ActualName = RandomParameter.Name;
+      mainOperator.SelectionPressureParameter.ActualName = "SelectionPressure";
+      mainOperator.SelectorParameter.ActualName = SelectorParameter.Name;
+      mainOperator.SuccessRatioParameter.ActualName = SuccessRatioParameter.Name;
+
+      generationsCounter.Increment = new IntValue(1);
+      generationsCounter.ValueParameter.ActualName = "Generations";
+
+      maxGenerationsComparator.Comparison = new Comparison(ComparisonType.GreaterOrEqual);
+      maxGenerationsComparator.LeftSideParameter.ActualName = "Generations";
+      maxGenerationsComparator.ResultParameter.ActualName = "TerminateMaximumGenerations";
+      maxGenerationsComparator.RightSideParameter.ActualName = MaximumGenerationsParameter.Name;
+
+      maxSelectionPressureComparator.Comparison = new Comparison(ComparisonType.GreaterOrEqual);
+      maxSelectionPressureComparator.LeftSideParameter.ActualName = "SelectionPressure";
+      maxSelectionPressureComparator.ResultParameter.ActualName = "TerminateSelectionPressure";
+      maxSelectionPressureComparator.RightSideParameter.ActualName = MaximumSelectionPressureParameter.Name;
+
+      analyzer2.Name = "Analyzer (placeholder)";
+      analyzer2.OperatorParameter.ActualName = AnalyzerParameter.Name;
+
+      resultsCollector2.CollectedValues.Add(new LookupParameter<IntValue>("Generations"));
+      resultsCollector2.CollectedValues.Add(new LookupParameter<IntValue>("Evaluated Solutions", null, "EvaluatedSolutions"));
+      resultsCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Curent Comparison Factor", null, "ComparisonFactor"));
+      resultsCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Selection Pressure", null, "SelectionPressure"));
+      resultsCollector2.CollectedValues.Add(new LookupParameter<DoubleValue>("Current Success Ratio", null, "CurrentSuccessRatio"));
+      resultsCollector2.ResultsParameter.ActualName = ResultsParameter.Name;
 
       conditionalBranch1.Name = "MaximumSelectionPressure reached?";
@@ -377,73 +199,23 @@
 
       conditionalBranch2.Name = "MaximumGenerations reached?";
-      conditionalBranch2.ConditionParameter.ActualName = "TerminateMaximumGenerations"; // this variable is referenced in SASEGASAMainLoop, do not change!
+      conditionalBranch2.ConditionParameter.ActualName = "TerminateMaximumGenerations";
       #endregion
 
       #region Create operator graph
-      OperatorGraph.InitialOperator = initializationBranch;
-      initializationBranch.FalseBranch = variableCreator;
-      initializationBranch.Successor = selector;
-      variableCreator.Successor = variableAssigner;
-      variableAssigner.Successor = bestQualityMemorizer1;
-      bestQualityMemorizer1.Successor = bestQualityMemorizer2;
-      bestQualityMemorizer2.Successor = bestAverageWorstQualityCalculator1;
-      bestAverageWorstQualityCalculator1.Successor = dataTableValuesCollector1;
-      dataTableValuesCollector1.Successor = selPressDataTableValuesCollector1;
-      selPressDataTableValuesCollector1.Successor = qualityDifferenceCalculator1;
-      qualityDifferenceCalculator1.Successor = visualizer1;
-      visualizer1.Successor = resultsCollector;
-      resultsCollector.Successor = null;
-      selector.Successor = subScopesProcessor1;
-      subScopesProcessor1.Operators.Add(new EmptyOperator());
-      subScopesProcessor1.Operators.Add(childrenCreator);
-      subScopesProcessor1.Successor = offspringSelector;
-      childrenCreator.Successor = uniformSubScopesProcessor;
-      uniformSubScopesProcessor.Operator = crossover;
-      uniformSubScopesProcessor.Successor = conditionalSelector;
-      crossover.Successor = osBeforeMutationBranch;
-      osBeforeMutationBranch.TrueBranch = evaluator1;
-      osBeforeMutationBranch.FalseBranch = mutationBranch2;
-      osBeforeMutationBranch.Successor = subScopesRemover;
-      evaluator1.Successor = evaluationCounter1;
-      evaluationCounter1.Successor = qualityComparer1;
-      qualityComparer1.Successor = mutationBranch1;
-      mutationBranch1.FirstBranch = mutator1;
-      mutationBranch1.SecondBranch = null;
-      mutationBranch1.Successor = null;
-      mutator1.Successor = evaluator2;
-      evaluator2.Successor = evaluationCounter2;
-      evaluationCounter2.Successor = null;
-      mutationBranch2.FirstBranch = mutator2;
-      mutationBranch2.SecondBranch = null;
-      mutationBranch2.Successor = evaluator3;
-      mutator2.Successor = null;
-      evaluator3.Successor = evaluationCounter3;
-      evaluationCounter3.Successor = qualityComparer2;
-      subScopesRemover.Successor = null;
-      offspringSelector.OffspringCreator = selector;
-      offspringSelector.Successor = subScopesProcessor2;
-      subScopesProcessor2.Operators.Add(bestSelector);
-      subScopesProcessor2.Operators.Add(new EmptyOperator());
-      subScopesProcessor2.Successor = mergingReducer;
-      bestSelector.Successor = rightReducer;
-      rightReducer.Successor = null;
-      mergingReducer.Successor = intCounter;
-      intCounter.Successor = comparisonFactorModifier;
-      comparisonFactorModifier.Successor = comparator1;
-      comparator1.Successor = comparator2;
-      comparator2.Successor = evaluatedSolutionsAssigner;
-      evaluatedSolutionsAssigner.Successor = evalSolCollector;
-      evalSolCollector.Successor = bestQualityMemorizer3;
-      bestQualityMemorizer3.Successor = bestQualityMemorizer4;
-      bestQualityMemorizer4.Successor = bestAverageWorstQualityCalculator2;
-      bestAverageWorstQualityCalculator2.Successor = dataTableValuesCollector2;
-      dataTableValuesCollector2.Successor = selPressDataTableValuesCollector2;
-      selPressDataTableValuesCollector2.Successor = qualityDifferenceCalculator2;
-      qualityDifferenceCalculator2.Successor = visualizer2;
-      visualizer2.Successor = conditionalBranch1;
+      OperatorGraph.InitialOperator = variableCreator;
+      variableCreator.Successor = comparisonFactorModifier;
+      comparisonFactorModifier.Successor = analyzer1;
+      analyzer1.Successor = resultsCollector1;
+      resultsCollector1.Successor = mainOperator;
+      mainOperator.Successor = generationsCounter;
+      generationsCounter.Successor = maxGenerationsComparator;
+      maxGenerationsComparator.Successor = maxSelectionPressureComparator;
+      maxSelectionPressureComparator.Successor = analyzer2;
+      analyzer2.Successor = resultsCollector2;
+      resultsCollector2.Successor = conditionalBranch1;
       conditionalBranch1.FalseBranch = conditionalBranch2;
       conditionalBranch1.TrueBranch = null;
       conditionalBranch1.Successor = null;
-      conditionalBranch2.FalseBranch = selector;
+      conditionalBranch2.FalseBranch = mainOperator;
       conditionalBranch2.TrueBranch = null;
       conditionalBranch2.Successor = null;
