Index: trunk/sources/HeuristicLab.Selection/3.3/BestSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/BestSelector.cs	(revision 3096)
+++ trunk/sources/HeuristicLab.Selection/3.3/BestSelector.cs	(revision 3096)
@@ -0,0 +1,69 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Linq;
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Selection {
+  /// <summary>
+  /// A selection operator which considers a single double quality value and selects the best.
+  /// </summary>
+  [Item("BestSelector", "A selection operator which considers a single double quality value and selects the best.")]
+  [StorableClass]
+  [Creatable("Test")]
+  public sealed class BestSelector : SingleObjectiveSelector {
+    public BestSelector() : base() { }
+
+    protected override IScope[] Select(List<IScope> scopes) {
+      int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
+      bool copy = CopySelectedParameter.Value.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      IScope[] selected = new IScope[count];
+
+      // create a list for each scope that contains the scope's index in the original scope list
+      var temp = qualities.Select((x, index) => new { index, x.Value });
+      if (maximization)
+        temp = temp.OrderByDescending(x => x.Value);
+      else
+        temp = temp.OrderBy(x => x.Value);
+      var list = temp.ToList();
+
+      int j = 0;
+      for (int i = 0; i < count; i++) {
+        if (copy) {
+          selected[i] = (IScope)scopes[list[j].index].Clone();
+          j++;
+          if (j >= list.Count) j = 0;
+        } else {
+          selected[i] = scopes[list[j].index];
+          scopes.RemoveAt(list[j].index);
+          list.RemoveAt(j);
+        }
+      }
+      return selected;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Selection/3.3/HeuristicLab.Selection-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/HeuristicLab.Selection-3.3.csproj	(revision 3048)
+++ trunk/sources/HeuristicLab.Selection/3.3/HeuristicLab.Selection-3.3.csproj	(revision 3096)
@@ -82,4 +82,6 @@
   <ItemGroup>
     <None Include="HeuristicLabSelectionPlugin.cs.frame" />
+    <Compile Include="BestSelector.cs" />
+    <Compile Include="SingleObjectiveSelector.cs" />
     <Compile Include="LeftReducer.cs" />
     <Compile Include="MergingReducer.cs" />
@@ -88,7 +90,5 @@
     <Compile Include="ProportionalSelector.cs" />
     <Compile Include="RightReducer.cs" />
-    <Compile Include="RightSelector.cs" />
     <Compile Include="StochasticSelector.cs" />
-    <Compile Include="LeftSelector.cs" />
     <Compile Include="RandomSelector.cs" />
     <Compile Include="StochasticSingleObjectiveSelector.cs" />
@@ -97,4 +97,5 @@
     <Compile Include="Selector.cs" />
     <Compile Include="TournamentSelector.cs" />
+    <Compile Include="WorstSelector.cs" />
   </ItemGroup>
   <ItemGroup>
Index: trunk/sources/HeuristicLab.Selection/3.3/LeftSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/LeftSelector.cs	(revision 3048)
+++ 	(revision )
@@ -1,55 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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.Collections.Generic;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Selection {
-  /// <summary>
-  /// An operator which selects sub-scopes from left to right.
-  /// </summary>
-  [Item("LeftSelector", "An operator which selects sub-scopes from left to right.")]
-  [StorableClass]
-  [Creatable("Test")]
-  public sealed class LeftSelector : Selector {
-    public LeftSelector() : base() { }
-
-    protected override IScope[] Select(List<IScope> scopes) {
-      int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
-      bool copy = CopySelectedParameter.Value.Value;
-      IScope[] selected = new IScope[count];
-
-      int j = 0;
-      for (int i = 0; i < count; i++) {
-        if (copy) {
-          selected[i] = (IScope)scopes[j].Clone();
-          j++;
-          if (j >= scopes.Count) j = 0;
-        } else {
-          selected[i] = scopes[0];
-          scopes.RemoveAt(0);
-        }
-      }
-      return selected;
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Selection/3.3/LinearRankSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/LinearRankSelector.cs	(revision 3048)
+++ trunk/sources/HeuristicLab.Selection/3.3/LinearRankSelector.cs	(revision 3096)
@@ -34,8 +34,5 @@
   [Creatable("Test")]
   public sealed class LinearRankSelector : StochasticSingleObjectiveSelector {
-    public LinearRankSelector()
-      : base() {
-      CopySelected.Value = true;
-    }
+    public LinearRankSelector() : base() { }
 
     protected override IScope[] Select(List<IScope> scopes) {
Index: trunk/sources/HeuristicLab.Selection/3.3/ProportionalSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/ProportionalSelector.cs	(revision 3048)
+++ trunk/sources/HeuristicLab.Selection/3.3/ProportionalSelector.cs	(revision 3096)
@@ -48,5 +48,4 @@
       : base() {
       Parameters.Add(new ValueParameter<BoolValue>("Windowing", "Apply windowing strategy (selection probability is proportional to the quality differences and not to the total quality).", new BoolValue(true)));
-      CopySelected.Value = true;
     }
 
Index: trunk/sources/HeuristicLab.Selection/3.3/RightSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/RightSelector.cs	(revision 3048)
+++ 	(revision )
@@ -1,55 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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.Collections.Generic;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Selection {
-  /// <summary>
-  /// An operator which selects sub-scopes from right to left.
-  /// </summary>
-  [Item("RightSelector", "An operator which selects sub-scopes from right to left.")]
-  [StorableClass]
-  [Creatable("Test")]
-  public sealed class RightSelector : Selector {
-    public RightSelector() : base() { }
-
-    protected override IScope[] Select(List<IScope> scopes) {
-      int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
-      bool copy = CopySelectedParameter.Value.Value;
-      IScope[] selected = new IScope[count];
-
-      int j = scopes.Count - 1;
-      for (int i = 0; i < count; i++) {
-        if (copy) {
-          selected[i] = (IScope)scopes[j].Clone();
-          j--;
-          if (j < 0) j = scopes.Count - 1;
-        } else {
-          selected[i] = scopes[scopes.Count - 1];
-          scopes.RemoveAt(scopes.Count - 1);
-        }
-      }
-      return selected;
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Selection/3.3/Selector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/Selector.cs	(revision 3048)
+++ trunk/sources/HeuristicLab.Selection/3.3/Selector.cs	(revision 3096)
@@ -59,5 +59,5 @@
     protected Selector()
       : base() {
-      Parameters.Add(new ValueParameter<BoolValue>("CopySelected", "True if the selected sub-scopes should be copied, otherwise false.", new BoolValue(false)));
+      Parameters.Add(new ValueParameter<BoolValue>("CopySelected", "True if the selected sub-scopes should be copied, otherwise false.", new BoolValue(true)));
       Parameters.Add(new ValueLookupParameter<IntValue>("NumberOfSelectedSubScopes", "The number of sub-scopes which should be selected."));
       Parameters.Add(new ScopeParameter("CurrentScope", "The current scope from which sub-scopes should be selected."));
Index: trunk/sources/HeuristicLab.Selection/3.3/SingleObjectiveSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/SingleObjectiveSelector.cs	(revision 3096)
+++ trunk/sources/HeuristicLab.Selection/3.3/SingleObjectiveSelector.cs	(revision 3096)
@@ -0,0 +1,48 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Selection {
+  /// <summary>
+  /// A base class for selection operators which consider a single double quality value for selection.
+  /// </summary>
+  [Item("SingleObjectiveSelector", "A base class for selection operators which consider a single double quality value for selection.")]
+  [StorableClass]
+  public abstract class SingleObjectiveSelector : Selector, ISingleObjectiveSelector {
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<ItemArray<DoubleValue>> QualityParameter {
+      get { return (ILookupParameter<ItemArray<DoubleValue>>)Parameters["Quality"]; }
+    }
+
+    protected SingleObjectiveSelector()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the current problem is a maximization problem, otherwise false."));
+      Parameters.Add(new SubScopesLookupParameter<DoubleValue>("Quality", "The quality value contained in each sub-scope which is used for selection."));
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Selection/3.3/StochasticSingleObjectiveSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/StochasticSingleObjectiveSelector.cs	(revision 3048)
+++ trunk/sources/HeuristicLab.Selection/3.3/StochasticSingleObjectiveSelector.cs	(revision 3096)
@@ -21,5 +21,4 @@
 
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
@@ -32,16 +31,12 @@
   [Item("StochasticSingleObjectiveSelector", "A base class for stochastic selection operators which consider a single double quality value for selection.")]
   [StorableClass]
-  public abstract class StochasticSingleObjectiveSelector : StochasticSelector, ISingleObjectiveSelector {
-    public IValueLookupParameter<BoolValue> MaximizationParameter {
-      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
-    }
-    public ILookupParameter<ItemArray<DoubleValue>> QualityParameter {
-      get { return (ILookupParameter<ItemArray<DoubleValue>>)Parameters["Quality"]; }
+  public abstract class StochasticSingleObjectiveSelector : SingleObjectiveSelector, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
     }
 
     protected StochasticSingleObjectiveSelector()
       : base() {
-      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the current problem is a maximization problem, otherwise false."));
-      Parameters.Add(new SubScopesLookupParameter<DoubleValue>("Quality", "The quality value contained in each sub-scope which is used for selection."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator used for stochastic selection."));
     }
   }
Index: trunk/sources/HeuristicLab.Selection/3.3/TournamentSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/TournamentSelector.cs	(revision 3048)
+++ trunk/sources/HeuristicLab.Selection/3.3/TournamentSelector.cs	(revision 3096)
@@ -41,5 +41,4 @@
     public TournamentSelector() : base() {
       Parameters.Add(new ValueLookupParameter<IntValue>("GroupSize", "The size of the tournament group.", new IntValue(2)));
-      CopySelected.Value = true;
     }
 
Index: trunk/sources/HeuristicLab.Selection/3.3/WorstSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/WorstSelector.cs	(revision 3096)
+++ trunk/sources/HeuristicLab.Selection/3.3/WorstSelector.cs	(revision 3096)
@@ -0,0 +1,68 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Linq;
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Selection {
+  /// <summary>
+  /// A selection operator which considers a single double quality value and selects the worst.
+  /// </summary>
+  [Item("WorstSelector", "A selection operator which considers a single double quality value and selects the worst.")]
+  [StorableClass]
+  [Creatable("Test")]
+  public sealed class WorstSelector : SingleObjectiveSelector {
+    public WorstSelector() : base() { }
+
+    protected override IScope[] Select(List<IScope> scopes) {
+      int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
+      bool copy = CopySelectedParameter.Value.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      IScope[] selected = new IScope[count];
+
+      // create a list for each scope that contains the scope's index in the original scope list
+      var temp = qualities.Select((x, index) => new { index, x.Value });
+      if (maximization)
+        temp = temp.OrderBy(x => x.Value);
+      else
+        temp = temp.OrderByDescending(x => x.Value);
+      var list = temp.ToList();
+
+      int j = 0;
+      for (int i = 0; i < count; i++) {
+        if (copy) {
+          selected[i] = (IScope)scopes[list[j].index].Clone();
+          j++;
+          if (j >= list.Count) j = 0;
+        } else {
+          selected[i] = scopes[list[j].index];
+          scopes.RemoveAt(list[j].index);
+          list.RemoveAt(j);
+        }
+      }
+      return selected;
+    }
+  }
+}
