Index: /branches/GeneralizedQAP/HeuristicLab.Algorithms.GRASP/3.3/Plugin.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Algorithms.GRASP/3.3/Plugin.cs.frame	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Algorithms.GRASP/3.3/Plugin.cs.frame	(revision 15504)
@@ -35,5 +35,4 @@
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
-  [PluginDependency("HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common", "3.3")]
   [PluginDependency("HeuristicLab.Random", "3.3")]
   [PluginDependency("HeuristicLab.Selection", "3.3")]
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentArchiveView.Designer.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentArchiveView.Designer.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentArchiveView.Designer.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentArchiveView.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentArchiveView.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentArchiveView.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -85,6 +85,6 @@
           if (Content == null) return;
           foreach (var solution in Content.Solutions) {
-            if (solution.OverbookedCapacity.Value <= 0.0) {
-              paretoFrontChart.Series[0].Points.AddXY(solution.FlowDistanceQuality.Value, solution.InstallationQuality.Value);
+            if (solution.Evaluation.ExcessDemand <= 0.0) {
+              paretoFrontChart.Series[0].Points.AddXY(solution.Evaluation.FlowCosts, solution.Evaluation.InstallationCosts);
               paretoFrontChart.Series[0].Points.Last().Tag = solution;
             }
@@ -101,5 +101,5 @@
       if (h.ChartElementType == ChartElementType.DataPoint) {
         var solution = (GQAPSolution)((DataPoint)h.Object).Tag;
-        var assignment = new GQAPAssignment(solution.Assignment, solution.Quality, solution.FlowDistanceQuality, solution.InstallationQuality, solution.OverbookedCapacity, Content.EquipmentNames, Content.LocationNames, Content.Distances, Content.Weights, Content.InstallationCosts, Content.Demands, Content.Capacities, Content.TransportationCosts, Content.ExpectedRandomQuality, Content.Evaluator);
+        var assignment = new GQAPAssignment(solution.Assignment, Content.ProblemInstance, solution.Evaluation);
 
         var view = MainFormManager.MainForm.ShowContent(assignment);
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentView.Designer.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentView.Designer.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentView.Designer.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentView.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentView.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentView.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -28,5 +28,4 @@
 using HeuristicLab.Common.Resources;
 using HeuristicLab.Core.Views;
-using HeuristicLab.Data;
 using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.MainForm;
@@ -131,5 +130,5 @@
           qualityLabel.Text = "-";
         } else {
-          qualityLabel.Text = Content.Quality.ToString();
+          qualityLabel.Text = Content.ProblemInstance.ToSingleObjective(Content.Evaluation).ToString();
         }
       }
@@ -139,8 +138,8 @@
       if (InvokeRequired) Invoke((Action)UpdateFlowDistanceQuality);
       else {
-        if (Content == null || Content.FlowDistanceQuality == null) {
+        if (Content == null || Content.Evaluation == null) {
           flowDistanceQualityLabel.Text = "-";
         } else {
-          flowDistanceQualityLabel.Text = Content.FlowDistanceQuality.ToString();
+          flowDistanceQualityLabel.Text = Content.Evaluation.FlowCosts.ToString();
         }
       }
@@ -150,8 +149,8 @@
       if (InvokeRequired) Invoke((Action)UpdateInstallationQuality);
       else {
-        if (Content == null || Content.InstallationQuality == null) {
+        if (Content == null || Content.Evaluation == null) {
           installationQualityLabel.Text = "-";
         } else {
-          installationQualityLabel.Text = Content.InstallationQuality.ToString();
+          installationQualityLabel.Text = Content.Evaluation.InstallationCosts.ToString();
         }
       }
@@ -161,8 +160,8 @@
       if (InvokeRequired) Invoke((Action)UpdateOverbookedCapacity);
       else {
-        if (Content == null || Content.OverbookedCapacity == null) {
+        if (Content == null || Content.Evaluation == null) {
           overbookedCapacityLabel.Text = "-";
         } else {
-          overbookedCapacityLabel.Text = Content.OverbookedCapacity.ToString();
+          overbookedCapacityLabel.Text = Content.Evaluation.ExcessDemand.ToString();
         }
       }
@@ -179,11 +178,11 @@
             if (!locationNodes.ContainsKey(assignment[i])) {
               string locationName = assignment[i].ToString();
-              if (Content.LocationNames != null && Content.LocationNames.Length > assignment[i])
-                locationName = Content.LocationNames[assignment[i]];
+              if (Content.ProblemInstance.LocationNames != null && Content.ProblemInstance.LocationNames.Length > assignment[i])
+                locationName = Content.ProblemInstance.LocationNames[assignment[i]];
               locationNodes.Add(assignment[i], new LocationNode(assignment[i], locationName));
             }
             string equipmentName = i.ToString();
-            if (Content.EquipmentNames != null && Content.EquipmentNames.Length > i)
-              equipmentName = Content.EquipmentNames[i];
+            if (Content.ProblemInstance.EquipmentNames != null && Content.ProblemInstance.EquipmentNames.Length > i)
+              equipmentName = Content.ProblemInstance.EquipmentNames[i];
             locationNodes[assignment[i]].Nodes.Add(new EquipmentNode(i, equipmentName));
           }
@@ -205,5 +204,5 @@
       foreach (var node in GetAllSubNodes(assignmentTreeView.Nodes).OfType<EquipmentNode>()) {
         int location = Content.Assignment[node.Equipment];
-        installationCosts[node] = Content.InstallationCosts[node.Equipment, location];
+        installationCosts[node] = Content.ProblemInstance.InstallationCosts[node.Equipment, location];
       }
       double max = installationCosts.Values.Max();
@@ -224,8 +223,8 @@
       int equipment = selectedNode.Equipment;
       double rowSum = 0, colSum = 0;
-      for (int i = 0; i < Content.Weights.Columns; i++)
-        if (i != equipment) rowSum += Content.Weights[equipment, i];
-      for (int i = 0; i < Content.Weights.Rows; i++)
-        if (i != equipment) colSum += Content.Weights[i, equipment];
+      for (int i = 0; i < Content.ProblemInstance.Weights.Columns; i++)
+        if (i != equipment) rowSum += Content.ProblemInstance.Weights[equipment, i];
+      for (int i = 0; i < Content.ProblemInstance.Weights.Rows; i++)
+        if (i != equipment) colSum += Content.ProblemInstance.Weights[i, equipment];
 
       var otherEquipments = GetAllSubNodes(assignmentTreeView.Nodes)
@@ -240,6 +239,6 @@
           other.ForeColor = assignmentTreeView.ForeColor;
         } else {
-          double rowInvProportion = rowSum == 0 ? 1.0 : (rowSum - Content.Weights[equipment, other.Equipment]) / rowSum;
-          double colInvProportion = colSum == 0 ? 1.0 : (colSum - Content.Weights[other.Equipment, equipment]) / colSum;
+          double rowInvProportion = rowSum == 0 ? 1.0 : (rowSum - Content.ProblemInstance.Weights[equipment, other.Equipment]) / rowSum;
+          double colInvProportion = colSum == 0 ? 1.0 : (colSum - Content.ProblemInstance.Weights[other.Equipment, equipment]) / colSum;
           int colorComponent = (int)(255 * Math.Pow(Math.Min(rowInvProportion, colInvProportion), 2));
           other.BackColor = Color.FromArgb(colorComponent, 255, colorComponent);
@@ -258,7 +257,7 @@
         rowSums[e] = 0;
         colSums[e] = 0;
-        for (int i = 0; i < Content.Weights.Columns; i++) {
-          if (!equipments.Contains(i)) rowSums[e] += Content.Weights[e, i];
-          if (!equipments.Contains(i)) colSums[e] += Content.Weights[i, e];
+        for (int i = 0; i < Content.ProblemInstance.Weights.Columns; i++) {
+          if (!equipments.Contains(i)) rowSums[e] += Content.ProblemInstance.Weights[e, i];
+          if (!equipments.Contains(i)) colSums[e] += Content.ProblemInstance.Weights[i, e];
         }
       }
@@ -272,6 +271,6 @@
           other.ForeColor = assignmentTreeView.ForeColor;
         } else {
-          double rowInvProportion = relevantEquipments.Min(x => rowSums[x] == 0 ? 1.0 : (rowSums[x] - Content.Weights[x, other.Equipment]) / rowSums[x]);
-          double colInvProportion = relevantEquipments.Min(x => colSums[x] == 0 ? 1.0 : (colSums[x] - Content.Weights[other.Equipment, x]) / colSums[x]);
+          double rowInvProportion = relevantEquipments.Min(x => rowSums[x] == 0 ? 1.0 : (rowSums[x] - Content.ProblemInstance.Weights[x, other.Equipment]) / rowSums[x]);
+          double colInvProportion = relevantEquipments.Min(x => colSums[x] == 0 ? 1.0 : (colSums[x] - Content.ProblemInstance.Weights[other.Equipment, x]) / colSums[x]);
           int colorComponent = (int)(255 * Math.Pow(Math.Min(rowInvProportion, colInvProportion), 2));
           other.BackColor = Color.FromArgb(colorComponent, 255, colorComponent);
@@ -314,14 +313,5 @@
 
     private void recalculateButton_Click(object sender, EventArgs e) {
-      double fdq, iq, oc;
-      Content.Evaluator.Evaluate(Content.Assignment, Content.Weights,
-        Content.Distances, Content.InstallationCosts, Content.Demands,
-        Content.Capacities, out fdq, out iq, out oc);
-      Content.FlowDistanceQuality = new DoubleValue(fdq);
-      Content.InstallationQuality = new DoubleValue(iq);
-      Content.OverbookedCapacity = new DoubleValue(oc);
-      Content.Quality = new DoubleValue(
-        Content.Evaluator.GetFitness(fdq, iq, oc,
-        Content.TransportationCosts.Value, Content.ExpectedRandomQuality.Value));
+      Content.Evaluation = Content.ProblemInstance.Evaluate(Content.Assignment);
     }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -31,5 +31,5 @@
 [assembly: AssemblyCompany("HEAL")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2011 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2017 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
@@ -54,3 +54,3 @@
 // [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.6.$WCREV$")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluation/Evaluation.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluation/Evaluation.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluation/Evaluation.cs	(revision 15504)
@@ -0,0 +1,56 @@
+﻿using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  [Item("GQAP Evaluation", "Class that contains the results of evaluating a solution to the GQAP.")]
+  [StorableClass]
+  public class Evaluation : Item {
+
+    /// <summary>
+    /// The solution is feasible if there is no excess demand
+    /// </summary>
+    public bool IsFeasible { get { return ExcessDemand <= double.Epsilon; } }
+
+    /// <summary>
+    /// The amount of demand that exceeds the respective capacities
+    /// </summary>
+    [Storable]
+    public double ExcessDemand { get; set; }
+    /// <summary>
+    /// The amount of slack at each location, is negative in case of excess demand.
+    /// </summary>
+    /// <remarks>
+    /// Slack.Select(x => x &lt; 0 ? -x : 0).Sum() is equivalent to <see cref="ExcessDemand"/>.
+    /// </remarks>
+    [Storable]
+    public double[] Slack { get; set; }
+    /// <summary>
+    /// The quadratic part of the fitness function that represents the flow or transportation costs.
+    /// </summary>
+    [Storable]
+    public double FlowCosts { get; set; }
+    /// <summary>
+    /// The linear part of the fitness function that represents the installation costs.
+    /// </summary>
+    [Storable]
+    public double InstallationCosts { get; set; }
+    
+    [StorableConstructor]
+    protected Evaluation(bool deserializing) : base(deserializing) { }
+    protected Evaluation(Evaluation original, Cloner cloner)
+      : base(original, cloner) {
+      ExcessDemand = original.ExcessDemand;
+      if (original.Slack != null)
+        Slack = original.Slack.ToArray();
+      FlowCosts = original.FlowCosts;
+      InstallationCosts = original.InstallationCosts;
+    }
+    public Evaluation() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Evaluation(this, cloner);
+    }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluation/GQAPNMoveEvaluator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluation/GQAPNMoveEvaluator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluation/GQAPNMoveEvaluator.cs	(revision 15504)
@@ -0,0 +1,135 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  [Item("N-Move Evaluator", "Evaluates an N-Move.")]
+  [StorableClass]
+  public class GQAPNMoveEvaluator : SingleSuccessorOperator, IGQAPNMoveEvaluator,
+    IQualityAwareGQAPOperator, IProblemInstanceAwareGQAPOperator {
+
+    #region Parameter Descriptions
+    public static readonly string MoveQualityDescription = "The quality of the move if it would be applied.";
+    public static readonly string MoveEvaluationDescription = "The results of evaluating the move.";
+    #endregion
+
+    #region Parameter Properties
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<Evaluation> MoveEvaluationParameter {
+      get { return (ILookupParameter<Evaluation>)Parameters["MoveEvaluation"]; }
+    }
+    public ILookupParameter<NMove> MoveParameter {
+      get { return (ILookupParameter<NMove>)Parameters["Move"]; }
+    }
+    public ILookupParameter<IntegerVector> AssignmentParameter {
+      get { return (ILookupParameter<IntegerVector>)Parameters["Assignment"]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<Evaluation> EvaluationParameter {
+      get { return (ILookupParameter<Evaluation>)Parameters["Evaluation"]; }
+    }
+    public ILookupParameter<GQAPInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<GQAPInstance>)Parameters["ProblemInstance"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected GQAPNMoveEvaluator(bool deserializing) : base(deserializing) { }
+    protected GQAPNMoveEvaluator(GQAPNMoveEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public GQAPNMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<IntegerVector>("Assignment", GQAPSolutionCreator.AssignmentDescription));
+      Parameters.Add(new LookupParameter<NMove>("Move", GQAPNMoveGenerator.MoveDescription));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", ""));
+      Parameters.Add(new LookupParameter<Evaluation>("Evaluation", GQAP.EvaluationDescription));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", MoveQualityDescription));
+      Parameters.Add(new LookupParameter<Evaluation>("MoveEvaluation", MoveEvaluationDescription));
+      Parameters.Add(new LookupParameter<GQAPInstance>("ProblemInstance", GQAP.ProblemInstanceDescription));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GQAPNMoveEvaluator(this, cloner);
+    }
+
+    public static Evaluation Evaluate(NMove move, IntegerVector assignment, Evaluation evaluation, GQAPInstance problemInstance) {
+      int moves = move.N;
+      var newEvaluation = new Evaluation() {
+        ExcessDemand = evaluation.ExcessDemand,
+        FlowCosts = evaluation.FlowCosts,
+        InstallationCosts = evaluation.InstallationCosts,
+        Slack = evaluation.Slack.ToArray()
+      };
+      foreach (var kvp in move.NewAssignments) {
+        int equip = kvp.Key;
+        int newLoc = kvp.Value;
+        int oldLoc = assignment[equip];
+        var equipDemand = problemInstance.Demands[equip];
+        newEvaluation.InstallationCosts -= problemInstance.InstallationCosts[equip, oldLoc];
+        newEvaluation.InstallationCosts += problemInstance.InstallationCosts[equip, newLoc];
+        for (int j = 0; j < assignment.Length; j++) {
+          if (!move.NewAssignments.ContainsKey(j)) {
+            newEvaluation.FlowCosts += problemInstance.Weights[equip, j] * problemInstance.Distances[newLoc, assignment[j]];
+            newEvaluation.FlowCosts -= problemInstance.Weights[equip, j] * problemInstance.Distances[oldLoc, assignment[j]];
+            newEvaluation.FlowCosts += problemInstance.Weights[j, equip] * problemInstance.Distances[assignment[j], newLoc];
+            newEvaluation.FlowCosts -= problemInstance.Weights[j, equip] * problemInstance.Distances[assignment[j], oldLoc];
+          } else {
+            newEvaluation.FlowCosts += problemInstance.Weights[equip, j] * problemInstance.Distances[newLoc, move.NewAssignments[j]];
+            newEvaluation.FlowCosts -= problemInstance.Weights[equip, j] * problemInstance.Distances[oldLoc, assignment[j]];
+          }
+        }
+        newEvaluation.Slack[oldLoc] += equipDemand;
+        if (newEvaluation.Slack[oldLoc] < equipDemand)
+          newEvaluation.ExcessDemand -= Math.Min(equipDemand, equipDemand - newEvaluation.Slack[oldLoc]);
+        newEvaluation.Slack[newLoc] -= equipDemand;
+        if (newEvaluation.Slack[newLoc] < 0)
+          newEvaluation.ExcessDemand += Math.Min(equipDemand, -newEvaluation.Slack[newLoc]);
+      }
+
+      return newEvaluation;
+    }
+
+    public override IOperation Apply() {
+      var problemInstance = ProblemInstanceParameter.ActualValue;
+      var evaluation = EvaluationParameter.ActualValue;
+
+      var moveEvaluation = Evaluate(MoveParameter.ActualValue,
+               AssignmentParameter.ActualValue,
+               evaluation,
+               problemInstance);
+
+      MoveEvaluationParameter.ActualValue = moveEvaluation;
+      return base.Apply();
+    }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAP.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAP.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAP.cs	(revision 15504)
@@ -0,0 +1,482 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.Instances;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  [Item("Generalized Quadratic Assignment Problem (GQAP)", "The Generalized Quadratic Assignment Problem (GQAP) is a generalization of the QAP in that it allows to assign multiple facilities (here called equipment) to a single location. The problem is described in Lee, C.G., and Ma, Z. 2003. The Generalized Quadratic Assignment Problem. Technical Report M5S 3G8, University of Toronto, Canada.")]
+  [Creatable("Problems")]
+  [StorableClass]
+  public sealed class GQAP : SingleObjectiveBasicProblem<IntegerVectorEncoding>,
+    IProblemInstanceConsumer<QAPData>,
+    IProblemInstanceConsumer<CTAPData>,
+    IProblemInstanceConsumer<TSPData>,
+    IProblemInstanceConsumer<ATSPData>,
+    IProblemInstanceConsumer<GQAPData> {
+
+    public override bool Maximization { get { return false; } }
+
+    #region Parameter Descriptions
+    public static readonly string BestKnownQualityDescription = "The best known quality (if available).";
+    public static readonly string BestKnownSolutionDescription = "The best known solution (if available).";
+    public static readonly string BestKnownSolutionsDescription = "Contains an archive of best-known solutions regarding flow-distance quality and installation quality.";
+    public static readonly string ProblemInstanceDescription = "The problem instance that is to be solved.";
+    public static readonly string EvaluationDescription = "The evaluation result of a solution to the GQAP.";
+    #endregion
+
+    #region Parameter Properties
+    public OptionalValueParameter<GQAPAssignment> BestKnownSolutionParameter {
+      get { return (OptionalValueParameter<GQAPAssignment>)Parameters["BestKnownSolution"]; }
+    }
+    public OptionalValueParameter<GQAPAssignmentArchive> BestKnownSolutionsParameter {
+      get { return (OptionalValueParameter<GQAPAssignmentArchive>)Parameters["BestKnownSolutions"]; }
+    }
+    public IValueParameter<GQAPInstance> ProblemInstanceParameter {
+      get { return (IValueParameter<GQAPInstance>)Parameters["ProblemInstance"]; }
+    }
+    #endregion
+
+    #region Properties
+    public GQAPAssignment BestKnownSolution {
+      get { return BestKnownSolutionParameter.Value; }
+      set { BestKnownSolutionParameter.Value = value; }
+    }
+    public GQAPAssignmentArchive BestKnownSolutions {
+      get { return BestKnownSolutionsParameter.Value; }
+      set { BestKnownSolutionsParameter.Value = value; }
+    }
+    public GQAPInstance ProblemInstance {
+      get { return ProblemInstanceParameter.Value; }
+      set { ProblemInstanceParameter.Value = value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private GQAP(bool deserializing) : base(deserializing) { }
+    private GQAP(GQAP original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+    public GQAP() : base() {
+      Encoding = new IntegerVectorEncoding("Assignment");
+      Parameters.Add(new OptionalValueParameter<GQAPAssignment>("BestKnownSolution", BestKnownSolutionDescription, null, false));
+      Parameters.Add(new OptionalValueParameter<GQAPAssignmentArchive>("BestKnownSolutions", BestKnownSolutionsDescription, null, false));
+      Parameters.Add(new ValueParameter<GQAPInstance>("ProblemInstance", "The problem instance that is to be solved.", new GQAPInstance(), false));
+
+      InitializeOperators();
+      RegisterEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GQAP(this, cloner);
+    }
+
+    public override double Evaluate(Individual individual, IRandom random = null) {
+      var assignment = individual.IntegerVector();
+      var evaluation = ProblemInstance.Evaluate(assignment);
+      individual["Evaluation"] = evaluation;
+      return ProblemInstance.ToSingleObjective(evaluation);
+    }
+
+    public double Evaluate(IntegerVector assignment) {
+      var evaluation = ProblemInstance.Evaluate(assignment);
+      return ProblemInstance.ToSingleObjective(evaluation);
+    }
+
+    public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      AnalyzeBestSolution(results, GetBestIndividual(individuals, qualities));
+      AnalyzeParetoArchive(results,
+        individuals.Select(i => Tuple.Create((IntegerVector)i.IntegerVector().Clone(),
+        (Evaluation)i["Evaluation"])));
+    }
+
+    private void AnalyzeBestSolution(ResultCollection results, Tuple<Individual, double> best) {
+      var bestVector = best.Item1.IntegerVector();
+      var bestEvaluation = (Evaluation)best.Item1["Evaluation"];
+
+      IResult bestResult;
+      if (!results.TryGetValue("Best Solution", out bestResult)) {
+        bestResult = new Result("Best Solution", typeof(GQAPAssignment));
+        results.Add(bestResult);
+      }
+      var item = bestResult.Value as GQAPAssignment;
+      if (item == null) bestResult.Value = new GQAPAssignment((IntegerVector)bestVector.Clone(), ProblemInstance, bestEvaluation);
+      else if (ProblemInstance.ToSingleObjective(bestEvaluation)
+        < ProblemInstance.ToSingleObjective(item.Evaluation)) {
+        item.ProblemInstance = ProblemInstance;
+        item.Assignment = (IntegerVector)bestVector.Clone();
+        item.Evaluation = bestEvaluation;
+      }
+    }
+
+    private void AnalyzeParetoArchive(ResultCollection results, IEnumerable<Tuple<IntegerVector, Evaluation>> solutions) {
+      IResult archiveResult;
+      if (!results.TryGetValue("Solution Archive", out archiveResult)) {
+        archiveResult = new Result("Solution Archive", typeof(GQAPAssignmentArchive));
+        results.Add(archiveResult);
+      }
+      var archive = archiveResult.Value as GQAPAssignmentArchive;
+      if (archive == null) archive = new GQAPAssignmentArchive(ProblemInstance);
+      else archive.ProblemInstance = ProblemInstance;
+      
+      var combinedArchive = solutions
+        .Select(x => new GQAPSolution(x.Item1, x.Item2))
+        .Concat(archive.Solutions);
+      archive.Solutions = GetFeasibleParetoFront(combinedArchive);
+      
+      if (BestKnownSolutions == null) {
+        BestKnownSolutions = archive;
+      } else {
+        var combinedArchive2 = solutions
+        .Select(x => new GQAPSolution(x.Item1, x.Item2))
+        .Concat(BestKnownSolutions.Solutions);
+        BestKnownSolutions.Solutions = GetFeasibleParetoFront(combinedArchive2);
+      }
+    }
+
+    #region Problem Instance Loading
+    public void Load(QAPData data) {
+      Name = data.Name;
+      Description = data.Description;
+
+      var weights = new DoubleMatrix(data.Weights);
+      var distances = new DoubleMatrix(data.Distances);
+      var installationCosts = new DoubleMatrix(weights.Rows, distances.Columns); // all zero
+      var capacities = new DoubleArray(Enumerable.Range(0, distances.Rows).Select(x => 1.0).ToArray());
+      var demands = new DoubleArray(Enumerable.Range(0, weights.Rows).Select(x => 1.0).ToArray());
+
+      Load(demands, capacities, weights, distances, installationCosts, new DoubleValue(1));
+      EvaluateAndLoadAssignment(data.BestKnownAssignment);
+    }
+
+    public void Load(CTAPData data) {
+      Name = data.Name;
+      Description = data.Description;
+
+      var capacities = new DoubleArray(data.MemoryCapacities);
+      var demands = new DoubleArray(data.MemoryRequirements);
+      var weights = new DoubleMatrix(data.CommunicationCosts);
+      var installationCosts = new DoubleMatrix(data.ExecutionCosts.Transpose());
+      var distances = new DoubleMatrix(capacities.Length, capacities.Length);
+      for (int i = 0; i < capacities.Length - 1; i++)
+        for (int j = i + 1; j < capacities.Length; j++) {
+          distances[i, j] = 1;
+        }
+
+      Load(demands, capacities, weights, distances, installationCosts, new DoubleValue(1));
+      EvaluateAndLoadAssignment(data.BestKnownAssignment);
+    }
+
+    public void Load(TSPData data) {
+      if (data.Dimension > 1000)
+        throw new System.IO.InvalidDataException("Instances with more than 1000 cities are not supported.");
+
+      Name = data.Name;
+      Description = data.Description;
+
+      var capacities = new DoubleArray(data.Dimension);
+      var demands = new DoubleArray(data.Dimension);
+      for (int i = 0; i < data.Dimension; i++) {
+        capacities[i] = 1;
+        demands[i] = 1;
+      }
+      var installationCosts = new DoubleMatrix(data.Dimension, data.Dimension);
+      var weights = new DoubleMatrix(data.Dimension, data.Dimension);
+      for (int i = 0; i < data.Dimension; i++)
+        weights[i, (i + 1) % data.Dimension] = 1;
+      var distances = new DoubleMatrix(data.GetDistanceMatrix());
+
+      Load(demands, capacities, weights, distances, installationCosts, new DoubleValue(1));
+      EvaluateAndLoadAssignment(data.BestKnownTour);
+    }
+
+    public void Load(ATSPData data) {
+      Name = data.Name;
+      Description = data.Description;
+
+      var capacities = new DoubleArray(data.Dimension);
+      var demands = new DoubleArray(data.Dimension);
+      for (int i = 0; i < data.Dimension; i++) {
+        capacities[i] = 1;
+        demands[i] = 1;
+      }
+      var installationCosts = new DoubleMatrix(data.Dimension, data.Dimension);
+      var weights = new DoubleMatrix(data.Dimension, data.Dimension);
+      for (int i = 0; i < data.Dimension; i++)
+        weights[i, (i + 1) % data.Dimension] = 1;
+      var distances = new DoubleMatrix(data.Distances);
+
+      Load(demands, capacities, weights, distances, installationCosts, new DoubleValue(1));
+      EvaluateAndLoadAssignment(data.BestKnownTour);
+    }
+
+    public void Load(GQAPData data) {
+      Name = data.Name;
+      Description = data.Description;
+
+      var capacities = new DoubleArray(data.Capacities);
+      var demands = new DoubleArray(data.Demands);
+      var installationCosts = new DoubleMatrix(data.InstallationCosts);
+      var weights = new DoubleMatrix(data.Weights);
+      var distances = new DoubleMatrix(data.Distances);
+      var transportationCosts = new DoubleValue(data.TransportationCosts);
+
+      Load(demands, capacities, weights, distances, installationCosts, transportationCosts);
+      EvaluateAndLoadAssignment(data.BestKnownAssignment);
+
+      if (data.BestKnownAssignment == null && data.BestKnownQuality.HasValue) {
+        BestKnownQuality = data.BestKnownQuality.Value;
+      }
+    }
+
+    public void Load(DoubleArray demands, DoubleArray capacities,
+      DoubleMatrix weights, DoubleMatrix distances, DoubleMatrix installationCosts,
+      DoubleValue transportationCosts) {
+      if (weights == null || weights.Rows == 0)
+        throw new System.IO.InvalidDataException(
+@"The given instance does not contain weights!");
+      if (weights.Rows != weights.Columns)
+        throw new System.IO.InvalidDataException(
+@"The weights matrix of the given instance contains
+an unequal number of rows and columns.");
+      if (distances == null || distances.Rows == 0)
+        throw new System.IO.InvalidDataException(
+@"The given instance does not contain distances!");
+      if (distances.Rows != distances.Columns)
+        throw new System.IO.InvalidDataException(
+@"The distances matrix of the given instance contains
+an unequal number of rows and columns.");
+      if (installationCosts == null || installationCosts.Rows == 0)
+        throw new System.IO.InvalidDataException(
+@"The given instance does not contain installation costs!");
+      if (installationCosts.Rows != weights.Rows
+        || installationCosts.Columns != distances.Columns)
+        throw new System.IO.InvalidDataException(
+@"The installation costs matrix of the given instance
+contains different number of rows than given in the
+weights matrix and a different number of columns than
+given in the distances matrix.");
+      if (capacities == null || capacities.Length == 0)
+        throw new System.IO.InvalidDataException(
+@"The given instance does not contain capacities!");
+      if (capacities.Length != distances.Rows)
+        throw new System.IO.InvalidDataException(
+@"The given instance contains a different number of
+capacities than rows given in the distances matrix.");
+      if (demands == null || demands.Length == 0)
+        throw new System.IO.InvalidDataException(
+@"The given instance does not contain demands!");
+      if (demands.Length != weights.Rows)
+        throw new System.IO.InvalidDataException(
+@"The given instance contains a different number of
+demands than rows given in the weights matrix.");
+      if (transportationCosts == null)
+        throw new System.IO.InvalidDataException(
+@"The given instance does not contain transportation costs.");
+
+      ProblemInstance = new GQAPInstance() {
+        Weights = weights,
+        Distances = distances,
+        InstallationCosts = installationCosts,
+        Capacities = capacities,
+        Demands = demands,
+        TransportationCosts = transportationCosts.Value
+      };
+      BestKnownQualityParameter.Value = null;
+      BestKnownSolution = null;
+      BestKnownSolutions = null;
+      ProblemInstance.CalculatePenaltyLevel();
+    }
+    private void EvaluateAndLoadAssignment(int[] vector) {
+      if (vector == null || vector.Length == 0) return;
+      EvaluateAndLoadAssignment(new IntegerVector(vector));
+    }
+    public void EvaluateAndLoadAssignment(IntegerVector assignment) {
+      if (!ProblemInstance.IsValid()) {
+        BestKnownQualityParameter.Value = null;
+        BestKnownSolution = null;
+        BestKnownSolutions = null;
+        return;
+      }
+      var evaluation = ProblemInstance.Evaluate(assignment);
+      var quality = ProblemInstance.ToSingleObjective(evaluation);
+      
+      BestKnownSolution = new GQAPAssignment((IntegerVector)assignment.Clone(), ProblemInstance, evaluation);
+      BestKnownQuality = quality;
+      BestKnownSolutions = new GQAPAssignmentArchive(ProblemInstance);
+      BestKnownSolutions.Solutions.Add(new GQAPSolution((IntegerVector)assignment.Clone(), evaluation));
+    }
+    #endregion
+
+    #region Events
+    protected override void OnOperatorsChanged() {
+      base.OnOperatorsChanged();
+      Parameterize();
+    }
+    protected override void OnEncodingChanged() {
+      base.OnEncodingChanged();
+      Parameterize();
+    }
+    #endregion
+
+    #region Helpers
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    private void RegisterEventHandlers() {
+      ProblemInstanceParameter.ValueChanged += ProblemInstanceParameterOnValueChanged;
+      ProblemInstance.CapacitiesParameter.ValueChanged += ProblemInstanceCapacitiesParameterOnValueChanged;
+      ProblemInstance.DemandsParameter.ValueChanged += ProblemInstanceDemandsParameterOnValueChanged;
+      ProblemInstance.Capacities.Reset += ProblemInstanceCapacitiesOnReset;
+      ProblemInstance.Demands.Reset += ProblemInstanceDemandsOnReset;
+    }
+
+    private void ProblemInstanceParameterOnValueChanged(object sender, EventArgs e) {
+      ProblemInstance.CapacitiesParameter.ValueChanged += ProblemInstanceCapacitiesParameterOnValueChanged;
+      ProblemInstance.Capacities.Reset += ProblemInstanceCapacitiesOnReset;
+      ProblemInstance.DemandsParameter.ValueChanged += ProblemInstanceDemandsParameterOnValueChanged;
+      ProblemInstance.Demands.Reset += ProblemInstanceDemandsOnReset;
+      UpdateEncoding();
+    }
+    private void ProblemInstanceCapacitiesParameterOnValueChanged(object sender, EventArgs e) {
+      ProblemInstance.Capacities.Reset += ProblemInstanceCapacitiesOnReset;
+      UpdateEncoding();
+    }
+    private void ProblemInstanceDemandsParameterOnValueChanged(object sender, EventArgs e) {
+      ProblemInstance.Demands.Reset += ProblemInstanceDemandsOnReset;
+      UpdateEncoding();
+    }
+    private void ProblemInstanceDemandsOnReset(object sender, EventArgs e) {
+      UpdateEncoding();
+    }
+    private void ProblemInstanceCapacitiesOnReset(object sender, EventArgs e) {
+      UpdateEncoding();
+    }
+
+    private void UpdateEncoding() {
+      Encoding.Length = ProblemInstance.Demands.Length;
+      Encoding.Bounds = new IntMatrix(new int[,] { { 0, ProblemInstance.Capacities.Length } });
+    }
+
+    private void InitializeOperators() {
+      Operators.Clear();
+      Operators.AddRange(ApplicationManager.Manager.GetInstances<IGQAPOperator>());
+      Operators.RemoveAll(x => x is ISingleObjectiveMoveEvaluator);
+      Operators.AddRange(ApplicationManager.Manager.GetInstances<IGQAPMoveEvaluator>());
+      Operators.Add(new HammingSimilarityCalculator());
+      Operators.Add(new QualitySimilarityCalculator());
+      
+      Operators.Add(new PopulationSimilarityAnalyzer(Operators.OfType<ISolutionSimilarityCalculator>()));
+      Parameterize();
+    }
+
+    private void Parameterize() {
+      var operators = Operators.Union(new IOperator[] { SolutionCreator, Evaluator }).ToArray();
+      
+      foreach (var op in operators.OfType<IBestKnownQualityAwareGQAPOperator>()) {
+        op.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
+        op.BestKnownQualityParameter.Hidden = true;
+      }
+      foreach (var op in operators.OfType<IBestKnownSolutionAwareGQAPOperator>()) {
+        op.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
+        op.BestKnownSolutionParameter.Hidden = true;
+      }
+      foreach (var op in operators.OfType<IBestKnownSolutionsAwareGQAPOperator>()) {
+        op.BestKnownSolutionsParameter.ActualName = BestKnownSolutionsParameter.Name;
+        op.BestKnownSolutionsParameter.Hidden = true;
+      }
+      foreach (var op in operators.OfType<IGQAPCrossover>()) {
+        op.ParentsParameter.ActualName = Encoding.Name;
+        op.ParentsParameter.Hidden = true;
+        op.ChildParameter.ActualName = Encoding.Name;
+        op.ChildParameter.Hidden = true;
+      }
+      var moveEvaluator = operators.OfType<IGQAPMoveEvaluator>().FirstOrDefault();
+      foreach (var op in operators.OfType<IGQAPMoveEvaluator>()) { // synchronize all move evaluators
+        if (moveEvaluator != null) {
+          op.MoveQualityParameter.ActualName = moveEvaluator.MoveQualityParameter.ActualName;
+          op.MoveQualityParameter.Hidden = true;
+          op.MoveEvaluationParameter.ActualName = "MoveEvaluation";
+          op.MoveEvaluationParameter.Hidden = true;
+        }
+      }
+      foreach (var op in operators.OfType<IMoveQualityAwareGQAPOperator>()) {
+        if (moveEvaluator != null) {
+          op.MoveQualityParameter.ActualName = moveEvaluator.MoveQualityParameter.ActualName;
+          op.MoveQualityParameter.Hidden = true;
+          op.MoveEvaluationParameter.ActualName = "MoveEvaluation";
+          op.MoveEvaluationParameter.Hidden = true;
+        }
+      }
+      foreach (var op in operators.OfType<IProblemInstanceAwareGQAPOperator>()) {
+        op.ProblemInstanceParameter.ActualName = ProblemInstanceParameter.Name;
+        op.ProblemInstanceParameter.Hidden = true;
+      }
+      foreach (var op in operators.OfType<IQualitiesAwareGQAPOperator>()) {
+        op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+        op.QualityParameter.Hidden = true;
+        op.EvaluationParameter.ActualName = "Evaluation";
+        op.EvaluationParameter.Hidden = true;
+      }
+      foreach (var op in operators.OfType<IQualityAwareGQAPOperator>()) {
+        op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+        op.QualityParameter.Hidden = true;
+        op.EvaluationParameter.ActualName = "Evaluation";
+        op.EvaluationParameter.Hidden = true;
+      }
+    }
+    #endregion
+
+    public static ItemList<GQAPSolution> GetFeasibleParetoFront(IEnumerable<GQAPSolution> solutions) {
+      var front = new ItemList<GQAPSolution>(solutions.Where(x => x.Evaluation.IsFeasible));
+
+      for (int i = 0; i < front.Count - 1; i++) {
+        for (int j = i + 1; j < front.Count; j++) {
+          if (front[i].Evaluation.FlowCosts <= front[j].Evaluation.FlowCosts
+            && front[i].Evaluation.InstallationCosts <= front[j].Evaluation.InstallationCosts) {
+            front.RemoveAt(j);
+            j--;
+          } else if (front[i].Evaluation.FlowCosts >= front[j].Evaluation.FlowCosts
+            && front[i].Evaluation.InstallationCosts >= front[j].Evaluation.InstallationCosts) {
+            front.RemoveAt(i);
+            j = i;
+          }
+        }
+      }
+      return front;
+    }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPAssignment.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPAssignment.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPAssignment.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -23,5 +23,4 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -37,161 +36,29 @@
       get { return assignment; }
       set {
-        bool changed = (assignment != value);
+        if (assignment == value) return;
         assignment = value;
-        if (changed) OnPropertyChanged("Assignment");
+        OnPropertyChanged(nameof(Assignment));
       }
     }
 
     [Storable]
-    private DoubleValue quality;
-    public DoubleValue Quality {
-      get { return quality; }
+    private Evaluation evaluation;
+    public Evaluation Evaluation {
+      get { return evaluation; }
       set {
-        bool changed = (quality != value);
-        quality = value;
-        if (changed) OnPropertyChanged("Quality");
+        if (evaluation == value) return;
+        evaluation = value;
+        OnPropertyChanged(nameof(Evaluation));
       }
     }
 
     [Storable]
-    private DoubleValue flowDistanceQuality;
-    public DoubleValue FlowDistanceQuality {
-      get { return flowDistanceQuality; }
+    private GQAPInstance problemInstance;
+    public GQAPInstance ProblemInstance {
+      get { return problemInstance; }
       set {
-        bool changed = (flowDistanceQuality != value);
-        flowDistanceQuality = value;
-        if (changed) OnPropertyChanged("FlowDistanceQuality");
-      }
-    }
-
-    [Storable]
-    private DoubleValue installationQuality;
-    public DoubleValue InstallationQuality {
-      get { return installationQuality; }
-      set {
-        bool changed = (installationQuality != value);
-        installationQuality = value;
-        if (changed) OnPropertyChanged("InstallationQuality");
-      }
-    }
-
-    [Storable]
-    private DoubleValue overbookedCapacity;
-    public DoubleValue OverbookedCapacity {
-      get { return overbookedCapacity; }
-      set {
-        bool changed = (overbookedCapacity != value);
-        overbookedCapacity = value;
-        if (changed) OnPropertyChanged("OverbookedCapacity");
-      }
-    }
-
-    [Storable]
-    private StringArray equipmentNames;
-    public StringArray EquipmentNames {
-      get { return equipmentNames; }
-      set {
-        bool changed = (equipmentNames != value);
-        equipmentNames = value;
-        if (changed) OnPropertyChanged("EquipmentNames");
-      }
-    }
-
-    [Storable]
-    private StringArray locationNames;
-    public StringArray LocationNames {
-      get { return locationNames; }
-      set {
-        bool changed = (locationNames != value);
-        locationNames = value;
-        if (changed) OnPropertyChanged("LocationNames");
-      }
-    }
-
-    [Storable]
-    private DoubleMatrix distances;
-    public DoubleMatrix Distances {
-      get { return distances; }
-      set {
-        bool changed = (distances != value);
-        distances = value;
-        if (changed) OnPropertyChanged("Distances");
-      }
-    }
-
-    [Storable]
-    private DoubleMatrix weights;
-    public DoubleMatrix Weights {
-      get { return weights; }
-      set {
-        bool changed = (weights != value);
-        weights = value;
-        if (changed) OnPropertyChanged("Weights");
-      }
-    }
-
-    [Storable]
-    private DoubleMatrix installationCosts;
-    public DoubleMatrix InstallationCosts {
-      get { return installationCosts; }
-      set {
-        bool changed = (installationCosts != value);
-        installationCosts = value;
-        if (changed) OnPropertyChanged("InstallationCosts");
-      }
-    }
-
-    [Storable]
-    private DoubleArray demands;
-    public DoubleArray Demands {
-      get { return demands; }
-      set {
-        bool changed = (demands != value);
-        demands = value;
-        if (changed) OnPropertyChanged("Demands");
-      }
-    }
-
-    [Storable]
-    private DoubleArray capacities;
-    public DoubleArray Capacities {
-      get { return capacities; }
-      set {
-        bool changed = (capacities != value);
-        capacities = value;
-        if (changed) OnPropertyChanged("Capacities");
-      }
-    }
-
-    [Storable]
-    private DoubleValue transportationCosts;
-    public DoubleValue TransportationCosts {
-      get { return transportationCosts; }
-      set {
-        bool changed = (transportationCosts != value);
-        transportationCosts = value;
-        if (changed) OnPropertyChanged("TransportationCosts");
-      }
-    }
-
-    [Storable]
-    private DoubleValue expectedRandomQuality;
-    public DoubleValue ExpectedRandomQuality {
-      get { return expectedRandomQuality; }
-      set {
-        bool changed = (expectedRandomQuality != value);
-        expectedRandomQuality = value;
-        if (changed) OnPropertyChanged("ExpectedRandomQuality");
-      }
-    }
-
-    [Storable]
-    private IGQAPEvaluator evaluator;
-    public IGQAPEvaluator Evaluator {
-      get { return evaluator; }
-      set {
-        bool changed = (evaluator != value);
-        evaluator = value;
-        if (changed) OnPropertyChanged("Evaluator");
+        if (problemInstance == value) return;
+        problemInstance = value;
+        OnPropertyChanged(nameof(ProblemInstance));
       }
     }
@@ -202,36 +69,14 @@
       : base(original, cloner) {
       assignment = cloner.Clone(original.assignment);
-      quality = cloner.Clone(original.quality);
-      flowDistanceQuality = cloner.Clone(original.flowDistanceQuality);
-      installationQuality = cloner.Clone(original.installationQuality);
-      overbookedCapacity = cloner.Clone(original.overbookedCapacity);
-      equipmentNames = cloner.Clone(original.equipmentNames);
-      locationNames = cloner.Clone(original.locationNames);
-      distances = cloner.Clone(original.distances);
-      weights = cloner.Clone(original.weights);
-      installationCosts = cloner.Clone(original.installationCosts);
-      demands = cloner.Clone(original.demands);
-      capacities = cloner.Clone(original.capacities);
-      transportationCosts = cloner.Clone(original.transportationCosts);
-      expectedRandomQuality = cloner.Clone(original.expectedRandomQuality);
-      evaluator = cloner.Clone(original.evaluator);
+      evaluation = cloner.Clone(original.evaluation);
+      problemInstance = cloner.Clone(original.problemInstance);
     }
-    public GQAPAssignment(IntegerVector assignment, DoubleValue quality, DoubleValue flowDistanceQuality, DoubleValue installationQuality, DoubleValue overbookedCapacity, StringArray equipmentNames, StringArray locationNames, DoubleMatrix distances, DoubleMatrix weights, DoubleMatrix installationCosts, DoubleArray demands, DoubleArray capacities, DoubleValue transportationCosts, DoubleValue expectedRandomQuality, IGQAPEvaluator evaluator)
+    public GQAPAssignment(IntegerVector assignment, GQAPInstance problemInstance)
+      : this(assignment, problemInstance, problemInstance.Evaluate(assignment)) { }
+    public GQAPAssignment(IntegerVector assignment, GQAPInstance problemInstance, Evaluation evaluation)
       : base() {
       this.assignment = assignment;
-      this.quality = quality;
-      this.flowDistanceQuality = flowDistanceQuality;
-      this.installationQuality = installationQuality;
-      this.overbookedCapacity = overbookedCapacity;
-      this.equipmentNames = equipmentNames;
-      this.locationNames = locationNames;
-      this.distances = distances;
-      this.weights = weights;
-      this.installationCosts = installationCosts;
-      this.demands = demands;
-      this.capacities = capacities;
-      this.transportationCosts = transportationCosts;
-      this.expectedRandomQuality = expectedRandomQuality;
-      this.evaluator = evaluator;
+      this.evaluation = evaluation;
+      this.problemInstance = problemInstance;
     }
 
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPAssignmentArchive.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPAssignmentArchive.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPAssignmentArchive.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -23,5 +23,4 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -36,117 +35,18 @@
       get { return solutions; }
       set {
-        bool changed = (solutions != value);
+        if (solutions == value) return;
         solutions = value;
-        if (changed) OnPropertyChanged("Solutions");
+        OnPropertyChanged(nameof(Solutions));
       }
     }
 
     [Storable]
-    private StringArray equipmentNames;
-    public StringArray EquipmentNames {
-      get { return equipmentNames; }
+    private GQAPInstance problemInstance;
+    public GQAPInstance ProblemInstance {
+      get { return problemInstance; }
       set {
-        bool changed = (equipmentNames != value);
-        equipmentNames = value;
-        if (changed) OnPropertyChanged("EquipmentNames");
-      }
-    }
-
-    [Storable]
-    private StringArray locationNames;
-    public StringArray LocationNames {
-      get { return locationNames; }
-      set {
-        bool changed = (locationNames != value);
-        locationNames = value;
-        if (changed) OnPropertyChanged("LocationNames");
-      }
-    }
-
-    [Storable]
-    private DoubleMatrix distances;
-    public DoubleMatrix Distances {
-      get { return distances; }
-      set {
-        bool changed = (distances != value);
-        distances = value;
-        if (changed) OnPropertyChanged("Distances");
-      }
-    }
-
-    [Storable]
-    private DoubleMatrix weights;
-    public DoubleMatrix Weights {
-      get { return weights; }
-      set {
-        bool changed = (weights != value);
-        weights = value;
-        if (changed) OnPropertyChanged("Weights");
-      }
-    }
-
-    [Storable]
-    private DoubleMatrix installationCosts;
-    public DoubleMatrix InstallationCosts {
-      get { return installationCosts; }
-      set {
-        bool changed = (installationCosts != value);
-        installationCosts = value;
-        if (changed) OnPropertyChanged("InstallationCosts");
-      }
-    }
-
-    [Storable]
-    private DoubleArray demands;
-    public DoubleArray Demands {
-      get { return demands; }
-      set {
-        bool changed = (demands != value);
-        demands = value;
-        if (changed) OnPropertyChanged("Demands");
-      }
-    }
-
-    [Storable]
-    private DoubleArray capacities;
-    public DoubleArray Capacities {
-      get { return capacities; }
-      set {
-        bool changed = (capacities != value);
-        capacities = value;
-        if (changed) OnPropertyChanged("Capacities");
-      }
-    }
-
-    [Storable]
-    private DoubleValue transportationCosts;
-    public DoubleValue TransportationCosts {
-      get { return transportationCosts; }
-      set {
-        bool changed = (transportationCosts != value);
-        transportationCosts = value;
-        if (changed) OnPropertyChanged("TransportationCosts");
-      }
-    }
-
-    [Storable]
-    private DoubleValue expectedRandomQuality;
-    public DoubleValue ExpectedRandomQuality {
-      get { return expectedRandomQuality; }
-      set {
-        bool changed = (expectedRandomQuality != value);
-        expectedRandomQuality = value;
-        if (changed) OnPropertyChanged("ExpectedRandomQuality");
-      }
-    }
-
-    [Storable]
-    private IGQAPEvaluator evaluator;
-    public IGQAPEvaluator Evaluator {
-      get { return evaluator; }
-      set {
-        bool changed = (evaluator != value);
-        evaluator = value;
-        if (changed) OnPropertyChanged("Evaluator");
+        if (problemInstance == value) return;
+        problemInstance = value;
+        OnPropertyChanged(nameof(ProblemInstance));
       }
     }
@@ -157,14 +57,5 @@
       : base(original, cloner) {
       solutions = cloner.Clone(original.solutions);
-      equipmentNames = cloner.Clone(original.equipmentNames);
-      locationNames = cloner.Clone(original.locationNames);
-      distances = cloner.Clone(original.distances);
-      weights = cloner.Clone(original.weights);
-      installationCosts = cloner.Clone(original.installationCosts);
-      demands = cloner.Clone(original.demands);
-      capacities = cloner.Clone(original.capacities);
-      transportationCosts = cloner.Clone(original.transportationCosts);
-      expectedRandomQuality = cloner.Clone(original.expectedRandomQuality);
-      evaluator = cloner.Clone(original.evaluator);
+      problemInstance = cloner.Clone(original.problemInstance);
     }
     public GQAPAssignmentArchive()
@@ -172,14 +63,7 @@
       this.solutions = new ItemList<GQAPSolution>();
     }
-    public GQAPAssignmentArchive(StringArray equipmentNames, StringArray locationNames, DoubleMatrix distances, DoubleMatrix weights, DoubleMatrix installationCosts, DoubleArray demands, DoubleArray capacities, DoubleValue transportationCosts, DoubleValue expectedRandomQuality, IGQAPEvaluator evaluator)
+    public GQAPAssignmentArchive(GQAPInstance problemInstance)
       : this() {
-      this.distances = distances;
-      this.weights = weights;
-      this.installationCosts = installationCosts;
-      this.demands = demands;
-      this.capacities = capacities;
-      this.transportationCosts = transportationCosts;
-      this.expectedRandomQuality = expectedRandomQuality;
-      this.evaluator = evaluator;
+      this.problemInstance = problemInstance;
     }
 
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPInstance.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPInstance.cs	(revision 15504)
@@ -0,0 +1,256 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  [Item("GQAP Instance", "Instance of a generalized quadratic assignment problem.")]
+  [StorableClass]
+  public class GQAPInstance : ParameterizedNamedItem {
+    public static readonly string WeightsDescription = "The weights matrix describes the flows between the equipments.";
+    public static readonly string DistancesDescription = "The distances matrix describes the distances between the locations at which the equipment can be installed.";
+    public static readonly string InstallationCostsDescription = "The installation costs matrix describes the installation costs of installing equipment i at location j";
+    public static readonly string DemandsDescription = "The demands vector describes the space requirements of the equipments.";
+    public static readonly string CapacitiesDescription = "The capacities vector describes the available space at the locations.";
+    public static readonly string TransportationCostsDescription = "The transportation cost represents the flow-unit per distance-unit cost factor. This value can also be set to 1 if these costs are factored into the weights matrix already.";
+    public static readonly string EquipmentNamesDescription = "Optional: A list of names that describes the equipments.";
+    public static readonly string LocationNamesDescription = "Optional: A list of names that describes the locations.";
+    public static readonly string PenaltyLevelDescription = "The quality that an infeasible solution cannot surpass.";
+
+
+    #region Parameter Properties
+    [Storable]
+    private ValueParameter<DoubleMatrix> weightsParam;
+    public IValueParameter<DoubleMatrix> WeightsParameter {
+      get { return weightsParam; }
+    }
+    [Storable]
+    private ValueParameter<DoubleMatrix> distancesParam;
+    public IValueParameter<DoubleMatrix> DistancesParameter {
+      get { return distancesParam; }
+    }
+    [Storable]
+    private ValueParameter<DoubleMatrix> installCostsParam;
+    public IValueParameter<DoubleMatrix> InstallationCostsParameter {
+      get { return installCostsParam; }
+    }
+    [Storable]
+    private ValueParameter<DoubleArray> demandsParam;
+    public IValueParameter<DoubleArray> DemandsParameter {
+      get { return demandsParam; }
+    }
+    [Storable]
+    private ValueParameter<DoubleArray> capacitiesParam;
+    public IValueParameter<DoubleArray> CapacitiesParameter {
+      get { return capacitiesParam; }
+    }
+    [Storable]
+    private FixedValueParameter<DoubleValue> transportationCostsParam;
+    public IFixedValueParameter<DoubleValue> TransportationCostsParameter {
+      get { return transportationCostsParam; }
+    }
+    [Storable]
+    private FixedValueParameter<DoubleValue> penaltyLevelParam;
+    public IFixedValueParameter<DoubleValue> PenaltyLevelParameter {
+      get { return penaltyLevelParam; }
+    }
+    [Storable]
+    private OptionalValueParameter<StringArray> equipmentNamesParam;
+    public OptionalValueParameter<StringArray> EquipmentNamesParameter {
+      get { return equipmentNamesParam; }
+    }
+    [Storable]
+    private OptionalValueParameter<StringArray> locationNamesParam;
+    public OptionalValueParameter<StringArray> LocationNamesParameter {
+      get { return locationNamesParam; }
+    }
+    #endregion
+
+    #region Properties
+    public DoubleMatrix Weights {
+      get { return WeightsParameter.Value; }
+      set { WeightsParameter.Value = value; }
+    }
+    public DoubleMatrix Distances {
+      get { return DistancesParameter.Value; }
+      set { DistancesParameter.Value = value; }
+    }
+    public DoubleMatrix InstallationCosts {
+      get { return InstallationCostsParameter.Value; }
+      set { InstallationCostsParameter.Value = value; }
+    }
+    public DoubleArray Demands {
+      get { return DemandsParameter.Value; }
+      set { DemandsParameter.Value = value; }
+    }
+    public DoubleArray Capacities {
+      get { return CapacitiesParameter.Value; }
+      set { CapacitiesParameter.Value = value; }
+    }
+    public double TransportationCosts {
+      get { return TransportationCostsParameter.Value.Value; }
+      set { TransportationCostsParameter.Value.Value = value; }
+    }
+    public double PenaltyLevel {
+      get { return PenaltyLevelParameter.Value.Value; }
+      set { PenaltyLevelParameter.Value.Value = value; }
+    }
+    public StringArray EquipmentNames {
+      get { return EquipmentNamesParameter.Value; }
+      set { EquipmentNamesParameter.Value = value; }
+    }
+    public StringArray LocationNames {
+      get { return LocationNamesParameter.Value; }
+      set { LocationNamesParameter.Value = value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected GQAPInstance(bool deserializing) : base(deserializing) { }
+    protected GQAPInstance(GQAPInstance original, Cloner cloner)
+      : base(original, cloner) {
+      weightsParam = cloner.Clone(original.weightsParam);
+      distancesParam = cloner.Clone(original.distancesParam);
+      installCostsParam = cloner.Clone(original.installCostsParam);
+      transportationCostsParam = cloner.Clone(original.transportationCostsParam);
+      penaltyLevelParam = cloner.Clone(original.penaltyLevelParam);
+      demandsParam = cloner.Clone(original.demandsParam);
+      capacitiesParam = cloner.Clone(original.capacitiesParam);
+      equipmentNamesParam = cloner.Clone(original.equipmentNamesParam);
+      locationNamesParam = cloner.Clone(original.locationNamesParam);
+    }
+    public GQAPInstance() {
+      Parameters.Add(weightsParam = new ValueParameter<DoubleMatrix>("Weights", WeightsDescription, new DoubleMatrix(), false));
+      Parameters.Add(distancesParam = new ValueParameter<DoubleMatrix>("Distances", DistancesDescription, new DoubleMatrix(), false));
+      Parameters.Add(installCostsParam = new ValueParameter<DoubleMatrix>("InstallationCosts", InstallationCostsDescription, new DoubleMatrix(), false));
+      Parameters.Add(transportationCostsParam = new FixedValueParameter<DoubleValue>("TransportationCosts", TransportationCostsDescription, new DoubleValue(1)));
+      Parameters.Add(penaltyLevelParam = new FixedValueParameter<DoubleValue>("PenaltyLevel", PenaltyLevelDescription, new DoubleValue(0), true));
+      Parameters.Add(demandsParam = new ValueParameter<DoubleArray>("Demands", DemandsDescription, new DoubleArray(), false));
+      Parameters.Add(capacitiesParam = new ValueParameter<DoubleArray>("Capacities", CapacitiesDescription, new DoubleArray(), false));
+      Parameters.Add(equipmentNamesParam = new OptionalValueParameter<StringArray>("EquipmentNames", EquipmentNamesDescription, null, false));
+      Parameters.Add(locationNamesParam = new OptionalValueParameter<StringArray>("LocationNames", LocationNamesDescription, null, false));
+
+      weightsParam.ReactOnValueToStringChangedAndValueItemImageChanged = false;
+      distancesParam.ReactOnValueToStringChangedAndValueItemImageChanged = false;
+      installCostsParam.ReactOnValueToStringChangedAndValueItemImageChanged = false;
+      demandsParam.ReactOnValueToStringChangedAndValueItemImageChanged = false;
+      capacitiesParam.ReactOnValueToStringChangedAndValueItemImageChanged = false;
+
+      Weights = new DoubleMatrix(5, 5);
+      Weights[0, 0] = Weights[1, 1] = Weights[2, 2] = Weights[3, 3] = Weights[4, 4] = 0;
+      Weights[0, 1] = Weights[1, 0] = Weights[0, 2] = Weights[2, 0] = Weights[0, 3] = Weights[3, 0] = Weights[0, 4] = Weights[4, 0] = 10;
+      Weights[1, 2] = Weights[2, 1] = Weights[1, 3] = Weights[3, 1] = Weights[1, 4] = Weights[4, 1] = 5;
+      Weights[2, 3] = Weights[3, 2] = Weights[2, 4] = Weights[4, 2] = 7.5;
+      Weights[3, 4] = Weights[4, 3] = 2.5;
+
+      Distances = new DoubleMatrix(3, 3);
+      Distances[0, 0] = Distances[1, 1] = Distances[2, 2] = 0;
+      Distances[0, 1] = Distances[1, 0] = Distances[1, 2] = Distances[2, 1] = 1;
+      Distances[0, 2] = Distances[2, 0] = 2;
+
+      InstallationCosts = new DoubleMatrix(5, 3);
+
+      Demands = new DoubleArray(5);
+      Demands[0] = 2; Demands[1] = 1; Demands[2] = 3; Demands[3] = 1; Demands[4] = 1;
+
+      Capacities = new DoubleArray(3);
+      Capacities[0] = 4; Capacities[1] = 1; Capacities[2] = 4;
+
+      TransportationCosts = 1;
+
+      CalculatePenaltyLevel();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GQAPInstance(this, cloner);
+    }
+
+    public Evaluation Evaluate(IntegerVector assignment) {
+      return EvaluateIntegerVector(assignment, Demands, Capacities,
+        InstallationCosts, Weights, Distances);
+    }
+
+    public static Evaluation EvaluateIntegerVector(IntegerVector assignment,
+      DoubleArray demands, DoubleArray capacities, DoubleMatrix installCosts,
+      DoubleMatrix weights, DoubleMatrix distances) {
+      var flowDistanceQuality = 0.0;
+      var installationQuality = 0.0;
+      var overbookedCapacity = 0.0;
+      int len = assignment.Length;
+      var slack = capacities.ToArray();
+
+      for (int i = 0; i < len; i++) {
+        var assignI = assignment[i];
+        installationQuality += installCosts[i, assignI];
+        for (int j = 0; j < len; j++) {
+          flowDistanceQuality += weights[i, j] * distances[assignI, assignment[j]];
+        }
+        if (slack[assignI] < 0) overbookedCapacity += demands[i];
+        else if (slack[assignI] < demands[i]) overbookedCapacity += (demands[i] - slack[assignI]);
+        slack[assignI] -= demands[i];
+      }
+      return new Evaluation() {
+        ExcessDemand = overbookedCapacity,
+        FlowCosts = flowDistanceQuality,
+        InstallationCosts = installationQuality,
+        Slack = slack
+      };
+    }
+
+    public double ToSingleObjective(Evaluation fitness) {
+      return fitness.IsFeasible
+        ? fitness.InstallationCosts + TransportationCosts * fitness.FlowCosts
+        : PenaltyLevel + fitness.ExcessDemand;
+    }
+
+    public double[] ToMultiObjectiveStrict(Evaluation fitness) {
+      return fitness.IsFeasible
+        ? new double[] { fitness.InstallationCosts, TransportationCosts * fitness.FlowCosts }
+        : new double[] { PenaltyLevel + fitness.ExcessDemand, PenaltyLevel + fitness.ExcessDemand };
+    }
+
+    public double[] ToMultiObjectiveRelaxed(Evaluation fitness) {
+      return new double[] {
+        fitness.InstallationCosts,
+        TransportationCosts * fitness.FlowCosts,
+        fitness.ExcessDemand };
+    }
+
+    public bool IsValid() {
+      return Weights != null && Distances != null && Demands != null && Capacities != null && InstallationCosts != null
+        && Weights.Rows == Weights.Columns && Weights.Rows == InstallationCosts.Rows
+        && Distances.Rows == Distances.Columns && Distances.Rows == InstallationCosts.Columns
+        && Demands.Length == Weights.Rows && Capacities.Length == Distances.Rows;
+    }
+
+    public void CalculatePenaltyLevel() {
+      var flowQuality = Distances.Max() * Weights.Max() * Demands.Length * Demands.Length;
+      var installQuality = InstallationCosts.Max() * Demands.Length;
+      PenaltyLevel = installQuality + TransportationCosts * flowQuality;
+    }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPSolution.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPSolution.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPSolution.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -23,5 +23,4 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -44,44 +43,11 @@
 
     [Storable]
-    private DoubleValue quality;
-    public DoubleValue Quality {
-      get { return quality; }
+    private Evaluation evaluation;
+    public Evaluation Evaluation {
+      get { return evaluation; }
       set {
-        bool changed = (quality != value);
-        quality = value;
-        if (changed) OnPropertyChanged("Quality");
-      }
-    }
-
-    [Storable]
-    private DoubleValue flowDistanceQuality;
-    public DoubleValue FlowDistanceQuality {
-      get { return flowDistanceQuality; }
-      set {
-        bool changed = (flowDistanceQuality != value);
-        flowDistanceQuality = value;
-        if (changed) OnPropertyChanged("FlowDistanceQuality");
-      }
-    }
-
-    [Storable]
-    private DoubleValue installationQuality;
-    public DoubleValue InstallationQuality {
-      get { return installationQuality; }
-      set {
-        bool changed = (installationQuality != value);
-        installationQuality = value;
-        if (changed) OnPropertyChanged("InstallationQuality");
-      }
-    }
-
-    [Storable]
-    private DoubleValue overbookedCapacity;
-    public DoubleValue OverbookedCapacity {
-      get { return overbookedCapacity; }
-      set {
-        bool changed = (overbookedCapacity != value);
-        overbookedCapacity = value;
-        if (changed) OnPropertyChanged("OverbookedCapacity");
+        if (evaluation == value) return;
+        evaluation = value;
+        OnPropertyChanged(nameof(Evaluation));
       }
     }
@@ -92,16 +58,10 @@
       : base(original, cloner) {
       assignment = cloner.Clone(original.assignment);
-      quality = cloner.Clone(original.quality);
-      flowDistanceQuality = cloner.Clone(original.flowDistanceQuality);
-      installationQuality = cloner.Clone(original.installationQuality);
-      overbookedCapacity = cloner.Clone(original.overbookedCapacity);
+      evaluation = cloner.Clone(original.evaluation);
     }
-    public GQAPSolution(IntegerVector assignment, DoubleValue quality, DoubleValue flowDistanceQuality, DoubleValue installationQuality, DoubleValue overbookedCapacity)
+    public GQAPSolution(IntegerVector assignment, Evaluation evaluation)
       : base() {
       this.assignment = assignment;
-      this.quality = quality;
-      this.flowDistanceQuality = flowDistanceQuality;
-      this.installationQuality = installationQuality;
-      this.overbookedCapacity = overbookedCapacity;
+      this.evaluation = evaluation;
     }
 
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs	(revision 15503)
+++ 	(revision )
@@ -1,617 +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;
-using System.Drawing;
-using System.Linq;
-using HeuristicLab.Analysis.QualityAnalysis;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.PluginInfrastructure;
-using HeuristicLab.Problems.Instances;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  [Item("Generalized Quadratic Assignment Problem (GQAP)", "The Generalized Quadratic Assignment Problem (GQAP) is a generalization of the QAP in that it allows to assign multiple facilities (here called equipment) to a single location. The problem is described in Lee, C.G., and Ma, Z. 2003. The Generalized Quadratic Assignment Problem. Technical Report M5S 3G8, University of Toronto, Canada.")]
-  [Creatable("Problems")]
-  [StorableClass]
-  public sealed class GeneralizedQuadraticAssignmentProblem : SingleObjectiveHeuristicOptimizationProblem<IGQAPEvaluator, IGQAPSolutionCreator>, IStorableContent,
-    IProblemInstanceConsumer<QAPData>,
-    IProblemInstanceConsumer<CTAPData>,
-    IProblemInstanceConsumer<TSPData>,
-    IProblemInstanceConsumer<ATSPData>,
-    IProblemInstanceConsumer<GQAPData> {
-
-    public override Image ItemImage {
-      get { return HeuristicLab.Common.Resources.VSImageLibrary.Type; }
-    }
-
-    public string Filename { get; set; }
-
-    #region Parameter Descriptions
-    public static readonly string MaximizationDescription = "False if the fitness function should be minimized (default) or otherwise True if it should be maximized.";
-    public static readonly string WeightsDescription = "The weights matrix describes the flows between the equipments.";
-    public static readonly string DistancesDescription = "The distances matrix describes the distances between the locations at which the equipment can be installed.";
-    public static readonly string InstallationCostsDescription = "The installation costs matrix describes the installation costs of installing equipment i at location j";
-    public static readonly string DemandsDescription = "The demands vector describes the space requirements of the equipments.";
-    public static readonly string CapacitiesDescription = "The capacities vector describes the available space at the locations.";
-    public static readonly string TransportationCostsDescription = "The transportation cost represents the flow-unit per distance-unit cost factor. This value can also be set to 1 if these costs are factored into the weights matrix already.";
-    public static readonly string BestKnownQualityDescription = "The best known quality (if available).";
-    public static readonly string BestKnownSolutionDescription = "The best known solution (if available).";
-    public static readonly string BestKnownSolutionsDescription = "Contains an archive of best-known solutions regarding flow-distance quality and installation quality.";
-    public static readonly string EquipmentNamesDescription = "Optional: A list of names that describes the equipments.";
-    public static readonly string LocationNamesDescription = "Optional: A list of names that describes the locations.";
-    public static readonly string ExpectedRandomQualityDescription = "The expected quality value of a random solution.";
-    #endregion
-
-    #region Parameter Properties
-    public ValueParameter<DoubleMatrix> WeightsParameter {
-      get { return (ValueParameter<DoubleMatrix>)Parameters["Weights"]; }
-    }
-    public ValueParameter<DoubleMatrix> DistancesParameter {
-      get { return (ValueParameter<DoubleMatrix>)Parameters["Distances"]; }
-    }
-    public ValueParameter<DoubleMatrix> InstallationCostsParameter {
-      get { return (ValueParameter<DoubleMatrix>)Parameters["InstallationCosts"]; }
-    }
-    public ValueParameter<DoubleArray> DemandsParameter {
-      get { return (ValueParameter<DoubleArray>)Parameters["Demands"]; }
-    }
-    public ValueParameter<DoubleArray> CapacitiesParameter {
-      get { return (ValueParameter<DoubleArray>)Parameters["Capacities"]; }
-    }
-    public FixedValueParameter<DoubleValue> TransportationCostsParameter {
-      get { return (FixedValueParameter<DoubleValue>)Parameters["TransportationCosts"]; }
-    }
-    public FixedValueParameter<DoubleValue> ExpectedRandomQualityParameter {
-      get { return (FixedValueParameter<DoubleValue>)Parameters["ExpectedRandomQuality"]; }
-    }
-    public OptionalValueParameter<GQAPAssignment> BestKnownSolutionParameter {
-      get { return (OptionalValueParameter<GQAPAssignment>)Parameters["BestKnownSolution"]; }
-    }
-    public OptionalValueParameter<GQAPAssignmentArchive> BestKnownSolutionsParameter {
-      get { return (OptionalValueParameter<GQAPAssignmentArchive>)Parameters["BestKnownSolutions"]; }
-    }
-    public OptionalValueParameter<StringArray> EquipmentNamesParameter {
-      get { return (OptionalValueParameter<StringArray>)Parameters["EquipmentNames"]; }
-    }
-    public OptionalValueParameter<StringArray> LocationNamesParameter {
-      get { return (OptionalValueParameter<StringArray>)Parameters["LocationNames"]; }
-    }
-    #endregion
-
-    #region Properties
-    public DoubleMatrix Weights {
-      get { return WeightsParameter.Value; }
-      set { WeightsParameter.Value = value; }
-    }
-    public DoubleMatrix Distances {
-      get { return DistancesParameter.Value; }
-      set { DistancesParameter.Value = value; }
-    }
-    public DoubleMatrix InstallationCosts {
-      get { return InstallationCostsParameter.Value; }
-      set { InstallationCostsParameter.Value = value; }
-    }
-    public DoubleArray Demands {
-      get { return DemandsParameter.Value; }
-      set { DemandsParameter.Value = value; }
-    }
-    public DoubleArray Capacities {
-      get { return CapacitiesParameter.Value; }
-      set { CapacitiesParameter.Value = value; }
-    }
-    public double TransportationCosts {
-      get { return TransportationCostsParameter.Value.Value; }
-      set { TransportationCostsParameter.Value.Value = value; }
-    }
-    public double ExpectedRandomQuality {
-      get { return ExpectedRandomQualityParameter.Value.Value; }
-      set { ExpectedRandomQualityParameter.Value.Value = value; }
-    }
-    public StringArray EquipmentNames {
-      get { return EquipmentNamesParameter.Value; }
-      set { EquipmentNamesParameter.Value = value; }
-    }
-    public StringArray LocationNames {
-      get { return LocationNamesParameter.Value; }
-      set { LocationNamesParameter.Value = value; }
-    }
-    public GQAPAssignment BestKnownSolution {
-      get { return BestKnownSolutionParameter.Value; }
-      set { BestKnownSolutionParameter.Value = value; }
-    }
-    public GQAPAssignmentArchive BestKnownSolutions {
-      get { return BestKnownSolutionsParameter.Value; }
-      set { BestKnownSolutionsParameter.Value = value; }
-    }
-    #endregion
-
-    public BestGQAPSolutionAnalyzer BestSolutionAnalyzer {
-      get { return Operators.OfType<BestGQAPSolutionAnalyzer>().FirstOrDefault(); }
-    }
-    public GQAPSolutionArchiveAnalyzer SolutionArchiveAnalyzer {
-      get { return Operators.OfType<GQAPSolutionArchiveAnalyzer>().FirstOrDefault(); }
-    }
-
-    [StorableConstructor]
-    private GeneralizedQuadraticAssignmentProblem(bool deserializing) : base(deserializing) { }
-    private GeneralizedQuadraticAssignmentProblem(GeneralizedQuadraticAssignmentProblem original, Cloner cloner)
-      : base(original, cloner) {
-      RegisterEventHandlers();
-    }
-    public GeneralizedQuadraticAssignmentProblem()
-      : base(new GQAPAdditivePenaltyEvaluator(), new RandomSolutionCreator()) {
-      Parameters.Add(new ValueParameter<DoubleMatrix>("Weights", WeightsDescription, new DoubleMatrix(), false));
-      Parameters.Add(new ValueParameter<DoubleMatrix>("Distances", DistancesDescription, new DoubleMatrix(), false));
-      Parameters.Add(new ValueParameter<DoubleMatrix>("InstallationCosts", InstallationCostsDescription, new DoubleMatrix(), false));
-      Parameters.Add(new FixedValueParameter<DoubleValue>("TransportationCosts", TransportationCostsDescription, new DoubleValue(1)));
-      Parameters.Add(new FixedValueParameter<DoubleValue>("ExpectedRandomQuality", ExpectedRandomQualityDescription, new DoubleValue(0), true));
-      Parameters.Add(new ValueParameter<DoubleArray>("Demands", DemandsDescription, new DoubleArray(), false));
-      Parameters.Add(new ValueParameter<DoubleArray>("Capacities", CapacitiesDescription, new DoubleArray(), false));
-      Parameters.Add(new OptionalValueParameter<GQAPAssignment>("BestKnownSolution", BestKnownSolutionDescription, null, false));
-      Parameters.Add(new OptionalValueParameter<GQAPAssignmentArchive>("BestKnownSolutions", BestKnownSolutionsDescription, null, false));
-      Parameters.Add(new OptionalValueParameter<StringArray>("EquipmentNames", EquipmentNamesDescription, null, false));
-      Parameters.Add(new OptionalValueParameter<StringArray>("LocationNames", LocationNamesDescription, null, false));
-
-      WeightsParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
-      DistancesParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
-      InstallationCostsParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
-      DemandsParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
-      CapacitiesParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
-
-      Weights = new DoubleMatrix(5, 5);
-      Weights[0, 0] = Weights[1, 1] = Weights[2, 2] = Weights[3, 3] = Weights[4, 4] = 0;
-      Weights[0, 1] = Weights[1, 0] = Weights[0, 2] = Weights[2, 0] = Weights[0, 3] = Weights[3, 0] = Weights[0, 4] = Weights[4, 0] = 10;
-      Weights[1, 2] = Weights[2, 1] = Weights[1, 3] = Weights[3, 1] = Weights[1, 4] = Weights[4, 1] = 5;
-      Weights[2, 3] = Weights[3, 2] = Weights[2, 4] = Weights[4, 2] = 7.5;
-      Weights[3, 4] = Weights[4, 3] = 2.5;
-
-      Distances = new DoubleMatrix(3, 3);
-      Distances[0, 0] = Distances[1, 1] = Distances[2, 2] = 0;
-      Distances[0, 1] = Distances[1, 0] = Distances[1, 2] = Distances[2, 1] = 1;
-      Distances[0, 2] = Distances[2, 0] = 2;
-
-      InstallationCosts = new DoubleMatrix(5, 3);
-
-      Demands = new DoubleArray(5);
-      Demands[0] = 2; Demands[1] = 1; Demands[2] = 3; Demands[3] = 1; Demands[4] = 1;
-
-      Capacities = new DoubleArray(3);
-      Capacities[0] = 4; Capacities[1] = 1; Capacities[2] = 4;
-
-      SolutionCreator.AssignmentParameter.ActualName = "Assignment";
-
-      InitializeOperators();
-      RegisterEventHandlers();
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new GeneralizedQuadraticAssignmentProblem(this, cloner);
-    }
-
-    #region Problem Instance Loading
-    public void Load(QAPData data) {
-      Name = data.Name;
-      Description = data.Description;
-
-      var weights = new DoubleMatrix(data.Weights);
-      var distances = new DoubleMatrix(data.Distances);
-      var installationCosts = new DoubleMatrix(weights.Rows, distances.Columns); // all zero
-      var capacities = new DoubleArray(Enumerable.Range(0, distances.Rows).Select(x => 1.0).ToArray());
-      var demands = new DoubleArray(Enumerable.Range(0, weights.Rows).Select(x => 1.0).ToArray());
-
-      Load(demands, capacities, weights, distances, installationCosts, new DoubleValue(1));
-      EvaluateAndLoadAssignment(data.BestKnownAssignment);
-    }
-
-    public void Load(CTAPData data) {
-      Name = data.Name;
-      Description = data.Description;
-
-      var capacities = new DoubleArray(data.MemoryCapacities);
-      var demands = new DoubleArray(data.MemoryRequirements);
-      var weights = new DoubleMatrix(data.CommunicationCosts);
-      var installationCosts = new DoubleMatrix(data.ExecutionCosts.Transpose());
-      var distances = new DoubleMatrix(capacities.Length, capacities.Length);
-      for (int i = 0; i < capacities.Length - 1; i++)
-        for (int j = i + 1; j < capacities.Length; j++) {
-          distances[i, j] = 1;
-        }
-
-      Load(demands, capacities, weights, distances, installationCosts, new DoubleValue(1));
-      EvaluateAndLoadAssignment(data.BestKnownAssignment);
-    }
-
-    public void Load(TSPData data) {
-      if (data.Dimension > 1000)
-        throw new System.IO.InvalidDataException("Instances with more than 1000 cities are not supported.");
-
-      Name = data.Name;
-      Description = data.Description;
-
-      var capacities = new DoubleArray(data.Dimension);
-      var demands = new DoubleArray(data.Dimension);
-      for (int i = 0; i < data.Dimension; i++) {
-        capacities[i] = 1;
-        demands[i] = 1;
-      }
-      var installationCosts = new DoubleMatrix(data.Dimension, data.Dimension);
-      var weights = new DoubleMatrix(data.Dimension, data.Dimension);
-      for (int i = 0; i < data.Dimension; i++)
-        weights[i, (i + 1) % data.Dimension] = 1;
-      var distances = new DoubleMatrix(data.GetDistanceMatrix());
-
-      Load(demands, capacities, weights, distances, installationCosts, new DoubleValue(1));
-      EvaluateAndLoadAssignment(data.BestKnownTour);
-    }
-
-    public void Load(ATSPData data) {
-      Name = data.Name;
-      Description = data.Description;
-
-      var capacities = new DoubleArray(data.Dimension);
-      var demands = new DoubleArray(data.Dimension);
-      for (int i = 0; i < data.Dimension; i++) {
-        capacities[i] = 1;
-        demands[i] = 1;
-      }
-      var installationCosts = new DoubleMatrix(data.Dimension, data.Dimension);
-      var weights = new DoubleMatrix(data.Dimension, data.Dimension);
-      for (int i = 0; i < data.Dimension; i++)
-        weights[i, (i + 1) % data.Dimension] = 1;
-      var distances = new DoubleMatrix(data.Distances);
-
-      Load(demands, capacities, weights, distances, installationCosts, new DoubleValue(1));
-      EvaluateAndLoadAssignment(data.BestKnownTour);
-    }
-
-    public void Load(GQAPData data) {
-      Name = data.Name;
-      Description = data.Description;
-
-      var capacities = new DoubleArray(data.Capacities);
-      var demands = new DoubleArray(data.Demands);
-      var installationCosts = new DoubleMatrix(data.InstallationCosts);
-      var weights = new DoubleMatrix(data.Weights);
-      var distances = new DoubleMatrix(data.Distances);
-      var transportationCosts = new DoubleValue(data.TransportationCosts);
-
-      Load(demands, capacities, weights, distances, installationCosts, transportationCosts);
-      EvaluateAndLoadAssignment(data.BestKnownAssignment);
-
-      if (data.BestKnownAssignment == null && data.BestKnownQuality.HasValue) {
-        BestKnownQuality = new DoubleValue(data.BestKnownQuality.Value);
-      }
-    }
-
-    public void Load(DoubleArray demands, DoubleArray capacities,
-      DoubleMatrix weights, DoubleMatrix distances, DoubleMatrix installationCosts,
-      DoubleValue transportationCosts) {
-      if (weights == null || weights.Rows == 0)
-        throw new System.IO.InvalidDataException(
-@"The given instance does not contain weights!");
-      if (weights.Rows != weights.Columns)
-        throw new System.IO.InvalidDataException(
-@"The weights matrix of the given instance contains
-an unequal number of rows and columns.");
-      Weights = weights;
-
-      if (distances == null || distances.Rows == 0)
-        throw new System.IO.InvalidDataException(
-@"The given instance does not contain distances!");
-      if (distances.Rows != distances.Columns)
-        throw new System.IO.InvalidDataException(
-@"The distances matrix of the given instance contains
-an unequal number of rows and columns.");
-      Distances = distances;
-
-      if (installationCosts == null || installationCosts.Rows == 0)
-        throw new System.IO.InvalidDataException(
-@"The given instance does not contain installation costs!");
-      if (installationCosts.Rows != weights.Rows
-        || installationCosts.Columns != distances.Columns)
-        throw new System.IO.InvalidDataException(
-@"The installation costs matrix of the given instance
-contains different number of rows than given in the
-weights matrix and a different number of columns than
-given in the distances matrix.");
-      InstallationCosts = installationCosts;
-
-      if (capacities == null || capacities.Length == 0)
-        throw new System.IO.InvalidDataException(
-@"The given instance does not contain capacities!");
-      if (capacities.Length != distances.Rows)
-        throw new System.IO.InvalidDataException(
-@"The given instance contains a different number of
-capacities than rows given in the distances matrix.");
-      Capacities = capacities;
-
-      if (demands == null || demands.Length == 0)
-        throw new System.IO.InvalidDataException(
-@"The given instance does not contain demands!");
-      if (demands.Length != weights.Rows)
-        throw new System.IO.InvalidDataException(
-@"The given instance contains a different number of
-demands than rows given in the weights matrix.");
-      Demands = demands;
-
-      if (transportationCosts == null)
-        throw new System.IO.InvalidDataException(
-@"The given instance does not contain transportation costs.");
-      TransportationCosts = transportationCosts.Value;
-
-      BestKnownQuality = null;
-      BestKnownSolution = null;
-      BestKnownSolutions = null;
-      CalculateExpectedRandomQuality();
-    }
-
-    private void CalculateExpectedRandomQuality() {
-      if (IsConfigurationValid()) {
-        double[] avgDistances = new double[Capacities.Length];
-        for (int i = 0; i < Capacities.Length; i++) {
-          for (int j = 0; j < Capacities.Length; j++)
-            avgDistances[i] += Distances[i, j];
-          avgDistances[i] /= Capacities.Length;
-        }
-        double[] avgWeight = new double[Demands.Length];
-        for (int i = 0; i < Demands.Length; i++) {
-          for (int j = 0; j < Demands.Length; j++)
-            avgWeight[i] += Weights[i, j];
-          avgWeight[i] /= Demands.Length;
-        }
-        double avgCosts = InstallationCosts.Average();
-        double quality = 0;
-        for (int i = 0; i < Demands.Length; i++) {
-          double equipmentInfluence = 0;
-          for (int j = 0; j < Capacities.Length; j++)
-            equipmentInfluence += avgWeight[i] * avgDistances[j];
-          quality += equipmentInfluence * Demands.Length / (double)Capacities.Length;
-        }
-        quality *= TransportationCosts;
-        quality += avgCosts * Demands.Length;
-
-        ExpectedRandomQuality = quality;
-      }
-    }
-    private void EvaluateAndLoadAssignment(int[] vector) {
-      if (vector == null || vector.Length == 0) return;
-      EvaluateAndLoadAssignment(new IntegerVector(vector));
-    }
-    public void EvaluateAndLoadAssignment(IntegerVector assignment) {
-      if (!IsConfigurationValid()) {
-        BestKnownQuality = null;
-        BestKnownSolution = null;
-        BestKnownSolutions = null;
-      }
-      double flowDistanceQuality, installationQuality, overbookedCapacity;
-      Evaluator.Evaluate(assignment, Weights, Distances, InstallationCosts, Demands, Capacities,
-        out flowDistanceQuality, out installationQuality, out overbookedCapacity);
-      double quality = Evaluator.GetFitness(flowDistanceQuality, installationQuality, overbookedCapacity, TransportationCosts, ExpectedRandomQuality);
-      BestKnownSolution = new GQAPAssignment((IntegerVector)assignment.Clone(), new DoubleValue(quality),
-        new DoubleValue(flowDistanceQuality), new DoubleValue(installationQuality),
-        new DoubleValue(overbookedCapacity), EquipmentNames, LocationNames, Distances, Weights, InstallationCosts,
-        Demands, Capacities, new DoubleValue(TransportationCosts), new DoubleValue(ExpectedRandomQuality), Evaluator);
-      BestKnownQuality = new DoubleValue(quality);
-      BestKnownSolutions = new GQAPAssignmentArchive(EquipmentNames, LocationNames, Distances, Weights, InstallationCosts, Demands, Capacities, new DoubleValue(TransportationCosts), new DoubleValue(ExpectedRandomQuality), Evaluator);
-      BestKnownSolutions.Solutions.Add(new GQAPSolution((IntegerVector)assignment.Clone(), new DoubleValue(quality), new DoubleValue(flowDistanceQuality), new DoubleValue(installationQuality), new DoubleValue(overbookedCapacity)));
-    }
-    #endregion
-
-    #region Events
-    protected override void OnOperatorsChanged() {
-      base.OnOperatorsChanged();
-      Parameterize();
-    }
-    protected override void OnEvaluatorChanged() {
-      base.OnEvaluatorChanged();
-      Parameterize();
-      if (BestKnownSolution != null) EvaluateAndLoadAssignment(BestKnownSolution.Assignment);
-      Evaluator.QualityParameter.ActualNameChanged += new System.EventHandler(Evaluator_QualityParameter_ActualNameChanged);
-    }
-    protected override void OnSolutionCreatorChanged() {
-      base.OnSolutionCreatorChanged();
-      Parameterize();
-      SolutionCreator.AssignmentParameter.ActualNameChanged += new EventHandler(SolutionCreator_IntegerVectorParameter_ActualNameChanged);
-    }
-
-    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
-      Parameterize();
-    }
-    private void SolutionCreator_IntegerVectorParameter_ActualNameChanged(object sender, EventArgs e) {
-      Parameterize();
-    }
-    #endregion
-
-    #region Helpers
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      RegisterEventHandlers();
-    }
-
-    private void RegisterEventHandlers() {
-      Evaluator.QualityParameter.ActualNameChanged += new System.EventHandler(Evaluator_QualityParameter_ActualNameChanged);
-      SolutionCreator.AssignmentParameter.ActualNameChanged += new EventHandler(SolutionCreator_IntegerVectorParameter_ActualNameChanged);
-    }
-
-    private void InitializeOperators() {
-      Operators.Clear();
-      Operators.AddRange(ApplicationManager.Manager.GetInstances<IGQAPOperator>());
-      Operators.AddRange(ApplicationManager.Manager.GetInstances<IIntegerVectorOperator>());
-      Operators.RemoveAll(x => x is ISingleObjectiveMoveEvaluator);
-      Operators.AddRange(ApplicationManager.Manager.GetInstances<IGQAPMoveEvaluator>());
-      Operators.Add(new ScaledQualityDifferenceAnalyzer());
-      Parameterize();
-    }
-
-    private void Parameterize() {
-
-      var operators = Operators.Union(new IOperator[] { SolutionCreator, Evaluator }).ToArray();
-
-      foreach (var op in operators.OfType<IAssignmentAwareGQAPOperator>()) {
-        op.AssignmentParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
-        op.AssignmentParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IBestKnownQualityAwareGQAPOperator>()) {
-        op.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
-        op.BestKnownQualityParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IBestKnownSolutionAwareGQAPOperator>()) {
-        op.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
-        op.BestKnownSolutionParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IBestKnownSolutionsAwareGQAPOperator>()) {
-        op.BestKnownSolutionsParameter.ActualName = BestKnownSolutionsParameter.Name;
-        op.BestKnownSolutionsParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<ICapacitiesAwareGQAPOperator>()) {
-        op.CapacitiesParameter.ActualName = CapacitiesParameter.Name;
-        op.CapacitiesParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IDemandsAwareGQAPOperator>()) {
-        op.DemandsParameter.ActualName = DemandsParameter.Name;
-        op.DemandsParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IDistancesAwareGQAPOperator>()) {
-        op.DistancesParameter.ActualName = DistancesParameter.Name;
-        op.DistancesParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IEquipmentNamesAwareGQAPOperator>()) {
-        op.EquipmentNamesParameter.ActualName = EquipmentNamesParameter.Name;
-        op.EquipmentNamesParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IGQAPCrossover>()) {
-        op.ParentsParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
-        op.ParentsParameter.Hidden = true;
-        op.ChildParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
-        op.ChildParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IInstallationCostsAwareGQAPOperator>()) {
-        op.InstallationCostsParameter.ActualName = InstallationCostsParameter.Name;
-        op.InstallationCostsParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<ILocationNamesAwareGQAPOperator>()) {
-        op.LocationNamesParameter.ActualName = LocationNamesParameter.Name;
-        op.LocationNamesParameter.Hidden = true;
-      }
-      var moveEvaluator = operators.OfType<IGQAPMoveEvaluator>().FirstOrDefault();
-      foreach (var op in operators.OfType<IGQAPMoveEvaluator>()) { // synchronize all move evaluators
-        if (moveEvaluator != null) {
-          op.MoveQualityParameter.ActualName = moveEvaluator.MoveQualityParameter.ActualName;
-          op.MoveQualityParameter.Hidden = true;
-          op.MoveFlowDistanceQualityParameter.ActualName = moveEvaluator.MoveFlowDistanceQualityParameter.ActualName;
-          op.MoveFlowDistanceQualityParameter.Hidden = true;
-          op.MoveInstallationQualityParameter.ActualName = moveEvaluator.MoveInstallationQualityParameter.ActualName;
-          op.MoveInstallationQualityParameter.Hidden = true;
-          op.MoveOverbookedCapacityParameter.ActualName = moveEvaluator.MoveOverbookedCapacityParameter.ActualName;
-          op.MoveOverbookedCapacityParameter.Hidden = true;
-        }
-      }
-      foreach (var op in operators.OfType<IMoveQualityAwareGQAPOperator>()) {
-        if (moveEvaluator != null) {
-          op.MoveQualityParameter.ActualName = moveEvaluator.MoveQualityParameter.ActualName;
-          op.MoveQualityParameter.Hidden = true;
-          op.MoveFlowDistanceQualityParameter.ActualName = moveEvaluator.MoveFlowDistanceQualityParameter.ActualName;
-          op.MoveFlowDistanceQualityParameter.Hidden = true;
-          op.MoveInstallationQualityParameter.ActualName = moveEvaluator.MoveInstallationQualityParameter.ActualName;
-          op.MoveInstallationQualityParameter.Hidden = true;
-          op.MoveOverbookedCapacityParameter.ActualName = moveEvaluator.MoveOverbookedCapacityParameter.ActualName;
-          op.MoveOverbookedCapacityParameter.Hidden = true;
-        }
-        op.MaximizationParameter.ActualName = MaximizationParameter.Name;
-        op.MaximizationParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IExpectedRandomQualityAwareGQAPOperator>()) {
-        op.ExpectedRandomQualityParameter.ActualName = ExpectedRandomQualityParameter.Name;
-        op.ExpectedRandomQualityParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IQualitiesAwareGQAPOperator>()) {
-        op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
-        op.QualityParameter.Hidden = true;
-        op.FlowDistanceQualityParameter.ActualName = Evaluator.FlowDistanceQualityParameter.ActualName;
-        op.FlowDistanceQualityParameter.Hidden = true;
-        op.InstallationQualityParameter.ActualName = Evaluator.InstallationQualityParameter.ActualName;
-        op.InstallationQualityParameter.Hidden = true;
-        op.OverbookedCapacityParameter.ActualName = Evaluator.OverbookedCapacityParameter.ActualName;
-        op.OverbookedCapacityParameter.Hidden = true;
-        op.MaximizationParameter.ActualName = MaximizationParameter.Name;
-        op.MaximizationParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IQualityAwareGQAPOperator>()) {
-        op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
-        op.QualityParameter.Hidden = true;
-        op.FlowDistanceQualityParameter.ActualName = Evaluator.FlowDistanceQualityParameter.ActualName;
-        op.FlowDistanceQualityParameter.Hidden = true;
-        op.InstallationQualityParameter.ActualName = Evaluator.InstallationQualityParameter.ActualName;
-        op.InstallationQualityParameter.Hidden = true;
-        op.OverbookedCapacityParameter.ActualName = Evaluator.OverbookedCapacityParameter.ActualName;
-        op.OverbookedCapacityParameter.Hidden = true;
-        op.MaximizationParameter.ActualName = MaximizationParameter.Name;
-        op.MaximizationParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<ITransportationCostsAwareGQAPOperator>()) {
-        op.TransportationCostsParameter.ActualName = TransportationCostsParameter.Name;
-        op.TransportationCostsParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IWeightsAwareGQAPOperator>()) {
-        op.WeightsParameter.ActualName = WeightsParameter.Name;
-        op.WeightsParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IEvaluatorAwareGQAPOperator>()) {
-        op.EvaluatorParameter.ActualName = EvaluatorParameter.Name;
-        op.EvaluatorParameter.Hidden = true;
-      }
-
-      foreach (var op in operators.OfType<IIntegerVectorCrossover>()) {
-        op.ParentsParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
-        op.ParentsParameter.Hidden = true;
-        op.ChildParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
-        op.ChildParameter.Hidden = true;
-      }
-      foreach (var op in operators.OfType<IIntegerVectorManipulator>()) {
-        op.IntegerVectorParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
-        op.IntegerVectorParameter.Hidden = true;
-      }
-
-      foreach (var op in operators.OfType<ScaledQualityDifferenceAnalyzer>()) {
-        op.MinimumQualityParameter.ActualName = BestKnownQualityParameter.Name;
-        op.MinimumQualityParameter.Hidden = true;
-        op.MaximumQualityParameter.ActualName = ExpectedRandomQualityParameter.Name;
-        op.MaximumQualityParameter.Hidden = true;
-        op.QualityParameter.ActualName = "BestQuality";
-        op.QualityParameter.Hidden = true;
-      }
-    }
-    #endregion
-
-    public bool IsConfigurationValid() {
-      return Weights != null && Distances != null && Demands != null && Capacities != null && InstallationCosts != null
-        && Weights.Rows == Weights.Columns && Weights.Rows == InstallationCosts.Rows
-        && Distances.Rows == Distances.Columns && Distances.Rows == InstallationCosts.Columns
-        && Demands.Length == Weights.Rows && Capacities.Length == Distances.Rows;
-    }
-  }
-}
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 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/HeuristicLab.Problems.GeneralizedQuadraticAssignment-3.3.csproj	(revision 15504)
@@ -98,13 +98,8 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="Analyzers\BestGQAPSolutionAnalyzer.cs" />
-    <Compile Include="Analyzers\GQAPSolutionArchiveUpdater.cs" />
-    <Compile Include="Analyzers\GQAPPopulationDiversityAnalyzer.cs" />
-    <Compile Include="Analyzers\GQAPSolutionArchiveAnalyzer.cs" />
-    <Compile Include="Evaluators\GQAPPenaltyLevelEvaluator.cs" />
-    <Compile Include="Evaluators\GQAPEvaluator.cs" />
-    <Compile Include="Evaluators\GQAPNMoveEvaluator.cs" />
+    <Compile Include="Evaluation\Evaluation.cs" />
+    <Compile Include="Evaluation\GQAPNMoveEvaluator.cs" />
     <Compile Include="GQAPAssignment.cs" />
-    <Compile Include="Interfaces\IEvaluatorAwareGQAPOperator.cs" />
+    <Compile Include="GQAPInstance.cs" />
     <Compile Include="Operators\Crossovers\CordeauCrossover.cs" />
     <Compile Include="SolutionCreators\SlackMinimizationSolutionCreator.cs" />
@@ -113,37 +108,24 @@
     <Compile Include="SolutionCreators\GQAPStochasticSolutionCreator.cs" />
     <Compile Include="SolutionCreators\GreedyRandomizedSolutionCreator.cs" />
-    <Compile Include="SolutionCreators\RandomSolutionCreator.cs" />
     <None Include="Plugin.cs.frame" />
-    <Compile Include="Evaluators\GQAPAdditivePenaltyEvaluator.cs" />
-    <Compile Include="GeneralizedQuadraticAssignmentProblem.cs" />
+    <Compile Include="GQAP.cs" />
     <Compile Include="GQAPAssignmentArchive.cs" />
     <Compile Include="GQAPSolution.cs" />
-    <Compile Include="Interfaces\IBestKnownSolutionsAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IGQAPManipulator.cs" />
-    <Compile Include="Interfaces\IQualitiesAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IAssignmentsAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IBestKnownQualityAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IBestKnownSolutionAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\ILocationNamesAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IEquipmentNamesAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IMoveQualityAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IGQAPEvaluator.cs" />
-    <Compile Include="Interfaces\IQualityAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IExpectedRandomQualityAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\ITransportationCostsAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IInstallationCostsAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IDistancesAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IWeightsAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IAssignmentAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IGQAPNMoveEvaluator.cs" />
-    <Compile Include="Interfaces\IDemandsAwareGQAPOperator.cs" />
-    <Compile Include="Interfaces\IGQAPCrossover.cs" />
-    <Compile Include="Interfaces\IGQAPLocalImprovementOperator.cs" />
-    <Compile Include="Interfaces\IGQAPMoveEvaluator.cs" />
-    <Compile Include="Interfaces\IGQAPMoveOperator.cs" />
-    <Compile Include="Interfaces\IGQAPNMoveOperator.cs" />
-    <Compile Include="Interfaces\IGQAPOperator.cs" />
-    <Compile Include="Interfaces\IGQAPSolutionCreator.cs" />
-    <Compile Include="Interfaces\ICapacitiesAwareGQAPOperator.cs" />
+    <Compile Include="Interfaces\Parameter\IBestKnownSolutionsAwareGQAPOperator.cs" />
+    <Compile Include="Interfaces\Operator\IGQAPManipulator.cs" />
+    <Compile Include="Interfaces\Parameter\IQualitiesAwareGQAPOperator.cs" />
+    <Compile Include="Interfaces\Parameter\IBestKnownQualityAwareGQAPOperator.cs" />
+    <Compile Include="Interfaces\Parameter\IBestKnownSolutionAwareGQAPOperator.cs" />
+    <Compile Include="Interfaces\Parameter\IMoveQualityAwareGQAPOperator.cs" />
+    <Compile Include="Interfaces\Parameter\IQualityAwareGQAPOperator.cs" />
+    <Compile Include="Interfaces\Parameter\IProblemInstanceAwareGQAPOperator.cs" />
+    <Compile Include="Interfaces\Operator\IGQAPNMoveEvaluator.cs" />
+    <Compile Include="Interfaces\Operator\IGQAPCrossover.cs" />
+    <Compile Include="Interfaces\Operator\IGQAPLocalImprovementOperator.cs" />
+    <Compile Include="Interfaces\Operator\IGQAPMoveEvaluator.cs" />
+    <Compile Include="Interfaces\Operator\IGQAPMoveOperator.cs" />
+    <Compile Include="Interfaces\Operator\IGQAPNMoveOperator.cs" />
+    <Compile Include="Interfaces\Operator\IGQAPOperator.cs" />
+    <Compile Include="Interfaces\Operator\IGQAPSolutionCreator.cs" />
     <Compile Include="Moves\NMove.cs" />
     <Compile Include="Moves\GQAPMoveGenerator.cs" />
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IAssignmentAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IAssignmentAwareGQAPOperator.cs	(revision 15503)
+++ 	(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.Encodings.IntegerVectorEncoding;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IAssignmentAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<IntegerVector> AssignmentParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IAssignmentsAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IAssignmentsAwareGQAPOperator.cs	(revision 15503)
+++ 	(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.Encodings.IntegerVectorEncoding;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IAssignmentsAwareGQAPOperator : IGQAPOperator {
-    IScopeTreeLookupParameter<IntegerVector> AssignmentParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IBestKnownQualityAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IBestKnownQualityAwareGQAPOperator.cs	(revision 15503)
+++ 	(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 {
-  public interface IBestKnownQualityAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<DoubleValue> BestKnownQualityParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IBestKnownSolutionAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IBestKnownSolutionAwareGQAPOperator.cs	(revision 15503)
+++ 	(revision )
@@ -1,28 +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;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IBestKnownSolutionAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<GQAPAssignment> BestKnownSolutionParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IBestKnownSolutionsAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IBestKnownSolutionsAwareGQAPOperator.cs	(revision 15503)
+++ 	(revision )
@@ -1,28 +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;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IBestKnownSolutionsAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<GQAPAssignmentArchive> BestKnownSolutionsParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/ICapacitiesAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/ICapacitiesAwareGQAPOperator.cs	(revision 15503)
+++ 	(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 {
-  public interface ICapacitiesAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<DoubleArray> CapacitiesParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IDemandsAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IDemandsAwareGQAPOperator.cs	(revision 15503)
+++ 	(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 {
-  public interface IDemandsAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<DoubleArray> DemandsParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IDistancesAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IDistancesAwareGQAPOperator.cs	(revision 15503)
+++ 	(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 {
-  public interface IDistancesAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<DoubleMatrix> DistancesParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IEquipmentNamesAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IEquipmentNamesAwareGQAPOperator.cs	(revision 15503)
+++ 	(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 {
-  public interface IEquipmentNamesAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<StringArray> EquipmentNamesParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IEvaluatorAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IEvaluatorAwareGQAPOperator.cs	(revision 15503)
+++ 	(revision )
@@ -1,28 +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;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IEvaluatorAwareGQAPOperator : IGQAPOperator {
-    IValueLookupParameter<IGQAPEvaluator> EvaluatorParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IExpectedRandomQualityAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IExpectedRandomQualityAwareGQAPOperator.cs	(revision 15503)
+++ 	(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 {
-  public interface IExpectedRandomQualityAwareGQAPOperator : IGQAPOperator {
-    IValueLookupParameter<DoubleValue> ExpectedRandomQualityParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPCrossover.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPCrossover.cs	(revision 15503)
+++ 	(revision )
@@ -1,31 +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.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Optimization;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IGQAPCrossover : IGQAPOperator, ICrossover {
-    IScopeTreeLookupParameter<IntegerVector> ParentsParameter { get; }
-    ILookupParameter<IntegerVector> ChildParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPEvaluator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPEvaluator.cs	(revision 15503)
+++ 	(revision )
@@ -1,49 +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;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Optimization;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IGQAPEvaluator : ISingleObjectiveEvaluator {
-    ILookupParameter<BoolValue> MaximizationParameter { get; }
-    ILookupParameter<DoubleValue> FlowDistanceQualityParameter { get; }
-    ILookupParameter<DoubleValue> InstallationQualityParameter { get; }
-    ILookupParameter<DoubleValue> OverbookedCapacityParameter { get; }
-
-    double Evaluate(IntegerVector assignment, DoubleMatrix weights, DoubleMatrix distances,
-                    DoubleMatrix installCosts, DoubleArray demands, DoubleArray capacities,
-                    double transportationCosts, double expectedRandomQuality);
-
-    void Evaluate(IntegerVector assignment, DoubleMatrix weights, DoubleMatrix distances,
-                  DoubleMatrix installCosts, DoubleArray demands, DoubleArray capacities,
-                  out double flowDistanceQuality, out double installationQuality,
-                  out double overbookedCapacity);
-
-    double EvaluateOverbooking(DoubleArray slack, DoubleArray capacities);
-
-    double GetFitness(double flowDistanceQuality, double installationQuality,
-                      double overbookedCapacity, double transportationCosts,
-                      double expectedRandomQuality);
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPLocalImprovementOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPLocalImprovementOperator.cs	(revision 15503)
+++ 	(revision )
@@ -1,30 +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;
-using HeuristicLab.Optimization;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IGQAPLocalImprovementOperator : ILocalImprovementAlgorithmOperator {
-    IValueLookupParameter<IntValue> MaximumCandidateListSizeParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPManipulator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPManipulator.cs	(revision 15503)
+++ 	(revision )
@@ -1,26 +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.Optimization;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IGQAPManipulator : IAssignmentAwareGQAPOperator, IManipulator { }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPMoveEvaluator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPMoveEvaluator.cs	(revision 15503)
+++ 	(revision )
@@ -1,33 +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;
-using HeuristicLab.Optimization;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IGQAPMoveEvaluator : IGQAPMoveOperator, ISingleObjectiveMoveEvaluator {
-    ILookupParameter<BoolValue> MaximizationParameter { get; }
-    ILookupParameter<DoubleValue> MoveFlowDistanceQualityParameter { get; }
-    ILookupParameter<DoubleValue> MoveInstallationQualityParameter { get; }
-    ILookupParameter<DoubleValue> MoveOverbookedCapacityParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPMoveOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPMoveOperator.cs	(revision 15503)
+++ 	(revision )
@@ -1,26 +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.Optimization;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IGQAPMoveOperator : IMoveOperator { }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPNMoveEvaluator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPNMoveEvaluator.cs	(revision 15503)
+++ 	(revision )
@@ -1,24 +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
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IGQAPNMoveEvaluator : IGQAPMoveEvaluator, IGQAPNMoveOperator { }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPNMoveOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPNMoveOperator.cs	(revision 15503)
+++ 	(revision )
@@ -1,28 +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;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IGQAPNMoveOperator : IGQAPMoveOperator {
-    ILookupParameter<NMove> MoveParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPOperator.cs	(revision 15503)
+++ 	(revision )
@@ -1,26 +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;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IGQAPOperator : IOperator { }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPSolutionCreator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPSolutionCreator.cs	(revision 15503)
+++ 	(revision )
@@ -1,30 +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.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Optimization;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IGQAPSolutionCreator : ISolutionCreator {
-    ILookupParameter<IntegerVector> AssignmentParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IInstallationCostsAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IInstallationCostsAwareGQAPOperator.cs	(revision 15503)
+++ 	(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 {
-  public interface IInstallationCostsAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<DoubleMatrix> InstallationCostsParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/ILocationNamesAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/ILocationNamesAwareGQAPOperator.cs	(revision 15503)
+++ 	(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 {
-  public interface ILocationNamesAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<StringArray> LocationNamesParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IMoveQualityAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IMoveQualityAwareGQAPOperator.cs	(revision 15503)
+++ 	(revision )
@@ -1,33 +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 {
-  public interface IMoveQualityAwareGQAPOperator : IGQAPMoveOperator {
-    ILookupParameter<BoolValue> MaximizationParameter { get; }
-    ILookupParameter<DoubleValue> MoveQualityParameter { get; }
-    ILookupParameter<DoubleValue> MoveFlowDistanceQualityParameter { get; }
-    ILookupParameter<DoubleValue> MoveInstallationQualityParameter { get; }
-    ILookupParameter<DoubleValue> MoveOverbookedCapacityParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IQualitiesAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IQualitiesAwareGQAPOperator.cs	(revision 15503)
+++ 	(revision )
@@ -1,33 +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 {
-  public interface IQualitiesAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<BoolValue> MaximizationParameter { get; }
-    IScopeTreeLookupParameter<DoubleValue> QualityParameter { get; }
-    IScopeTreeLookupParameter<DoubleValue> FlowDistanceQualityParameter { get; }
-    IScopeTreeLookupParameter<DoubleValue> InstallationQualityParameter { get; }
-    IScopeTreeLookupParameter<DoubleValue> OverbookedCapacityParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IQualityAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IQualityAwareGQAPOperator.cs	(revision 15503)
+++ 	(revision )
@@ -1,33 +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 {
-  public interface IQualityAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<BoolValue> MaximizationParameter { get; }
-    ILookupParameter<DoubleValue> QualityParameter { get; }
-    ILookupParameter<DoubleValue> FlowDistanceQualityParameter { get; }
-    ILookupParameter<DoubleValue> InstallationQualityParameter { get; }
-    ILookupParameter<DoubleValue> OverbookedCapacityParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/ITransportationCostsAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/ITransportationCostsAwareGQAPOperator.cs	(revision 15503)
+++ 	(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 {
-  public interface ITransportationCostsAwareGQAPOperator : IGQAPOperator {
-    IValueLookupParameter<DoubleValue> TransportationCostsParameter { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IWeightsAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IWeightsAwareGQAPOperator.cs	(revision 15503)
+++ 	(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 {
-  public interface IWeightsAwareGQAPOperator : IGQAPOperator {
-    ILookupParameter<DoubleMatrix> WeightsParameter { get; }
-  }
-}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPCrossover.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPCrossover.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPCrossover.cs	(revision 15504)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IGQAPCrossover : IGQAPOperator, ICrossover {
+    IScopeTreeLookupParameter<IntegerVector> ParentsParameter { get; }
+    ILookupParameter<IntegerVector> ChildParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPLocalImprovementOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPLocalImprovementOperator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPLocalImprovementOperator.cs	(revision 15504)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IGQAPLocalImprovementOperator : ILocalImprovementAlgorithmOperator {
+    IValueLookupParameter<IntValue> MaximumCandidateListSizeParameter { get; }
+    ILookupParameter<IntegerVector> AssignmentParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPManipulator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPManipulator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPManipulator.cs	(revision 15504)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IGQAPManipulator : IManipulator {
+    ILookupParameter<IntegerVector> AssignmentParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPMoveEvaluator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPMoveEvaluator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPMoveEvaluator.cs	(revision 15504)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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.Optimization;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IGQAPMoveEvaluator : IGQAPMoveOperator, ISingleObjectiveMoveEvaluator {
+    ILookupParameter<Evaluation> MoveEvaluationParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPMoveOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPMoveOperator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPMoveOperator.cs	(revision 15504)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IGQAPMoveOperator : IMoveOperator {
+    ILookupParameter<IntegerVector> AssignmentParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPNMoveEvaluator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPNMoveEvaluator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPNMoveEvaluator.cs	(revision 15504)
@@ -0,0 +1,24 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IGQAPNMoveEvaluator : IGQAPMoveEvaluator, IGQAPNMoveOperator { }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPNMoveOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPNMoveOperator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPNMoveOperator.cs	(revision 15504)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IGQAPNMoveOperator : IGQAPMoveOperator {
+    ILookupParameter<NMove> MoveParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPOperator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPOperator.cs	(revision 15504)
@@ -0,0 +1,26 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IGQAPOperator : IOperator { }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPSolutionCreator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPSolutionCreator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Operator/IGQAPSolutionCreator.cs	(revision 15504)
@@ -0,0 +1,26 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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.Encodings.IntegerVectorEncoding;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IGQAPSolutionCreator : IIntegerVectorCreator {  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IBestKnownQualityAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IBestKnownQualityAwareGQAPOperator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IBestKnownQualityAwareGQAPOperator.cs	(revision 15504)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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 {
+  public interface IBestKnownQualityAwareGQAPOperator : IGQAPOperator {
+    ILookupParameter<DoubleValue> BestKnownQualityParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IBestKnownSolutionAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IBestKnownSolutionAwareGQAPOperator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IBestKnownSolutionAwareGQAPOperator.cs	(revision 15504)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IBestKnownSolutionAwareGQAPOperator : IGQAPOperator {
+    ILookupParameter<GQAPAssignment> BestKnownSolutionParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IBestKnownSolutionsAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IBestKnownSolutionsAwareGQAPOperator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IBestKnownSolutionsAwareGQAPOperator.cs	(revision 15504)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IBestKnownSolutionsAwareGQAPOperator : IGQAPOperator {
+    ILookupParameter<GQAPAssignmentArchive> BestKnownSolutionsParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IMoveQualityAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IMoveQualityAwareGQAPOperator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IMoveQualityAwareGQAPOperator.cs	(revision 15504)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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 {
+  public interface IMoveQualityAwareGQAPOperator : IGQAPMoveOperator {
+    ILookupParameter<DoubleValue> MoveQualityParameter { get; }
+    ILookupParameter<Evaluation> MoveEvaluationParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IProblemInstanceAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IProblemInstanceAwareGQAPOperator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IProblemInstanceAwareGQAPOperator.cs	(revision 15504)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IProblemInstanceAwareGQAPOperator : IGQAPOperator {
+    ILookupParameter<GQAPInstance> ProblemInstanceParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IQualitiesAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IQualitiesAwareGQAPOperator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IQualitiesAwareGQAPOperator.cs	(revision 15504)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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 {
+  public interface IQualitiesAwareGQAPOperator : IGQAPOperator {
+    IScopeTreeLookupParameter<DoubleValue> QualityParameter { get; }
+    IScopeTreeLookupParameter<Evaluation> EvaluationParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IQualityAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IQualityAwareGQAPOperator.cs	(revision 15504)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/Parameter/IQualityAwareGQAPOperator.cs	(revision 15504)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 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 {
+  public interface IQualityAwareGQAPOperator : IGQAPOperator {
+    ILookupParameter<DoubleValue> QualityParameter { get; }
+    ILookupParameter<Evaluation> EvaluationParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/GQAPMoveGenerator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/GQAPMoveGenerator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/GQAPMoveGenerator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -31,8 +31,14 @@
   [Item("GQAPMoveGenerator", "Base class for move generators for the Generalized Quadratic Assignment Problem.")]
   [StorableClass]
-  public abstract class GQAPMoveGenerator : SingleSuccessorOperator, IAssignmentAwareGQAPOperator, IMoveGenerator, IGQAPMoveOperator {
+  public abstract class GQAPMoveGenerator : SingleSuccessorOperator, IMoveGenerator, IGQAPMoveOperator,
+    IProblemInstanceAwareGQAPOperator {
 
     public ILookupParameter<IntegerVector> AssignmentParameter {
       get { return (ILookupParameter<IntegerVector>)Parameters["Assignment"]; }
+    }
+
+
+    public ILookupParameter<GQAPInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<GQAPInstance>)Parameters["ProblemInstance"]; }
     }
 
@@ -43,4 +49,5 @@
       : base() {
       Parameters.Add(new LookupParameter<IntegerVector>("Assignment", GQAPSolutionCreator.AssignmentDescription));
+      Parameters.Add(new LookupParameter<GQAPInstance>("ProblemInstance", GQAP.ProblemInstanceDescription));
     }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/GQAPNMoveGenerator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/GQAPNMoveGenerator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/GQAPNMoveGenerator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -58,5 +58,5 @@
       int counter = 0;
       string name = MoveParameter.TranslatedName;
-      foreach (var move in GenerateMoves(AssignmentParameter.ActualValue, NParameter.ActualValue.Value)) {
+      foreach (var move in GenerateMoves(AssignmentParameter.ActualValue, NParameter.ActualValue.Value, ProblemInstanceParameter.ActualValue)) {
         scopes.Add(new Scope(counter.ToString()));
         scopes.Last().Variables.Add(new Variable(name, move));
@@ -67,5 +67,5 @@
     }
 
-    public abstract IEnumerable<NMove> GenerateMoves(IntegerVector assignment, int n);
+    public abstract IEnumerable<NMove> GenerateMoves(IntegerVector assignment, int n, GQAPInstance problemInstance);
   }
 }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMove.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMove.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMove.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveAbsoluteAttribute.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveAbsoluteAttribute.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveAbsoluteAttribute.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveMaker.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveMaker.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveMaker.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
   [Item("N-Move Maker", "Performs an N-Move.")]
   [StorableClass]
-  public class NMoveMaker : SingleSuccessorOperator, IAssignmentAwareGQAPOperator, IQualityAwareGQAPOperator, IMoveQualityAwareGQAPOperator, IGQAPNMoveOperator, IMoveMaker {
+  public class NMoveMaker : SingleSuccessorOperator, IQualityAwareGQAPOperator, IMoveQualityAwareGQAPOperator, IGQAPNMoveOperator, IMoveMaker {
 
     public ILookupParameter<IntegerVector> AssignmentParameter {
@@ -40,36 +40,15 @@
       get { return (ILookupParameter<NMove>)Parameters["Move"]; }
     }
-    ILookupParameter<BoolValue> IQualityAwareGQAPOperator.MaximizationParameter {
-      get { return MaximizationParameter; }
-    }
-    ILookupParameter<BoolValue> IMoveQualityAwareGQAPOperator.MaximizationParameter {
-      get { return MaximizationParameter; }
-    }
-    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<Evaluation> EvaluationParameter {
+      get { return (ILookupParameter<Evaluation>)Parameters["Evaluation"]; }
     }
     public ILookupParameter<DoubleValue> MoveQualityParameter {
       get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
     }
-    public ILookupParameter<DoubleValue> MoveFlowDistanceQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["MoveFlowDistanceQuality"]; }
-    }
-    public ILookupParameter<DoubleValue> MoveInstallationQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["MoveInstallationQuality"]; }
-    }
-    public ILookupParameter<DoubleValue> MoveOverbookedCapacityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverbookedCapacity"]; }
+    public ILookupParameter<Evaluation> MoveEvaluationParameter {
+      get { return (ILookupParameter<Evaluation>)Parameters["MoveEvaluation"]; }
     }
 
@@ -81,13 +60,8 @@
       Parameters.Add(new LookupParameter<IntegerVector>("Assignment", GQAPSolutionCreator.AssignmentDescription));
       Parameters.Add(new LookupParameter<NMove>("Move", GQAPNMoveGenerator.MoveDescription));
-      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<DoubleValue>("Quality", ""));
+      Parameters.Add(new LookupParameter<Evaluation>("Evaluation", GQAP.EvaluationDescription));
       Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", GQAPNMoveEvaluator.MoveQualityDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("MoveFlowDistanceQuality", GQAPNMoveEvaluator.MoveFlowDistanceQualityDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("MoveInstallationQuality", GQAPNMoveEvaluator.MoveInstallationQualityDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("MoveOverbookedCapacity", GQAPNMoveEvaluator.MoveOverbookedCapacityDescription));
+      Parameters.Add(new LookupParameter<Evaluation>("MoveEvaluation", GQAPNMoveEvaluator.MoveEvaluationDescription));
     }
 
@@ -104,7 +78,5 @@
       Apply(AssignmentParameter.ActualValue, MoveParameter.ActualValue);
       QualityParameter.ActualValue.Value = MoveQualityParameter.ActualValue.Value;
-      FlowDistanceQualityParameter.ActualValue.Value = MoveFlowDistanceQualityParameter.ActualValue.Value;
-      InstallationQualityParameter.ActualValue.Value = MoveInstallationQualityParameter.ActualValue.Value;
-      OverbookedCapacityParameter.ActualValue.Value = MoveOverbookedCapacityParameter.ActualValue.Value;
+      EvaluationParameter.ActualValue = MoveEvaluationParameter.ActualValue;
       return base.Apply();
     }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveTabuChecker.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveTabuChecker.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveTabuChecker.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -33,7 +33,10 @@
   [StorableClass]
   public class NMoveTabuChecker : SingleSuccessorOperator, ITabuChecker,
-    IAssignmentAwareGQAPOperator, IGQAPNMoveOperator, IMoveQualityAwareGQAPOperator {
+    IGQAPNMoveOperator, IMoveQualityAwareGQAPOperator {
     public override bool CanChangeName {
       get { return false; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
     }
     public ILookupParameter<NMove> MoveParameter {
@@ -49,21 +52,9 @@
       get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
     }
-    public IValueLookupParameter<BoolValue> MaximizationParameter {
-      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
-    }
-    ILookupParameter<BoolValue> IMoveQualityAwareGQAPOperator.MaximizationParameter {
-      get { return MaximizationParameter; }
-    }
     public ILookupParameter<DoubleValue> MoveQualityParameter {
       get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
     }
-    public ILookupParameter<DoubleValue> MoveFlowDistanceQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["MoveFlowDistanceQuality"]; }
-    }
-    public ILookupParameter<DoubleValue> MoveInstallationQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["MoveInstallationQuality"]; }
-    }
-    public ILookupParameter<DoubleValue> MoveOverbookedCapacityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverbookedCapacity"]; }
+    public ILookupParameter<Evaluation> MoveEvaluationParameter {
+      get { return (ILookupParameter<Evaluation>)Parameters["MoveEvaluation"]; }
     }
     public IValueParameter<BoolValue> UseAspirationCriterionParameter {
@@ -81,13 +72,11 @@
     public NMoveTabuChecker()
       : base() {
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", ""));
       Parameters.Add(new LookupParameter<NMove>("Move", GQAPNMoveGenerator.MoveDescription));
       Parameters.Add(new LookupParameter<IntegerVector>("Assignment", GQAPSolutionCreator.AssignmentDescription));
       Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list contains previous move attributes."));
       Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "Declares if a move is tabu or not."));
-      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem."));
       Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", GQAPNMoveEvaluator.MoveQualityDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("MoveFlowDistanceQuality", GQAPNMoveEvaluator.MoveFlowDistanceQualityDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("MoveInstallationQuality", GQAPNMoveEvaluator.MoveInstallationQualityDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("MoveOverbookedCapacity", GQAPNMoveEvaluator.MoveOverbookedCapacityDescription));
+      Parameters.Add(new LookupParameter<Evaluation>("MoveEvaluation", GQAPNMoveEvaluator.MoveEvaluationDescription));
       Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether moves can be aspired.", new BoolValue(true)));
     }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveTabuMaker.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveTabuMaker.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveTabuMaker.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -22,5 +22,4 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Optimization.Operators;
@@ -31,6 +30,5 @@
   [Item("N-Move TabuMaker", "Declares an N-Move tabu.")]
   [StorableClass]
-  public class NMoveTabuMaker : TabuMaker, IGQAPNMoveOperator, IAssignmentAwareGQAPOperator,
-    IMoveQualityAwareGQAPOperator {
+  public class NMoveTabuMaker : TabuMaker, IGQAPNMoveOperator, IMoveQualityAwareGQAPOperator {
 
     public ILookupParameter<IntegerVector> AssignmentParameter {
@@ -40,15 +38,6 @@
       get { return (ILookupParameter<NMove>)Parameters["Move"]; }
     }
-    ILookupParameter<BoolValue> IMoveQualityAwareGQAPOperator.MaximizationParameter {
-      get { return (ILookupParameter<BoolValue>)MaximizationParameter; }
-    }
-    public ILookupParameter<DoubleValue> MoveFlowDistanceQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["MoveFlowDistanceQuality"]; }
-    }
-    public ILookupParameter<DoubleValue> MoveInstallationQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["MoveInstallationQuality"]; }
-    }
-    public ILookupParameter<DoubleValue> MoveOverbookedCapacityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverbookedCapacity"]; }
+    public ILookupParameter<Evaluation> MoveEvaluationParameter {
+      get { return (ILookupParameter<Evaluation>)Parameters["MoveEvaluation"]; }
     }
 
@@ -60,7 +49,5 @@
       Parameters.Add(new LookupParameter<IntegerVector>("Assignment", GQAPSolutionCreator.AssignmentDescription));
       Parameters.Add(new LookupParameter<NMove>("Move", GQAPNMoveGenerator.MoveDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("MoveFlowDistanceQuality", GQAPNMoveEvaluator.MoveFlowDistanceQualityDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("MoveInstallationQuality", GQAPNMoveEvaluator.MoveInstallationQualityDescription));
-      Parameters.Add(new LookupParameter<DoubleValue>("MoveOverbookedCapacity", GQAPNMoveEvaluator.MoveOverbookedCapacityDescription));
+      Parameters.Add(new LookupParameter<Evaluation>("MoveEvaluation", GQAPNMoveEvaluator.MoveEvaluationDescription));
     }
 
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/StochasticNMoveMultiMoveGenerator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/StochasticNMoveMultiMoveGenerator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/StochasticNMoveMultiMoveGenerator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,9 +32,6 @@
   [Item("Stochastic N-Move MultiMoveGenerator", "Randomly samples a number of N-Moves.")]
   [StorableClass]
-  public class StochasticNMoveMultiMoveGenerator : GQAPNMoveGenerator, ICapacitiesAwareGQAPOperator, IStochasticOperator, IMultiMoveGenerator {
-
-    public ILookupParameter<DoubleArray> CapacitiesParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
-    }
+  public class StochasticNMoveMultiMoveGenerator : GQAPNMoveGenerator, IStochasticOperator, IMultiMoveGenerator {
+    
     public ILookupParameter<IRandom> RandomParameter {
       get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
@@ -50,5 +47,4 @@
       : base() {
       Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator that should be used."));
-      Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription));
       Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
     }
@@ -58,11 +54,11 @@
     }
 
-    public static IEnumerable<NMove> Generate(IRandom random, IntegerVector assignment, int n, DoubleArray capacities, int sampleSize) {
+    public static IEnumerable<NMove> Generate(IRandom random, IntegerVector assignment, int n, GQAPInstance problemInstance, int sampleSize) {
       for (int i = 0; i < sampleSize; i++)
-        yield return StochasticNMoveSingleMoveGenerator.GenerateUpToN(random, assignment, n, capacities);
+        yield return StochasticNMoveSingleMoveGenerator.GenerateUpToN(random, assignment, n, problemInstance.Capacities);
     }
 
-    public override IEnumerable<NMove> GenerateMoves(IntegerVector assignment, int n) {
-      return Generate(RandomParameter.ActualValue, assignment, n, CapacitiesParameter.ActualValue, SampleSizeParameter.ActualValue.Value);
+    public override IEnumerable<NMove> GenerateMoves(IntegerVector assignment, int n, GQAPInstance problemInstance) {
+      return Generate(RandomParameter.ActualValue, assignment, n, problemInstance, SampleSizeParameter.ActualValue.Value);
     }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/StochasticNMoveSingleMoveGenerator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/StochasticNMoveSingleMoveGenerator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/StochasticNMoveSingleMoveGenerator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,9 +32,6 @@
   [Item("Stochastic N-Move SingleMoveGenerator", "Randomly samples a single N-Move.")]
   [StorableClass]
-  public class StochasticNMoveSingleMoveGenerator : GQAPNMoveGenerator, ICapacitiesAwareGQAPOperator, IStochasticOperator, ISingleMoveGenerator {
-
-    public ILookupParameter<DoubleArray> CapacitiesParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
-    }
+  public class StochasticNMoveSingleMoveGenerator : GQAPNMoveGenerator, IStochasticOperator, ISingleMoveGenerator {
+    
     public ILookupParameter<IRandom> RandomParameter {
       get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
@@ -47,5 +44,4 @@
       : base() {
       Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator that should be used."));
-      Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription));
     }
 
@@ -73,6 +69,6 @@
     }
 
-    public override IEnumerable<NMove> GenerateMoves(IntegerVector assignment, int n) {
-      yield return GenerateUpToN(RandomParameter.ActualValue, assignment, n, CapacitiesParameter.ActualValue);
+    public override IEnumerable<NMove> GenerateMoves(IntegerVector assignment, int n, GQAPInstance problemInstance) {
+      yield return GenerateUpToN(RandomParameter.ActualValue, assignment, n, problemInstance.Capacities);
     }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/CordeauCrossover.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/CordeauCrossover.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/CordeauCrossover.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -34,7 +34,5 @@
   [StorableClass]
   public class CordeauCrossover : GQAPCrossover,
-    IQualitiesAwareGQAPOperator, IWeightsAwareGQAPOperator, IDistancesAwareGQAPOperator, IInstallationCostsAwareGQAPOperator,
-    IDemandsAwareGQAPOperator, ICapacitiesAwareGQAPOperator, ITransportationCostsAwareGQAPOperator,
-    IExpectedRandomQualityAwareGQAPOperator {
+    IQualitiesAwareGQAPOperator, IProblemInstanceAwareGQAPOperator {
 
     public ILookupParameter<BoolValue> MaximizationParameter {
@@ -44,36 +42,6 @@
       get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
     }
-    public IScopeTreeLookupParameter<DoubleValue> FlowDistanceQualityParameter {
-      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["FlowDistanceQuality"]; }
-    }
-    public IScopeTreeLookupParameter<DoubleValue> InstallationQualityParameter {
-      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["InstallationQuality"]; }
-    }
-    public IScopeTreeLookupParameter<DoubleValue> OverbookedCapacityParameter {
-      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["OverbookedCapacity"]; }
-    }
-    public ILookupParameter<DoubleMatrix> WeightsParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["Weights"]; }
-    }
-    public ILookupParameter<DoubleMatrix> DistancesParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["Distances"]; }
-    }
-    public ILookupParameter<DoubleMatrix> InstallationCostsParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["InstallationCosts"]; }
-    }
-    public ILookupParameter<DoubleArray> DemandsParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Demands"]; }
-    }
-    public ILookupParameter<DoubleArray> CapacitiesParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
-    }
-    public IValueLookupParameter<DoubleValue> TransportationCostsParameter {
-      get { return (IValueLookupParameter<DoubleValue>)Parameters["TransportationCosts"]; }
-    }
-    public IValueLookupParameter<DoubleValue> ExpectedRandomQualityParameter {
-      get { return (IValueLookupParameter<DoubleValue>)Parameters["ExpectedRandomQuality"]; }
-    }
-    public IValueLookupParameter<IGQAPEvaluator> EvaluatorParameter {
-      get { return (IValueLookupParameter<IGQAPEvaluator>)Parameters["Evaluator"]; }
+    public IScopeTreeLookupParameter<Evaluation> EvaluationParameter {
+      get { return (IScopeTreeLookupParameter<Evaluation>)Parameters["Evaluation"]; }
     }
     public ILookupParameter<IntValue> EvaluatedSolutionsParameter {
@@ -88,17 +56,7 @@
     public CordeauCrossover()
       : base() {
-      Parameters.Add(new LookupParameter<BoolValue>("Maximization", GeneralizedQuadraticAssignmentProblem.MaximizationDescription));
-      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", GQAPEvaluator.QualityDescription, 1));
-      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("FlowDistanceQuality", GQAPEvaluator.FlowDistanceQualityDescription, 1));
-      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("InstallationQuality", GQAPEvaluator.InstallationQualityDescription, 1));
-      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("OverbookedCapacity", GQAPEvaluator.OverbookedCapacityDescription, 1));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("Weights", GeneralizedQuadraticAssignmentProblem.WeightsDescription));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("Distances", GeneralizedQuadraticAssignmentProblem.DistancesDescription));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("InstallationCosts", GeneralizedQuadraticAssignmentProblem.InstallationCostsDescription));
-      Parameters.Add(new LookupParameter<DoubleArray>("Demands", GeneralizedQuadraticAssignmentProblem.DemandsDescription));
-      Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription));
-      Parameters.Add(new ValueLookupParameter<DoubleValue>("TransportationCosts", GeneralizedQuadraticAssignmentProblem.TransportationCostsDescription));
-      Parameters.Add(new ValueLookupParameter<DoubleValue>("ExpectedRandomQuality", GeneralizedQuadraticAssignmentProblem.ExpectedRandomQualityDescription));
-      Parameters.Add(new ValueLookupParameter<IGQAPEvaluator>("Evaluator", "The evaluator used to evaluate solutions."));
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", ""));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The quality of the parents", 1));
+      Parameters.Add(new ScopeTreeLookupParameter<Evaluation>("Evaluation", GQAP.EvaluationDescription, 1));
       Parameters.Add(new LookupParameter<IntValue>("EvaluatedSolutions", "The number of evaluated solutions."));
     }
@@ -108,10 +66,12 @@
     }
 
-    public static IntegerVector Apply(IRandom random, BoolValue maximization,
+    public static IntegerVector Apply(IRandom random, bool maximization,
       IntegerVector parent1, DoubleValue quality1,
       IntegerVector parent2, DoubleValue quality2,
-      DoubleMatrix weights, DoubleMatrix distances, DoubleMatrix installationCosts,
-      DoubleArray demands, DoubleArray capacities,
-      double transportationCosts, double expectedRandomQuality, IGQAPEvaluator evaluator, IntValue evaluatedSolutions) {
+      GQAPInstance problemInstance, IntValue evaluatedSolutions) {
+      var distances = problemInstance.Distances;
+      var capacities = problemInstance.Capacities;
+      var demands = problemInstance.Demands;
+
       var medianDistances = Enumerable.Range(0, distances.Rows).Select(x => distances.GetRow(x).Median()).ToArray();
 
@@ -120,11 +80,11 @@
       
       bool onefound = false;
-      double fbest, fbestAttempt = maximization.Value ? double.MinValue : double.MaxValue;
+      double fbest, fbestAttempt = maximization ? double.MinValue : double.MaxValue;
       IntegerVector bestAttempt = null;
       IntegerVector result = null;
 
       fbest = quality1.Value;
-      if (maximization.Value && quality1.Value < quality2.Value
-        || !maximization.Value && quality1.Value > quality2.Value) {
+      if (maximization && quality1.Value < quality2.Value
+        || !maximization && quality1.Value > quality2.Value) {
         var temp = parent1;
         parent1 = parent2;
@@ -140,13 +100,13 @@
           TryRandomAssignment(random, demands, capacities, m, n, cap, child, ref unassigned);
         if (unassigned == 0) {
-          var childFit = evaluator.Evaluate(child, weights, distances, installationCosts, demands, capacities, transportationCosts, expectedRandomQuality);
+          var childFit = problemInstance.ToSingleObjective(problemInstance.Evaluate(child));
           evaluatedSolutions.Value++;
-          if (maximization.Value && childFit >= fbest
-            || !maximization.Value && childFit <= fbest) {
+          if (maximization && childFit >= fbest
+            || !maximization && childFit <= fbest) {
             fbest = childFit;
             result = child;
             onefound = true;
           }
-          if (!onefound && (maximization.Value && fbestAttempt < childFit || !maximization.Value && fbestAttempt > childFit)) {
+          if (!onefound && (maximization && fbestAttempt < childFit || !maximization && fbestAttempt > childFit)) {
             bestAttempt = child;
             fbestAttempt = childFit;
@@ -162,5 +122,5 @@
         RandomAssignment(random, demands, capacities, m, n, cap, child, ref unassigned);
 
-        var childFit = evaluator.Evaluate(child, weights, distances, installationCosts, demands, capacities, transportationCosts, expectedRandomQuality);
+        var childFit = problemInstance.ToSingleObjective(problemInstance.Evaluate(child));
         evaluatedSolutions.Value++;
         if (childFit < fbest) {
@@ -170,5 +130,5 @@
         }
 
-        if (!onefound && (maximization.Value && fbestAttempt < childFit || !maximization.Value && fbestAttempt > childFit)) {
+        if (!onefound && (maximization && fbestAttempt < childFit || !maximization && fbestAttempt > childFit)) {
           bestAttempt = child;
           fbestAttempt = childFit;
@@ -237,16 +197,15 @@
     }
 
-    protected override IntegerVector Cross(IRandom random, ItemArray<IntegerVector> parents) {
+    protected override IntegerVector Cross(IRandom random, ItemArray<IntegerVector> parents,
+      GQAPInstance problemInstance) {
       if (parents == null) throw new ArgumentNullException("parents");
       if (parents.Length != 2) throw new ArgumentException(Name + " works only with exactly two parents.");
 
       var qualities = QualityParameter.ActualValue;
-      return Apply(random, MaximizationParameter.ActualValue,
+      return Apply(random, MaximizationParameter.ActualValue.Value,
         parents[0], qualities[0],
         parents[1], qualities[1],
-        WeightsParameter.ActualValue, DistancesParameter.ActualValue, InstallationCostsParameter.ActualValue,
-        DemandsParameter.ActualValue, CapacitiesParameter.ActualValue,
-        TransportationCostsParameter.ActualValue.Value, ExpectedRandomQualityParameter.ActualValue.Value,
-        EvaluatorParameter.ActualValue, EvaluatedSolutionsParameter.ActualValue);
+        problemInstance,
+        EvaluatedSolutionsParameter.ActualValue);
     }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/DiscreteLocationCrossover.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/DiscreteLocationCrossover.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/DiscreteLocationCrossover.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -26,5 +26,4 @@
 using HeuristicLab.Data;
 using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Random;
@@ -33,9 +32,5 @@
   [Item("DiscreteLocationCrossover", "Combines the assignment to locations from various parents.")]
   [StorableClass]
-  public class DiscreteLocationCrossover : GQAPCrossover, ICapacitiesAwareGQAPOperator {
-
-    public ILookupParameter<DoubleArray> CapacitiesParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
-    }
+  public class DiscreteLocationCrossover : GQAPCrossover {
 
     [StorableConstructor]
@@ -45,5 +40,4 @@
     public DiscreteLocationCrossover()
       : base() {
-      Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription));
     }
 
@@ -88,6 +82,7 @@
     }
 
-    protected override IntegerVector Cross(IRandom random, ItemArray<IntegerVector> parents) {
-      return Apply(random, parents, CapacitiesParameter.ActualValue);
+    protected override IntegerVector Cross(IRandom random, ItemArray<IntegerVector> parents,
+      GQAPInstance problemInstance) {
+      return Apply(random, parents, problemInstance.Capacities);
     }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/GQAPCrossover.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/GQAPCrossover.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/GQAPCrossover.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -46,4 +46,7 @@
       get { return (LookupParameter<IRandom>)Parameters["Random"]; }
     }
+    public ILookupParameter<GQAPInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<GQAPInstance>)Parameters["ProblemInstance"]; }
+    }
 
     [StorableConstructor]
@@ -55,12 +58,13 @@
       Parameters.Add(new LookupParameter<IntegerVector>("Child", "The child vector resulting from the crossover.", "Assignment"));
       Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic crossover operators."));
+      Parameters.Add(new LookupParameter<GQAPInstance>("ProblemInstance", GQAP.ProblemInstanceDescription));
     }
 
     public sealed override IOperation Apply() {
-      ChildParameter.ActualValue = Cross(RandomParameter.ActualValue, ParentsParameter.ActualValue);
+      ChildParameter.ActualValue = Cross(RandomParameter.ActualValue, ParentsParameter.ActualValue, ProblemInstanceParameter.ActualValue);
       return base.Apply();
     }
 
-    protected abstract IntegerVector Cross(IRandom random, ItemArray<IntegerVector> parents);
+    protected abstract IntegerVector Cross(IRandom random, ItemArray<IntegerVector> parents, GQAPInstance problemInstance);
   }
 }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/GQAPPathRelinking.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/GQAPPathRelinking.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/GQAPPathRelinking.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -34,46 +34,11 @@
   [Item("GQAPPathRelinking", "Operator that performs path relinking between two solutions. It is described in Mateus, G., Resende, M., and Silva, R. 2011. GRASP with path-relinking for the generalized quadratic assignment problem. Journal of Heuristics 17, Springer Netherlands, pp. 527-565.")]
   [StorableClass]
-  public class GQAPPathRelinking : GQAPCrossover, IQualitiesAwareGQAPOperator, IDemandsAwareGQAPOperator, ICapacitiesAwareGQAPOperator,
-  IWeightsAwareGQAPOperator, IDistancesAwareGQAPOperator, IInstallationCostsAwareGQAPOperator, ITransportationCostsAwareGQAPOperator,
-  IExpectedRandomQualityAwareGQAPOperator, IEvaluatorAwareGQAPOperator {
+  public class GQAPPathRelinking : GQAPCrossover, IQualitiesAwareGQAPOperator {
 
-    public ILookupParameter<BoolValue> MaximizationParameter {
-      get { return (ILookupParameter<BoolValue>)Parameters["Maximization"]; }
-    }
     public IScopeTreeLookupParameter<DoubleValue> QualityParameter {
       get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
     }
-    public IScopeTreeLookupParameter<DoubleValue> FlowDistanceQualityParameter {
-      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["FlowDistanceQuality"]; }
-    }
-    public IScopeTreeLookupParameter<DoubleValue> InstallationQualityParameter {
-      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["InstallationQuality"]; }
-    }
-    public IScopeTreeLookupParameter<DoubleValue> OverbookedCapacityParameter {
-      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["OverbookedCapacity"]; }
-    }
-    public ILookupParameter<DoubleArray> DemandsParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Demands"]; }
-    }
-    public ILookupParameter<DoubleArray> CapacitiesParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
-    }
-    public ILookupParameter<DoubleMatrix> WeightsParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["Weights"]; }
-    }
-    public ILookupParameter<DoubleMatrix> DistancesParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["Distances"]; }
-    }
-    public ILookupParameter<DoubleMatrix> InstallationCostsParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["InstallationCosts"]; }
-    }
-    public IValueLookupParameter<DoubleValue> TransportationCostsParameter {
-      get { return (IValueLookupParameter<DoubleValue>)Parameters["TransportationCosts"]; }
-    }
-    public IValueLookupParameter<DoubleValue> ExpectedRandomQualityParameter {
-      get { return (IValueLookupParameter<DoubleValue>)Parameters["ExpectedRandomQuality"]; }
-    }
-    public IValueLookupParameter<IGQAPEvaluator> EvaluatorParameter {
-      get { return (IValueLookupParameter<IGQAPEvaluator>)Parameters["Evaluator"]; }
+    public IScopeTreeLookupParameter<Evaluation> EvaluationParameter {
+      get { return (IScopeTreeLookupParameter<Evaluation>)Parameters["Evaluation"]; }
     }
 
@@ -87,17 +52,6 @@
     public GQAPPathRelinking()
       : base() {
-      Parameters.Add(new LookupParameter<BoolValue>("Maximization", GeneralizedQuadraticAssignmentProblem.MaximizationDescription));
-      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", GQAPEvaluator.QualityDescription));
-      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("FlowDistanceQuality", GQAPEvaluator.FlowDistanceQualityDescription));
-      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("InstallationQuality", GQAPEvaluator.InstallationQualityDescription));
-      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("OverbookedCapacity", GQAPEvaluator.OverbookedCapacityDescription));
-      Parameters.Add(new LookupParameter<DoubleArray>("Demands", GeneralizedQuadraticAssignmentProblem.DemandsDescription));
-      Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("Weights", GeneralizedQuadraticAssignmentProblem.WeightsDescription));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("Distances", GeneralizedQuadraticAssignmentProblem.DistancesDescription));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("InstallationCosts", GeneralizedQuadraticAssignmentProblem.InstallationCostsDescription));
-      Parameters.Add(new ValueLookupParameter<DoubleValue>("TransportationCosts", GeneralizedQuadraticAssignmentProblem.TransportationCostsDescription));
-      Parameters.Add(new ValueLookupParameter<DoubleValue>("ExpectedRandomQuality", GeneralizedQuadraticAssignmentProblem.ExpectedRandomQualityDescription));
-      Parameters.Add(new ValueLookupParameter<IGQAPEvaluator>("Evaluator", "The evaluator that is used to evaluate GQAP solutions."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", ""));
+      Parameters.Add(new ScopeTreeLookupParameter<Evaluation>("Evaluation", GQAP.EvaluationDescription));
       Parameters.Add(new ValueParameter<PercentValue>("CandidateSizeFactor", "(η) Determines the size of the set of feasible moves in each path-relinking step relative to the maximum size. A value of 50% means that only half of all possible moves are considered each step.", new PercentValue(0.5)));
     }
@@ -107,8 +61,6 @@
     }
 
-    public static IntegerVector Apply(IRandom random, ItemArray<IntegerVector> parents, BoolValue maximization, ItemArray<DoubleValue> qualities,
-      ItemArray<DoubleValue> flowDistanceQualities, ItemArray<DoubleValue> installationQualities, ItemArray<DoubleValue> overbookedCapacities,
-      DoubleArray demands, DoubleArray capacities, DoubleMatrix weights, DoubleMatrix distances, DoubleMatrix installationCosts,
-      DoubleValue transportationCosts, DoubleValue expectedRandomQuality, DoubleValue candidateSizeFactor, IGQAPEvaluator evaluator) {
+    public static IntegerVector Apply(IRandom random, ItemArray<IntegerVector> parents, ItemArray<DoubleValue> qualities,
+      GQAPInstance problemInstance, double candidateSizeFactor) {
       if (random == null) throw new ArgumentNullException("random", "No IRandom provider is given.");
       if (parents == null || !parents.Any()) throw new ArgumentException("No parents given for path relinking.", "parents");
@@ -117,20 +69,19 @@
       if (qualities == null || qualities.Length == 0) throw new ArgumentException("The qualities are not given.", "qualities");
       if (qualities.Length != parents.Length) throw new ArgumentException(String.Format("There are a different number of parents ({0}) than quality values ({1})", parents.Length.ToString(), qualities.Length.ToString()));
-
+      
       var source = parents[0];
       var target = parents[1];
       IntegerVector result;
-      double resultQuality, resultFDQ, resultIQ, resultOC;
+      double resultQuality;
 
-      int betterParent = 1;
-      if ((maximization.Value && qualities[0].Value >= qualities[1].Value)
-        || (!maximization.Value && qualities[0].Value <= qualities[1].Value))
-        betterParent = 0;
+      int betterParent = (qualities[0].Value <= qualities[1].Value) ? 0 : 1;
 
       result = (IntegerVector)parents[betterParent].Clone();
       resultQuality = qualities[betterParent].Value;
-      resultFDQ = flowDistanceQualities[betterParent].Value;
-      resultIQ = installationQualities[betterParent].Value;
-      resultOC = overbookedCapacities[betterParent].Value;
+
+      var demands = problemInstance.Demands;
+      var capacities = problemInstance.Capacities;
+
+      var cmp = new IntegerVectorEqualityComparer();
 
       var pi_prime = (IntegerVector)source.Clone();
@@ -140,26 +91,23 @@
 
       while (phi.Any()) {
-        var B = new List<GQAPSolution>();
+        var B = new List<Tuple<GQAPSolution, double>>();
         foreach (var v in phi) {
           int oldLocation = pi_prime[v];
           pi_prime[v] = target[v];
-          var pi2 = makeFeasible(random, pi_prime, v, nonFix, demands, capacities);
+          var pi2 = MakeFeasible(random, pi_prime, v, nonFix, demands, capacities);
           pi_prime[v] = oldLocation;
 
-          double currentFDQ, currentIQ, currentOC;
-          evaluator.Evaluate(pi2, weights, distances, installationCosts, demands, capacities,
-            out currentFDQ, out currentIQ, out currentOC);
+          var currentEval = problemInstance.Evaluate(pi2);
 
-          if (currentOC <= 0.0) {
-            var quality = evaluator.GetFitness(currentFDQ, currentIQ, currentOC,
-              transportationCosts.Value, expectedRandomQuality.Value);
-            var solution = new GQAPSolution(pi2, new DoubleValue(quality), new DoubleValue(currentFDQ),
-              new DoubleValue(currentIQ), new DoubleValue(currentOC));
-            if (B.Count >= candidateSizeFactor.Value * phi.Count) {
+          if (currentEval.ExcessDemand <= 0.0) {
+            var quality = problemInstance.ToSingleObjective(currentEval);
+
+            var solution = new GQAPSolution(pi2, currentEval);
+            if (B.Count >= candidateSizeFactor * phi.Count) {
               int mostSimilarIndex = -1;
               double mostSimilarValue = 1.0;
               for (int i = 0; i < B.Count; i++) {
-                if (IsBetter(maximization.Value, solution.Quality.Value, B[i].Quality.Value)) {
-                  var similarity = HammingSimilarityCalculator.CalculateSimilarity(solution.Assignment, B[i].Assignment);
+                if (quality < B[i].Item2) {
+                  var similarity = HammingSimilarityCalculator.CalculateSimilarity(solution.Assignment, B[i].Item1.Assignment);
                   if (similarity == 1.0) {
                     mostSimilarIndex = -1;
@@ -172,33 +120,28 @@
               }
               if (mostSimilarIndex >= 0)
-                B[mostSimilarIndex] = solution;
+                B[mostSimilarIndex] = Tuple.Create(solution, quality);
             } else {
               bool contains = false;
               foreach (var b in B) {
-                if (!IntegerVectorEqualityComparer.GetDifferingIndices(solution.Assignment, b.Assignment).Any()) {
+                if (cmp.Equals(solution.Assignment, b.Item1.Assignment)) {
                   contains = true;
                   break;
                 }
               }
-              if (!contains) B.Add(solution);
+              if (!contains) B.Add(Tuple.Create(solution, quality));
             }
           }
         }
         if (B.Any()) {
-          GQAPSolution pi;
-          if (maximization.Value) pi = B.SampleProportional(random, 1, B.Select(x => x.Quality.Value), false).First();
-          else pi = B.SampleProportional(random, 1, B.Select(x => 1.0 / x.Quality.Value), false).First();
-          var diff = IntegerVectorEqualityComparer.GetDifferingIndices(pi.Assignment, target);
+          var pi = B.SampleProportional(random, 1, B.Select(x => 1.0 / x.Item2), false).First();
+          var diff = IntegerVectorEqualityComparer.GetDifferingIndices(pi.Item1.Assignment, target);
           var I = phi.Except(diff);
           var i = I.SampleRandom(random);
           fix.Add(i);
           nonFix.Remove(i);
-          pi_prime = pi.Assignment;
-          if (IsBetter(maximization.Value, pi.Quality.Value, resultQuality)) {
-            result = pi.Assignment;
-            resultQuality = pi.Quality.Value;
-            resultFDQ = pi.FlowDistanceQuality.Value;
-            resultIQ = pi.InstallationQuality.Value;
-            resultOC = pi.OverbookedCapacity.Value;
+          pi_prime = pi.Item1.Assignment;
+          if (pi.Item2 < resultQuality) {
+            result = pi.Item1.Assignment;
+            resultQuality = pi.Item2;
           }
         } else return result;
@@ -209,14 +152,11 @@
     }
 
-    protected override IntegerVector Cross(IRandom random, ItemArray<IntegerVector> parents) {
-      return Apply(random, parents, MaximizationParameter.ActualValue, QualityParameter.ActualValue, FlowDistanceQualityParameter.ActualValue,
-        InstallationQualityParameter.ActualValue, OverbookedCapacityParameter.ActualValue, DemandsParameter.ActualValue,
-        CapacitiesParameter.ActualValue, WeightsParameter.ActualValue, DistancesParameter.ActualValue,
-        InstallationCostsParameter.ActualValue, TransportationCostsParameter.ActualValue,
-        ExpectedRandomQualityParameter.ActualValue, CandidateSizeFactorParameter.Value,
-        EvaluatorParameter.ActualValue);
+    protected override IntegerVector Cross(IRandom random, ItemArray<IntegerVector> parents,
+      GQAPInstance problemInstance) {
+      return Apply(random, parents, QualityParameter.ActualValue, problemInstance,
+        CandidateSizeFactorParameter.Value.Value);
     }
 
-    private static IntegerVector makeFeasible(IRandom random, IntegerVector assignment, int equipment, HashSet<int> nonFix, DoubleArray demands, DoubleArray capacities, int maximumTries = 1000) {
+    private static IntegerVector MakeFeasible(IRandom random, IntegerVector assignment, int equipment, HashSet<int> nonFix, DoubleArray demands, DoubleArray capacities, int maximumTries = 1000) {
       int l = assignment[equipment];
       var slack = ComputeSlack(assignment, demands, capacities);
@@ -250,8 +190,4 @@
       return slack;
     }
-
-    private static bool IsBetter(bool maximization, double quality, double otherQuality) {
-      return maximization && quality > otherQuality || !maximization && quality < otherQuality;
-    }
   }
 }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/MultiGQAPCrossover.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/MultiGQAPCrossover.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/MultiGQAPCrossover.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -35,5 +35,5 @@
   [Item("MultiGQAPCrossover", "Randomly selects and applies one of its crossovers every time it is called.")]
   [StorableClass]
-  public class MultiGQAPCrossover : StochasticMultiBranch<IGQAPCrossover>, IGQAPCrossover {
+  public class MultiGQAPCrossover : StochasticMultiBranch<IGQAPCrossover>, IGQAPCrossover, IProblemInstanceAwareGQAPOperator, IStochasticOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -49,4 +49,7 @@
       get { return (ILookupParameter<IntegerVector>)Parameters["Child"]; }
     }
+    public ILookupParameter<GQAPInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<GQAPInstance>)Parameters["ProblemInstance"]; }
+    }
 
     [StorableConstructor]
@@ -57,4 +60,6 @@
       Parameters.Add(new ScopeTreeLookupParameter<IntegerVector>("Parents", "The parent vectors which should be crossed.", "Assignment"));
       Parameters.Add(new LookupParameter<IntegerVector>("Child", "The child vector resulting from the crossover.", "Assignment"));
+      Parameters.Add(new LookupParameter<GQAPInstance>("ProblemInstance", GQAP.ProblemInstanceDescription));
+
       foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IGQAPCrossover))) {
         if (!typeof(MultiOperator<IGQAPCrossover>).IsAssignableFrom(type))
@@ -79,8 +84,15 @@
       foreach (var op in Operators.OfType<IGQAPCrossover>()) {
         op.ParentsParameter.ActualName = ParentsParameter.Name;
+        op.ParentsParameter.Hidden = true;
         op.ChildParameter.ActualName = ChildParameter.Name;
+        op.ChildParameter.Hidden = true;
       }
       foreach (var op in Operators.OfType<IStochasticOperator>()) {
         op.RandomParameter.ActualName = RandomParameter.Name;
+        op.RandomParameter.Hidden = true;
+      }
+      foreach (var op in Operators.OfType<IProblemInstanceAwareGQAPOperator>()) {
+        op.ProblemInstanceParameter.ActualName = ProblemInstanceParameter.Name;
+        op.ProblemInstanceParameter.Hidden = true;
       }
     }
@@ -88,5 +100,5 @@
     public override IOperation InstrumentedApply() {
       if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one crossover to choose from.");
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/LocalImprovers/ApproximateLocalSearch.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/LocalImprovers/ApproximateLocalSearch.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/LocalImprovers/ApproximateLocalSearch.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -35,52 +35,22 @@
   [Item("ApproximateLocalSearch", "The approximate local search is described in Mateus, G., Resende, M., and Silva, R. 2011. GRASP with path-relinking for the generalized quadratic assignment problem. Journal of Heuristics 17, Springer Netherlands, pp. 527-565.")]
   [StorableClass]
-  public class ApproximateLocalSearch : SingleSuccessorOperator, IDemandsAwareGQAPOperator, ICapacitiesAwareGQAPOperator,
-    IWeightsAwareGQAPOperator, IDistancesAwareGQAPOperator, IInstallationCostsAwareGQAPOperator,
-    ITransportationCostsAwareGQAPOperator, IExpectedRandomQualityAwareGQAPOperator,
-    IAssignmentAwareGQAPOperator, IQualityAwareGQAPOperator, IGQAPLocalImprovementOperator,
-    IEvaluatorAwareGQAPOperator, IStochasticOperator {
+  public class ApproximateLocalSearch : SingleSuccessorOperator, IProblemInstanceAwareGQAPOperator,
+    IQualityAwareGQAPOperator, IGQAPLocalImprovementOperator, IStochasticOperator {
     public IProblem Problem { get; set; }
     public Type ProblemType {
-      get { return typeof(GeneralizedQuadraticAssignmentProblem); }
+      get { return typeof(GQAP); }
     }
 
-    public ILookupParameter<DoubleArray> DemandsParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Demands"]; }
-    }
-    public ILookupParameter<DoubleArray> CapacitiesParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
-    }
-    public ILookupParameter<DoubleMatrix> WeightsParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["Weights"]; }
-    }
-    public ILookupParameter<DoubleMatrix> DistancesParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["Distances"]; }
-    }
-    public ILookupParameter<DoubleMatrix> InstallationCostsParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["InstallationCosts"]; }
-    }
-    public IValueLookupParameter<DoubleValue> TransportationCostsParameter {
-      get { return (IValueLookupParameter<DoubleValue>)Parameters["TransportationCosts"]; }
-    }
-    public IValueLookupParameter<DoubleValue> ExpectedRandomQualityParameter {
-      get { return (IValueLookupParameter<DoubleValue>)Parameters["ExpectedRandomQuality"]; }
+    public ILookupParameter<GQAPInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<GQAPInstance>)Parameters["ProblemInstance"]; }
     }
     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<Evaluation> EvaluationParameter {
+      get { return (ILookupParameter<Evaluation>)Parameters["Evaluation"]; }
     }
     public IValueLookupParameter<IntValue> MaximumIterationsParameter {
@@ -102,7 +72,4 @@
       get { return (ILookupParameter<ResultCollection>)Parameters["Results"]; }
     }
-    public IValueLookupParameter<IGQAPEvaluator> EvaluatorParameter {
-      get { return (IValueLookupParameter<IGQAPEvaluator>)Parameters["Evaluator"]; }
-    }
 
     [StorableConstructor]
@@ -111,17 +78,8 @@
     public ApproximateLocalSearch()
       : base() {
-      Parameters.Add(new LookupParameter<DoubleArray>("Demands", GeneralizedQuadraticAssignmentProblem.DemandsDescription));
-      Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("Weights", GeneralizedQuadraticAssignmentProblem.WeightsDescription));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("Distances", GeneralizedQuadraticAssignmentProblem.DistancesDescription));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("InstallationCosts", GeneralizedQuadraticAssignmentProblem.InstallationCostsDescription));
-      Parameters.Add(new ValueLookupParameter<DoubleValue>("TransportationCosts", GeneralizedQuadraticAssignmentProblem.TransportationCostsDescription));
-      Parameters.Add(new ValueLookupParameter<DoubleValue>("ExpectedRandomQuality", GeneralizedQuadraticAssignmentProblem.ExpectedRandomQualityDescription));
+      Parameters.Add(new LookupParameter<GQAPInstance>("ProblemInstance", GQAP.ProblemInstanceDescription));
       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<DoubleValue>("Quality", ""));
+      Parameters.Add(new LookupParameter<Evaluation>("Evaluation", GQAP.EvaluationDescription));
       Parameters.Add(new ValueLookupParameter<IntValue>("MaximumIterations", "The maximum number of iterations that should be performed."));
       Parameters.Add(new LookupParameter<IntValue>("EvaluatedSolutions", "The number of evaluated solution equivalents."));
@@ -130,5 +88,4 @@
       Parameters.Add(new ValueLookupParameter<PercentValue>("OneMoveProbability", "The probability for performing a 1-move, which is the opposite of performing a 2-move.", new PercentValue(.5)));
       Parameters.Add(new LookupParameter<ResultCollection>("Results", "The result collection that stores the results."));
-      Parameters.Add(new ValueLookupParameter<IGQAPEvaluator>("Evaluator", "The evaluator that is used to evaluate GQAP solutions."));
     }
 
@@ -145,27 +102,20 @@
     /// <param name="assignment">The equipment-location assignment vector.</param>
     /// <param name="quality">The solution quality.</param>
-    /// <param name="flowDistanceQuality">The quality regarding the flow-distance criteria.</param>
-    /// <param name="installationQuality">The quality regarding the installation costs.</param>
-    /// <param name="overbookedCapacity">The sum of the overbooked capacities relative to the capacity of each location.</param>
+    /// <param name="evaluation">The evaluation result of the solution.</param>
     /// <param name="maxCLS">The maximum number of candidates that should be found in each step.</param>
     /// <param name="maximumIterations">The maximum number of iterations that should be performed each time the candidate list is generated.</param>
-    /// <param name="weights">The weights matrix describes the flows between the equipments.</param>
-    /// <param name="distances">The distances matrix describes the distances between the locations at which the equipment can be installed.</param>
-    /// <param name="installationCosts">The installation costs matrix describes the installation costs of installing equipment i at location j</param>
-    /// <param name="demands">The demands vector describes the space requirements of the equipments.</param>
-    /// <param name="capacities">The capacities vector describes the available space at the locations.</param>
-    /// <param name="transportationCosts">The transportation cost represents the flow-unit per distance-unit cost factor. This value can also be set to 1 if these costs are factored into the weights matrix already.</param>
-    /// <param name="overbookedCapacityPenalty"></param>
+    /// <param name="problemInstance">The problem instance that contains the data.</param>
     /// <param name="oneMoveProbability">The probability for performing a 1-move, which is the opposite of performing a 2-move.</param>
     public static void Apply(IRandom random, IntegerVector assignment,
-      DoubleValue quality, DoubleValue flowDistanceQuality, DoubleValue installationQuality, DoubleValue overbookedCapacity,
-      IntValue maxCLS, IntValue maximumIterations,
-      DoubleMatrix weights, DoubleMatrix distances, DoubleMatrix installationCosts, DoubleArray demands, DoubleArray capacities,
-      DoubleValue transportationCosts, DoubleValue expectedRandomQuality, PercentValue oneMoveProbability,
-      IGQAPEvaluator evaluator) {
-
+      DoubleValue quality, ref Evaluation evaluation, IntValue maxCLS, IntValue maximumIterations,
+      GQAPInstance problemInstance, PercentValue oneMoveProbability) {
+      var capacities = problemInstance.Capacities;
+      var demands = problemInstance.Demands;
+      //var weights = problemInstance.Weights;
+      //var distances = problemInstance.Distances;
+      //var installationCosts = problemInstance.InstallationCosts;
       while (true) {
         int count = 0;
-        var CLS = new List<Tuple<NMove, double, double, double, double>>();
+        var CLS = new List<Tuple<NMove, double, Evaluation>>();
         double sum = 0.0;
         do {
@@ -174,13 +124,10 @@
             move = StochasticNMoveSingleMoveGenerator.GenerateExactlyN(random, assignment, 1, capacities);
           else move = StochasticNMoveSingleMoveGenerator.GenerateExactlyN(random, assignment, 2, capacities);
+          
+          var moveEval = GQAPNMoveEvaluator.Evaluate(move, assignment, evaluation, problemInstance);
+          double moveQuality = problemInstance.ToSingleObjective(moveEval);
 
-          double moveFlowDistanceQuality, moveInstallationQuality, moveOverbookedCapacity;
-          GQAPNMoveEvaluator.Evaluate(move, assignment, weights, distances, installationCosts,
-            demands, capacities, evaluator, out moveFlowDistanceQuality, out moveInstallationQuality, out moveOverbookedCapacity);
-          double moveQuality = evaluator.GetFitness(moveFlowDistanceQuality, moveInstallationQuality, moveOverbookedCapacity,
-            transportationCosts.Value, expectedRandomQuality.Value);
-
-          if (moveOverbookedCapacity <= 0.0 && moveQuality < 0.0) {
-            CLS.Add(Tuple.Create(move, moveQuality, moveFlowDistanceQuality, moveInstallationQuality, moveOverbookedCapacity));
+          if (moveEval.ExcessDemand <= 0.0 && moveQuality < 0.0) {
+            CLS.Add(Tuple.Create(move, moveQuality, moveEval));
             sum += 1.0 / moveQuality;
           }
@@ -202,7 +149,5 @@
           NMoveMaker.Apply(assignment, selected.Item1);
           quality.Value += selected.Item2;
-          flowDistanceQuality.Value += selected.Item3;
-          installationQuality.Value += selected.Item4;
-          overbookedCapacity.Value += selected.Item5;
+          evaluation = selected.Item3;
         }
       }
@@ -210,19 +155,14 @@
 
     public override IOperation Apply() {
+      var evaluation = EvaluationParameter.ActualValue;
       Apply(RandomParameter.ActualValue,
         AssignmentParameter.ActualValue,
         QualityParameter.ActualValue,
-        FlowDistanceQualityParameter.ActualValue,
-        InstallationQualityParameter.ActualValue,
-        OverbookedCapacityParameter.ActualValue,
+        ref evaluation,
         MaximumCandidateListSizeParameter.ActualValue,
         MaximumIterationsParameter.ActualValue,
-        WeightsParameter.ActualValue, DistancesParameter.ActualValue,
-        InstallationCostsParameter.ActualValue,
-        DemandsParameter.ActualValue, CapacitiesParameter.ActualValue,
-        TransportationCostsParameter.ActualValue,
-        ExpectedRandomQualityParameter.ActualValue,
-        OneMoveProbabilityParameter.ActualValue,
-        EvaluatorParameter.ActualValue);
+        ProblemInstanceParameter.ActualValue,
+        OneMoveProbabilityParameter.ActualValue);
+      EvaluationParameter.ActualValue = evaluation;
       return base.Apply();
     }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/DemandEquivalentSwapEquipmentManipluator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/DemandEquivalentSwapEquipmentManipluator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/DemandEquivalentSwapEquipmentManipluator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -27,5 +27,4 @@
 using HeuristicLab.Data;
 using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Random;
@@ -35,12 +34,5 @@
   [Item("DemandEquivalentSwapEquipmentManipluator", "Swaps equipment X from location A with as much equipments from location B that the demand of X is less than or equal to the demand of the swapped equipments in B.")]
   [StorableClass]
-  public class DemandEquivalentSwapEquipmentManipluator : GQAPManipulator, IDemandsAwareGQAPOperator, ICapacitiesAwareGQAPOperator {
-
-    public ILookupParameter<DoubleArray> DemandsParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Demands"]; }
-    }
-    public ILookupParameter<DoubleArray> CapacitiesParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
-    }
+  public class DemandEquivalentSwapEquipmentManipluator : GQAPManipulator {
 
     [StorableConstructor]
@@ -49,6 +41,4 @@
     public DemandEquivalentSwapEquipmentManipluator()
       : base() {
-      Parameters.Add(new LookupParameter<DoubleArray>("Demands", GeneralizedQuadraticAssignmentProblem.DemandsDescription));
-      Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription));
     }
 
@@ -85,6 +75,6 @@
     }
 
-    protected override void Manipulate(IRandom random, IntegerVector vector) {
-      Apply(random, vector, CapacitiesParameter.ActualValue, DemandsParameter.ActualValue);
+    protected override void Manipulate(IRandom random, IntegerVector vector, GQAPInstance problemInstance) {
+      Apply(random, vector, problemInstance.Capacities, problemInstance.Demands);
     }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/GQAPManipulator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/GQAPManipulator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/GQAPManipulator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -31,5 +31,5 @@
   [Item("GQAPManipulator", "A base class for operators that manipulate assignment vectors of the GeneralizedQuadraticAssignment problems.")]
   [StorableClass]
-  public abstract class GQAPManipulator : SingleSuccessorOperator, IGQAPManipulator, IAssignmentAwareGQAPOperator, IStochasticOperator {
+  public abstract class GQAPManipulator : SingleSuccessorOperator, IGQAPManipulator, IProblemInstanceAwareGQAPOperator, IStochasticOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -39,4 +39,8 @@
       get { return (ILookupParameter<IntegerVector>)Parameters["Assignment"]; }
     }
+    public ILookupParameter<GQAPInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<GQAPInstance>)Parameters["ProblemInstance"]; }
+    }
+
     public ILookupParameter<IRandom> RandomParameter {
       get { return (LookupParameter<IRandom>)Parameters["Random"]; }
@@ -49,13 +53,14 @@
       : base() {
       Parameters.Add(new LookupParameter<IntegerVector>("Assignment", GQAPSolutionCreator.AssignmentDescription));
+      Parameters.Add(new LookupParameter<GQAPInstance>("ProblemInstance", GQAP.ProblemInstanceDescription));
       Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
     }
 
     public sealed override IOperation Apply() {
-      Manipulate(RandomParameter.ActualValue, AssignmentParameter.ActualValue);
+      Manipulate(RandomParameter.ActualValue, AssignmentParameter.ActualValue, ProblemInstanceParameter.ActualValue);
       return base.Apply();
     }
 
-    protected abstract void Manipulate(IRandom random, IntegerVector integerVector);
+    protected abstract void Manipulate(IRandom random, IntegerVector integerVector, GQAPInstance problemInstance);
   }
 }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/MultiGQAPManipulator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/MultiGQAPManipulator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/MultiGQAPManipulator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -35,5 +35,6 @@
   [Item("MultiGQAPManipulator", "Randomly selects and applies one of its manipulators every time it is called.")]
   [StorableClass]
-  public class MultiGQAPManipulator : StochasticMultiBranch<IGQAPManipulator>, IGQAPManipulator {
+  public class MultiGQAPManipulator : StochasticMultiBranch<IGQAPManipulator>, IGQAPManipulator,
+    IProblemInstanceAwareGQAPOperator {
     public override bool CanChangeName {
       get { return false; }
@@ -46,4 +47,7 @@
       get { return (ILookupParameter<IntegerVector>)Parameters["Assignment"]; }
     }
+    public ILookupParameter<GQAPInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<GQAPInstance>)Parameters["ProblemInstance"]; }
+    }
 
     [StorableConstructor]
@@ -53,4 +57,6 @@
       : base() {
       Parameters.Add(new LookupParameter<IntegerVector>("Assignment", GQAPSolutionCreator.AssignmentDescription));
+      Parameters.Add(new LookupParameter<GQAPInstance>("ProblemInstance", GQAP.ProblemInstanceDescription));
+
       foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IGQAPManipulator))) {
         if (!typeof(MultiOperator<IGQAPManipulator>).IsAssignableFrom(type))
@@ -73,13 +79,21 @@
 
     private void Parameterize() {
-      foreach (var op in Operators.OfType<IGQAPManipulator>())
+      foreach (var op in Operators.OfType<IGQAPManipulator>()) {
         op.AssignmentParameter.ActualName = AssignmentParameter.Name;
-      foreach (var op in Operators.OfType<IStochasticOperator>())
+        op.AssignmentParameter.Hidden = true;
+      }
+      foreach (var op in Operators.OfType<IStochasticOperator>()) {
         op.RandomParameter.ActualName = RandomParameter.Name;
+        op.RandomParameter.Hidden = true;
+      }
+      foreach (var op in Operators.OfType<IProblemInstanceAwareGQAPOperator>()) {
+        op.ProblemInstanceParameter.ActualName = ProblemInstanceParameter.Name;
+        op.ProblemInstanceParameter.Hidden = true;
+      }
     }
 
     public override IOperation InstrumentedApply() {
       if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one manipulator to choose from.");
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/RelocateEquipmentManipluator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/RelocateEquipmentManipluator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/RelocateEquipmentManipluator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -27,5 +27,4 @@
 using HeuristicLab.Data;
 using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Random;
@@ -35,13 +34,6 @@
   [Item("RelocateEquipmentManipluator", "Relocates a random equipment from an overstuffed location to a random one with space or a random equipment if constraints are satisfied.")]
   [StorableClass]
-  public class RelocateEquipmentManipluator : GQAPManipulator, IDemandsAwareGQAPOperator, ICapacitiesAwareGQAPOperator {
-
-    public ILookupParameter<DoubleArray> CapacitiesParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
-    }
-    public ILookupParameter<DoubleArray> DemandsParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Demands"]; }
-    }
-
+  public class RelocateEquipmentManipluator : GQAPManipulator {
+    
     [StorableConstructor]
     protected RelocateEquipmentManipluator(bool deserializing) : base(deserializing) { }
@@ -49,6 +41,4 @@
     public RelocateEquipmentManipluator()
       : base() {
-      Parameters.Add(new LookupParameter<DoubleArray>("Demands", GeneralizedQuadraticAssignmentProblem.DemandsDescription));
-      Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription));
     }
 
@@ -92,6 +82,6 @@
     }
 
-    protected override void Manipulate(IRandom random, IntegerVector vector) {
-      Apply(random, vector, CapacitiesParameter.ActualValue, DemandsParameter.ActualValue);
+    protected override void Manipulate(IRandom random, IntegerVector vector, GQAPInstance problemInstance) {
+      Apply(random, vector, problemInstance.Capacities, problemInstance.Demands);
     }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/SwapEquipmentManipluator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/SwapEquipmentManipluator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/SwapEquipmentManipluator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -56,5 +56,5 @@
     }
 
-    protected override void Manipulate(IRandom random, IntegerVector vector) {
+    protected override void Manipulate(IRandom random, IntegerVector vector, GQAPInstance problemInstance) {
       Apply(random, vector);
     }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/SwapLocationManipulator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/SwapLocationManipulator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Manipulators/SwapLocationManipulator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -24,7 +24,5 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -33,10 +31,6 @@
   [Item("SwapLocationManipluator", "Swaps two locations by exchanging all equipments between the locations.")]
   [StorableClass]
-  public class SwapLocationManipluator : GQAPManipulator, ICapacitiesAwareGQAPOperator {
-
-    public ILookupParameter<DoubleArray> CapacitiesParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
-    }
-
+  public class SwapLocationManipluator : GQAPManipulator {
+    
     [StorableConstructor]
     protected SwapLocationManipluator(bool deserializing) : base(deserializing) { }
@@ -44,5 +38,4 @@
     public SwapLocationManipluator()
       : base() {
-      Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription));
     }
 
@@ -72,6 +65,6 @@
     }
 
-    protected override void Manipulate(IRandom random, IntegerVector vector) {
-      Apply(random, vector, CapacitiesParameter.ActualValue.Length);
+    protected override void Manipulate(IRandom random, IntegerVector vector, GQAPInstance problemInstance) {
+      Apply(random, vector, problemInstance.Capacities.Length);
     }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/PopulationReducers/GQAPQualitySimilarityReducer.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/PopulationReducers/GQAPQualitySimilarityReducer.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/PopulationReducers/GQAPQualitySimilarityReducer.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -34,22 +34,13 @@
   [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 class GQAPQualitySimilarityReducer : SingleSuccessorOperator, 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<Evaluation> EvaluationParameter {
+      get { return (ILookupParameter<Evaluation>)Parameters["Evaluation"]; }
     }
     public ILookupParameter<IntValue> MinimumPopulationSizeParameter {
@@ -66,9 +57,6 @@
       : 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<DoubleValue>("Quality", ""));
+      Parameters.Add(new LookupParameter<Evaluation>("Evaluation", GQAP.EvaluationDescription));
       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."));
@@ -83,5 +71,4 @@
       string qualityName = QualityParameter.TranslatedName;
       int populationSize = MaximumPopulationSizeParameter.ActualValue.Value;
-      bool maximization = MaximizationParameter.ActualValue.Value;
 
       IScope remaining = ExecutionContext.Scope.SubScopes[0];
@@ -108,6 +95,5 @@
         } 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));
+                                      .Where(x => x.V.Quality > candidate.Quality);
           if (replacement.Any()) {
             replacement.OrderBy(x => similarities[x.Index]).ToArray();
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Shakers/NMoveShakingOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Shakers/NMoveShakingOperator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Shakers/NMoveShakingOperator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,11 +32,12 @@
   [Item("NMoveShakingOperator", "Performs a number of shaking operations that increase in strength.")]
   [StorableClass]
-  public class NMoveShakingOperator : SingleSuccessorOperator, IAssignmentAwareGQAPOperator, ICapacitiesAwareGQAPOperator, IMultiNeighborhoodShakingOperator, IStochasticOperator {
+  public class NMoveShakingOperator : SingleSuccessorOperator, IProblemInstanceAwareGQAPOperator, IMultiNeighborhoodShakingOperator, IStochasticOperator {
 
+
+    public ILookupParameter<GQAPInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<GQAPInstance>)Parameters["ProblemInstance"]; }
+    }
     public ILookupParameter<IntegerVector> AssignmentParameter {
       get { return (ILookupParameter<IntegerVector>)Parameters["Assignment"]; }
-    }
-    public ILookupParameter<DoubleArray> CapacitiesParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
     }
     public IValueLookupParameter<IntValue> CurrentNeighborhoodIndexParameter {
@@ -54,6 +55,6 @@
     protected NMoveShakingOperator(NMoveShakingOperator original, Cloner cloner) : base(original, cloner) { }
     public NMoveShakingOperator() {
+      Parameters.Add(new LookupParameter<GQAPInstance>("ProblemInstance", GQAP.ProblemInstanceDescription));
       Parameters.Add(new LookupParameter<IntegerVector>("Assignment", GQAPSolutionCreator.AssignmentDescription));
-      Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription));
       Parameters.Add(new ValueLookupParameter<IntValue>("CurrentNeighborhoodIndex", "The index of the operator that should be applied (k)."));
       Parameters.Add(new LookupParameter<IntValue>("NeighborhoodCount", "The number of operators that are available."));
@@ -68,5 +69,5 @@
       var random = RandomParameter.ActualValue;
       var assignment = AssignmentParameter.ActualValue;
-      var capacities = CapacitiesParameter.ActualValue;
+      var capacities = ProblemInstanceParameter.ActualValue.Capacities;
 
       if (NeighborhoodCountParameter.ActualValue == null)
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Plugin.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Plugin.cs.frame	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Plugin.cs.frame	(revision 15504)
@@ -37,5 +37,4 @@
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
-  [PluginDependency("HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common", "3.3")]
   [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
   [PluginDependency("HeuristicLab.Random", "3.3")]
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Properties/AssemblyInfo.cs.frame	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Properties/AssemblyInfo.cs.frame	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("HEAL")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2011 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2017 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
@@ -55,3 +55,3 @@
 // [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.6.$WCREV$")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/GQAPSolutionCreator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/GQAPSolutionCreator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/GQAPSolutionCreator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -31,5 +31,5 @@
   [Item("GQAPSolutionCreator", "Base class for solution creators of the Generalized Quadratic Assignment Problem.")]
   [StorableClass]
-  public abstract class GQAPSolutionCreator : SingleSuccessorOperator, IDemandsAwareGQAPOperator, ICapacitiesAwareGQAPOperator, IGQAPSolutionCreator {
+  public abstract class GQAPSolutionCreator : SingleSuccessorOperator, IProblemInstanceAwareGQAPOperator, IGQAPSolutionCreator {
 
     #region Parameter Descriptions
@@ -37,12 +37,15 @@
     #endregion
 
-    public ILookupParameter<IntegerVector> AssignmentParameter {
-      get { return (ILookupParameter<IntegerVector>)Parameters["Assignment"]; }
+    public ILookupParameter<IntegerVector> IntegerVectorParameter {
+      get { return (ILookupParameter<IntegerVector>)Parameters["IntegerVector"]; }
     }
-    public ILookupParameter<DoubleArray> DemandsParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Demands"]; }
+    public ILookupParameter<GQAPInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<GQAPInstance>)Parameters["ProblemInstance"]; }
     }
-    public ILookupParameter<DoubleArray> CapacitiesParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
+    public IValueLookupParameter<IntValue> LengthParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["Length"]; }
+    }
+    public IValueLookupParameter<IntMatrix> BoundsParameter {
+      get { return (IValueLookupParameter<IntMatrix>)Parameters["Bounds"]; }
     }
 
@@ -53,15 +56,16 @@
     public GQAPSolutionCreator()
       : base() {
-      Parameters.Add(new LookupParameter<IntegerVector>("Assignment", AssignmentDescription));
-      Parameters.Add(new LookupParameter<DoubleArray>("Demands", GeneralizedQuadraticAssignmentProblem.DemandsDescription));
-      Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription));
+      Parameters.Add(new LookupParameter<IntegerVector>("IntegerVector", AssignmentDescription));
+      Parameters.Add(new LookupParameter<GQAPInstance>("ProblemInstance", GQAP.ProblemInstanceDescription));
+      Parameters.Add(new ValueLookupParameter<IntValue>("Length", "The length of the vector.") { Hidden = true });
+      Parameters.Add(new ValueLookupParameter<IntMatrix>("Bounds", "") { Hidden = true });
     }
 
     public override IOperation Apply() {
-      AssignmentParameter.ActualValue = CreateSolution(DemandsParameter.ActualValue, CapacitiesParameter.ActualValue);
+      IntegerVectorParameter.ActualValue = CreateSolution(ProblemInstanceParameter.ActualValue);
       return base.Apply();
     }
 
-    protected abstract IntegerVector CreateSolution(DoubleArray demands, DoubleArray capacities);
+    protected abstract IntegerVector CreateSolution(GQAPInstance problemInstance);
   }
 }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/GQAPStochasticSolutionCreator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/GQAPStochasticSolutionCreator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/GQAPStochasticSolutionCreator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -22,5 +22,4 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Optimization;
@@ -46,9 +45,9 @@
     }
 
-    protected sealed override IntegerVector CreateSolution(DoubleArray demands, DoubleArray capacities) {
-      return CreateRandomSolution(RandomParameter.ActualValue, demands, capacities);
+    protected sealed override IntegerVector CreateSolution(GQAPInstance problemInstance) {
+      return CreateRandomSolution(RandomParameter.ActualValue, problemInstance);
     }
 
-    protected abstract IntegerVector CreateRandomSolution(IRandom random, DoubleArray demands, DoubleArray capacities);
+    protected abstract IntegerVector CreateRandomSolution(IRandom random, GQAPInstance problemInstance);
   }
 }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/GreedyRandomizedSolutionCreator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/GreedyRandomizedSolutionCreator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/GreedyRandomizedSolutionCreator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -35,6 +35,5 @@
   [Item("GreedyRandomizedSolutionCreator", "Creates a solution according to the procedure described in Mateus, G., Resende, M., and Silva, R. 2011. GRASP with path-relinking for the generalized quadratic assignment problem. Journal of Heuristics 17, Springer Netherlands, pp. 527-565.")]
   [StorableClass]
-  public class GreedyRandomizedSolutionCreator : GQAPStochasticSolutionCreator,
-    IEvaluatorAwareGQAPOperator {
+  public class GreedyRandomizedSolutionCreator : GQAPStochasticSolutionCreator {
 
     public IValueLookupParameter<IntValue> MaximumTriesParameter {
@@ -43,7 +42,4 @@
     public IValueLookupParameter<BoolValue> CreateMostFeasibleSolutionParameter {
       get { return (IValueLookupParameter<BoolValue>)Parameters["CreateMostFeasibleSolution"]; }
-    }
-    public IValueLookupParameter<IGQAPEvaluator> EvaluatorParameter {
-      get { return (IValueLookupParameter<IGQAPEvaluator>)Parameters["Evaluator"]; }
     }
 
@@ -56,5 +52,4 @@
       Parameters.Add(new ValueLookupParameter<IntValue>("MaximumTries", "The maximum number of tries to create a feasible solution after which an exception is thrown. If it is set to 0 or a negative value there will be an infinite number of attempts.", new IntValue(100000)));
       Parameters.Add(new ValueLookupParameter<BoolValue>("CreateMostFeasibleSolution", "If this is set to true the operator will always succeed, and outputs the solution with the least violation instead of throwing an exception.", new BoolValue(false)));
-      Parameters.Add(new ValueLookupParameter<IGQAPEvaluator>("Evaluator", "The evaluator that is used to evaluate GQAP solutions."));
     }
 
@@ -63,7 +58,8 @@
     }
 
-    public static IntegerVector CreateSolution(IRandom random, DoubleArray demands, DoubleArray capacities,
-      IGQAPEvaluator evaluator,
+    public static IntegerVector CreateSolution(IRandom random, GQAPInstance problemInstance,
       int maximumTries, bool createMostFeasibleSolution, CancellationToken cancelToken) {
+      var demands = problemInstance.Demands;
+      var capacities = problemInstance.Capacities;
       int tries = 0;
       var assignment = new Dictionary<int, int>(demands.Length);
@@ -125,5 +121,5 @@
             slack[l] -= demands[f];
           }
-          double violation = evaluator.EvaluateOverbooking(slack, capacities);
+          double violation = slack.Select(x => x < 0 ? -x : 0).Sum();
           if (violation < minViolation) {
             bestAssignment = assignment;
@@ -139,7 +135,6 @@
     }
 
-    protected override IntegerVector CreateRandomSolution(IRandom random, DoubleArray demands, DoubleArray capacities) {
-      return CreateSolution(random, demands, capacities,
-        EvaluatorParameter.ActualValue,
+    protected override IntegerVector CreateRandomSolution(IRandom random, GQAPInstance problemInstance) {
+      return CreateSolution(random, problemInstance,
         MaximumTriesParameter.ActualValue.Value,
         CreateMostFeasibleSolutionParameter.ActualValue.Value,
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/RandomButFeasibleSolutionCreator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/RandomButFeasibleSolutionCreator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/RandomButFeasibleSolutionCreator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -35,6 +35,5 @@
   [Item("RandomButFeasibleSolutionCreator", "Creates a random, but feasible solution to the Generalized Quadratic Assignment Problem.")]
   [StorableClass]
-  public class RandomFeasibleSolutionCreator : GQAPStochasticSolutionCreator,
-    IEvaluatorAwareGQAPOperator {
+  public class RandomFeasibleSolutionCreator : GQAPStochasticSolutionCreator {
 
     public IValueLookupParameter<IntValue> MaximumTriesParameter {
@@ -43,7 +42,4 @@
     public IValueLookupParameter<BoolValue> CreateMostFeasibleSolutionParameter {
       get { return (IValueLookupParameter<BoolValue>)Parameters["CreateMostFeasibleSolution"]; }
-    }
-    public IValueLookupParameter<IGQAPEvaluator> EvaluatorParameter {
-      get { return (IValueLookupParameter<IGQAPEvaluator>)Parameters["Evaluator"]; }
     }
 
@@ -55,5 +51,4 @@
       Parameters.Add(new ValueLookupParameter<IntValue>("MaximumTries", "The maximum number of tries to create a feasible solution after which an exception is thrown. If it is set to 0 or a negative value there will be an infinite number of attempts.", new IntValue(100000)));
       Parameters.Add(new ValueLookupParameter<BoolValue>("CreateMostFeasibleSolution", "If this is set to true the operator will always succeed, and outputs the solution with the least violation instead of throwing an exception.", new BoolValue(false)));
-      Parameters.Add(new ValueLookupParameter<IGQAPEvaluator>("Evaluator", "The evaluator that is used to evaluate GQAP solutions."));
     }
 
@@ -62,7 +57,8 @@
     }
 
-    public static IntegerVector CreateSolution(IRandom random, DoubleArray demands,
-      DoubleArray capacities, IGQAPEvaluator evaluator,
+    public static IntegerVector CreateSolution(IRandom random, GQAPInstance problemInstance,
       int maximumTries, bool createMostFeasibleSolution, CancellationToken cancel) {
+      var capacities = problemInstance.Capacities;
+      var demands = problemInstance.Demands;
       IntegerVector result = null;
       bool isFeasible = false;
@@ -87,5 +83,5 @@
           slack[assignment[equipment]] -= demands[equipment];
         }
-        double violation = evaluator.EvaluateOverbooking(slack, capacities);
+        double violation = slack.Select(x => x < 0 ? -x : 0).Sum();
         isFeasible = violation == 0;
         if (isFeasible || violation < minViolation) {
@@ -97,7 +93,6 @@
     }
 
-    protected override IntegerVector CreateRandomSolution(IRandom random, DoubleArray demands, DoubleArray capacities) {
-      return CreateSolution(random, demands, capacities,
-        EvaluatorParameter.ActualValue,
+    protected override IntegerVector CreateRandomSolution(IRandom random, GQAPInstance problemInstance) {
+      return CreateSolution(random, problemInstance,
         MaximumTriesParameter.ActualValue.Value,
         CreateMostFeasibleSolutionParameter.ActualValue.Value,
Index: anches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/RandomSolutionCreator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/RandomSolutionCreator.cs	(revision 15503)
+++ 	(revision )
@@ -1,50 +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.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  [Item("RandomSolutionCreator", "Creates a completely random solution to the Generalized Quadratic Assignment Problem.")]
-  [StorableClass]
-  public class RandomSolutionCreator : GQAPStochasticSolutionCreator {
-
-    [StorableConstructor]
-    protected RandomSolutionCreator(bool deserializing) : base(deserializing) { }
-    protected RandomSolutionCreator(RandomSolutionCreator original, Cloner cloner) : base(original, cloner) { }
-    public RandomSolutionCreator() : base() { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new RandomSolutionCreator(this, cloner);
-    }
-
-    public static IntegerVector CreateSolution(IRandom random, DoubleArray demands, DoubleArray capacities) {
-      return UniformRandomIntegerVectorCreator.Apply(random, demands.Length, new IntMatrix(new int[,] {  { 0 , capacities.Length }}));
-    }
-
-    protected override IntegerVector CreateRandomSolution(IRandom random, DoubleArray demands, DoubleArray capacities) {
-      return CreateSolution(random, demands, capacities);
-    }
-  }
-}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/SlackMinimizationSolutionCreator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/SlackMinimizationSolutionCreator.cs	(revision 15503)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/SolutionCreators/SlackMinimizationSolutionCreator.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -35,6 +35,5 @@
   [Item("SlackMinimizationSolutionCreator", "A heuristic that creates a solution to the Generalized Quadratic Assignment Problem by minimizing the amount of slack.")]
   [StorableClass]
-  public class SlackMinimizationSolutionCreator : GQAPStochasticSolutionCreator,
-    IEvaluatorAwareGQAPOperator {
+  public class SlackMinimizationSolutionCreator : GQAPStochasticSolutionCreator {
 
     public IValueLookupParameter<IntValue> MaximumTriesParameter {
@@ -50,7 +49,4 @@
       get { return (IValueLookupParameter<IntValue>)Parameters["RandomWalkLength"]; }
     }
-    public IValueLookupParameter<IGQAPEvaluator> EvaluatorParameter {
-      get { return (IValueLookupParameter<IGQAPEvaluator>)Parameters["Evaluator"]; }
-    }
 
     [StorableConstructor]
@@ -63,5 +59,4 @@
       Parameters.Add(new ValueLookupParameter<IntValue>("Depth", "How deep the algorithm should look forward.", new IntValue(3)));
       Parameters.Add(new ValueLookupParameter<IntValue>("RandomWalkLength", "The length of the random walk in the feasible region that is used to diversify the found assignments.", new IntValue(10)));
-      Parameters.Add(new ValueLookupParameter<IGQAPEvaluator>("Evaluator", "The evaluator that is used to evaluate GQAP solutions."));
     }
 
@@ -70,17 +65,9 @@
     }
 
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      if (!Parameters.ContainsKey("Depth")) {
-        Parameters.Add(new ValueLookupParameter<IntValue>("Depth", "How deep the algorithm should look forward.", new IntValue(3)));
-      }
-      if (!Parameters.ContainsKey("RandomWalkLength")) {
-        Parameters.Add(new ValueLookupParameter<IntValue>("RandomWalkLength", "The length of the random walk in the feasible region that is used to diversify the found assignments.", new IntValue(10)));
-      }
-    }
+    public static IntegerVector CreateSolution(IRandom random, GQAPInstance problemInstance,
+      int depth, int maximumTries, bool createMostFeasibleSolution, int randomWalkLength, CancellationToken cancel) {
+      var capacities = problemInstance.Capacities;
+      var demands = problemInstance.Demands;
 
-    public static IntegerVector CreateSolution(IRandom random, DoubleArray demands,
-      DoubleArray capacities, IGQAPEvaluator evaluator,
-      int depth, int maximumTries, bool createMostFeasibleSolution, int randomWalkLength, CancellationToken cancel) {
       IntegerVector result = null;
       bool isFeasible = false;
@@ -125,5 +112,5 @@
           }
         } else RandomFeasibleWalk(random, assignment, demands, slack, randomWalkLength);
-        double violation = evaluator.EvaluateOverbooking(slack, capacities);
+        double violation = slack.Select(x => x < 0 ? -x : 0).Sum();
         isFeasible = violation == 0;
         if (isFeasible || violation < minViolation) {
@@ -182,7 +169,6 @@
     }
 
-    protected override IntegerVector CreateRandomSolution(IRandom random, DoubleArray demands, DoubleArray capacities) {
-      return CreateSolution(random, demands, capacities,
-        EvaluatorParameter.ActualValue,
+    protected override IntegerVector CreateRandomSolution(IRandom random, GQAPInstance problemInstance) {
+      return CreateSolution(random, problemInstance,
         DepthParameter.ActualValue.Value,
         MaximumTriesParameter.ActualValue.Value,
Index: /branches/GeneralizedQAP/UnitTests/CordeauCrossoverTest.cs
===================================================================
--- /branches/GeneralizedQAP/UnitTests/CordeauCrossoverTest.cs	(revision 15503)
+++ /branches/GeneralizedQAP/UnitTests/CordeauCrossoverTest.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -35,5 +35,5 @@
       var provider = new CordeauGQAPInstanceProvider();
       var instance = provider.LoadData(provider.GetDataDescriptors().Single(x => x.Name == "20-15-75"));
-      var gqap = new GeneralizedQuadraticAssignmentProblem();
+      var gqap = new GQAP();
       gqap.Load(instance);
       var evaluator = gqap.Evaluator;
@@ -41,14 +41,14 @@
       for (int i = 0; i < 100; i++) {
         var random = new MersenneTwister((uint)i);
-        var parent1 = GreedyRandomizedSolutionCreator.CreateSolution(random, gqap.Demands, gqap.Capacities, gqap.Evaluator, 100, true, CancellationToken.None);
-        var parent2 = GreedyRandomizedSolutionCreator.CreateSolution(random, gqap.Demands, gqap.Capacities, gqap.Evaluator, 100, true, CancellationToken.None);
+        var parent1 = GreedyRandomizedSolutionCreator.CreateSolution(random, gqap.ProblemInstance, 100, true, CancellationToken.None);
+        var parent2 = GreedyRandomizedSolutionCreator.CreateSolution(random, gqap.ProblemInstance, 100, true, CancellationToken.None);
 
         try {
           CordeauCrossover.Apply(random, gqap.Maximization,
             parent1,
-            new DoubleValue(gqap.Evaluator.Evaluate(parent1, gqap.Weights, gqap.Distances, gqap.InstallationCosts, gqap.Demands, gqap.Capacities, gqap.TransportationCosts, gqap.ExpectedRandomQuality)),
+            new DoubleValue(gqap.Evaluate(parent1)),
             parent2,
-            new DoubleValue(gqap.Evaluator.Evaluate(parent2, gqap.Weights, gqap.Distances, gqap.InstallationCosts, gqap.Demands, gqap.Capacities, gqap.TransportationCosts, gqap.ExpectedRandomQuality)),
-            gqap.Weights, gqap.Distances, gqap.InstallationCosts, gqap.Demands, gqap.Capacities, gqap.TransportationCosts, gqap.ExpectedRandomQuality, gqap.Evaluator,
+            new DoubleValue(gqap.Evaluate(parent2)),
+            gqap.ProblemInstance,
             new IntValue(0));
         } catch {
Index: /branches/GeneralizedQAP/UnitTests/GQAPNMoveEvaluatorTest.cs
===================================================================
--- /branches/GeneralizedQAP/UnitTests/GQAPNMoveEvaluatorTest.cs	(revision 15503)
+++ /branches/GeneralizedQAP/UnitTests/GQAPNMoveEvaluatorTest.cs	(revision 15504)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -35,9 +35,5 @@
   public class GQAPNMoveEvaluatorTest {
     private const int Equipments = 10, Locations = 5;
-    private static DoubleMatrix symmetricWeights, asymmetricWeights, nonZeroDiagonalWeights;
-    private static DoubleMatrix symmetricDistances, asymmetricDistances, nonZeroDiagonalDistances;
-    private static DoubleMatrix installationCosts;
-    private static DoubleArray demands, capacities;
-    private static double transportationCosts, overbookedCapacityPenalty;
+    private static GQAPInstance symmetricInstance, asymmetricInstance, nonZeroDiagonalInstance;
     private static IntegerVector assignment;
     private static MersenneTwister random;
@@ -58,10 +54,10 @@
     public static void MyClassInitialize(TestContext testContext) {
       random = new MersenneTwister();
-      symmetricDistances = new DoubleMatrix(Locations, Locations);
-      symmetricWeights = new DoubleMatrix(Equipments, Equipments);
-      asymmetricDistances = new DoubleMatrix(Locations, Locations);
-      asymmetricWeights = new DoubleMatrix(Equipments, Equipments);
-      nonZeroDiagonalDistances = new DoubleMatrix(Locations, Locations);
-      nonZeroDiagonalWeights = new DoubleMatrix(Equipments, Equipments);
+      var symmetricDistances = new DoubleMatrix(Locations, Locations);
+      var symmetricWeights = new DoubleMatrix(Equipments, Equipments);
+      var asymmetricDistances = new DoubleMatrix(Locations, Locations);
+      var asymmetricWeights = new DoubleMatrix(Equipments, Equipments);
+      var nonZeroDiagonalDistances = new DoubleMatrix(Locations, Locations);
+      var nonZeroDiagonalWeights = new DoubleMatrix(Equipments, Equipments);
       for (int i = 0; i < Equipments - 1; i++) {
         for (int j = i + 1; j < Equipments; j++) {
@@ -86,5 +82,5 @@
         nonZeroDiagonalDistances[i, i] = random.Next(Locations * 100);
       }
-      installationCosts = new DoubleMatrix(Equipments, Locations);
+      var installationCosts = new DoubleMatrix(Equipments, Locations);
       for (int i = 0; i < Equipments; i++) {
         for (int j = 0; j < Locations; j++) {
@@ -92,9 +88,9 @@
         }
       }
-      demands = new DoubleArray(Equipments);
+      var demands = new DoubleArray(Equipments);
       for (int i = 0; i < Equipments; i++) {
         demands[i] = random.Next(1, 10);
       }
-      capacities = new DoubleArray(Locations);
+      var capacities = new DoubleArray(Locations);
       for (int j = 0; j < Locations; j++) {
         capacities[j] = random.Next(1, 10) * ((double)Equipments / (double)Locations) * 1.5;
@@ -107,7 +103,35 @@
         nonZeroDiagonalWeights[index, index] = random.Next(1, Equipments * 100);
 
-      transportationCosts = random.NextDouble() * 10;
-      overbookedCapacityPenalty = 1000 * random.NextDouble() + 100;
+      var transportationCosts = random.NextDouble() * 10;
+      var overbookedCapacityPenalty = 1000 * random.NextDouble() + 100;
       assignment = new IntegerVector(Equipments, random, 0, Locations);
+
+      symmetricInstance = new GQAPInstance() {
+        Capacities = capacities,
+        Demands = demands,
+        InstallationCosts = installationCosts,
+        PenaltyLevel = overbookedCapacityPenalty,
+        TransportationCosts = transportationCosts,
+        Weights = symmetricWeights,
+        Distances = symmetricDistances
+      };
+      asymmetricInstance = new GQAPInstance() {
+        Capacities = capacities,
+        Demands = demands,
+        InstallationCosts = installationCosts,
+        PenaltyLevel = overbookedCapacityPenalty,
+        TransportationCosts = transportationCosts,
+        Weights = asymmetricWeights,
+        Distances = asymmetricDistances
+      };
+      nonZeroDiagonalInstance = new GQAPInstance() {
+        Capacities = capacities,
+        Demands = demands,
+        InstallationCosts = installationCosts,
+        PenaltyLevel = overbookedCapacityPenalty,
+        TransportationCosts = transportationCosts,
+        Weights = nonZeroDiagonalWeights,
+        Distances = nonZeroDiagonalDistances
+      };
     }
     #endregion
@@ -119,28 +143,40 @@
     [TestMethod()]
     public void EvaluateTest() {
-      var evaluator = new GQAPAdditivePenaltyEvaluator();
       for (int i = 0; i < 500; i++) {
-        NMove currentMove = StochasticNMoveSingleMoveGenerator.GenerateUpToN(random, assignment, 3, capacities);
+        NMove currentMove = StochasticNMoveSingleMoveGenerator.GenerateUpToN(random, assignment, 3, symmetricInstance.Capacities);
         IntegerVector prevAssignment = (IntegerVector)assignment.Clone();
         NMoveMaker.Apply(assignment, currentMove);
-        double before = evaluator.Evaluate(prevAssignment, symmetricWeights, symmetricDistances, installationCosts, demands, capacities, transportationCosts, 0);
-        double after = evaluator.Evaluate(assignment, symmetricWeights, symmetricDistances, installationCosts, demands, capacities, transportationCosts, 0);
-        double moveDiff = GQAPNMoveEvaluator.Evaluate(currentMove, prevAssignment, symmetricWeights, symmetricDistances, installationCosts, demands, capacities, transportationCosts, 0, evaluator);
+        var beforeEval = symmetricInstance.Evaluate(prevAssignment);
+        double before = symmetricInstance.ToSingleObjective(beforeEval);
+        double after = Evaluate(symmetricInstance, assignment);
+        double moveDiff = symmetricInstance.ToSingleObjective(
+          GQAPNMoveEvaluator.Evaluate(currentMove, prevAssignment, beforeEval, symmetricInstance)
+          ) - symmetricInstance.ToSingleObjective(beforeEval);
         Assert.IsTrue(Math.Abs(moveDiff - (after - before)) < 1e-07, "Failed on symmetric matrices: " + Environment.NewLine
           + "Quality changed from " + before + " to " + after + " (" + (after - before).ToString() + "), but move quality change was " + moveDiff + ".");
 
-        before = evaluator.Evaluate(prevAssignment, asymmetricWeights, asymmetricDistances, installationCosts, demands, capacities, transportationCosts, 0);
-        after = evaluator.Evaluate(assignment, asymmetricWeights, asymmetricDistances, installationCosts, demands, capacities, transportationCosts, 0);
-        moveDiff = GQAPNMoveEvaluator.Evaluate(currentMove, prevAssignment, asymmetricWeights, asymmetricDistances, installationCosts, demands, capacities, transportationCosts, 0, evaluator);
+        beforeEval = asymmetricInstance.Evaluate(prevAssignment);
+        before = asymmetricInstance.ToSingleObjective(beforeEval);
+        after = Evaluate(asymmetricInstance, assignment);
+        moveDiff = asymmetricInstance.ToSingleObjective(
+          GQAPNMoveEvaluator.Evaluate(currentMove, prevAssignment, beforeEval, asymmetricInstance)
+          ) - asymmetricInstance.ToSingleObjective(beforeEval);
         Assert.IsTrue(Math.Abs(moveDiff - (after - before)) < 1e-07, "Failed on asymmetric matrices: " + Environment.NewLine
           + "Quality changed from " + before + " to " + after + " (" + (after - before).ToString() + "), but move quality change was " + moveDiff + ".");
 
-        before = evaluator.Evaluate(prevAssignment, nonZeroDiagonalWeights, nonZeroDiagonalDistances, installationCosts, demands, capacities, transportationCosts, 0);
-        after = evaluator.Evaluate(assignment, nonZeroDiagonalWeights, nonZeroDiagonalDistances, installationCosts, demands, capacities, transportationCosts, 0);
-        moveDiff = GQAPNMoveEvaluator.Evaluate(currentMove, prevAssignment, nonZeroDiagonalWeights, nonZeroDiagonalDistances, installationCosts, demands, capacities, transportationCosts, 0, evaluator);
+        beforeEval = nonZeroDiagonalInstance.Evaluate(prevAssignment);
+        before = nonZeroDiagonalInstance.ToSingleObjective(beforeEval);
+        after = Evaluate(nonZeroDiagonalInstance, assignment);
+        moveDiff = nonZeroDiagonalInstance.ToSingleObjective(
+          GQAPNMoveEvaluator.Evaluate(currentMove, prevAssignment, beforeEval, nonZeroDiagonalInstance)
+          ) - nonZeroDiagonalInstance.ToSingleObjective(beforeEval);
         Assert.IsTrue(Math.Abs(moveDiff - (after - before)) < 1e-07, "Failed on non-zero diagonal matrices: " + Environment.NewLine
           + "Quality changed from " + before + " to " + after + " (" + (after - before).ToString() + "), but move quality change was " + moveDiff + ".");
       }
     }
+
+    private double Evaluate(GQAPInstance instance, IntegerVector assignment) {
+      return instance.ToSingleObjective(instance.Evaluate(assignment));
+    }
   }
 }
Index: /branches/GeneralizedQAP/UnitTests/Properties/AssemblyInfo.cs
===================================================================
--- /branches/GeneralizedQAP/UnitTests/Properties/AssemblyInfo.cs	(revision 15503)
+++ /branches/GeneralizedQAP/UnitTests/Properties/AssemblyInfo.cs	(revision 15504)
@@ -1,4 +1,3 @@
 ﻿using System.Reflection;
-using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 
@@ -9,7 +8,7 @@
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyCompany("HEAL")]
 [assembly: AssemblyProduct("UnitTests")]
-[assembly: AssemblyCopyright("Copyright © Microsoft 2012")]
+[assembly: AssemblyCopyright("(c) 2002-2017 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
