Index: trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGA.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGA.cs	(revision 2917)
+++ trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGA.cs	(revision 2924)
@@ -52,6 +52,6 @@
       get { return (ConstrainedValueParameter<ICrossover>)Parameters["Crossover"]; }
     }
-    private ConstrainedValueParameter<IManipulator> MutatorParameter {
-      get { return (ConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; }
+    private OptionalConstrainedValueParameter<IManipulator> MutatorParameter {
+      get { return (OptionalConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; }
     }
     private ValueParameter<IntData> ElitesParameter {
@@ -75,5 +75,5 @@
       Parameters.Add(new ConstrainedValueParameter<ICrossover>("Crossover", "The operator used to cross solutions."));
       Parameters.Add(new ValueParameter<DoubleData>("MutationProbability", "The probability that the mutation operator is applied on a solution.", new DoubleData(0.05)));
-      Parameters.Add(new ConstrainedValueParameter<IManipulator>("Mutator", "The operator used to mutate solutions."));
+      Parameters.Add(new OptionalConstrainedValueParameter<IManipulator>("Mutator", "The operator used to mutate solutions."));
       Parameters.Add(new ValueParameter<IntData>("Elites", "The numer of elite solutions which are kept in each generation.", new IntData(1)));
       Parameters.Add(new ValueParameter<IntData>("MaximumGenerations", "The maximum number of generations which should be processed.", new IntData(1000)));
Index: trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGAOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGAOperator.cs	(revision 2917)
+++ trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGAOperator.cs	(revision 2924)
@@ -97,5 +97,5 @@
       #region Create operator graph
       VariableCreator variableCreator = new VariableCreator();
-      ResultsCollector resultsCollector1 = new ResultsCollector();
+      ResultsCollector resultsCollector = new ResultsCollector();
       SubScopesSorter subScopesSorter1 = new SubScopesSorter();
       Placeholder selector = new Placeholder();
@@ -116,5 +116,4 @@
       Comparator comparator = new Comparator();
       BestAverageWorstQualityCalculator bestAverageWorstQualityCalculator = new BestAverageWorstQualityCalculator();
-      ResultsCollector resultsCollector2 = new ResultsCollector();
       DataTableValuesCollector dataTableValuesCollector = new DataTableValuesCollector();
       ConditionalBranch conditionalBranch = new ConditionalBranch();
@@ -122,12 +121,18 @@
       OperatorGraph.InitialOperator = variableCreator;
 
+      variableCreator.CollectedValues.Add(new ValueParameter<IntData>("Generations", new IntData(0)));
+      variableCreator.CollectedValues.Add(new ValueParameter<DoubleData>("Best Quality", new DoubleData(0)));
+      variableCreator.CollectedValues.Add(new ValueParameter<DoubleData>("Average Quality", new DoubleData(0)));
+      variableCreator.CollectedValues.Add(new ValueParameter<DoubleData>("Worst Quality", new DoubleData(0)));
       variableCreator.CollectedValues.Add(new ValueParameter<DataTable>("Qualities", new DataTable("Qualities")));
-      variableCreator.Successor = resultsCollector1;
-
-      LookupParameter<DataTable> qualities = new LookupParameter<DataTable>("Qualities");
-      qualities.ActualName = "Qualities";
-      resultsCollector1.CollectedValues.Add(qualities);
-      resultsCollector1.ResultsParameter.ActualName = "Results";
-      resultsCollector1.Successor = subScopesSorter1;
+      variableCreator.Successor = resultsCollector;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<IntData>("Generations"));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleData>("Best Quality"));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleData>("Average Quality"));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleData>("Worst Quality"));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>("Qualities"));
+      resultsCollector.ResultsParameter.ActualName = "Results";
+      resultsCollector.Successor = subScopesSorter1;
 
       subScopesSorter1.DescendingParameter.ActualName = "Maximization";
@@ -196,34 +201,16 @@
       comparator.Successor = bestAverageWorstQualityCalculator;
 
-      bestAverageWorstQualityCalculator.AverageQualityParameter.ActualName = "AverageQuality";
-      bestAverageWorstQualityCalculator.BestQualityParameter.ActualName = "BestQuality";
+      bestAverageWorstQualityCalculator.AverageQualityParameter.ActualName = "Average Quality";
+      bestAverageWorstQualityCalculator.BestQualityParameter.ActualName = "Best Quality";
       bestAverageWorstQualityCalculator.MaximizationParameter.ActualName = "Maximization";
       bestAverageWorstQualityCalculator.QualityParameter.ActualName = "Quality";
-      bestAverageWorstQualityCalculator.WorstQualityParameter.ActualName = "WorstQuality";
+      bestAverageWorstQualityCalculator.WorstQualityParameter.ActualName = "Worst Quality";
       bestAverageWorstQualityCalculator.Successor = dataTableValuesCollector;
 
-      LookupParameter<DoubleData> bestQuality = new LookupParameter<DoubleData>("BestQuality");
-      bestQuality.ActualName = "BestQuality";
-      dataTableValuesCollector.CollectedValues.Add(bestQuality);
-      LookupParameter<DoubleData> averageQuality = new LookupParameter<DoubleData>("AverageQuality");
-      averageQuality.ActualName = "AverageQuality";
-      dataTableValuesCollector.CollectedValues.Add(averageQuality);
-      LookupParameter<DoubleData> worstQuality = new LookupParameter<DoubleData>("WorstQuality");
-      worstQuality.ActualName = "WorstQuality";
-      dataTableValuesCollector.CollectedValues.Add(worstQuality);
+      dataTableValuesCollector.CollectedValues.Add(new LookupParameter<DoubleData>("Best Quality"));
+      dataTableValuesCollector.CollectedValues.Add(new LookupParameter<DoubleData>("Average Quality"));
+      dataTableValuesCollector.CollectedValues.Add(new LookupParameter<DoubleData>("Worst Quality"));
       dataTableValuesCollector.DataTableParameter.ActualName = "Qualities";
-      dataTableValuesCollector.Successor = resultsCollector2;
-
-      bestQuality = new LookupParameter<DoubleData>("BestQuality");
-      bestQuality.ActualName = "BestQuality";
-      resultsCollector2.CollectedValues.Add(bestQuality);
-      averageQuality = new LookupParameter<DoubleData>("AverageQuality");
-      averageQuality.ActualName = "AverageQuality";
-      resultsCollector2.CollectedValues.Add(averageQuality);
-      worstQuality = new LookupParameter<DoubleData>("WorstQuality");
-      worstQuality.ActualName = "WorstQuality";
-      resultsCollector2.CollectedValues.Add(worstQuality);
-      resultsCollector2.ResultsParameter.ActualName = "Results";
-      resultsCollector2.Successor = conditionalBranch;
+      dataTableValuesCollector.Successor = conditionalBranch;
 
       conditionalBranch.ConditionParameter.ActualName = "Terminate";
