Index: trunk/sources/HeuristicLab.SimOpt/HeuristicLab.SimOpt.csproj
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/HeuristicLab.SimOpt.csproj	(revision 1412)
+++ trunk/sources/HeuristicLab.SimOpt/HeuristicLab.SimOpt.csproj	(revision 1413)
@@ -73,5 +73,14 @@
     </Compile>
     <Compile Include="IntParameterBoundConstraint.cs" />
+    <Compile Include="NumericDataRoundedAverageMultiCrossover.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="SimOptCrossoverPreparator.cs" />
+    <Compile Include="SimOptSelfAdaptiveNumericVectorNormalMutation.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SimOptSelfAdaptiveNumericVectorProbabilityMutation.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="SimOptSequentialSubOperatorProcessor.cs" />
     <Compile Include="SimOptSquentialSubOperatorCrossover.cs" />
Index: trunk/sources/HeuristicLab.SimOpt/HeuristicLabSimOptPlugin.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/HeuristicLabSimOptPlugin.cs	(revision 1412)
+++ trunk/sources/HeuristicLab.SimOpt/HeuristicLabSimOptPlugin.cs	(revision 1413)
@@ -35,4 +35,5 @@
   [Dependency(Dependency = "HeuristicLab.Evolutionary-3.2")]
   [Dependency(Dependency = "HeuristicLab.Selection-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Random-3.2")]
   public class HeuristicLabSimOptPlugin : PluginBase {
   }
Index: trunk/sources/HeuristicLab.SimOpt/NumericDataRoundedAverageMultiCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/NumericDataRoundedAverageMultiCrossover.cs	(revision 1413)
+++ trunk/sources/HeuristicLab.SimOpt/NumericDataRoundedAverageMultiCrossover.cs	(revision 1413)
@@ -0,0 +1,73 @@
+﻿#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.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Evolutionary;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class NumericDataRoundedAverageMultiCrossover : CrossoverBase {
+
+    public override string Description {
+      get { return @"Takes two IntData, DoubleData, ConstrainedIntData, or ConstrainedDoubleData, averages, and rounds them."; }
+    }
+
+    public NumericDataRoundedAverageMultiCrossover()
+      : base() {
+      AddVariableInfo(new VariableInfo("VariableName", "The name of the variable to cross", typeof(IObjectData), VariableKind.In | VariableKind.Out));
+    }
+
+    protected override void Cross(IScope scope, IRandom random) {
+      IScope[] parents = scope.SubScopes.ToArray<IScope>();
+      if (parents.Length == 0) throw new ArgumentException("ERROR in NumericDataRoundedAverageMultiCrossover: No parents are given");
+      double sum = 0.0;
+      IVariable var = null;
+      for (int i = 0; i < parents.Length; i++) {
+        var = parents[i].GetVariable(scope.TranslateName("VariableName"));
+        if (var.Value is DoubleData) {
+          sum += ((DoubleData)var.Value).Data;
+        } else if (var.Value is IntData) {
+          sum += ((IntData)var.Value).Data;
+        } else if (var.Value is ConstrainedIntData) {
+          sum += ((ConstrainedIntData)var.Value).Data;
+        } else if (var.Value is ConstrainedDoubleData) {
+          sum += ((ConstrainedDoubleData)var.Value).Data;
+        } else throw new InvalidOperationException("ERROR in NumericDataRoundedAverageMultiCrossover: Encountered unknown type: " + ((var.Value != null) ? (var.Value.GetType().ToString()) : ("null")));
+      }
+      double roundedAverage = Math.Round(sum / (double)parents.Length);
+      IVariable varChild = (IVariable)var.Clone();
+      if (varChild.Value is DoubleData) {
+        (varChild.Value as DoubleData).Data = roundedAverage;
+      } else if (var.Value is IntData) {
+        (varChild.Value as IntData).Data = (int)roundedAverage;
+      } else if (var.Value is ConstrainedIntData) {
+        (varChild.Value as ConstrainedIntData).TrySetData((int)roundedAverage);
+      } else if (var.Value is ConstrainedDoubleData) {
+        (varChild.Value as ConstrainedDoubleData).TrySetData(roundedAverage);
+      }
+      scope.AddVariable(varChild);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptSelfAdaptiveNumericVectorNormalMutation.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptSelfAdaptiveNumericVectorNormalMutation.cs	(revision 1413)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptSelfAdaptiveNumericVectorNormalMutation.cs	(revision 1413)
@@ -0,0 +1,88 @@
+﻿#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.Linq;
+using System.Text;
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.SimOpt {
+  public class SimOptSelfAdaptiveNumericVectorNormalMutation : OperatorBase {
+
+    public override string Description {
+      get { return @"This operator modifies all elements in the parameter vector using a normal distributed variable with mean 0 and variable sigma"; }
+    }
+
+    public SimOptSelfAdaptiveNumericVectorNormalMutation()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "The random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("ShakingFactors", "The mutation strength vector", typeof(DoubleArrayData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Items", "The parameter vector", typeof(ConstrainedItemList), VariableKind.In | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      DoubleArrayData shakingFactors = GetVariableValue<DoubleArrayData>("ShakingFactors", scope, false);
+
+      ConstrainedItemList parameters = GetVariableValue<ConstrainedItemList>("Items", scope, false);
+      int tries;
+      ConstrainedItemList temp = null;
+      ICollection<IConstraint> tmp;
+
+      NormalDistributedRandom nd = new NormalDistributedRandom(random, 0.0, 1.0);
+
+      for (tries = 0; tries < 10000; tries++) {
+        temp = (ConstrainedItemList)parameters.Clone();
+
+        temp.BeginCombinedOperation();
+        for (int i = 0; i < temp.Count; i++) {
+          if (random.NextDouble() < shakingFactors.Data[i % shakingFactors.Data.Length]) {
+            if (((Variable)temp[i]).Value is IntData) {
+              ((IntData)((Variable)temp[i]).Value).Data += ((int)(nd.NextDouble() * shakingFactors.Data[i % shakingFactors.Data.Length]));
+            } else if (((Variable)temp[i]).Value is DoubleData) {
+              ((DoubleData)((Variable)temp[i]).Value).Data += nd.NextDouble() * shakingFactors.Data[i % shakingFactors.Data.Length];
+            } else if (((Variable)temp[i]).Value is ConstrainedIntData) {
+              int val = ((ConstrainedIntData)((Variable)temp[i]).Value).Data;
+              ((ConstrainedIntData)((Variable)temp[i]).Value).TrySetData(val + ((int)(nd.NextDouble() * shakingFactors.Data[i % shakingFactors.Data.Length])));
+            } else if (((Variable)temp[i]).Value is ConstrainedDoubleData) {
+              double val = ((ConstrainedDoubleData)((Variable)temp[i]).Value).Data;
+              ((ConstrainedDoubleData)((Variable)temp[i]).Value).TrySetData(val + nd.NextDouble() * shakingFactors.Data[i % shakingFactors.Data.Length]);
+            }
+          }
+        }
+        if (temp.EndCombinedOperation(out tmp)) break;
+      }
+
+      if (tries < 10000) {
+        parameters.BeginCombinedOperation();
+        for (int i = 0; i < temp.Count; i++)
+          parameters.TrySetAt(i, temp[i], out tmp);
+        parameters.EndCombinedOperation(out tmp);
+      } else throw new InvalidOperationException("ERROR in SimOptSelfAdaptiveNumericVectorProbabilityMutation: no feasible result in 10000 tries");
+
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptSelfAdaptiveNumericVectorProbabilityMutation.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptSelfAdaptiveNumericVectorProbabilityMutation.cs	(revision 1413)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptSelfAdaptiveNumericVectorProbabilityMutation.cs	(revision 1413)
@@ -0,0 +1,87 @@
+﻿#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.Linq;
+using System.Text;
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class SimOptSelfAdaptiveNumericVectorProbabilityMutation : OperatorBase {
+
+    public override string Description {
+      get { return @"Takes the values of a strategy vectors as possibilities to manipulate a certain dimension in the parameter vector"; }
+    }
+
+    public SimOptSelfAdaptiveNumericVectorProbabilityMutation()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "The random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Probabilities", "The probability vector", typeof(DoubleArrayData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Items", "The parameter vector", typeof(ConstrainedItemList), VariableKind.In | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("MaxVector", "Vector containing the maximum values", typeof(DoubleArrayData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("MinVector", "Vector containing the minimum values", typeof(DoubleArrayData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      DoubleArrayData max = GetVariableValue<DoubleArrayData>("MaxVector", scope, true);
+      DoubleArrayData min = GetVariableValue<DoubleArrayData>("MinVector", scope, true);
+      DoubleArrayData probs = GetVariableValue<DoubleArrayData>("Probabilities", scope, false);
+
+      ConstrainedItemList parameters = GetVariableValue<ConstrainedItemList>("Items", scope, false);
+      int tries;
+      ConstrainedItemList temp = null;
+      ICollection<IConstraint> tmp;
+
+      for (tries = 0; tries < 100; tries++) {
+        temp = (ConstrainedItemList)parameters.Clone();
+
+        temp.BeginCombinedOperation();
+        for (int i = 0; i < temp.Count; i++) {
+          if (random.NextDouble() < probs.Data[i % probs.Data.Length]) {
+            if (((Variable)temp[i]).Value is IntData) {
+              ((IntData)((Variable)temp[i]).Value).Data = random.Next((int)Math.Floor(min.Data[i % min.Data.Length]), (int)Math.Ceiling(max.Data[i % max.Data.Length]));
+            } else if (((Variable)temp[i]).Value is DoubleData) {
+              ((DoubleData)((Variable)temp[i]).Value).Data = min.Data[i] + (max.Data[i % max.Data.Length] - min.Data[i % min.Data.Length]) * random.NextDouble();
+            } else if (((Variable)temp[i]).Value is ConstrainedIntData) {
+              ((ConstrainedIntData)((Variable)temp[i]).Value).TrySetData(random.Next((int)Math.Floor(min.Data[i % min.Data.Length]), (int)Math.Ceiling(max.Data[i % max.Data.Length])));
+            } else if (((Variable)temp[i]).Value is ConstrainedDoubleData) {
+              ((ConstrainedDoubleData)((Variable)temp[i]).Value).TrySetData(min.Data[i % min.Data.Length] + (max.Data[i % max.Data.Length] - min.Data[i % min.Data.Length]) * random.NextDouble());
+            }
+          }
+        }
+        if (temp.EndCombinedOperation(out tmp)) break;
+      }
+
+      if (tries < 100) {
+        parameters.BeginCombinedOperation();
+        for (int i = 0; i < temp.Count; i++)
+          parameters.TrySetAt(i, temp[i], out tmp);
+        parameters.EndCombinedOperation(out tmp);
+      } else throw new InvalidOperationException("ERROR in SimOptSelfAdaptiveNumericVectorProbabilityMutation: no feasible result in 100 tries");
+
+      return null;
+    }
+  }
+}
