Index: /trunk/sources/HeuristicLab.RealVector/AverageCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/AverageCrossover.cs	(revision 70)
+++ /trunk/sources/HeuristicLab.RealVector/AverageCrossover.cs	(revision 70)
@@ -0,0 +1,38 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.RealVector {
+  class AverageCrossover : RealVectorCrossoverBase {
+    public override string Description {
+      get { return "Average (Continuous) crossover for real vectors."; }
+    }
+
+    public static double[] Apply(IScope scope, IRandom random, double[] parent1, double[] parent2) {
+      int length = parent1.Length;
+      double[] result = new double[length];
+      double min = scope.GetVariableValue<DoubleData>("Minimum", true).Data;
+      double max = scope.GetVariableValue<DoubleData>("Maximum", true).Data;
+
+      for (int i = 0; i < length; i++) {
+        if (random.NextDouble() < 0.5) {
+          result[i] = (parent1[i] + parent2[i]) / 2;
+        } else {
+          result[i] = parent1[i];
+        }
+
+        // check borders
+        if (result[i] < min) { result[i] = min; }
+        if (result[i] > max) { result[i] = max; }
+      }
+
+      return result;
+    }
+
+    protected override double[] Cross(IScope scope, IRandom random, double[] parent1, double[] parent2) {
+      return Apply(scope, random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/CompleteAverageCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/CompleteAverageCrossover.cs	(revision 70)
+++ /trunk/sources/HeuristicLab.RealVector/CompleteAverageCrossover.cs	(revision 70)
@@ -0,0 +1,34 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.RealVector {
+  class CompleteAverageCrossover : RealVectorCrossoverBase {
+    public override string Description {
+      get { return "Complete average (complete continuous) crossover for real vectors."; }
+    }
+
+    public static double[] Apply(IScope scope, IRandom random, double[] parent1, double[] parent2) {
+      int length = parent1.Length;
+      double[] result = new double[length];
+      double min = scope.GetVariableValue<DoubleData>("Minimum", true).Data;
+      double max = scope.GetVariableValue<DoubleData>("Maximum", true).Data;
+
+      for (int i = 0; i < length; i++) {
+        result[i] = (parent1[i] + parent2[i]) / 2;
+
+        // check borders
+        if (result[i] < min) { result[i] = min; }
+        if (result[i] > max) { result[i] = max; }
+      }
+
+      return result;
+    }
+
+    protected override double[] Cross(IScope scope, IRandom random, double[] parent1, double[] parent2) {
+      return Apply(scope, random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/DiscreteCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/DiscreteCrossover.cs	(revision 70)
+++ /trunk/sources/HeuristicLab.RealVector/DiscreteCrossover.cs	(revision 70)
@@ -0,0 +1,31 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.RealVector {
+  class DiscreteCrossover : RealVectorCrossoverBase {
+    public override string Description {
+      get { return "Discrete crossover for real vectors."; }
+    }
+
+    public static double[] Apply(IRandom random, double[] parent1, double[] parent2) {
+      int length = parent1.Length;
+      double[] result = new double[length];
+
+      for (int i = 0; i < length; i++) {
+        if (random.NextDouble() < 0.5) {
+          result[i] = parent1[i];
+        } else {
+          result[i] = parent2[i];
+        }
+      }
+
+      return result;
+    }
+
+    protected override double[] Cross(IScope scope, IRandom random, double[] parent1, double[] parent2) {
+      return Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/HeuristicCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/HeuristicCrossover.cs	(revision 70)
+++ /trunk/sources/HeuristicLab.RealVector/HeuristicCrossover.cs	(revision 70)
@@ -0,0 +1,69 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Evolutionary;
+
+namespace HeuristicLab.RealVector {
+  class HeuristicCrossover : CrossoverBase {
+    public HeuristicCrossover()
+      : base() {
+      AddVariableInfo(new VariableInfo("Quality", "Quality value", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("RealVector", "Parent and child real vector", typeof(DoubleArrayData), VariableKind.In | VariableKind.New));
+    }
+
+    public override string Description {
+      get { return "Heuristic crossover for real vectors."; }
+    }
+
+    public static double[] Apply(IScope scope, IRandom random, double[] parent1, double[] parent2, double quality1, double quality2) {
+      double factor;
+      int length = parent1.Length;
+      double[] result = new double[length];
+      bool isMaximization = scope.GetVariableValue<BoolData>("Maximization", true).Data;
+      double min = scope.GetVariableValue<DoubleData>("Minimum", true).Data;
+      double max = scope.GetVariableValue<DoubleData>("Maximum", true).Data;
+
+      factor = random.NextDouble();
+
+      for (int i = 0; i < length; i++) {
+        if (isMaximization) {
+          // maximization problem
+          if (quality1 > quality2) {
+            result[i] = parent1[i] + factor * (parent1[i] - parent2[i]);
+          } else {
+            result[i] = parent2[i] + factor * (parent2[i] - parent1[i]);
+          } // if
+        } else {
+          // minimization problem
+          if (quality1 < quality2) {
+            result[i] = parent1[i] + factor * (parent1[i] - parent2[i]);
+          } else {
+            result[i] = parent2[i] + factor * (parent2[i] - parent1[i]);
+          } // if
+        } // if
+
+        // check borders
+        if (result[i] < min) { result[i] = min; }
+        if (result[i] > max) { result[i] = max; }
+      } // for
+
+      return result;
+    }
+
+    protected sealed override void Cross(IScope scope, IRandom random, IScope parent1, IScope parent2, IScope child) {
+      IVariableInfo realVectorInfo = GetVariableInfo("RealVector");
+      IVariableInfo qualityInfo = GetVariableInfo("Quality");
+      DoubleArrayData vector1 = parent1.GetVariableValue<DoubleArrayData>(realVectorInfo.ActualName, false);
+      DoubleArrayData vector2 = parent2.GetVariableValue<DoubleArrayData>(realVectorInfo.ActualName, false);
+      DoubleData quality1 = parent1.GetVariableValue<DoubleData>(qualityInfo.ActualName, false);
+      DoubleData quality2 = parent2.GetVariableValue<DoubleData>(qualityInfo.ActualName, false);
+
+      if (vector1.Data.Length != vector2.Data.Length) throw new InvalidOperationException("Cannot apply crossover to real vectors of different length.");
+
+      double[] result = Apply(scope, random, vector1.Data, vector2.Data, quality1.Data, quality2.Data);
+      child.AddVariable(new Variable(realVectorInfo.ActualName, new DoubleArrayData(result)));
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/HeuristicLab.RealVector.csproj
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/HeuristicLab.RealVector.csproj	(revision 69)
+++ /trunk/sources/HeuristicLab.RealVector/HeuristicLab.RealVector.csproj	(revision 70)
@@ -40,4 +40,11 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="AverageCrossover.cs" />
+    <Compile Include="CompleteAverageCrossover.cs" />
+    <Compile Include="DiscreteCrossover.cs" />
+    <Compile Include="HeuristicCrossover.cs" />
+    <Compile Include="RandomConvexCrossover.cs" />
+    <Compile Include="RandomLocalCrossover.cs" />
+    <Compile Include="UniformAllPositionsManipulator.cs" />
     <Compile Include="UniformRandomRealVectorGenerator.cs" />
     <Compile Include="UniformOnePositionManipulator.cs" />
Index: /trunk/sources/HeuristicLab.RealVector/RandomConvexCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/RandomConvexCrossover.cs	(revision 70)
+++ /trunk/sources/HeuristicLab.RealVector/RandomConvexCrossover.cs	(revision 70)
@@ -0,0 +1,37 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.RealVector {
+  class RandomConvexCrossover : RealVectorCrossoverBase {
+    public override string Description {
+      get { return "Random convex crossover for real vectors."; }
+    }
+
+    public static double[] Apply(IScope scope, IRandom random, double[] parent1, double[] parent2) {
+      double factor;
+      int length = parent1.Length;
+      double[] result = new double[length];
+      double min = scope.GetVariableValue<DoubleData>("Minimum", true).Data;
+      double max = scope.GetVariableValue<DoubleData>("Maximum", true).Data;
+
+      factor = random.NextDouble();
+
+      for (int i = 0; i < length; i++) {
+        result[i] = (factor * parent1[i]) + ((1 - factor) * parent2[i]);
+
+        // check borders
+        if (result[i] < min) { result[i] = min; }
+        if (result[i] > max) { result[i] = max; }
+      }
+
+      return result;
+    }
+
+    protected override double[] Cross(IScope scope, IRandom random, double[] parent1, double[] parent2) {
+      return Apply(scope, random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/RandomLocalCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/RandomLocalCrossover.cs	(revision 70)
+++ /trunk/sources/HeuristicLab.RealVector/RandomLocalCrossover.cs	(revision 70)
@@ -0,0 +1,36 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.RealVector {
+  class RandomLocalCrossover : RealVectorCrossoverBase {
+    public override string Description {
+      get { return "Random local crossover for real vectors."; }
+    }
+
+    public static double[] Apply(IScope scope, IRandom random, double[] parent1, double[] parent2) {
+      double factor;
+      int length = parent1.Length;
+      double[] result = new double[length];
+      double min = scope.GetVariableValue<DoubleData>("Minimum", true).Data;
+      double max = scope.GetVariableValue<DoubleData>("Maximum", true).Data;
+
+      for (int i = 0; i < length; i++) {
+        factor = random.NextDouble();
+        result[i] = (factor * parent1[i]) + ((1 - factor) * parent2[i]);
+
+        // check borders
+        if (result[i] < min) { result[i] = min; }
+        if (result[i] > max) { result[i] = max; }
+      }
+
+      return result;
+    }
+
+    protected override double[] Cross(IScope scope, IRandom random, double[] parent1, double[] parent2) {
+      return Apply(scope, random, parent1, parent2);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.RealVector/UniformAllPositionsManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.RealVector/UniformAllPositionsManipulator.cs	(revision 70)
+++ /trunk/sources/HeuristicLab.RealVector/UniformAllPositionsManipulator.cs	(revision 70)
@@ -0,0 +1,34 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.RealVector {
+  class UniformAllPositionsManipulator : RealVectorManipulatorBase {
+    public override string Description {
+      get { return "Uniformly distributed change of all positions of a real vector."; }
+    }
+
+    public UniformAllPositionsManipulator() {
+      AddVariableInfo(new VariableInfo("Minimum", "Minimum of the sampling range for the vector element (included)", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Maximum", "Maximum of the sampling range for the vector element (excluded)", typeof(DoubleData), VariableKind.In));
+    }
+
+    public static double[] Apply(IRandom random, double[] vector, double min, double max) {
+      double[] result = (double[])vector.Clone();
+
+      for (int i = 0; i < result.Length; i++) {
+        result[i] = min + random.NextDouble() * (max - min);
+      }
+
+      return result;
+    }
+
+    protected override double[] Manipulate(IScope scope, IRandom random, double[] vector) {
+      double min = GetVariableValue<DoubleData>("Minimum", scope, true).Data;
+      double max = GetVariableValue<DoubleData>("Maximum", scope, true).Data;
+      return Apply(random, vector, min, max);
+    }
+  }
+}
