Index: /trunk/sources/HeuristicLab.ES/ES.cs
===================================================================
--- /trunk/sources/HeuristicLab.ES/ES.cs	(revision 85)
+++ /trunk/sources/HeuristicLab.ES/ES.cs	(revision 86)
@@ -74,4 +74,10 @@
       co3.AddSubOperator(eo3);
 
+      // place holder for Recombinator
+      EmptyOperator eo5 = new EmptyOperator();
+      eo5.Name = "Recombinator";
+      op.OperatorGraph.AddOperator(eo5);
+      co3.AddSubOperator(eo5);
+
       return op;
     }
@@ -94,4 +100,5 @@
       VariableInjector vi = new VariableInjector();
       vi.AddVariable(new Variable("ESmu", new IntData(1)));
+      vi.AddVariable(new Variable("ESrho", new IntData(1)));
       vi.AddVariable(new Variable("ESlambda", new IntData(1)));
       vi.AddVariable(new Variable("EvaluatedSolutions", new IntData()));
@@ -160,8 +167,8 @@
       op.OperatorGraph.InitialOperator = sp;
 
-      RandomSelector rs = new RandomSelector();
+      ESRandomSelector rs = new ESRandomSelector();
       rs.Name = "Child Selector";
-      rs.GetVariableInfo("Selected").ActualName = "ESlambda";
-      rs.GetVariable("CopySelected").Value = new BoolData(true);
+      rs.GetVariableInfo("Lambda").ActualName = "ESlambda";
+      rs.GetVariableInfo("Rho").ActualName = "ESrho";
       op.OperatorGraph.AddOperator(rs);
       sp.AddSubOperator(rs);
@@ -181,5 +188,5 @@
 
       ConditionalBranch cb1 = new ConditionalBranch();
-      cb1.Name = "Point or Plus Replacement";
+      cb1.Name = "Plus or Comma Replacement";
       cb1.GetVariableInfo("Condition").ActualName = "PlusNotation";
       op.OperatorGraph.AddOperator(cb1);
@@ -192,5 +199,5 @@
 
       RightReducer rr = new RightReducer();
-      rr.Name = "Point Replacement";
+      rr.Name = "Comma Replacement";
       op.OperatorGraph.AddOperator(rr);
       cb1.AddSubOperator(rr);
@@ -266,29 +273,39 @@
       sp2.AddSubOperator(oa);
 
+      SequentialProcessor sp3 = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp3);
+      oa.AddSubOperator(sp3);
+      cb.AddSubOperator(sp3);
+
+      OperatorExtractor oe1 = new OperatorExtractor();
+      oe1.Name = "Recombinator";
+      oe1.GetVariableInfo("Operator").ActualName = "Recombinator";
+      op.OperatorGraph.AddOperator(oe1);
+      sp3.AddSubOperator(oe1);
+
       UniformSequentialSubScopesProcessor ussp = new UniformSequentialSubScopesProcessor();
       op.OperatorGraph.AddOperator(ussp);
-      oa.AddSubOperator(ussp);
-      cb.AddSubOperator(ussp);
-
-      SequentialProcessor sp3 = new SequentialProcessor();
-      op.OperatorGraph.AddOperator(sp3);
-      ussp.AddSubOperator(sp3);
-
-      OperatorExtractor oe1 = new OperatorExtractor();
-      oe1.Name = "Mutator";
-      oe1.GetVariableInfo("Operator").ActualName = "Mutator";
-      op.OperatorGraph.AddOperator(oe1);
-      sp3.AddSubOperator(oe1);
+      sp3.AddSubOperator(ussp);
+
+      SequentialProcessor sp4 = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp4);
+      ussp.AddSubOperator(sp4);
 
       OperatorExtractor oe2 = new OperatorExtractor();
-      oe2.Name = "Evaluator";
-      oe2.GetVariableInfo("Operator").ActualName = "Evaluator";
+      oe2.Name = "Mutator";
+      oe2.GetVariableInfo("Operator").ActualName = "Mutator";
       op.OperatorGraph.AddOperator(oe2);
-      sp3.AddSubOperator(oe2);
+      sp4.AddSubOperator(oe2);
+
+      OperatorExtractor oe3 = new OperatorExtractor();
+      oe3.Name = "Evaluator";
+      oe3.GetVariableInfo("Operator").ActualName = "Evaluator";
+      op.OperatorGraph.AddOperator(oe3);
+      sp4.AddSubOperator(oe3);
 
       Counter c = new Counter();
       c.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
       op.OperatorGraph.AddOperator(c);
-      sp3.AddSubOperator(c);
+      sp4.AddSubOperator(c);
 
       SuccessRuleMutationStrengthAdjuster srmsa = new SuccessRuleMutationStrengthAdjuster();
@@ -346,7 +363,21 @@
       get { return myMu.Data; }
       set {
-        myMu.Data = value;
-        if (!PlusNotation && value >= Lambda) myLambda.Data = value + 1;
-        OnChanged();
+        if (value > 0) {
+          myMu.Data = value;
+          if (!PlusNotation && value >= Lambda) myLambda.Data = value + 1;
+          if (value < Rho) myRho.Data = value;
+          OnChanged();
+        }
+      }
+    }
+    private IntData myRho;
+    public int Rho {
+      get { return myRho.Data; }
+      set {
+        if (value > 0) {
+          myRho.Data = value;
+          if (value > Mu) Mu = value;
+          OnChanged();
+        }
       }
     }
@@ -448,4 +479,13 @@
         myES.OperatorGraph.AddOperator(value);
         myESMain.AddSubOperator(value, 0);
+      }
+    }
+    public IOperator Recombinator {
+      get { return myESMain.SubOperators[2]; }
+      set {
+        value.Name = "Recombinator";
+        myES.OperatorGraph.RemoveOperator(Recombinator.Guid);
+        myES.OperatorGraph.AddOperator(value);
+        myESMain.AddSubOperator(value, 2);
       }
     }
@@ -491,4 +531,5 @@
       VariableInjector vi = (VariableInjector)sp2.SubOperators[2];
       myMu = vi.GetVariable("ESmu").GetValue<IntData>();
+      myRho = vi.GetVariable("ESrho").GetValue<IntData>();
       myLambda = vi.GetVariable("ESlambda").GetValue<IntData>();
       myMaximumGenerations = vi.GetVariable("MaximumGenerations").GetValue<IntData>();
Index: /trunk/sources/HeuristicLab.ES/ESEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.ES/ESEditor.Designer.cs	(revision 85)
+++ /trunk/sources/HeuristicLab.ES/ESEditor.Designer.cs	(revision 86)
@@ -49,4 +49,5 @@
       this.tabControl = new System.Windows.Forms.TabControl();
       this.parametersTabPage = new System.Windows.Forms.TabPage();
+      this.useSuccessRuleCheckBox = new System.Windows.Forms.CheckBox();
       this.targetSuccessRateTextBox = new System.Windows.Forms.TextBox();
       this.targetSuccessRateLabel = new System.Windows.Forms.Label();
@@ -86,5 +87,10 @@
       this.resetButton = new System.Windows.Forms.Button();
       this.cloneEngineButton = new System.Windows.Forms.Button();
-      this.useSuccessRuleCheckBox = new System.Windows.Forms.CheckBox();
+      this.rhoLabel = new System.Windows.Forms.Label();
+      this.rhoTextBox = new System.Windows.Forms.TextBox();
+      this.recombinationLabel = new System.Windows.Forms.Label();
+      this.recombinationTextBox = new System.Windows.Forms.TextBox();
+      this.setRecombinationButton = new System.Windows.Forms.Button();
+      this.viewRecombinationButton = new System.Windows.Forms.Button();
       this.tabControl.SuspendLayout();
       this.parametersTabPage.SuspendLayout();
@@ -95,5 +101,5 @@
       // 
       this.executeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.executeButton.Location = new System.Drawing.Point(0, 396);
+      this.executeButton.Location = new System.Drawing.Point(0, 459);
       this.executeButton.Name = "executeButton";
       this.executeButton.Size = new System.Drawing.Size(75, 23);
@@ -113,9 +119,15 @@
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(526, 390);
+      this.tabControl.Size = new System.Drawing.Size(526, 453);
       this.tabControl.TabIndex = 0;
       // 
       // parametersTabPage
       // 
+      this.parametersTabPage.Controls.Add(this.setRecombinationButton);
+      this.parametersTabPage.Controls.Add(this.viewRecombinationButton);
+      this.parametersTabPage.Controls.Add(this.recombinationTextBox);
+      this.parametersTabPage.Controls.Add(this.recombinationLabel);
+      this.parametersTabPage.Controls.Add(this.rhoTextBox);
+      this.parametersTabPage.Controls.Add(this.rhoLabel);
       this.parametersTabPage.Controls.Add(this.useSuccessRuleCheckBox);
       this.parametersTabPage.Controls.Add(this.targetSuccessRateTextBox);
@@ -154,16 +166,30 @@
       this.parametersTabPage.Name = "parametersTabPage";
       this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.parametersTabPage.Size = new System.Drawing.Size(518, 364);
+      this.parametersTabPage.Size = new System.Drawing.Size(518, 427);
       this.parametersTabPage.TabIndex = 0;
       this.parametersTabPage.Text = "Parameters";
       this.parametersTabPage.UseVisualStyleBackColor = true;
       // 
+      // useSuccessRuleCheckBox
+      // 
+      this.useSuccessRuleCheckBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.useSuccessRuleCheckBox.AutoSize = true;
+      this.useSuccessRuleCheckBox.Checked = true;
+      this.useSuccessRuleCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.useSuccessRuleCheckBox.Location = new System.Drawing.Point(411, 215);
+      this.useSuccessRuleCheckBox.Name = "useSuccessRuleCheckBox";
+      this.useSuccessRuleCheckBox.Size = new System.Drawing.Size(51, 17);
+      this.useSuccessRuleCheckBox.TabIndex = 16;
+      this.useSuccessRuleCheckBox.Text = "Use?";
+      this.useSuccessRuleCheckBox.UseVisualStyleBackColor = true;
+      this.useSuccessRuleCheckBox.CheckedChanged += new System.EventHandler(this.useSuccessRuleCheckBox_CheckedChanged);
+      // 
       // targetSuccessRateTextBox
       // 
       this.targetSuccessRateTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.targetSuccessRateTextBox.Location = new System.Drawing.Point(218, 182);
+      this.targetSuccessRateTextBox.Location = new System.Drawing.Point(218, 213);
       this.targetSuccessRateTextBox.Name = "targetSuccessRateTextBox";
       this.targetSuccessRateTextBox.Size = new System.Drawing.Size(186, 20);
-      this.targetSuccessRateTextBox.TabIndex = 39;
+      this.targetSuccessRateTextBox.TabIndex = 15;
       // 
       // targetSuccessRateLabel
@@ -171,8 +197,8 @@
       this.targetSuccessRateLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.targetSuccessRateLabel.AutoSize = true;
-      this.targetSuccessRateLabel.Location = new System.Drawing.Point(65, 185);
+      this.targetSuccessRateLabel.Location = new System.Drawing.Point(65, 216);
       this.targetSuccessRateLabel.Name = "targetSuccessRateLabel";
       this.targetSuccessRateLabel.Size = new System.Drawing.Size(111, 13);
-      this.targetSuccessRateLabel.TabIndex = 38;
+      this.targetSuccessRateLabel.TabIndex = 14;
       this.targetSuccessRateLabel.Text = "Target Success Rate:";
       // 
@@ -181,8 +207,8 @@
       this.plusNotationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.plusNotationButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-      this.plusNotationButton.Location = new System.Drawing.Point(218, 208);
+      this.plusNotationButton.Location = new System.Drawing.Point(218, 239);
       this.plusNotationButton.Name = "plusNotationButton";
       this.plusNotationButton.Size = new System.Drawing.Size(78, 24);
-      this.plusNotationButton.TabIndex = 37;
+      this.plusNotationButton.TabIndex = 18;
       this.plusNotationButton.Text = "Plus";
       this.plusNotationButton.UseVisualStyleBackColor = true;
@@ -193,17 +219,17 @@
       this.plusNotationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.plusNotationLabel.AutoSize = true;
-      this.plusNotationLabel.Location = new System.Drawing.Point(65, 214);
+      this.plusNotationLabel.Location = new System.Drawing.Point(65, 245);
       this.plusNotationLabel.Name = "plusNotationLabel";
-      this.plusNotationLabel.Size = new System.Drawing.Size(102, 13);
-      this.plusNotationLabel.TabIndex = 36;
-      this.plusNotationLabel.Text = "Plus/Point Notation:";
+      this.plusNotationLabel.Size = new System.Drawing.Size(113, 13);
+      this.plusNotationLabel.TabIndex = 17;
+      this.plusNotationLabel.Text = "Plus/Comma Notation:";
       // 
       // setEvaluationButton
       // 
       this.setEvaluationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.setEvaluationButton.Location = new System.Drawing.Point(469, 338);
+      this.setEvaluationButton.Location = new System.Drawing.Point(469, 361);
       this.setEvaluationButton.Name = "setEvaluationButton";
       this.setEvaluationButton.Size = new System.Drawing.Size(43, 20);
-      this.setEvaluationButton.TabIndex = 35;
+      this.setEvaluationButton.TabIndex = 34;
       this.setEvaluationButton.Text = "Set...";
       this.setEvaluationButton.UseVisualStyleBackColor = true;
@@ -213,8 +239,8 @@
       // 
       this.setMutationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.setMutationButton.Location = new System.Drawing.Point(469, 312);
+      this.setMutationButton.Location = new System.Drawing.Point(469, 335);
       this.setMutationButton.Name = "setMutationButton";
       this.setMutationButton.Size = new System.Drawing.Size(43, 20);
-      this.setMutationButton.TabIndex = 31;
+      this.setMutationButton.TabIndex = 30;
       this.setMutationButton.Text = "Set...";
       this.setMutationButton.UseVisualStyleBackColor = true;
@@ -224,8 +250,8 @@
       // 
       this.setSolutionGenerationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.setSolutionGenerationButton.Location = new System.Drawing.Point(469, 286);
+      this.setSolutionGenerationButton.Location = new System.Drawing.Point(469, 309);
       this.setSolutionGenerationButton.Name = "setSolutionGenerationButton";
       this.setSolutionGenerationButton.Size = new System.Drawing.Size(43, 20);
-      this.setSolutionGenerationButton.TabIndex = 19;
+      this.setSolutionGenerationButton.TabIndex = 26;
       this.setSolutionGenerationButton.Text = "Set...";
       this.setSolutionGenerationButton.UseVisualStyleBackColor = true;
@@ -235,8 +261,8 @@
       // 
       this.viewEvaluationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.viewEvaluationButton.Location = new System.Drawing.Point(410, 338);
+      this.viewEvaluationButton.Location = new System.Drawing.Point(410, 361);
       this.viewEvaluationButton.Name = "viewEvaluationButton";
       this.viewEvaluationButton.Size = new System.Drawing.Size(53, 20);
-      this.viewEvaluationButton.TabIndex = 34;
+      this.viewEvaluationButton.TabIndex = 33;
       this.viewEvaluationButton.Text = "View...";
       this.viewEvaluationButton.UseVisualStyleBackColor = true;
@@ -246,8 +272,8 @@
       // 
       this.viewMutationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.viewMutationButton.Location = new System.Drawing.Point(410, 312);
+      this.viewMutationButton.Location = new System.Drawing.Point(410, 335);
       this.viewMutationButton.Name = "viewMutationButton";
       this.viewMutationButton.Size = new System.Drawing.Size(53, 20);
-      this.viewMutationButton.TabIndex = 30;
+      this.viewMutationButton.TabIndex = 29;
       this.viewMutationButton.Text = "View...";
       this.viewMutationButton.UseVisualStyleBackColor = true;
@@ -257,8 +283,8 @@
       // 
       this.viewSolutionGenerationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.viewSolutionGenerationButton.Location = new System.Drawing.Point(410, 286);
+      this.viewSolutionGenerationButton.Location = new System.Drawing.Point(410, 309);
       this.viewSolutionGenerationButton.Name = "viewSolutionGenerationButton";
       this.viewSolutionGenerationButton.Size = new System.Drawing.Size(53, 20);
-      this.viewSolutionGenerationButton.TabIndex = 18;
+      this.viewSolutionGenerationButton.TabIndex = 25;
       this.viewSolutionGenerationButton.Text = "View...";
       this.viewSolutionGenerationButton.UseVisualStyleBackColor = true;
@@ -268,8 +294,8 @@
       // 
       this.viewProblemInitializationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.viewProblemInitializationButton.Location = new System.Drawing.Point(410, 260);
+      this.viewProblemInitializationButton.Location = new System.Drawing.Point(410, 283);
       this.viewProblemInitializationButton.Name = "viewProblemInitializationButton";
       this.viewProblemInitializationButton.Size = new System.Drawing.Size(53, 20);
-      this.viewProblemInitializationButton.TabIndex = 14;
+      this.viewProblemInitializationButton.TabIndex = 21;
       this.viewProblemInitializationButton.Text = "View...";
       this.viewProblemInitializationButton.UseVisualStyleBackColor = true;
@@ -279,8 +305,8 @@
       // 
       this.setProblemInitializationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.setProblemInitializationButton.Location = new System.Drawing.Point(469, 260);
+      this.setProblemInitializationButton.Location = new System.Drawing.Point(469, 283);
       this.setProblemInitializationButton.Name = "setProblemInitializationButton";
       this.setProblemInitializationButton.Size = new System.Drawing.Size(43, 20);
-      this.setProblemInitializationButton.TabIndex = 15;
+      this.setProblemInitializationButton.TabIndex = 22;
       this.setProblemInitializationButton.Text = "Set...";
       this.setProblemInitializationButton.UseVisualStyleBackColor = true;
@@ -290,36 +316,36 @@
       // 
       this.evaluationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.evaluationTextBox.Location = new System.Drawing.Point(218, 338);
+      this.evaluationTextBox.Location = new System.Drawing.Point(218, 361);
       this.evaluationTextBox.Name = "evaluationTextBox";
       this.evaluationTextBox.ReadOnly = true;
       this.evaluationTextBox.Size = new System.Drawing.Size(186, 20);
-      this.evaluationTextBox.TabIndex = 33;
+      this.evaluationTextBox.TabIndex = 32;
       // 
       // mutationTextBox
       // 
       this.mutationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.mutationTextBox.Location = new System.Drawing.Point(218, 312);
+      this.mutationTextBox.Location = new System.Drawing.Point(218, 335);
       this.mutationTextBox.Name = "mutationTextBox";
       this.mutationTextBox.ReadOnly = true;
       this.mutationTextBox.Size = new System.Drawing.Size(186, 20);
-      this.mutationTextBox.TabIndex = 29;
+      this.mutationTextBox.TabIndex = 28;
       // 
       // solutionGenerationTextBox
       // 
       this.solutionGenerationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.solutionGenerationTextBox.Location = new System.Drawing.Point(218, 286);
+      this.solutionGenerationTextBox.Location = new System.Drawing.Point(218, 309);
       this.solutionGenerationTextBox.Name = "solutionGenerationTextBox";
       this.solutionGenerationTextBox.ReadOnly = true;
       this.solutionGenerationTextBox.Size = new System.Drawing.Size(186, 20);
-      this.solutionGenerationTextBox.TabIndex = 17;
+      this.solutionGenerationTextBox.TabIndex = 24;
       // 
       // problemInitializationTextBox
       // 
       this.problemInitializationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.problemInitializationTextBox.Location = new System.Drawing.Point(218, 260);
+      this.problemInitializationTextBox.Location = new System.Drawing.Point(218, 283);
       this.problemInitializationTextBox.Name = "problemInitializationTextBox";
       this.problemInitializationTextBox.ReadOnly = true;
       this.problemInitializationTextBox.Size = new System.Drawing.Size(186, 20);
-      this.problemInitializationTextBox.TabIndex = 13;
+      this.problemInitializationTextBox.TabIndex = 20;
       // 
       // setRandomSeedRandomlyCheckBox
@@ -327,5 +353,5 @@
       this.setRandomSeedRandomlyCheckBox.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.setRandomSeedRandomlyCheckBox.AutoSize = true;
-      this.setRandomSeedRandomlyCheckBox.Location = new System.Drawing.Point(218, 6);
+      this.setRandomSeedRandomlyCheckBox.Location = new System.Drawing.Point(218, 15);
       this.setRandomSeedRandomlyCheckBox.Name = "setRandomSeedRandomlyCheckBox";
       this.setRandomSeedRandomlyCheckBox.Size = new System.Drawing.Size(15, 14);
@@ -336,8 +362,8 @@
       // 
       this.initialMutationStrengthTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.initialMutationStrengthTextBox.Location = new System.Drawing.Point(218, 156);
+      this.initialMutationStrengthTextBox.Location = new System.Drawing.Point(218, 187);
       this.initialMutationStrengthTextBox.Name = "initialMutationStrengthTextBox";
       this.initialMutationStrengthTextBox.Size = new System.Drawing.Size(186, 20);
-      this.initialMutationStrengthTextBox.TabIndex = 11;
+      this.initialMutationStrengthTextBox.TabIndex = 13;
       // 
       // evaluationLabel
@@ -345,8 +371,8 @@
       this.evaluationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.evaluationLabel.AutoSize = true;
-      this.evaluationLabel.Location = new System.Drawing.Point(65, 341);
+      this.evaluationLabel.Location = new System.Drawing.Point(65, 364);
       this.evaluationLabel.Name = "evaluationLabel";
       this.evaluationLabel.Size = new System.Drawing.Size(60, 13);
-      this.evaluationLabel.TabIndex = 32;
+      this.evaluationLabel.TabIndex = 31;
       this.evaluationLabel.Text = "&Evaluation:";
       // 
@@ -355,8 +381,8 @@
       this.mutationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.mutationLabel.AutoSize = true;
-      this.mutationLabel.Location = new System.Drawing.Point(65, 315);
+      this.mutationLabel.Location = new System.Drawing.Point(65, 338);
       this.mutationLabel.Name = "mutationLabel";
       this.mutationLabel.Size = new System.Drawing.Size(51, 13);
-      this.mutationLabel.TabIndex = 28;
+      this.mutationLabel.TabIndex = 27;
       this.mutationLabel.Text = "&Mutation:";
       // 
@@ -365,8 +391,8 @@
       this.solutionGenerationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.solutionGenerationLabel.AutoSize = true;
-      this.solutionGenerationLabel.Location = new System.Drawing.Point(65, 289);
+      this.solutionGenerationLabel.Location = new System.Drawing.Point(65, 312);
       this.solutionGenerationLabel.Name = "solutionGenerationLabel";
       this.solutionGenerationLabel.Size = new System.Drawing.Size(103, 13);
-      this.solutionGenerationLabel.TabIndex = 16;
+      this.solutionGenerationLabel.TabIndex = 23;
       this.solutionGenerationLabel.Text = "&Solution Generation:";
       // 
@@ -375,8 +401,8 @@
       this.problemInitializationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.problemInitializationLabel.AutoSize = true;
-      this.problemInitializationLabel.Location = new System.Drawing.Point(65, 263);
+      this.problemInitializationLabel.Location = new System.Drawing.Point(65, 286);
       this.problemInitializationLabel.Name = "problemInitializationLabel";
       this.problemInitializationLabel.Size = new System.Drawing.Size(105, 13);
-      this.problemInitializationLabel.TabIndex = 12;
+      this.problemInitializationLabel.TabIndex = 19;
       this.problemInitializationLabel.Text = "&Problem Initialization:";
       // 
@@ -385,8 +411,8 @@
       this.initialMutationStrengthLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.initialMutationStrengthLabel.AutoSize = true;
-      this.initialMutationStrengthLabel.Location = new System.Drawing.Point(65, 159);
+      this.initialMutationStrengthLabel.Location = new System.Drawing.Point(65, 190);
       this.initialMutationStrengthLabel.Name = "initialMutationStrengthLabel";
       this.initialMutationStrengthLabel.Size = new System.Drawing.Size(121, 13);
-      this.initialMutationStrengthLabel.TabIndex = 10;
+      this.initialMutationStrengthLabel.TabIndex = 12;
       this.initialMutationStrengthLabel.Text = "Initial Mutation Strength:";
       // 
@@ -395,5 +421,5 @@
       this.mutationRateLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.mutationRateLabel.AutoSize = true;
-      this.mutationRateLabel.Location = new System.Drawing.Point(65, 107);
+      this.mutationRateLabel.Location = new System.Drawing.Point(65, 138);
       this.mutationRateLabel.Name = "mutationRateLabel";
       this.mutationRateLabel.Size = new System.Drawing.Size(48, 13);
@@ -404,8 +430,8 @@
       // 
       this.maximumGenerationsTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.maximumGenerationsTextBox.Location = new System.Drawing.Point(218, 130);
+      this.maximumGenerationsTextBox.Location = new System.Drawing.Point(218, 161);
       this.maximumGenerationsTextBox.Name = "maximumGenerationsTextBox";
       this.maximumGenerationsTextBox.Size = new System.Drawing.Size(186, 20);
-      this.maximumGenerationsTextBox.TabIndex = 7;
+      this.maximumGenerationsTextBox.TabIndex = 11;
       // 
       // maximumGenerationsLabel
@@ -413,8 +439,8 @@
       this.maximumGenerationsLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.maximumGenerationsLabel.AutoSize = true;
-      this.maximumGenerationsLabel.Location = new System.Drawing.Point(65, 133);
+      this.maximumGenerationsLabel.Location = new System.Drawing.Point(65, 164);
       this.maximumGenerationsLabel.Name = "maximumGenerationsLabel";
       this.maximumGenerationsLabel.Size = new System.Drawing.Size(114, 13);
-      this.maximumGenerationsLabel.TabIndex = 6;
+      this.maximumGenerationsLabel.TabIndex = 10;
       this.maximumGenerationsLabel.Text = "Maximum &Generations:";
       // 
@@ -422,5 +448,5 @@
       // 
       this.randomSeedTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.randomSeedTextBox.Location = new System.Drawing.Point(218, 26);
+      this.randomSeedTextBox.Location = new System.Drawing.Point(218, 35);
       this.randomSeedTextBox.Name = "randomSeedTextBox";
       this.randomSeedTextBox.Size = new System.Drawing.Size(186, 20);
@@ -430,5 +456,5 @@
       // 
       this.muTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.muTextBox.Location = new System.Drawing.Point(218, 78);
+      this.muTextBox.Location = new System.Drawing.Point(218, 83);
       this.muTextBox.Name = "muTextBox";
       this.muTextBox.Size = new System.Drawing.Size(186, 20);
@@ -439,5 +465,5 @@
       this.setRandomSeedRandomlyLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.setRandomSeedRandomlyLabel.AutoSize = true;
-      this.setRandomSeedRandomlyLabel.Location = new System.Drawing.Point(65, 6);
+      this.setRandomSeedRandomlyLabel.Location = new System.Drawing.Point(65, 15);
       this.setRandomSeedRandomlyLabel.Name = "setRandomSeedRandomlyLabel";
       this.setRandomSeedRandomlyLabel.Size = new System.Drawing.Size(147, 13);
@@ -449,5 +475,5 @@
       this.randomSeedLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.randomSeedLabel.AutoSize = true;
-      this.randomSeedLabel.Location = new System.Drawing.Point(65, 29);
+      this.randomSeedLabel.Location = new System.Drawing.Point(65, 38);
       this.randomSeedLabel.Name = "randomSeedLabel";
       this.randomSeedLabel.Size = new System.Drawing.Size(78, 13);
@@ -459,5 +485,5 @@
       this.populationSizeLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.populationSizeLabel.AutoSize = true;
-      this.populationSizeLabel.Location = new System.Drawing.Point(65, 81);
+      this.populationSizeLabel.Location = new System.Drawing.Point(65, 86);
       this.populationSizeLabel.Name = "populationSizeLabel";
       this.populationSizeLabel.Size = new System.Drawing.Size(25, 13);
@@ -468,5 +494,5 @@
       // 
       this.lambdaTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.lambdaTextBox.Location = new System.Drawing.Point(218, 104);
+      this.lambdaTextBox.Location = new System.Drawing.Point(218, 135);
       this.lambdaTextBox.Name = "lambdaTextBox";
       this.lambdaTextBox.Size = new System.Drawing.Size(186, 20);
@@ -498,5 +524,5 @@
       this.abortButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
       this.abortButton.Enabled = false;
-      this.abortButton.Location = new System.Drawing.Point(81, 396);
+      this.abortButton.Location = new System.Drawing.Point(81, 459);
       this.abortButton.Name = "abortButton";
       this.abortButton.Size = new System.Drawing.Size(75, 23);
@@ -509,5 +535,5 @@
       // 
       this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.resetButton.Location = new System.Drawing.Point(162, 396);
+      this.resetButton.Location = new System.Drawing.Point(162, 459);
       this.resetButton.Name = "resetButton";
       this.resetButton.Size = new System.Drawing.Size(75, 23);
@@ -520,5 +546,5 @@
       // 
       this.cloneEngineButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.cloneEngineButton.Location = new System.Drawing.Point(420, 396);
+      this.cloneEngineButton.Location = new System.Drawing.Point(420, 459);
       this.cloneEngineButton.Name = "cloneEngineButton";
       this.cloneEngineButton.Size = new System.Drawing.Size(106, 23);
@@ -528,17 +554,62 @@
       this.cloneEngineButton.Click += new System.EventHandler(this.cloneEngineButton_Click);
       // 
-      // useSuccessRuleMutationStrengthAdjustmentCheckBox
-      // 
-      this.useSuccessRuleCheckBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.useSuccessRuleCheckBox.AutoSize = true;
-      this.useSuccessRuleCheckBox.Checked = true;
-      this.useSuccessRuleCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
-      this.useSuccessRuleCheckBox.Location = new System.Drawing.Point(411, 184);
-      this.useSuccessRuleCheckBox.Name = "useSuccessRuleMutationStrengthAdjustmentCheckBox";
-      this.useSuccessRuleCheckBox.Size = new System.Drawing.Size(51, 17);
-      this.useSuccessRuleCheckBox.TabIndex = 40;
-      this.useSuccessRuleCheckBox.Text = "Use?";
-      this.useSuccessRuleCheckBox.UseVisualStyleBackColor = true;
-      this.useSuccessRuleCheckBox.CheckedChanged += new System.EventHandler(this.useSuccessRuleCheckBox_CheckedChanged);
+      // rhoLabel
+      // 
+      this.rhoLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.rhoLabel.AutoSize = true;
+      this.rhoLabel.Location = new System.Drawing.Point(65, 112);
+      this.rhoLabel.Name = "rhoLabel";
+      this.rhoLabel.Size = new System.Drawing.Size(30, 13);
+      this.rhoLabel.TabIndex = 6;
+      this.rhoLabel.Text = "Rho:";
+      // 
+      // rhoTextBox
+      // 
+      this.rhoTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.rhoTextBox.Location = new System.Drawing.Point(218, 109);
+      this.rhoTextBox.Name = "rhoTextBox";
+      this.rhoTextBox.Size = new System.Drawing.Size(186, 20);
+      this.rhoTextBox.TabIndex = 7;
+      // 
+      // recombinationLabel
+      // 
+      this.recombinationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.recombinationLabel.AutoSize = true;
+      this.recombinationLabel.Location = new System.Drawing.Point(65, 390);
+      this.recombinationLabel.Name = "recombinationLabel";
+      this.recombinationLabel.Size = new System.Drawing.Size(81, 13);
+      this.recombinationLabel.TabIndex = 35;
+      this.recombinationLabel.Text = "Recombination:";
+      // 
+      // recombinationTextBox
+      // 
+      this.recombinationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.recombinationTextBox.Location = new System.Drawing.Point(218, 387);
+      this.recombinationTextBox.Name = "recombinationTextBox";
+      this.recombinationTextBox.ReadOnly = true;
+      this.recombinationTextBox.Size = new System.Drawing.Size(186, 20);
+      this.recombinationTextBox.TabIndex = 36;
+      // 
+      // setRecombinationButton
+      // 
+      this.setRecombinationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.setRecombinationButton.Location = new System.Drawing.Point(469, 387);
+      this.setRecombinationButton.Name = "setRecombinationButton";
+      this.setRecombinationButton.Size = new System.Drawing.Size(43, 20);
+      this.setRecombinationButton.TabIndex = 38;
+      this.setRecombinationButton.Text = "Set...";
+      this.setRecombinationButton.UseVisualStyleBackColor = true;
+      this.setRecombinationButton.Click += new System.EventHandler(this.setRecombinationButton_Click);
+      // 
+      // viewRecombinationButton
+      // 
+      this.viewRecombinationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.viewRecombinationButton.Location = new System.Drawing.Point(410, 387);
+      this.viewRecombinationButton.Name = "viewRecombinationButton";
+      this.viewRecombinationButton.Size = new System.Drawing.Size(53, 20);
+      this.viewRecombinationButton.TabIndex = 37;
+      this.viewRecombinationButton.Text = "View...";
+      this.viewRecombinationButton.UseVisualStyleBackColor = true;
+      this.viewRecombinationButton.Click += new System.EventHandler(this.viewRecombinationButton_Click);
       // 
       // ESEditor
@@ -552,5 +623,5 @@
       this.Controls.Add(this.executeButton);
       this.Name = "ESEditor";
-      this.Size = new System.Drawing.Size(526, 419);
+      this.Size = new System.Drawing.Size(526, 482);
       this.tabControl.ResumeLayout(false);
       this.parametersTabPage.ResumeLayout(false);
@@ -604,4 +675,10 @@
     private System.Windows.Forms.Label targetSuccessRateLabel;
     private System.Windows.Forms.CheckBox useSuccessRuleCheckBox;
+    private System.Windows.Forms.Button setRecombinationButton;
+    private System.Windows.Forms.Button viewRecombinationButton;
+    private System.Windows.Forms.TextBox recombinationTextBox;
+    private System.Windows.Forms.Label recombinationLabel;
+    private System.Windows.Forms.TextBox rhoTextBox;
+    private System.Windows.Forms.Label rhoLabel;
   }
 }
Index: /trunk/sources/HeuristicLab.ES/ESEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.ES/ESEditor.cs	(revision 85)
+++ /trunk/sources/HeuristicLab.ES/ESEditor.cs	(revision 86)
@@ -66,4 +66,5 @@
       // neither Refresh() nor Update() work
       muTextBox.Text = ES.Mu.ToString();
+      rhoTextBox.Text = ES.Rho.ToString();
       lambdaTextBox.Text = ES.Lambda.ToString();
     }
@@ -79,4 +80,5 @@
         mutationTextBox.Text = ES.Mutator.GetType().Name;
         evaluationTextBox.Text = ES.Evaluator.GetType().Name;
+        recombinationTextBox.Text = ES.Recombinator.GetType().Name;
       }
     }
@@ -86,4 +88,5 @@
       randomSeedTextBox.DataBindings.Add("Text", ES, "Seed");
       muTextBox.DataBindings.Add("Text", ES, "Mu");
+      rhoTextBox.DataBindings.Add("Text", ES, "Rho");
       lambdaTextBox.DataBindings.Add("Text", ES, "Lambda");
       maximumGenerationsTextBox.DataBindings.Add("Text", ES, "MaximumGenerations");
@@ -96,5 +99,5 @@
     private void plusNotationButton_Click(object sender, EventArgs e) {
       if (plusNotationButton.Text.Equals("Plus")) {
-        plusNotationButton.Text = "Point";
+        plusNotationButton.Text = "Comma";
       } else {
         plusNotationButton.Text = "Plus";
@@ -122,4 +125,9 @@
         PluginManager.ControlManager.ShowControl(view);
     }
+    private void viewRecombinationButton_Click(object sender, EventArgs e) {
+      IView view = ES.Recombinator.CreateView();
+      if (view != null)
+        PluginManager.ControlManager.ShowControl(view);
+    }
     private void setProblemInitializationButton_Click(object sender, EventArgs e) {
       if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
@@ -148,4 +156,11 @@
         ES.Evaluator = chooseOperatorDialog.Operator;
         evaluationTextBox.Text = ES.Evaluator.GetType().Name;
+      }
+    }
+    private void setRecombinationButton_Click(object sender, EventArgs e) {
+      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+        ES.Recombinator = chooseOperatorDialog.Operator;
+        recombinationTextBox.Text = ES.Recombinator.GetType().Name;
       }
     }
Index: /trunk/sources/HeuristicLab.ES/ESRandomSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.ES/ESRandomSelector.cs	(revision 86)
+++ /trunk/sources/HeuristicLab.ES/ESRandomSelector.cs	(revision 86)
@@ -0,0 +1,86 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Selection;
+
+namespace HeuristicLab.ES {
+  public class ESRandomSelector : OperatorBase {
+    public override string Description {
+      get {
+        return @"Selects rho*lambda individuals with each rho successing individuals being selected from the parent population without repetitions.";
+      }
+    }
+
+    public ESRandomSelector()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Lambda", "The amount of children to select", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Rho", "The amount of parents per child", typeof(IntData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IScope source = new Scope("Remaining");
+      while (scope.SubScopes.Count > 0) {
+        IScope s = scope.SubScopes[0];
+        scope.RemoveSubScope(s);
+        source.AddSubScope(s);
+      }
+      scope.AddSubScope(source);
+      IScope target = new Scope("Selected");
+      scope.AddSubScope(target);
+
+      Select(source, target);
+
+      return null;
+    }
+
+    protected virtual void Select(IScope source, IScope target) {
+      IRandom random = GetVariableValue<IRandom>("Random", source, true);
+      int children = GetVariableValue<IntData>("Lambda", source, true).Data;
+      int parents = GetVariableValue<IntData>("Rho", source, true).Data;
+      int parentsAvailable = source.SubScopes.Count;
+
+      if (parents > parentsAvailable)
+        throw new InvalidOperationException("Cannot select more parents per child than there are parents available");
+
+      IList<int> selectedParents = new List<int>(parentsAvailable);
+      for (int i = 0; i < children; i++) {
+        selectedParents.Clear();
+        for (int j = 0; j < parents; j++) {
+          int nextParent = j; // will be used in case parents == parentsAvailable
+          if (parents < parentsAvailable) {
+            do {
+              nextParent = random.Next(parentsAvailable);
+            } while (selectedParents.Contains(nextParent));
+          }
+
+          target.AddSubScope((IScope)source.SubScopes[nextParent].Clone());
+          selectedParents.Add(nextParent);
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.ES/HeuristicLab.ES.csproj
===================================================================
--- /trunk/sources/HeuristicLab.ES/HeuristicLab.ES.csproj	(revision 85)
+++ /trunk/sources/HeuristicLab.ES/HeuristicLab.ES.csproj	(revision 86)
@@ -51,4 +51,5 @@
   <ItemGroup>
     <Compile Include="ES.cs" />
+    <Compile Include="ESRandomSelector.cs" />
     <Compile Include="HeuristicLabESPlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
Index: /trunk/sources/HeuristicLab.RealVector/DiscreteRecombination.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/DiscreteRecombination.cs	(revision 86)
+++ /trunk/sources/HeuristicLab.RealVector/DiscreteRecombination.cs	(revision 86)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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;
+
+namespace HeuristicLab.RealVector {
+  public class DiscreteRecombination : OperatorBase {
+    public override string Description {
+      get {
+        return @"Discrete/dominant recombination creates a new offspring by combining the alleles in the parents such that each allele is randomly selected from one parent";
+      }
+    }
+
+    public DiscreteRecombination()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Rho", "Amount of parents to recombine", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("RealVector", "Parent and child real vector", typeof(DoubleArrayData), VariableKind.In | VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      int rho = GetVariableValue<IntData>("Rho", scope, true).Data;
+      // with just 1 parent no recombination is necessary/possible
+      if (rho == 1) return null;
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+
+      if (scope.SubScopes.Count % rho != 0)
+        throw new InvalidOperationException("Number of parents is not a multiple of rho");
+      int lambda = scope.SubScopes.Count / rho;
+      IList<double[]> parents = new List<double[]>(rho);
+
+      for (int i = 0; i < lambda; i++) {
+        IScope childScope = new Scope(i.ToString());
+        double[] childGene = (double[])scope.SubScopes[0].GetVariableValue<DoubleArrayData>("RealVector", false).Data.Clone();
+        parents.Clear();
+        for (int j = 0; j < rho; j++) {
+          IScope parent = scope.SubScopes[0];
+          parents.Add(parent.GetVariableValue<DoubleArrayData>("RealVector", false).Data);
+          scope.RemoveSubScope(parent);
+        }
+        // actual discrete recombination
+        for (int x = 0; x < childGene.Length; x++) {
+          childGene[x] = parents[random.Next(rho)][x];
+        }
+        childScope.AddVariable(new Variable(scope.SubScopes[0].TranslateName("RealVector"), new DoubleArrayData(childGene)));
+        scope.AddSubScope(childScope);
+      }
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/HeuristicLab.RealVector.csproj
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/HeuristicLab.RealVector.csproj	(revision 85)
+++ /trunk/sources/HeuristicLab.RealVector/HeuristicLab.RealVector.csproj	(revision 86)
@@ -45,6 +45,8 @@
     <Compile Include="DiscreteCrossover.cs" />
     <Compile Include="HeuristicCrossover.cs" />
+    <Compile Include="IntermediateRecombination.cs" />
     <Compile Include="RandomConvexCrossover.cs" />
     <Compile Include="LocalCrossover.cs" />
+    <Compile Include="DiscreteRecombination.cs" />
     <Compile Include="UniformAllPositionsManipulator.cs" />
     <Compile Include="UniformRandomRealVectorGenerator.cs" />
Index: /trunk/sources/HeuristicLab.RealVector/IntermediateRecombination.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/IntermediateRecombination.cs	(revision 86)
+++ /trunk/sources/HeuristicLab.RealVector/IntermediateRecombination.cs	(revision 86)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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;
+
+namespace HeuristicLab.RealVector {
+  public class IntermediateRecombination : OperatorBase {
+    public override string Description {
+      get {
+        return @"Intermediate recombination creates a new offspring by computing the centroid of a number of parents";
+      }
+    }
+
+    public IntermediateRecombination()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Rho", "Amount of parents to recombine", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("RealVector", "Parent and child real vector", typeof(DoubleArrayData), VariableKind.In | VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      int rho = GetVariableValue<IntData>("Rho", scope, true).Data;
+      // with just 1 parent no recombination is necessary/possible
+      if (rho == 1) return null;
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+
+      if (scope.SubScopes.Count % rho != 0)
+        throw new InvalidOperationException("Number of parents is not a multiple of rho");
+      int lambda = scope.SubScopes.Count / rho;
+      IList<double[]> parents = new List<double[]>(rho);
+
+      for (int i = 0; i < lambda; i++) {
+        IScope childScope = new Scope(i.ToString());
+        double[] childGene = (double[])scope.SubScopes[0].GetVariableValue<DoubleArrayData>("RealVector", false).Data.Clone();
+        parents.Clear();
+        for (int j = 0; j < rho; j++) {
+          IScope parent = scope.SubScopes[0];
+          parents.Add(parent.GetVariableValue<DoubleArrayData>("RealVector", false).Data);
+          scope.RemoveSubScope(parent);
+        }
+        // actual intermediate recombination
+        for (int x = 0; x < childGene.Length; x++) {
+          double sum = 0.0;
+          for (int y = 0; y < rho; y++) {
+            sum += parents[y][x];
+          }
+          childGene[x] = sum / rho;
+        }
+        childScope.AddVariable(new Variable(scope.SubScopes[0].TranslateName("RealVector"), new DoubleArrayData(childGene)));
+        scope.AddSubScope(childScope);
+      }
+      return null;
+    }
+  }
+}
