Index: trunk/sources/HeuristicLab.Evolutionary/ChildrenInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Evolutionary/ChildrenInitializer.cs	(revision 1159)
+++ trunk/sources/HeuristicLab.Evolutionary/ChildrenInitializer.cs	(revision 1159)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2009 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Evolutionary {
+  public class ChildrenInitializer : OperatorBase {
+    public override string Description {
+      get {
+        return @"This operator prepares the individuals for crossover.";
+      }
+    }
+
+    public ChildrenInitializer()
+      : base() {
+      AddVariableInfo(new VariableInfo("ParentsPerChild", "Denotes the number of parents that should be crossed per child. Note that some of the typical crossover operators can only work with 2 parents.", typeof(IntData), VariableKind.In));
+      GetVariableInfo("ParentsPerChild").Local = true;
+      AddVariable(new Variable("ParentsPerChild", new IntData(2)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      int parents = GetVariableValue<IntData>("ParentsPerChild", scope, true).Data;
+      int children = scope.SubScopes.Count;
+      if (children % parents > 0) throw new InvalidOperationException("ERROR in ChildrenInitializer: The number of selected parents is not a natural multiple of ParentsPerChild");
+      children /= parents;
+
+      for (int i = 0; i < children; i++) {
+        IScope child = new Scope(i.ToString());
+        for (int y = 0; y < parents; y++) {
+          IScope parenty = scope.SubScopes[0];
+          scope.RemoveSubScope(parenty);
+          child.AddSubScope(parenty);
+        }
+        scope.AddSubScope(child);
+      }
+
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Evolutionary/CrossoverBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Evolutionary/CrossoverBase.cs	(revision 881)
+++ trunk/sources/HeuristicLab.Evolutionary/CrossoverBase.cs	(revision 1159)
@@ -50,17 +50,11 @@
       IRandom random = GetVariableValue<IRandom>("Random", scope, true);
 
-      if ((scope.SubScopes.Count % 2) != 0)
-        throw new InvalidOperationException("Size of mating pool is not even");
+      if (scope.SubScopes.Count != 2)
+        throw new InvalidOperationException("ERROR: Number of parents is != 2");
 
-      int children = scope.SubScopes.Count / 2;
-      for (int i = 0; i < children; i++) {
-        IScope parent1 = scope.SubScopes[0];
-        IScope parent2 = scope.SubScopes[1];
-        IScope child = new Scope(i.ToString());
-        scope.AddSubScope(child);
-        Cross(scope, random, parent1, parent2, child);
-        scope.RemoveSubScope(parent1);
-        scope.RemoveSubScope(parent2);
-      }
+      IScope parent1 = scope.SubScopes[0];
+      IScope parent2 = scope.SubScopes[1];
+      IScope child = scope;
+      Cross(scope, random, parent1, parent2, child);
 
       return null;
Index: trunk/sources/HeuristicLab.Evolutionary/HeuristicLab.Evolutionary.csproj
===================================================================
--- trunk/sources/HeuristicLab.Evolutionary/HeuristicLab.Evolutionary.csproj	(revision 881)
+++ trunk/sources/HeuristicLab.Evolutionary/HeuristicLab.Evolutionary.csproj	(revision 1159)
@@ -60,4 +60,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ChildrenInitializer.cs" />
     <Compile Include="MultiCrossoverBase.cs" />
     <Compile Include="SASEGASAReunificator.cs" />
Index: trunk/sources/HeuristicLab.Evolutionary/MultiCrossoverBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Evolutionary/MultiCrossoverBase.cs	(revision 881)
+++ trunk/sources/HeuristicLab.Evolutionary/MultiCrossoverBase.cs	(revision 1159)
@@ -38,5 +38,4 @@
     public MultiCrossoverBase()
       : base() {
-      AddVariableInfo(new VariableInfo("Parents", "Number of parents that should be crossed", typeof(IntData), VariableKind.In));
       AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
     }
@@ -53,22 +52,15 @@
     public override IOperation Apply(IScope scope) {
       IRandom random = GetVariableValue<IRandom>("Random", scope, true);
-      int parents = GetVariableValue<IntData>("Parents", scope, true).Data;
+      int parents = scope.SubScopes.Count;
 
-      if ((scope.SubScopes.Count % parents) != 0)
-        throw new InvalidOperationException("Size of mating pool and number of parents don't match");
+      if (parents < 2)
+        throw new InvalidOperationException("ERROR: Number of parents is < 2");
 
-      int children = scope.SubScopes.Count / parents;
-      for (int i = 0; i < children; i++) {
-        IScope[] parentScopes = new IScope[parents];
-        for (int j = 0; j < parentScopes.Length; j++)
-          parentScopes[j] = scope.SubScopes[j];
+      IScope[] parentScopes = new IScope[parents];
+      for (int i = 0; i < parents; i++)
+        parentScopes[i] = scope.SubScopes[i];
+      IScope child = scope;
+      Cross(scope, random, parentScopes, child);
 
-        IScope child = new Scope(i.ToString());
-        scope.AddSubScope(child);
-        Cross(scope, random, parentScopes, child);
-
-        for (int j = 0; j < parentScopes.Length; j++)
-          scope.RemoveSubScope(parentScopes[j]);
-      }
       return null;
     }
