Index: branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithm.cs
===================================================================
--- branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithm.cs	(revision 12040)
+++ branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithm.cs	(revision 12045)
@@ -90,4 +90,7 @@
       get { return (IValueParameter<IntValue>)Parameters["MatingPoolRange"]; }
     }
+    private IValueParameter<PercentValue> MatingPoolSelectionPercentageParameter {
+      get { return (IValueLookupParameter<PercentValue>)Parameters["MatingPoolSelectionPercentage"]; }
+    }
     public IConstrainedValueParameter<ISelector> SelectorParameter {
       get { return (IConstrainedValueParameter<ISelector>)Parameters["Selector"]; }
@@ -159,4 +162,8 @@
       get { return MatingPoolRangeParameter.Value; }
       set { MatingPoolRangeParameter.Value = value; }
+    }
+    public PercentValue MatingPoolSelectionPercentage {
+      get { return MatingPoolSelectionPercentageParameter.Value; }
+      set { MatingPoolSelectionPercentageParameter.Value = value; }
     }
     public ISelector Selector {
@@ -230,4 +237,5 @@
       Parameters.Add(new ValueParameter<ReductionOperation>("AgeInheritance", "The operator for determining the age of an offspring based the parents' age.", new ReductionOperation(ReductionOperations.Max)) { Hidden = true });
       Parameters.Add(new ValueParameter<IntValue>("MatingPoolRange", "The range of layers used for creating a mating pool. (1 = current + previous layer)", new IntValue(1)) { Hidden = true });
+      Parameters.Add(new ValueParameter<PercentValue>("MatingPoolSelectionPercentage", "Percentage of the previous layers used for creating a mating pool.", new PercentValue(1.0, restrictToUnitInterval: true)) { Hidden = true });
       Parameters.Add(new ConstrainedValueParameter<ISelector>("Selector", "The operator used to select solutions for reproduction."));
       Parameters.Add(new ConstrainedValueParameter<ICrossover>("Crossover", "The operator used to cross solutions."));
@@ -421,4 +429,6 @@
     }
     private void ParameterizeMainLoop() {
+      MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
+      MainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
       MainLoop.MainOperator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
       MainLoop.MainOperator.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
@@ -429,5 +439,4 @@
     }
     private void ParameterizeSelectors() {
-
       foreach (var selector in SelectorParameter.ValidValues) {
         selector.CopySelected = new BoolValue(true);
Index: branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs
===================================================================
--- branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs	(revision 12040)
+++ branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs	(revision 12045)
@@ -38,4 +38,10 @@
   public sealed class AlpsGeneticAlgorithmMainLoop : AlgorithmOperator {
     #region Parameter Properties
+    public ValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (ValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
     public ILookupParameter<IntValue> MaximumGenerationsParameter {
       get { return (ILookupParameter<IntValue>)Parameters["MaximumGenerations"]; }
@@ -69,4 +75,6 @@
     public AlpsGeneticAlgorithmMainLoop()
       : base() {
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, otherwise false."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The value which represents the quality of a solution."));
       Parameters.Add(new LookupParameter<IntValue>("MaximumGenerations", "The maximum number of generations that the algorithm should process."));
       Parameters.Add(new LookupParameter<IOperator>("Analyzer", "The operator used to the analyze all individuals."));
@@ -79,4 +87,6 @@
       var initAnalyzerPlaceholder = new Placeholder() { Name = "Analyzer (Placeholder)" };
       var resultsCollector = new ResultsCollector();
+      var matingPoolPreProcessor = new UniformSubScopesProcessor() { Name = "MatingPoolPreProcessor" };
+      var matingPoolPreSorter = new SubScopesSorter() { Name = "MatingPoolPreSorter" };
       var matingPoolCreator = new MatingPoolCreator() { Name = "Create Mating Pools" };
       var matingPoolProcessor = new LayerUniformSubScopesProcessor();
@@ -116,5 +126,11 @@
       resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("OpenLayers"));
       resultsCollector.CopyValue = new BoolValue(false);
-      resultsCollector.Successor = matingPoolCreator;
+      resultsCollector.Successor = matingPoolPreProcessor;
+
+      matingPoolPreProcessor.Operator = matingPoolPreSorter;
+      matingPoolPreProcessor.Successor = matingPoolCreator;
+
+      matingPoolPreSorter.ValueParameter.ActualName = QualityParameter.Name;
+      matingPoolPreSorter.DescendingParameter.ActualName = MaximizationParameter.Name;
 
       matingPoolCreator.Successor = matingPoolProcessor;
@@ -157,5 +173,5 @@
 
       terminateBranch.ConditionParameter.ActualName = "TerminateGenerations";
-      terminateBranch.FalseBranch = matingPoolCreator;
+      terminateBranch.FalseBranch = matingPoolPreProcessor;
     }
 
Index: branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/MatingPoolCreator.cs
===================================================================
--- branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/MatingPoolCreator.cs	(revision 12040)
+++ branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/MatingPoolCreator.cs	(revision 12045)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -33,6 +34,9 @@
   public sealed class MatingPoolCreator : SingleSuccessorOperator {
 
-    private ILookupParameter<IntValue> MatingPoolRangeParameter {
+    public ILookupParameter<IntValue> MatingPoolRangeParameter {
       get { return (ILookupParameter<IntValue>)Parameters["MatingPoolRange"]; }
+    }
+    public ILookupParameter<PercentValue> MatingPoolSelectionPercentageParameter {
+      get { return (ILookupParameter<PercentValue>)Parameters["MatingPoolSelectionPercentage"]; }
     }
 
@@ -48,4 +52,5 @@
       : base() {
       Parameters.Add(new LookupParameter<IntValue>("MatingPoolRange"));
+      Parameters.Add(new LookupParameter<PercentValue>("MatingPoolSelectionPercentage"));
     }
 
@@ -53,4 +58,5 @@
       var layers = ExecutionContext.Scope.SubScopes;
       int range = MatingPoolRangeParameter.ActualValue.Value;
+      double percentage = MatingPoolSelectionPercentageParameter.ActualValue.Value;
 
       for (int layer = layers.Count - 1; layer > 0; layer--) {
@@ -58,5 +64,6 @@
         for (int n = 1; (n <= range) && (layer - n >= 0); n++) {
           var prevLayerScope = layers[layer - n];
-          foreach (var individual in prevLayerScope.SubScopes) {
+          var individuals = prevLayerScope.SubScopes;
+          foreach (var individual in individuals.Take((int)(individuals.Count * percentage))) {
             layerScope.SubScopes.Add((IScope)individual.Clone(new Cloner()));
           }
