Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinking.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinking.cs	(revision 7471)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinking.cs	(revision 7478)
@@ -27,4 +27,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -79,6 +80,6 @@
       get { return (ConstrainedValueParameter<ICrossover>)Parameters["PathRelinking"]; }
     }
-    public ConstrainedValueParameter<IMerger> EliteSetMergerParameter {
-      get { return (ConstrainedValueParameter<IMerger>)Parameters["EliteSetMerger"]; }
+    public ConstrainedValueParameter<IPopulationReducer> EliteSetReducerParameter {
+      get { return (ConstrainedValueParameter<IPopulationReducer>)Parameters["EliteSetReducer"]; }
     }
     #endregion
@@ -109,6 +110,9 @@
       get { return (RandomCreator)OperatorGraph.InitialOperator; }
     }
+    private SolutionsCreator SolutionsCreator {
+      get { return (SolutionsCreator)RandomCreator.Successor; }
+    }
     private GRASPWithPathRelinkingMainLoop MainLoop {
-      get { return RandomCreator.Successor as GRASPWithPathRelinkingMainLoop; }
+      get { return SolutionsCreator.Successor as GRASPWithPathRelinkingMainLoop; }
     }
     #endregion
@@ -135,10 +139,10 @@
       Parameters.Add(new FixedValueParameter<IntValue>("MinimumEliteSetSize", "(ρ) The minimum amount of elites for performing path relinking.", new IntValue(2)));
       Parameters.Add(new ConstrainedValueParameter<ICrossover>("PathRelinking", "The operator that performs the path relinking."));
-      Parameters.Add(new ConstrainedValueParameter<IMerger>("EliteSetMerger", "The operator that merges new solutions into the elite set."));
+      Parameters.Add(new ConstrainedValueParameter<IPopulationReducer>("EliteSetReducer", "The operator that reduces the old elite set and the new solution(s) to a new elite set."));
 
       analyzer = new BestAverageWorstQualityAnalyzer();
       Analyzer.Operators.Add(analyzer);
 
-      RandomCreator randomCreator = new RandomCreator();
+      var randomCreator = new RandomCreator();
       OperatorGraph.InitialOperator = randomCreator;
 
@@ -149,7 +153,12 @@
       randomCreator.SetSeedRandomlyParameter.Value = null;
 
+      var solutionsCreator = new SolutionsCreator();
+      solutionsCreator.NumberOfSolutionsParameter.ActualName = MinimumEliteSetSizeParameter.Name;
+      solutionsCreator.ParallelParameter.Value = new BoolValue(true);
+      randomCreator.Successor = solutionsCreator;
+
       var mainLoop = new GRASPWithPathRelinkingMainLoop();
       mainLoop.AnalyzerParameter.ActualName = AnalyzerParameter.Name;
-      mainLoop.EliteSetMergerParameter.ActualName = EliteSetMergerParameter.Name;
+      mainLoop.EliteSetReducerParameter.ActualName = EliteSetReducerParameter.Name;
       mainLoop.EliteSetSizeParameter.ActualName = EliteSetSizeParameter.Name;
       mainLoop.EvaluatedSolutionsParameter.ActualName = "EvaluatedSolutions";
@@ -158,5 +167,5 @@
       mainLoop.PathRelinkingParameter.ActualName = PathRelinkingParameter.Name;
       mainLoop.ResultsParameter.ActualName = "Results";
-      randomCreator.Successor = mainLoop;
+      solutionsCreator.Successor = mainLoop;
 
       InitializeOperators();
@@ -219,9 +228,9 @@
         InitializeFromInstallation(LocalImprovementParameter, x => x.ProblemType.IsAssignableFrom(Problem.GetType()));
         InitializeFromProblem(PathRelinkingParameter);
-        InitializeFromProblem(EliteSetMergerParameter);
+        InitializeFromProblem(EliteSetReducerParameter);
       } else {
         LocalImprovementParameter.ValidValues.Clear();
         PathRelinkingParameter.ValidValues.Clear();
-        EliteSetMergerParameter.ValidValues.Clear();
+        EliteSetReducerParameter.ValidValues.Clear();
       }
       Analyzer.Operators.Add(analyzer);
@@ -232,4 +241,7 @@
     private void Parameterize() {
       if (Problem != null) {
+        SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
+        SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
+
         MainLoop.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
         MainLoop.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
@@ -245,6 +257,7 @@
         localImprovement.ResultsParameter.ActualName = "Results";
       }
-      foreach (var merger in EliteSetMergerParameter.ValidValues) {
-        merger.PopulationSizeParameter.ActualName = EliteSetSizeParameter.Name;
+      foreach (var reducer in EliteSetReducerParameter.ValidValues) {
+        reducer.MinimumPopulationSizeParameter.ActualName = MinimumEliteSetSizeParameter.Name;
+        reducer.MaximumPopulationSizeParameter.ActualName = EliteSetSizeParameter.Name;
       }
     }
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinkingMainLoop.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinkingMainLoop.cs	(revision 7471)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinkingMainLoop.cs	(revision 7478)
@@ -61,6 +61,6 @@
       get { return (IValueLookupParameter<IOperator>)Parameters["PathRelinking"]; }
     }
-    public IValueLookupParameter<IOperator> EliteSetMergerParameter {
-      get { return (IValueLookupParameter<IOperator>)Parameters["EliteSetMerger"]; }
+    public IValueLookupParameter<IOperator> EliteSetReducerParameter {
+      get { return (IValueLookupParameter<IOperator>)Parameters["EliteSetReducer"]; }
     }
     public IValueLookupParameter<IOperator> AnalyzerParameter {
@@ -82,5 +82,5 @@
       Parameters.Add(new ValueLookupParameter<IOperator>("LocalImprovement", "The operator which performs the local improvement."));
       Parameters.Add(new ValueLookupParameter<IOperator>("PathRelinking", "The operator which performs the path relinking."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("EliteSetMerger", "The operator that merges elements in the elite set."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("EliteSetReducer", "The operator that reduces the existing elite set and the new solution to a new elite set."));
       Parameters.Add(new ValueLookupParameter<IOperator>("Analyzer", "The analyzer that is to be applied."));
 
@@ -93,29 +93,7 @@
       resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Iterations"));
 
-      var variableCreator2 = new VariableCreator();
-      variableCreator2.Name = "ActualEliteSetSize = 0";
-      variableCreator2.CollectedValues.Add(new ValueParameter<IntValue>("ActualEliteSetSize", new IntValue(0)));
-
-      var subScopesCounter1 = new SubScopesCounter();
-      subScopesCounter1.Name = "ActualEliteSetSize += |SubScopes|";
-      subScopesCounter1.ValueParameter.ActualName = "ActualEliteSetSize";
-
-      var comparator1 = new Comparator();
-      comparator1.Name = "ActualEliteSetSize >= MinimumEliteSetSize";
-      comparator1.Comparison.Value = ComparisonType.GreaterOrEqual;
-      comparator1.LeftSideParameter.ActualName = "ActualEliteSetSize";
-      comparator1.RightSideParameter.ActualName = EliteSetSizeParameter.ActualName;
-      comparator1.ResultParameter.ActualName = "SizeOkay";
-
-      var conditionalBranch1 = new ConditionalBranch();
-      conditionalBranch1.Name = "Elite set has at least ρ elements";
-      conditionalBranch1.ConditionParameter.ActualName = "SizeOkay";
-
       var selector1 = new RandomSelector();
       selector1.NumberOfSelectedSubScopesParameter.Value = new IntValue(1);
       selector1.CopySelected.Value = true;
-
-      var selector2 = new RandomSelector();
-      selector2.NumberOfSelectedSubScopesParameter.Value = new IntValue(0);
 
       var ssp1 = new SubScopesProcessor();
@@ -129,19 +107,4 @@
       solutionsCreator.NumberOfSolutions = new IntValue(1);
 
-      var subScopesCounter2 = new SubScopesCounter();
-      subScopesCounter2.Name = "Count subscopes";
-      subScopesCounter2.ValueParameter.ActualName = "SolutionScopes";
-
-      var comparator2 = new Comparator();
-      comparator2.Name = "SolutionScopes == 2";
-      comparator2.Comparison.Value = ComparisonType.Equal;
-      comparator2.LeftSideParameter.ActualName = "SolutionScopes";
-      comparator2.RightSideParameter.Value = new IntValue(2);
-      comparator2.ResultParameter.ActualName = "PerformPR";
-
-      var conditionalBranch2 = new ConditionalBranch();
-      conditionalBranch2.Name = "Path relinking?";
-      conditionalBranch2.ConditionParameter.ActualName = "PerformPR";
-
       var ssp2 = new SubScopesProcessor();
 
@@ -175,6 +138,6 @@
 
       var placeholder5 = new Placeholder();
-      placeholder5.Name = "(EliteSetMerger)";
-      placeholder5.OperatorParameter.ActualName = EliteSetMergerParameter.Name;
+      placeholder5.Name = "(EliteSetReplacer)";
+      placeholder5.OperatorParameter.ActualName = EliteSetReducerParameter.Name;
 
       var counter = new IntCounter();
@@ -200,21 +163,11 @@
       OperatorGraph.InitialOperator = variableCreator1;
       variableCreator1.Successor = resultsCollector;
-      resultsCollector.Successor = variableCreator2;
-      variableCreator2.Successor = subScopesCounter1;
-      subScopesCounter1.Successor = comparator1;
-      comparator1.Successor = conditionalBranch1;
-      conditionalBranch1.TrueBranch = selector1;
-      conditionalBranch1.FalseBranch = selector2;
-      conditionalBranch1.Successor = ssp1;
+      resultsCollector.Successor = selector1;
+      selector1.Successor = ssp1;
       ssp1.Operators.Add(eo1);
       ssp1.Operators.Add(solutionsCreator);
       ssp1.Successor = placeholder5;
       eo1.Successor = null;
-      solutionsCreator.Successor = subScopesCounter2;
-      subScopesCounter2.Successor = comparator2;
-      comparator2.Successor = conditionalBranch2;
-      conditionalBranch2.TrueBranch = ssp2;
-      conditionalBranch2.FalseBranch = null;
-      conditionalBranch2.Successor = ssp4;
+      solutionsCreator.Successor = ssp2;
       ssp2.Operators.Add(eo2);
       ssp2.Operators.Add(placeholder1);
@@ -227,7 +180,6 @@
       placeholder2.Successor = placeholder3;
       placeholder3.Successor = subScopesRemover;
-      subScopesRemover.Successor = null;
-      ssp4.Operators.Add(placeholder4);
-      ssp4.Successor = null;
+      subScopesRemover.Successor = placeholder4;
+      placeholder4.Successor = null;
       placeholder5.Successor = counter;
       counter.Successor = analyzer1;
@@ -235,5 +187,5 @@
       comparator3.Successor = conditionalBranch3;
       conditionalBranch3.TrueBranch = null;
-      conditionalBranch3.FalseBranch = variableCreator2;
+      conditionalBranch3.FalseBranch = selector1;
       conditionalBranch3.Successor = null;
     }
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common/3.3/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common-3.3.csproj
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common/3.3/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common-3.3.csproj	(revision 7471)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common/3.3/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common-3.3.csproj	(revision 7478)
@@ -89,6 +89,6 @@
     <None Include="Plugin.cs.frame" />
     <Compile Include="ExtensionMethods.cs" />
-    <Compile Include="IMerger.cs" />
     <Compile Include="IntegerVectorEqualityComparer.cs" />
+    <Compile Include="IPopulationReducer.cs" />
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common/3.3/IMerger.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common/3.3/IMerger.cs	(revision 7471)
+++ 	(revision )
@@ -1,29 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 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;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common {
-  public interface IMerger : IOperator {
-    ILookupParameter<IntValue> PopulationSizeParameter { get; }
-  }
-}
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common/3.3/IPopulationReducer.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common/3.3/IPopulationReducer.cs	(revision 7478)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common/3.3/IPopulationReducer.cs	(revision 7478)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common {
+  public interface IPopulationReducer : IReducer {
+    ILookupParameter<IntValue> MinimumPopulationSizeParameter { get; }
+    ILookupParameter<IntValue> MaximumPopulationSizeParameter { get; }
+  }
+}
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/HeuristicLab.Problems.GeneralizedQuadraticAssignment-3.3.csproj
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/HeuristicLab.Problems.GeneralizedQuadraticAssignment-3.3.csproj	(revision 7471)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/HeuristicLab.Problems.GeneralizedQuadraticAssignment-3.3.csproj	(revision 7478)
@@ -148,5 +148,5 @@
     <Compile Include="Operators\MultiGQAPManipulator.cs" />
     <Compile Include="Operators\NMoveShakingOperator.cs" />
-    <Compile Include="Operators\QualitySimilarityMerger.cs" />
+    <Compile Include="Operators\GQAPQualitySimilarityReducer.cs" />
     <Compile Include="Operators\RandomSolutionCreator.cs" />
     <Compile Include="Operators\RelocateEquipmentManipluator.cs" />
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/GQAPQualitySimilarityReducer.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/GQAPQualitySimilarityReducer.cs	(revision 7478)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/GQAPQualitySimilarityReducer.cs	(revision 7478)
@@ -0,0 +1,137 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment.Operators {
+  [Item("GQAPQualitySimilarityReducer", "Reduces two populations two one by using quality and similarity information to obtain a population of high quality, but also diverse solutions.")]
+  [StorableClass]
+  public class GQAPQualitySimilarityReducer : SingleSuccessorOperator, IAssignmentAwareGQAPOperator, IQualityAwareGQAPOperator, IPopulationReducer {
+    public ILookupParameter<IntegerVector> AssignmentParameter {
+      get { return (ILookupParameter<IntegerVector>)Parameters["Assignment"]; }
+    }
+    public ILookupParameter<BoolValue> MaximizationParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> FlowDistanceQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["FlowDistanceQuality"]; }
+    }
+    public ILookupParameter<DoubleValue> InstallationQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["InstallationQuality"]; }
+    }
+    public ILookupParameter<DoubleValue> OverbookedCapacityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["OverbookedCapacity"]; }
+    }
+    public ILookupParameter<IntValue> MinimumPopulationSizeParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["MinimumPopulationSize"]; }
+    }
+    public ILookupParameter<IntValue> MaximumPopulationSizeParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["MaximumPopulationSize"]; }
+    }
+
+    [StorableConstructor]
+    protected GQAPQualitySimilarityReducer(bool deserializing) : base(deserializing) { }
+    protected GQAPQualitySimilarityReducer(GQAPQualitySimilarityReducer original, Cloner cloner) : base(original, cloner) { }
+    public GQAPQualitySimilarityReducer()
+      : base() {
+      Parameters.Add(new LookupParameter<IntegerVector>("Assignment", GQAPSolutionCreator.AssignmentDescription));
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", GeneralizedQuadraticAssignmentProblem.MaximizationDescription));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", GQAPEvaluator.QualityDescription));
+      Parameters.Add(new LookupParameter<DoubleValue>("FlowDistanceQuality", GQAPEvaluator.FlowDistanceQualityDescription));
+      Parameters.Add(new LookupParameter<DoubleValue>("InstallationQuality", GQAPEvaluator.InstallationQualityDescription));
+      Parameters.Add(new LookupParameter<DoubleValue>("OverbookedCapacity", GQAPEvaluator.OverbookedCapacityDescription));
+      Parameters.Add(new LookupParameter<IntValue>("MinimumPopulationSize", "The size of the population that should not be undershot."));
+      Parameters.Add(new LookupParameter<IntValue>("MaximumPopulationSize", "The size of the population that should not be surpassed."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GQAPQualitySimilarityReducer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      string vectorName = AssignmentParameter.TranslatedName;
+      string qualityName = QualityParameter.TranslatedName;
+      int populationSize = MaximumPopulationSizeParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+
+      IScope remaining = ExecutionContext.Scope.SubScopes[0];
+      IScope selected = ExecutionContext.Scope.SubScopes[1];
+
+      List<Individual> population =
+        remaining.SubScopes.Select(x => new Individual((IntegerVector)x.Variables[vectorName].Value,
+                                                      ((DoubleValue)x.Variables[qualityName].Value).Value,
+                                                      x)).ToList();
+      HashSet<Individual> candidates = new HashSet<Individual>(
+        selected.SubScopes.Select(x => new Individual((IntegerVector)x.Variables[vectorName].Value,
+                                                     ((DoubleValue)x.Variables[qualityName].Value).Value,
+                                                     x)));
+
+      foreach (var candidate in candidates) {
+        double[] similarities = population.Select(x => IntegerVectorEqualityComparer.GetSimilarity(x.Solution, candidate.Solution)).ToArray();
+        if (!similarities.Any()) {
+          population.Add(candidate);
+        } else if (population.Count < populationSize) {
+          double maxSimilarity = similarities.Max();
+          if (maxSimilarity < 1.0)
+            population.Add(candidate);
+        } else {
+          var replacement = population.Select((v, i) => new { V = v, Index = i })
+                                      .Where(x => (maximization && x.V.Quality < candidate.Quality)
+                                               || (!maximization && x.V.Quality > candidate.Quality));
+          if (replacement.Any()) {
+            replacement.OrderBy(x => similarities[x.Index]).ToArray();
+            population.Remove(replacement.Last().V);
+            population.Add(candidate);
+          }
+        }
+      }
+
+      ExecutionContext.Scope.SubScopes.Clear();
+      ExecutionContext.Scope.SubScopes.AddRange(population.Select(x => x.Scope));
+
+      return base.Apply();
+    }
+
+    private class Individual {
+      internal IntegerVector Solution { get; set; }
+      internal double Quality { get; set; }
+      internal IScope Scope { get; set; }
+
+      internal Individual(IntegerVector vector, double quality, IScope scope) {
+        Solution = vector;
+        Quality = quality;
+        Scope = scope;
+      }
+    }
+  }
+}
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/QualitySimilarityMerger.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/QualitySimilarityMerger.cs	(revision 7471)
+++ 	(revision )
@@ -1,133 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 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 System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment.Operators {
-  [Item("QualitySimilarityMerger", "Merges two populations by using quality and similarity information to maintain a population of high quality, but also diverse solutions.")]
-  [StorableClass]
-  public class QualitySimilarityMerger : SingleSuccessorOperator, IAssignmentAwareGQAPOperator, IQualityAwareGQAPOperator, IMerger {
-    public ILookupParameter<IntegerVector> AssignmentParameter {
-      get { return (ILookupParameter<IntegerVector>)Parameters["Assignment"]; }
-    }
-    public ILookupParameter<BoolValue> MaximizationParameter {
-      get { return (ILookupParameter<BoolValue>)Parameters["Maximization"]; }
-    }
-    public ILookupParameter<DoubleValue> QualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
-    }
-    public ILookupParameter<DoubleValue> FlowDistanceQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["FlowDistanceQuality"]; }
-    }
-    public ILookupParameter<DoubleValue> InstallationQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["InstallationQuality"]; }
-    }
-    public ILookupParameter<DoubleValue> OverbookedCapacityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["OverbookedCapacity"]; }
-    }
-    public ILookupParameter<IntValue> PopulationSizeParameter {
-      get { return (ILookupParameter<IntValue>)Parameters["PopulationSize"]; }
-    }
-
-    [StorableConstructor]
-    protected QualitySimilarityMerger(bool deserializing) : base(deserializing) { }
-    protected QualitySimilarityMerger(QualitySimilarityMerger original, Cloner cloner) : base(original, cloner) { }
-    public QualitySimilarityMerger()
-      : base() {
-      Parameters.Add(new LookupParameter<IntegerVector>("Assignment", GQAPSolutionCreator.AssignmentDescription));
-      Parameters.Add(new LookupParameter<BoolValue>("Maximization", GeneralizedQuadraticAssignmentProblem.MaximizationDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("Quality", GQAPEvaluator.QualityDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("FlowDistanceQuality", GQAPEvaluator.FlowDistanceQualityDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("InstallationQuality", GQAPEvaluator.InstallationQualityDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("OverbookedCapacity", GQAPEvaluator.OverbookedCapacityDescription));
-      Parameters.Add(new LookupParameter<IntValue>("PopulationSize", "The size of the population that should not be surpassed."));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new QualitySimilarityMerger(this, cloner);
-    }
-
-    public override IOperation Apply() {
-      string vectorName = AssignmentParameter.TranslatedName;
-      string qualityName = QualityParameter.TranslatedName;
-      int populationSize = PopulationSizeParameter.ActualValue.Value;
-      bool maximization = MaximizationParameter.ActualValue.Value;
-
-      IScope remaining = ExecutionContext.Scope.SubScopes[0];
-      IScope selected = ExecutionContext.Scope.SubScopes[1];
-
-      List<Individual> population =
-        remaining.SubScopes.Select(x => new Individual((IntegerVector)x.Variables[vectorName].Value,
-                                                      ((DoubleValue)x.Variables[qualityName].Value).Value,
-                                                      x)).ToList();
-      HashSet<Individual> candidates = new HashSet<Individual>(
-        selected.SubScopes.Select(x => new Individual((IntegerVector)x.Variables[vectorName].Value,
-                                                     ((DoubleValue)x.Variables[qualityName].Value).Value,
-                                                     x)));
-
-      foreach (var candidate in candidates) {
-        double[] similarities = population.Select(x => IntegerVectorEqualityComparer.GetSimilarity(x.Solution, candidate.Solution)).ToArray();
-        if (!similarities.Any()) {
-          population.Add(candidate);
-        } else if (population.Count < populationSize) {
-          double maxSimilarity = similarities.Max();
-          if (maxSimilarity < 1.0)
-            population.Add(candidate);
-        } else {
-          var replacement = population.Select((v, i) => new { V = v, Index = i })
-                                      .Where(x => (maximization && x.V.Quality < candidate.Quality)
-                                               || (!maximization && x.V.Quality > candidate.Quality));
-          if (replacement.Any()) {
-            replacement.OrderBy(x => similarities[x.Index]).ToArray();
-            population.Remove(replacement.Last().V);
-            population.Add(candidate);
-          }
-        }
-      }
-
-      ExecutionContext.Scope.SubScopes.Clear();
-      ExecutionContext.Scope.SubScopes.AddRange(population.Select(x => x.Scope));
-
-      return base.Apply();
-    }
-
-    private class Individual {
-      internal IntegerVector Solution { get; set; }
-      internal double Quality { get; set; }
-      internal IScope Scope { get; set; }
-
-      internal Individual(IntegerVector vector, double quality, IScope scope) {
-        Solution = vector;
-        Quality = quality;
-        Scope = scope;
-      }
-    }
-  }
-}
