Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinkingMainLoop.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinkingMainLoop.cs	(revision 7372)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinkingMainLoop.cs	(revision 7373)
@@ -61,6 +61,6 @@
       get { return (IValueLookupParameter<IOperator>)Parameters["PathRelinking"]; }
     }
-    public IValueLookupParameter<IOperator> EliteSetReplacerParameter {
-      get { return (IValueLookupParameter<IOperator>)Parameters["EliteSetReplacer"]; }
+    public IValueLookupParameter<IOperator> EliteSetMergerParameter {
+      get { return (IValueLookupParameter<IOperator>)Parameters["EliteSetMerger"]; }
     }
     public IValueLookupParameter<IOperator> AnalyzerParameter {
@@ -82,13 +82,14 @@
       Parameters.Add(new ValueLookupParameter<IOperator>("LocalImprovement", "The operator which performs the local improvement."));
       Parameters.Add(new ValueLookupParameter<IOperator>("PathRelinking", "The operator which performs the path relinking."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("EliteSetReplacer", "The operator that replaces elements in the elite set."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("EliteSetMerger", "The operator that merges elements in the elite set."));
       Parameters.Add(new ValueLookupParameter<IOperator>("Analyzer", "The analyzer that is to be applied."));
 
       var variableCreator1 = new VariableCreator();
+      variableCreator1.Name = "Iterations = 0";
       variableCreator1.CollectedValues.Add(new ValueParameter<IntValue>("Iterations", new IntValue(0)));
 
       var variableCreator2 = new VariableCreator();
+      variableCreator2.Name = "ActualEliteSetSize = 0";
       variableCreator2.CollectedValues.Add(new ValueParameter<IntValue>("ActualEliteSetSize", new IntValue(0)));
-      variableCreator2.Name = "ActualEliteSetSize = 0";
 
       var subScopesCounter1 = new SubScopesCounter();
@@ -119,4 +120,5 @@
 
       var solutionsCreator = new SolutionsCreator();
+      solutionsCreator.ParallelParameter.Value = new BoolValue(false);
       solutionsCreator.EvaluatorParameter.ActualName = EvaluatorParameter.Name;
       solutionsCreator.SolutionCreatorParameter.ActualName = SolutionCreatorParameter.Name;
@@ -149,4 +151,6 @@
       childrenCreator.ParentsPerChild = new IntValue(2);
 
+      var ssp3 = new SubScopesProcessor();
+
       var placeholder2 = new Placeholder();
       placeholder2.Name = "(PathRelinking)";
@@ -156,5 +160,5 @@
       subScopesRemover.RemoveAllSubScopes = true;
 
-      var ssp3 = new SubScopesProcessor();
+      var ssp4 = new SubScopesProcessor();
 
       var placeholder3 = new Placeholder();
@@ -163,6 +167,6 @@
 
       var placeholder4 = new Placeholder();
-      placeholder4.Name = "(Replacer)";
-      placeholder4.OperatorParameter.ActualName = EliteSetReplacerParameter.Name;
+      placeholder4.Name = "(EliteSetMerger)";
+      placeholder4.OperatorParameter.ActualName = EliteSetMergerParameter.Name;
 
       var counter = new IntCounter();
@@ -203,15 +207,17 @@
       conditionalBranch2.TrueBranch = ssp2;
       conditionalBranch2.FalseBranch = null;
-      conditionalBranch2.Successor = ssp3;
+      conditionalBranch2.Successor = ssp4;
       ssp2.Operators.Add(eo2);
       ssp2.Operators.Add(placeholder1);
-      ssp2.Successor = null;
+      ssp2.Successor = childrenCreator;
       eo2.Successor = null;
-      placeholder1.Successor = childrenCreator;
-      childrenCreator.Successor = placeholder2;
+      placeholder1.Successor = null;
+      childrenCreator.Successor = ssp3;
+      ssp3.Operators.Add(placeholder2);
+      ssp3.Successor = null;
       placeholder2.Successor = subScopesRemover;
       subScopesRemover.Successor = null;
-      ssp3.Operators.Add(placeholder3);
-      ssp3.Successor = null;
+      ssp4.Operators.Add(placeholder3);
+      ssp4.Successor = null;
       placeholder4.Successor = counter;
       counter.Successor = analyzer1;
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs	(revision 7372)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs	(revision 7373)
@@ -36,5 +36,5 @@
   [Creatable("Problems")]
   [StorableClass]
-  public sealed class GeneralizedQuadraticAssignmentProblem : SingleObjectiveHeuristicOptimizationProblem<IGQAPEvaluator, IIntegerVectorCreator>, IStorableContent {
+  public sealed class GeneralizedQuadraticAssignmentProblem : SingleObjectiveHeuristicOptimizationProblem<IGQAPEvaluator, IGQAPSolutionCreator>, IStorableContent {
     public override Image ItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Type; }
@@ -109,5 +109,5 @@
     }
     public GeneralizedQuadraticAssignmentProblem()
-      : base(new GQAPEvaluator(), new UniformRandomIntegerVectorCreator()) {
+      : base(new GQAPEvaluator(), new RandomSolutionCreator()) {
       Parameters.Add(new ValueParameter<DoubleMatrix>("Weights", "The weights matrix describes the flows between the equipments.", new DoubleMatrix()));
       Parameters.Add(new ValueParameter<DoubleMatrix>("Distances", "The distances matrix describes the distances between the locations at which the equipment can be installed.", new DoubleMatrix()));
@@ -146,5 +146,5 @@
       Capacities[0] = 4; Capacities[1] = 1; Capacities[2] = 4;
 
-      SolutionCreator.IntegerVectorParameter.ActualName = "Assignment";
+      SolutionCreator.AssignmentParameter.ActualName = "Assignment";
       Parameterize();
 
@@ -184,11 +184,4 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserializationHook() {
-      // BackwardsCompatibility3.3
-      #region Backwards compatible code, remove with 3.4
-      if (!Parameters.ContainsKey("EquipmentNames"))
-        Parameters.Add(new OptionalValueParameter<StringArray>("EquipmentNames", "Optional: A list of names that describes the equipments.", null, false));
-      if (!Parameters.ContainsKey("LocationNames"))
-        Parameters.Add(new OptionalValueParameter<StringArray>("LocationNames", "Optional: A list of names that describes the locations.", null, false));
-      #endregion
       AttachEventHandlers();
     }
@@ -196,5 +189,5 @@
     private void AttachEventHandlers() {
       Evaluator.QualityParameter.ActualNameChanged += new System.EventHandler(Evaluator_QualityParameter_ActualNameChanged);
-      SolutionCreator.IntegerVectorParameter.ActualNameChanged += new EventHandler(SolutionCreator_IntegerVectorParameter_ActualNameChanged);
+      SolutionCreator.AssignmentParameter.ActualNameChanged += new EventHandler(SolutionCreator_IntegerVectorParameter_ActualNameChanged);
     }
 
@@ -214,28 +207,27 @@
       Evaluator.DemandsParameter.ActualName = DemandsParameter.Name;
       Evaluator.CapacitiesParameter.ActualName = CapacitiesParameter.Name;
-      Evaluator.AssignmentParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
-
-      SolutionCreator.LengthParameter.Value = new IntValue(Demands.Length);
-      SolutionCreator.MinimumParameter.Value = new IntValue(0);
-      SolutionCreator.MaximumParameter.Value = new IntValue(Capacities.Length);
+      Evaluator.AssignmentParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
+
+      SolutionCreator.DemandsParameter.ActualName = DemandsParameter.Name;
+      SolutionCreator.CapacitiesParameter.ActualName = CapacitiesParameter.Name;
 
       foreach (var op in Operators.OfType<IIntegerVectorCrossover>()) {
-        op.ParentsParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
-        op.ChildParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
+        op.ParentsParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
+        op.ChildParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
       }
       foreach (var op in Operators.OfType<IIntegerVectorManipulator>()) {
-        op.IntegerVectorParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
+        op.IntegerVectorParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
       }
       foreach (var op in Operators.OfType<IGQAPCrossover>()) {
-        op.ParentsParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
-        op.ChildParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
+        op.ParentsParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
+        op.ChildParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
       }
       foreach (var op in Operators.OfType<IGQAPManipulator>()) {
-        op.IntegerVectorParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
+        op.IntegerVectorParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
       }
       foreach (var op in Operators.OfType<ILocationAwareGQAPOperator>()) {
         op.CapacitiesParameter.ActualName = CapacitiesParameter.Name;
       }
-      foreach (var op in Operators.OfType<IEquipmentAwareGQAPManipulator>()) {
+      foreach (var op in Operators.OfType<IEquipmentAwareGQAPOperator>()) {
         op.DemandsParameter.ActualName = DemandsParameter.Name;
       }
@@ -245,5 +237,5 @@
         BestSolutionAnalyzer.DistancesParameter.ActualName = DistancesParameter.Name;
         BestSolutionAnalyzer.WeightsParameter.ActualName = WeightsParameter.Name;
-        BestSolutionAnalyzer.AssignmentParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
+        BestSolutionAnalyzer.AssignmentParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;
         BestSolutionAnalyzer.ResultsParameter.ActualName = "Results";
         BestSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IEquipmentAwareGQAPOperator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IEquipmentAwareGQAPOperator.cs	(revision 7372)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IEquipmentAwareGQAPOperator.cs	(revision 7373)
@@ -24,5 +24,5 @@
 
 namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
-  public interface IEquipmentAwareGQAPManipulator : IGQAPManipulator {
+  public interface IEquipmentAwareGQAPOperator : IGQAPOperator {
     ILookupParameter<DoubleArray> DemandsParameter { get; }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPSolutionCreator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPSolutionCreator.cs	(revision 7373)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPSolutionCreator.cs	(revision 7373)
@@ -0,0 +1,30 @@
+﻿#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 : IGQAPOperator, ISolutionCreator, ILocationAwareGQAPOperator, IEquipmentAwareGQAPOperator {
+    ILookupParameter<IntegerVector> AssignmentParameter { get; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/DemandEquivalentSwapEquipmentManipluator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/DemandEquivalentSwapEquipmentManipluator.cs	(revision 7372)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/DemandEquivalentSwapEquipmentManipluator.cs	(revision 7373)
@@ -34,6 +34,6 @@
   [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, ILocationAwareGQAPOperator, IEquipmentAwareGQAPManipulator {
-    
+  public class DemandEquivalentSwapEquipmentManipluator : GQAPManipulator, ILocationAwareGQAPOperator, IEquipmentAwareGQAPOperator {
+
     public ILookupParameter<DoubleArray> CapacitiesParameter {
       get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/GQAPSolutionCreator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/GQAPSolutionCreator.cs	(revision 7373)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/GQAPSolutionCreator.cs	(revision 7373)
@@ -0,0 +1,63 @@
+﻿#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.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  [Item("GQAPSolutionCreator", "Base class for solution creators of the Generalized Quadratic Assignment Problem.")]
+  [StorableClass]
+  public abstract class GQAPSolutionCreator : SingleSuccessorOperator, IGQAPSolutionCreator {
+
+    public ILookupParameter<IntegerVector> AssignmentParameter {
+      get { return (ILookupParameter<IntegerVector>)Parameters["Assignment"]; }
+    }
+    public ILookupParameter<DoubleArray> CapacitiesParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
+    }
+    public ILookupParameter<DoubleArray> DemandsParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["Demands"]; }
+    }
+
+    [StorableConstructor]
+    protected GQAPSolutionCreator(bool deserializing) : base(deserializing) { }
+    protected GQAPSolutionCreator(GQAPSolutionCreator original, Cloner cloner)
+      : base(original, cloner) { }
+    public GQAPSolutionCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IntegerVector>("Assignment", "Creates an assignment for the Generalized Quadratic Assignment Problem."));
+      Parameters.Add(new LookupParameter<DoubleArray>("Capacities", "The capacities vector describes the available space at the locations."));
+      Parameters.Add(new LookupParameter<DoubleArray>("Demands", "The demands vector describes the space requirements of the equipments."));
+    }
+
+    public override IOperation Apply() {
+      AssignmentParameter.ActualValue = CreateSolution(DemandsParameter.ActualValue, CapacitiesParameter.ActualValue);
+      return base.Apply();
+    }
+
+    protected abstract IntegerVector CreateSolution(DoubleArray demands, DoubleArray capacities);
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/GreedyRandomizedSolutionCreator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/GreedyRandomizedSolutionCreator.cs	(revision 7373)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/GreedyRandomizedSolutionCreator.cs	(revision 7373)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment.Operators {
+  [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 : GQAPSolutionCreator, IStochasticOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueLookupParameter<IntValue> MaximumTriesParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["MaximumTries"]; }
+    }
+
+    [StorableConstructor]
+    protected GreedyRandomizedSolutionCreator(bool deserializing) : base(deserializing) { }
+    protected GreedyRandomizedSolutionCreator(GreedyRandomizedSolutionCreator original, Cloner cloner)
+      : base(original, cloner) { }
+    public GreedyRandomizedSolutionCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("MaximumTries", "The maximum number of tries to create a feasible solution."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GreedyRandomizedSolutionCreator(this, cloner);
+    }
+
+    protected override IntegerVector CreateSolution(DoubleArray demands, DoubleArray capacities) {
+      int k = 0, t = MaximumTriesParameter.ActualValue.Value;
+      HashSet<int> F = new HashSet<int>(Enumerable.Range(0, demands.Length));
+      while (k < t && F.Any()) {
+
+      }
+
+      // TODO: return actual solution
+      return UniformRandomIntegerVectorCreator.Apply(RandomParameter.ActualValue, demands.Length, 0, capacities.Length);
+    }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/RandomSolutionCreator.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/RandomSolutionCreator.cs	(revision 7373)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/RandomSolutionCreator.cs	(revision 7373)
@@ -0,0 +1,56 @@
+﻿#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.Optimization;
+using HeuristicLab.Parameters;
+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 : GQAPSolutionCreator, IStochasticOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected RandomSolutionCreator(bool deserializing) : base(deserializing) { }
+    protected RandomSolutionCreator(RandomSolutionCreator original, Cloner cloner)
+      : base(original, cloner) { }
+    public RandomSolutionCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RandomSolutionCreator(this, cloner);
+    }
+
+    protected override IntegerVector CreateSolution(DoubleArray demands, DoubleArray capacities) {
+      return UniformRandomIntegerVectorCreator.Apply(RandomParameter.ActualValue, demands.Length, 0, capacities.Length);
+    }
+  }
+}
