Index: branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs
===================================================================
--- branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs	(revision 12094)
+++ branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs	(revision 12186)
@@ -178,5 +178,5 @@
     private GeneticAlgorithmMainLoop CreatePreparedGeneticAlgorithmMainLoop() {
       var mainLoop = new GeneticAlgorithmMainLoop();
-      var numberOfSelectedSubScopesCalculator = new ExpressionCalculator() { Name = "NumberOfSelectedSubScopes = (PopulationSize - Elites) * 2" };
+
       var selector = mainLoop.OperatorGraph.Iterate().OfType<Placeholder>().First(o => o.OperatorParameter.ActualName == "Selector");
       var crossover = mainLoop.OperatorGraph.Iterate().OfType<Placeholder>().First(o => o.OperatorParameter.ActualName == "Crossover");
@@ -184,15 +184,62 @@
       var elitesMerger = mainLoop.OperatorGraph.Iterate().OfType<MergingReducer>().First();
 
-      // Operator starts with numberOfSelectedSubScopesCalculator
-      mainLoop.OperatorGraph.InitialOperator = numberOfSelectedSubScopesCalculator;
+      // Operator starts with calculating number of selected scopes base on plus/comma-selection replacement scheme
+      var numberOfSubScopesBranch = new ConditionalBranch() { Name = "PlusSelection?" };
+      var numberOfSelectedSubScopesPlusCalculator = new ExpressionCalculator() { Name = "NumberOfSelectedSubScopes = PopulationSize * 2" };
+      var numberOfSelectedSubScopesCalculator = new ExpressionCalculator() { Name = "NumberOfSelectedSubScopes = (PopulationSize - Elites) * 2" };
+      var replacementBranch = new ConditionalBranch() { Name = "PlusSelection?" };
+
+      mainLoop.OperatorGraph.InitialOperator = numberOfSubScopesBranch;
+
+      numberOfSubScopesBranch.ConditionParameter.ActualName = "PlusSelection";
+      numberOfSubScopesBranch.TrueBranch = numberOfSelectedSubScopesPlusCalculator;
+      numberOfSubScopesBranch.FalseBranch = numberOfSelectedSubScopesCalculator;
+      numberOfSubScopesBranch.Successor = selector;
+
+      numberOfSelectedSubScopesPlusCalculator.CollectedValues.Add(new LookupParameter<IntValue>("PopulationSize"));
+      numberOfSelectedSubScopesPlusCalculator.ExpressionResultParameter.ActualName = "NumberOfSelectedSubScopes";
+      numberOfSelectedSubScopesPlusCalculator.ExpressionParameter.Value = new StringValue("PopulationSize 2 * toint");
+
       numberOfSelectedSubScopesCalculator.CollectedValues.Add(new LookupParameter<IntValue>("PopulationSize"));
       numberOfSelectedSubScopesCalculator.CollectedValues.Add(new LookupParameter<IntValue>("Elites"));
       numberOfSelectedSubScopesCalculator.ExpressionResultParameter.ActualName = "NumberOfSelectedSubScopes";
       numberOfSelectedSubScopesCalculator.ExpressionParameter.Value = new StringValue("PopulationSize Elites - 2 * toint");
-      numberOfSelectedSubScopesCalculator.Successor = selector;
+
+      // Use Elitism or Plus-Selection as replacement strategy
+      var selectedProcessor = (SubScopesProcessor)selector.Successor;
+      var elitismReplacement = selectedProcessor.Successor;
+      selectedProcessor.Successor = replacementBranch;
+      replacementBranch.ConditionParameter.ActualName = "PlusSelection";
+      replacementBranch.FalseBranch = elitismReplacement;
+
+      // Plus selection replacement
+      var replacementMergingReducer = new MergingReducer();
+      var replacementBestSelector = new BestSelector();
+      var replacementRightReducer = new RightReducer();
+      replacementBranch.TrueBranch = replacementMergingReducer;
+
+      replacementMergingReducer.Successor = replacementBestSelector;
+
+      replacementBestSelector.NumberOfSelectedSubScopesParameter.ActualName = "PopulationSize";
+      replacementBestSelector.CopySelected = new BoolValue(false);
+      replacementBestSelector.Successor = replacementRightReducer;
+
+      replacementRightReducer.Successor = null;
+
+      // Increment ages of all individuals after replacement
+      var incrementAgeProcessor = new UniformSubScopesProcessor();
+      var ageIncrementor = new IntCounter() { Name = "Increment Age" };
+      replacementBranch.Successor = incrementAgeProcessor;
+      incrementAgeProcessor.Operator = ageIncrementor;
+      incrementAgeProcessor.Successor = null;
+      ageIncrementor.ValueParameter.ActualName = "Age";
+      ageIncrementor.Increment = new IntValue(1);
+      //ageIncrementor.Successor = null;
 
       // Insert AgeCalculator between crossover and its successor
       var crossoverSuccessor = crossover.Successor;
       var ageCalculator = new DataReducer() { Name = "Calculate Age" };
+      crossover.Successor = ageCalculator;
+
       ageCalculator.ParameterToReduce.ActualName = "Age";
       ageCalculator.TargetParameter.ActualName = "Age";
@@ -200,5 +247,4 @@
       ageCalculator.ReductionOperation.ActualName = "AgeInheritance";
       ageCalculator.TargetOperation.Value = new ReductionOperation(ReductionOperations.Assign);
-      crossover.Successor = ageCalculator;
       ageCalculator.Successor = crossoverSuccessor;
 
@@ -207,13 +253,6 @@
       subScopesCounter.AccumulateParameter.Value = new BoolValue(false);
 
-      // Instead of generational loop after merging of elites, increment ages of all individuals
-      var processor = new UniformSubScopesProcessor();
-      var incrementor = new IntCounter() { Name = "Increment Age" };
-      processor.Operator = incrementor;
-      processor.Successor = null;
-      incrementor.ValueParameter.ActualName = "Age";
-      incrementor.Increment = new IntValue(1);
-      incrementor.Successor = null;
-      elitesMerger.Successor = processor;
+      // Instead of generational loop after merging of elites, stop
+      elitesMerger.Successor = null;
 
       // Parameterize
