Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinking.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinking.cs	(revision 7373)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinking.cs	(revision 7412)
@@ -61,4 +61,7 @@
       get { return (IValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
     }
+    public IValueParameter<IntValue> MaximumIterationsParameter {
+      get { return (IValueParameter<IntValue>)Parameters["MaximumIterations"]; }
+    }
     private IFixedValueParameter<IntValue> EliteSetSizeParameter {
       get { return (IFixedValueParameter<IntValue>)Parameters["EliteSetSize"]; }
@@ -76,5 +79,5 @@
       get { return (ConstrainedValueParameter<ICrossover>)Parameters["PathRelinking"]; }
     }
-    public ConstrainedValueParameter<IMerger> EliteSetReplacerParameter {
+    public ConstrainedValueParameter<IMerger> EliteSetMergerParameter {
       get { return (ConstrainedValueParameter<IMerger>)Parameters["EliteSetMerger"]; }
     }
@@ -106,5 +109,11 @@
       get { return (RandomCreator)OperatorGraph.InitialOperator; }
     }
-    #endregion
+    private GRASPWithPathRelinkingMainLoop MainLoop {
+      get { return RandomCreator.Successor as GRASPWithPathRelinkingMainLoop; }
+    }
+    #endregion
+
+    [Storable]
+    private BestAverageWorstQualityAnalyzer analyzer;
 
     [StorableConstructor]
@@ -112,4 +121,5 @@
     private GRASPWithPathRelinking(GRASPWithPathRelinking original, Cloner cloner)
       : base(original, cloner) {
+      analyzer = cloner.Clone(original.analyzer);
       RegisterEventHandlers();
     }
@@ -119,10 +129,14 @@
       Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator."));
       Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze each iteration.", new MultiAnalyzer()));
+      Parameters.Add(new ValueParameter<IntValue>("MaximumIterations", "The maximum number of iterations that the algorithm should run.", new IntValue(1000)));
       Parameters.Add(new FixedValueParameter<IntValue>("EliteSetSize", "The elite set stores the best found solutions.", new IntValue(10)));
-      Parameters.Add(new FixedValueParameter<IntValue>("LocalImprovementMaximumIterations", "The maximum number of iterations performed by the local improvement operator.", new IntValue(100)));
+      Parameters.Add(new FixedValueParameter<IntValue>("LocalImprovementMaximumIterations", "The maximum number of iterations performed by the local improvement operator.", new IntValue(1000)));
       Parameters.Add(new ConstrainedValueParameter<ILocalImprovementOperator>("LocalImprovement", "Performs a local search on the solution."));
-      Parameters.Add(new FixedValueParameter<IntValue>("MinimumEliteSetSize", "(ρ) The minimum amount of elites for performing path relinking.", new IntValue(1)));
+      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."));
+
+      analyzer = new BestAverageWorstQualityAnalyzer();
+      Analyzer.Operators.Add(analyzer);
 
       RandomCreator randomCreator = new RandomCreator();
@@ -136,4 +150,12 @@
 
       var mainLoop = new GRASPWithPathRelinkingMainLoop();
+      mainLoop.AnalyzerParameter.ActualName = AnalyzerParameter.Name;
+      mainLoop.EliteSetMergerParameter.ActualName = EliteSetMergerParameter.Name;
+      mainLoop.EliteSetSizeParameter.ActualName = EliteSetSizeParameter.Name;
+      mainLoop.EvaluatedSolutionsParameter.ActualName = "EvaluatedSolutions";
+      mainLoop.LocalImprovementParameter.ActualName = LocalImprovementParameter.Name;
+      mainLoop.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name;
+      mainLoop.PathRelinkingParameter.ActualName = PathRelinkingParameter.Name;
+      mainLoop.ResultsParameter.ActualName = "Results";
       randomCreator.Successor = mainLoop;
 
@@ -185,17 +207,18 @@
       Analyzer.Operators.Clear();
       if (Problem != null) {
-        foreach (IAnalyzer analyzer in Problem.Operators.OfType<IAnalyzer>()) {
-          foreach (var param in analyzer.Parameters.OfType<IScopeTreeLookupParameter>())
+        foreach (IAnalyzer a in Problem.Operators.OfType<IAnalyzer>()) {
+          foreach (var param in a.Parameters.OfType<IScopeTreeLookupParameter>())
             param.Depth = 1;
-          Analyzer.Operators.Add(analyzer);
+          Analyzer.Operators.Add(a);
         }
         InitializeFromInstallation(LocalImprovementParameter, x => x.ProblemType.IsAssignableFrom(Problem.GetType()));
         InitializeFromProblem(PathRelinkingParameter);
-        InitializeFromProblem(EliteSetReplacerParameter);
+        InitializeFromProblem(EliteSetMergerParameter);
       } else {
         LocalImprovementParameter.ValidValues.Clear();
         PathRelinkingParameter.ValidValues.Clear();
-        EliteSetReplacerParameter.ValidValues.Clear();
-      }
+        EliteSetMergerParameter.ValidValues.Clear();
+      }
+      Analyzer.Operators.Add(analyzer);
 
       Parameterize();
@@ -203,4 +226,10 @@
 
     private void Parameterize() {
+      if (Problem != null) {
+        MainLoop.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
+        MainLoop.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
+
+        analyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
+      }
       foreach (var localImprovement in LocalImprovementParameter.ValidValues) {
         localImprovement.MaximumIterationsParameter.ActualName = LocalImprovementMaximumIterationsParameter.Name;
@@ -210,8 +239,11 @@
           localImprovement.Problem = Problem;
       }
+      foreach (var merger in EliteSetMergerParameter.ValidValues) {
+        merger.PopulationSizeParameter.ActualName = EliteSetSizeParameter.Name;
+      }
     }
 
     private void InitializeFromProblem<T>(ConstrainedValueParameter<T> parameter) where T : class, INamedItem {
-      InitializeFromProblem(parameter, x => true);
+      InitializeFromProblem<T>(parameter, x => true);
     }
     private void InitializeFromProblem<T>(ConstrainedValueParameter<T> parameter, Func<T, bool> condition) where T : class, INamedItem {
@@ -228,5 +260,5 @@
     }
     private void InitializeFromInstallation<T>(ConstrainedValueParameter<T> parameter) where T : class, INamedItem {
-      InitializeFromInstallation(parameter, x => true);
+      InitializeFromInstallation<T>(parameter, x => true);
     }
     private void InitializeFromInstallation<T>(ConstrainedValueParameter<T> parameter, Func<T, bool> condition) where T : class, INamedItem {
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinkingMainLoop.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinkingMainLoop.cs	(revision 7373)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinkingMainLoop.cs	(revision 7412)
@@ -89,4 +89,8 @@
       variableCreator1.CollectedValues.Add(new ValueParameter<IntValue>("Iterations", new IntValue(0)));
 
+      var resultsCollector = new ResultsCollector();
+      resultsCollector.CopyValue = new BoolValue(false);
+      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Iterations"));
+
       var variableCreator2 = new VariableCreator();
       variableCreator2.Name = "ActualEliteSetSize = 0";
@@ -157,4 +161,8 @@
       placeholder2.OperatorParameter.ActualName = PathRelinkingParameter.Name;
 
+      var placeholder3 = new Placeholder();
+      placeholder3.Name = "(Evaluator)";
+      placeholder3.OperatorParameter.ActualName = EvaluatorParameter.Name;
+
       var subScopesRemover = new SubScopesRemover();
       subScopesRemover.RemoveAllSubScopes = true;
@@ -162,11 +170,11 @@
       var ssp4 = new SubScopesProcessor();
 
-      var placeholder3 = new Placeholder();
-      placeholder3.Name = "(LocalImprovement)";
-      placeholder3.OperatorParameter.ActualName = LocalImprovementParameter.Name;
-
       var placeholder4 = new Placeholder();
-      placeholder4.Name = "(EliteSetMerger)";
-      placeholder4.OperatorParameter.ActualName = EliteSetMergerParameter.Name;
+      placeholder4.Name = "(LocalImprovement)";
+      placeholder4.OperatorParameter.ActualName = LocalImprovementParameter.Name;
+
+      var placeholder5 = new Placeholder();
+      placeholder5.Name = "(EliteSetMerger)";
+      placeholder5.OperatorParameter.ActualName = EliteSetMergerParameter.Name;
 
       var counter = new IntCounter();
@@ -191,5 +199,6 @@
 
       OperatorGraph.InitialOperator = variableCreator1;
-      variableCreator1.Successor = variableCreator2;
+      variableCreator1.Successor = resultsCollector;
+      resultsCollector.Successor = variableCreator2;
       variableCreator2.Successor = subScopesCounter1;
       subScopesCounter1.Successor = comparator1;
@@ -200,5 +209,5 @@
       ssp1.Operators.Add(eo1);
       ssp1.Operators.Add(solutionsCreator);
-      ssp1.Successor = placeholder4;
+      ssp1.Successor = placeholder5;
       eo1.Successor = null;
       solutionsCreator.Successor = subScopesCounter2;
@@ -216,9 +225,10 @@
       ssp3.Operators.Add(placeholder2);
       ssp3.Successor = null;
-      placeholder2.Successor = subScopesRemover;
+      placeholder2.Successor = placeholder3;
+      placeholder3.Successor = subScopesRemover;
       subScopesRemover.Successor = null;
-      ssp4.Operators.Add(placeholder3);
+      ssp4.Operators.Add(placeholder4);
       ssp4.Successor = null;
-      placeholder4.Successor = counter;
+      placeholder5.Successor = counter;
       counter.Successor = analyzer1;
       analyzer1.Successor = comparator3;
