Index: /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3.cs
===================================================================
--- /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3.cs	(revision 17719)
+++ /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3.cs	(revision 17720)
@@ -76,4 +76,5 @@
         private const string SetSeedRandomlyName = "Set Seed Randomly";
         private const string SeedName = "Seed";
+        private const string AnalyzeEveryGenerationName = "Analyze Every Generation";
 
         // Results Names
@@ -128,4 +129,9 @@
         }
 
+        private IFixedValueParameter<BoolValue> AnalyzeEveryGenerationParameter
+        {
+            get { return (IFixedValueParameter<BoolValue>)Parameters[AnalyzeEveryGenerationName]; }
+        }
+
         #endregion ParameterProperties
 
@@ -143,8 +149,8 @@
 
         public BoolValue SetSeedRandomly => SetSeedRandomlyParameter.Value;
+
         public IntValue Seed => SeedParameter.Value;
 
-        // todo: create one property for the Generated Reference Points and one for the current
-        // generations reference points
+        public BoolValue AnalyzeEveryGeneration => AnalyzeEveryGenerationParameter.Value;
 
         #endregion Properties
@@ -219,4 +225,5 @@
             Parameters.Add(new FixedValueParameter<BoolValue>(SetSeedRandomlyName, "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
             Parameters.Add(new FixedValueParameter<IntValue>(SeedName, "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
+            Parameters.Add(new FixedValueParameter<BoolValue>(AnalyzeEveryGenerationName, "If set to false, will only calculate the indicators (IGD, etc.) on the last generation and when pausing or stopping the algorithm.", new BoolValue(true)));
         }
 
@@ -249,22 +256,7 @@
             base.Initialize(cancellationToken);
 
-            SetParameters();
             InitResults();
             InitFields();
             Analyze();
-        }
-
-        // todo: trigger this when the problem parameters change
-        private void SetParameters()
-        {
-            // Set population size
-            int numberOfGeneratedReferencePoints = ReferencePoint.GetNumberOfGeneratedReferencePoints(Objectives);
-            if (numberOfGeneratedReferencePoints == -1) throw new NotSupportedException("The number of objectives is not supported.");
-            PopulationSize.Value = ReferencePoint.GetPopulationSizeForReferencePoints(numberOfGeneratedReferencePoints);
-
-            // Set mutation probability
-            MutationProbability.Value = 1.0 / Problem.Encoding.Length;
-
-            // todo: Set MaximumGenerations in Problem definition
         }
 
@@ -330,5 +322,5 @@
                 {
                     // todo: make parameter out of this
-                    List<Solution> qt = Mutate(Recombine(solutions), 30);
+                    List<Solution> qt = Mutate(Recombine(solutions));
                     foreach (var solution in qt)
                         solution.Fitness = Evaluate(solution.Chromosome);
@@ -336,9 +328,8 @@
                     List<Solution> rt = Utility.Concat(solutions, qt);
 
-                    // todo: remove this check
-                    for (int i = 0; i < rt.Count / 2; i++)
-                        if (!solutions.Contains(rt[i])) throw new Exception($"This should never happen: !solutions.Contains(rt[{i}])");
-
                     solutions = NSGA3Selection.SelectSolutionsForNextGeneration(rt, GetCopyOfReferencePoints(), Problem.Maximization, PopulationSize.Value, random);
+
+                    if (AnalyzeEveryGeneration.Value)
+                        Analyze();
 
                     ResultsCurrentGeneration.Value++;
@@ -399,29 +390,45 @@
         }
 
+        // todo: try both recombination methods
         private List<Solution> Recombine(List<Solution> solutions)
         {
             List<Solution> childSolutions = new List<Solution>();
-
-            for (int i = 0; i < solutions.Count; i += 2)
-            {
-                int parentIndex1 = random.Next(solutions.Count);
-                int parentIndex2 = random.Next(solutions.Count);
-                // ensure that the parents are not the same object
-                if (parentIndex1 == parentIndex2) parentIndex2 = (parentIndex2 + 1) % solutions.Count;
-                var parent1 = solutions[parentIndex1];
-                var parent2 = solutions[parentIndex2];
-
-                // Do crossover with crossoverProbabilty == 1 in order to guarantee that a crossover happens
-                var children = SimulatedBinaryCrossover.Apply(random,
-                Problem.Encoding.Bounds, parent1.Chromosome, parent2.Chromosome, CrossoverProbability.Value);
-
-                childSolutions.Add(new Solution(children.Item1));
-                childSolutions.Add(new Solution(children.Item2));
+            for (int i = 0; i < solutions.Count; i++)
+            {
+                var parent1 = solutions[random.Next(solutions.Count)];
+                var parent2 = solutions[random.Next(solutions.Count)];
+                var childChromosome = HeuristicLab.Encodings.RealVectorEncoding.SimulatedBinaryCrossover.Apply(random, parent1.Chromosome, parent2.Chromosome, new DoubleValue(5));
+
+                BoundsChecker.Apply(childChromosome, Problem.Encoding.Bounds);
+
+                Solution child = new Solution(childChromosome);
+                childSolutions.Add(child);
             }
 
             return childSolutions;
-        }
-
-        private List<Solution> Mutate(List<Solution> solutions, double eta)
+
+            //List<Solution> childSolutions = new List<Solution>();
+
+            //for (int i = 0; i < solutions.Count; i += 2)
+            //{
+            //    int parentIndex1 = random.Next(solutions.Count);
+            //    int parentIndex2 = random.Next(solutions.Count);
+            //    // ensure that the parents are not the same object
+            //    if (parentIndex1 == parentIndex2) parentIndex2 = (parentIndex2 + 1) % solutions.Count;
+            //    var parent1 = solutions[parentIndex1];
+            //    var parent2 = solutions[parentIndex2];
+
+            // // Do crossover with crossoverProbabilty == 1 in order to guarantee that a crossover
+            // happens var children = SimulatedBinaryCrossover.Apply(random,
+            // Problem.Encoding.Bounds, parent1.Chromosome, parent2.Chromosome, CrossoverProbability.Value);
+
+            //    childSolutions.Add(new Solution(children.Item1));
+            //    childSolutions.Add(new Solution(children.Item2));
+            //}
+
+            //return childSolutions;
+        }
+
+        private List<Solution> Mutate(List<Solution> solutions, double eta = 20)
         {
             foreach (var solution in solutions)
Index: /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3Selection.cs
===================================================================
--- /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3Selection.cs	(revision 17719)
+++ /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3Selection.cs	(revision 17720)
@@ -28,6 +28,6 @@
             // Do non-dominated sort
             var qualities = Utility.ToFitnessMatrix(rt);
-            // compute the pareto fronts using the DominationCalculator and discard the qualities
-            // part in the inner tuples
+
+            // compute the pareto fronts using the DominationCalculator
             var fronts = DominationCalculator<Solution>.CalculateAllParetoFronts(rt.ToArray(), qualities, maximization, out int[] rank, true)
                 .Select(list => new List<Solution>(list.Select(pair => pair.Item1))).ToList();
@@ -109,4 +109,6 @@
                     {
                         solution.ConvertedFitness[i] = solution.ConvertedFitness[i] / (intercepts[i] - idealPoint[i]);
+                        // todo: try this
+                        //solution.ConvertedFitness[i] = solution.ConvertedFitness[i] / intercepts[i];
                     }
                     else
Index: /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/Utility.cs
===================================================================
--- /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/Utility.cs	(revision 17719)
+++ /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/Utility.cs	(revision 17720)
@@ -116,9 +116,9 @@
             int obj = referencePoints.First().Objectives;
             int pointCount = referencePoints.Count;
-            double[,] array = new double[obj, pointCount];
+            double[,] array = new double[pointCount, obj];
 
             for (int p = 0; p < pointCount; p++)
                 for (int d = 0; d < obj; d++)
-                    array[d, p] = referencePoints[p].Values[d];
+                    array[p, d] = referencePoints[p].Values[d];
 
             return array;
