Index: branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3.cs
===================================================================
--- branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3.cs	(revision 17619)
+++ branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3.cs	(revision 17657)
@@ -1,4 +1,5 @@
 ﻿using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Linq;
 using System.Threading;
@@ -64,5 +65,6 @@
         private const string SetSeedRandomlyName = "SetSeedRandomly";
         private const string PopulationSizeName = "PopulationSize";
-        private const string CrossoverProbabilityName = "CrossOverProbability";
+        private const string CrossoverProbabilityName = "CrossoverProbability";
+        private const string CrossoverContiguityName = "CrossoverContiguity";
         private const string MutationProbabilityName = "MutationProbability";
         private const string MaximumGenerationsName = "MaximumGenerations";
@@ -98,4 +100,9 @@
         }
 
+        private IFixedValueParameter<DoubleValue> CrossoverContiguityParameter
+        {
+            get { return (IFixedValueParameter<DoubleValue>)Parameters[CrossoverContiguityName]; }
+        }
+
         private IFixedValueParameter<PercentValue> MutationProbabilityParameter
         {
@@ -124,4 +131,6 @@
 
         public PercentValue CrossoverProbability => CrossoverProbabilityParameter.Value;
+
+        public DoubleValue CrossoverContiguity => CrossoverContiguityParameter.Value;
 
         public PercentValue MutationProbability => MutationProbabilityParameter.Value;
@@ -159,6 +168,7 @@
             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>(SetSeedRandomlyName, "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
-            Parameters.Add(new FixedValueParameter<IntValue>(PopulationSizeName, "The size of the population of Individuals.", new IntValue(100)));
+            Parameters.Add(new FixedValueParameter<IntValue>(PopulationSizeName, "The size of the population of Individuals.", new IntValue(200)));
             Parameters.Add(new FixedValueParameter<PercentValue>(CrossoverProbabilityName, "The probability that the crossover operator is applied on two parents.", new PercentValue(0.9)));
+            Parameters.Add(new FixedValueParameter<DoubleValue>(CrossoverContiguityName, "The contiguity value for the Simulated Binary Crossover that specifies how close a child should be to its parents (larger value means closer). The value must be greater than or equal than 0. Typical values are in the range [2;5]."));
             Parameters.Add(new FixedValueParameter<PercentValue>(MutationProbabilityName, "The probability that the mutation operator is applied on a Individual.", new PercentValue(0.05)));
             Parameters.Add(new FixedValueParameter<IntValue>(MaximumGenerationsName, "The maximum number of generations which should be processed.", new IntValue(1000)));
@@ -195,6 +205,6 @@
 
             InitFields();
+            InitResults();
             InitReferencePoints();
-            InitResults();
             Analyze();
         }
@@ -218,8 +228,5 @@
                 RealVector randomRealVector = new RealVector(Problem.Encoding.Length, random, minBound, maxBound);
 
-                solutions.Add(new Solution(StorableConstructorFlag.Default)
-                {
-                    Chromosome = randomRealVector
-                });
+                solutions.Add(new Solution(randomRealVector));
                 solutions[i].Fitness = Evaluate(solutions[i].Chromosome);
             }
@@ -236,5 +243,5 @@
         private void InitResults()
         {
-            Results.Add(new Result(GeneratedReferencePointsResultName, "The initially generated reference points", Utility.ConvertToDoubleMatrix(ReferencePoints)));
+            Results.Add(new Result(GeneratedReferencePointsResultName, "The initially generated reference points", new DoubleMatrix()));
             Results.Add(new Result(CurrentFrontResultName, "The Pareto Front", new DoubleMatrix()));
         }
@@ -288,5 +295,5 @@
 
             // Do non-dominated sort
-            var qualities = Utility.ToFitnessMatrix(solutions);
+            var qualities = Utility.ToFitnessMatrix(rt);
             // compute the pareto fronts using the DominationCalculator and discard the qualities
             // part in the inner tuples
@@ -578,10 +585,38 @@
         private List<Solution> Recombine(List<Solution> solutions)
         {
-            throw new NotImplementedException();
+            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, 1);
+                Debug.Assert(children != null);
+
+                var child1 = new Solution(children.Item1);
+                var child2 = new Solution(children.Item2);
+                child1.Fitness = Evaluate(child1.Chromosome);
+                child2.Fitness = Evaluate(child1.Chromosome);
+
+                childSolutions.Add(child1);
+                childSolutions.Add(child2);
+            }
+
+            return childSolutions;
         }
 
         private List<Solution> Mutate(List<Solution> solutions)
         {
-            throw new NotImplementedException();
+            foreach (var solution in solutions)
+            {
+                UniformOnePositionManipulator.Apply(random, solution.Chromosome, Problem.Encoding.Bounds);
+            }
+            return solutions;
         }
 
