Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/GroupingVectorRandomCreator.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/GroupingVectorRandomCreator.cs	(revision 9348)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/GroupingVectorRandomCreator.cs	(revision 9440)
@@ -64,5 +64,5 @@
 		public static GroupingVectorEncoding Apply(int items, int lowerBound, IRandom random) {
 			var solution = new GroupingVectorEncoding();
-			solution.GroupingVector = new IntegerVector(items, random, 0, lowerBound);
+			solution.GroupingVector = new IntegerVector(items, random, 0, lowerBound + 1);
 			return solution;
 		}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/ExhaustiveSingleGroupingMoveGenerator.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/ExhaustiveSingleGroupingMoveGenerator.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/ExhaustiveSingleGroupingMoveGenerator.cs	(revision 9440)
@@ -0,0 +1,71 @@
+﻿#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.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Exhaustive Single Grouping Move Generator", "Generates all possible single grouping moves from a given groupingVector.")]
+  [StorableClass]
+  public class ExhaustiveSingleGroupingMoveGenerator : SingleGroupingMoveGenerator, IExhaustiveMoveGenerator {
+    [StorableConstructor]
+    protected ExhaustiveSingleGroupingMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ExhaustiveSingleGroupingMoveGenerator(ExhaustiveSingleGroupingMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ExhaustiveSingleGroupingMoveGenerator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExhaustiveSingleGroupingMoveGenerator(this, cloner);
+    }
+
+    public static IEnumerable<SingleGroupingMove> Generate(GroupingVectorEncoding groupingVector, int nrOfBins) {
+      for (int i = 0; i < groupingVector.GroupingVector.Length; i++)
+        for (int j = 0; j < nrOfBins; j++) {
+          if (j != groupingVector.GroupingVector[i])
+            yield return new SingleGroupingMove(i, j, groupingVector);
+        }
+    }
+
+    public static SingleGroupingMove[] Apply(GroupingVectorEncoding groupingVector) {
+      int nrOfBins = 0;
+      foreach (int binNr in groupingVector.GroupingVector) {
+        if (binNr > nrOfBins)
+          nrOfBins = binNr;
+      }
+      nrOfBins++;
+
+      int totalMoves = (groupingVector.GroupingVector.Length) * (nrOfBins - 1);
+      SingleGroupingMove[] moves = new SingleGroupingMove[totalMoves];
+      int count = 0;
+      foreach (SingleGroupingMove move in Generate(groupingVector, nrOfBins)) {
+        moves[count++] = move;
+      }
+      return moves;
+    }
+
+    protected override SingleGroupingMove[] GenerateMoves(GroupingVectorEncoding groupingVector) {
+      return Apply(groupingVector);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/ExhaustiveTargetBinSingleGroupingMoveGenerator.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/ExhaustiveTargetBinSingleGroupingMoveGenerator.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/ExhaustiveTargetBinSingleGroupingMoveGenerator.cs	(revision 9440)
@@ -0,0 +1,75 @@
+﻿#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.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Exhaustive Target Bin Single Grouping Move Generator", "Generates all possible single grouping moves for a specified target bin from a given groupingVector.")]
+  [StorableClass]
+  public class ExhaustiveTargetBinSingleGroupingMoveGenerator : SingleGroupingMoveGenerator, IExhaustiveMoveGenerator {
+    [StorableConstructor]
+    protected ExhaustiveTargetBinSingleGroupingMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ExhaustiveTargetBinSingleGroupingMoveGenerator(ExhaustiveTargetBinSingleGroupingMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ExhaustiveTargetBinSingleGroupingMoveGenerator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExhaustiveTargetBinSingleGroupingMoveGenerator(this, cloner);
+    }
+
+    private static IEnumerable<SingleGroupingMove> Generate(GroupingVectorEncoding groupingVector, int lastBinNr, List<int> indexesOfItemsInLastBin) {
+      for (int i = 0; i < indexesOfItemsInLastBin.Count; i++)
+        for (int j = 0; j < lastBinNr; j++) {
+          yield return new SingleGroupingMove(i, j, groupingVector);
+        }
+    }
+
+    public static SingleGroupingMove[] Apply(GroupingVectorEncoding groupingVector) {
+      int lastBinNr = 0;
+      foreach (int binNr in groupingVector.GroupingVector) {
+        if (binNr > lastBinNr)
+          lastBinNr = binNr;
+      }
+      int nrOfBins = lastBinNr + 1;
+      List<int> indexesOfItemsInLastBin = new List<int>();
+      for (int i = 0; i < groupingVector.GroupingVector.Length; i++ ) {
+        if (groupingVector.GroupingVector[i] == lastBinNr)
+          indexesOfItemsInLastBin.Add(i);
+      }
+
+      int totalMoves = indexesOfItemsInLastBin.Count * (nrOfBins - 1);
+      SingleGroupingMove[] moves = new SingleGroupingMove[totalMoves];
+      int count = 0;
+      foreach (SingleGroupingMove move in Generate(groupingVector, lastBinNr, indexesOfItemsInLastBin)) {
+        moves[count++] = move;
+      }
+      return moves;
+    }
+
+    protected override SingleGroupingMove[] GenerateMoves(GroupingVectorEncoding groupingVector) {
+      return Apply(groupingVector);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMove.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMove.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMove.cs	(revision 9440)
@@ -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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Single Grouping Move", "A move on a grouping vector that is specified by a single group-assignment-index.")]
+  [StorableClass]
+  public class SingleGroupingMove : Item {
+    [Storable]
+    public int Index { get; protected set; }
+    [Storable]
+    public int NewGroup { get; protected set; }
+    [Storable]
+    public GroupingVectorEncoding GroupingVector { get; protected set; }
+
+    [StorableConstructor]
+    protected SingleGroupingMove(bool deserializing) : base(deserializing) { }
+    protected SingleGroupingMove(SingleGroupingMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index = original.Index;
+      this.NewGroup = original.NewGroup;
+      if (original.GroupingVector != null)
+        this.GroupingVector = cloner.Clone(original.GroupingVector);
+    }
+    public SingleGroupingMove(int index, int newGroup, GroupingVectorEncoding groupingVector)
+      : base() {
+      Index = index;
+      GroupingVector = groupingVector;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleGroupingMove(this, cloner);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveAttribute.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveAttribute.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveAttribute.cs	(revision 9440)
@@ -0,0 +1,57 @@
+﻿#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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("SingleGroupingMoveAttribute", "Specifies the tabu attributes for a single grouping move on a grouping vector.")]
+  [StorableClass]
+  public class SingleGroupingMoveAttribute : Item {
+    [Storable]
+    public int ItemIndex { get; protected set; }
+    [Storable]
+    public int AssignedBin { get; protected set; }
+    [Storable]
+    public double MoveQuality { get; protected set; }
+
+    [StorableConstructor]
+    protected SingleGroupingMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected SingleGroupingMoveAttribute(SingleGroupingMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.ItemIndex = original.ItemIndex;
+      this.AssignedBin = original.AssignedBin;
+      this.MoveQuality = original.MoveQuality;
+    }
+    public SingleGroupingMoveAttribute() : this(-1, -1, -1) { }
+    public SingleGroupingMoveAttribute(int itemIndex, int assignedBin, double moveQuality)
+      : base() {
+      ItemIndex = itemIndex;
+      AssignedBin = assignedBin;
+      MoveQuality = moveQuality;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleGroupingMoveAttribute(this, cloner);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveGenerator.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveGenerator.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveGenerator.cs	(revision 9440)
@@ -0,0 +1,71 @@
+﻿#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.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Single Grouping Move Generator", "Base class for all single grouping move generators.")]
+  [StorableClass]
+  public abstract class SingleGroupingMoveGenerator : SingleSuccessorOperator, IGroupingVectorMoveOperator, IMoveGenerator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
+      get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
+    }
+    public ILookupParameter<SingleGroupingMove> SingleGroupingMoveParameter {
+      get { return (LookupParameter<SingleGroupingMove>)Parameters["SingleGroupingMove"]; }
+    }
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected SingleGroupingMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected SingleGroupingMoveGenerator(SingleGroupingMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public SingleGroupingMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The grouping vector for which moves should be generated."));
+      Parameters.Add(new LookupParameter<SingleGroupingMove>("SingleGroupingMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    public override IOperation Apply() {
+      GroupingVectorEncoding gv = GroupingVectorParameter.ActualValue;
+      SingleGroupingMove[] moves = GenerateMoves(gv);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(SingleGroupingMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+      return base.Apply();
+    }
+
+    protected abstract SingleGroupingMove[] GenerateMoves(GroupingVectorEncoding groupingVector);
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveHardTabuCriterion.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveHardTabuCriterion.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveHardTabuCriterion.cs	(revision 9440)
@@ -0,0 +1,110 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("SingleGroupingMoveHardTabuCriterion", "<Missing>")]
+  [StorableClass]
+  public class SingleGroupingMoveHardTabuCriterion : SingleSuccessorOperator, IGroupingVectorMoveOperator, ITabuChecker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<SingleGroupingMove> SingleGroupingMoveParameter {
+      get { return (ILookupParameter<SingleGroupingMove>)Parameters["SingleGroupingMove"]; }
+    }
+    public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
+      get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
+    }
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    [StorableConstructor]
+    protected SingleGroupingMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected SingleGroupingMoveHardTabuCriterion(SingleGroupingMoveHardTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public SingleGroupingMoveHardTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<SingleGroupingMove>("SingleGroupingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The solution to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleGroupingMoveHardTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      SingleGroupingMove move = SingleGroupingMoveParameter.ActualValue;
+      GroupingVectorEncoding groupingVector = GroupingVectorParameter.ActualValue;
+      int length = groupingVector.GroupingVector.Length;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;   
+      bool useAspiration = UseAspirationCriterionParameter.Value.Value;
+      bool isTabu = IsMoveTabu(tabuList, move, groupingVector, moveQuality, maximization, useAspiration);
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+
+    private bool IsMoveTabu(ItemList<IItem> tabuList, SingleGroupingMove move, GroupingVectorEncoding groupingVector, double moveQuality, bool maximization, bool useAspiration) {
+      var movedGroupingVector = new IntegerVector(groupingVector.GroupingVector);
+      movedGroupingVector[move.Index] = move.NewGroup;
+      foreach (IItem tabuMove in tabuList) {
+        SingleGroupingMoveAttribute sgmAttr = (tabuMove as SingleGroupingMoveAttribute);
+        if (sgmAttr != null
+          && (!useAspiration
+              || maximization && moveQuality <= sgmAttr.MoveQuality
+              || !maximization && moveQuality >= sgmAttr.MoveQuality)) {
+                if (move.Index == sgmAttr.ItemIndex || groupingVector.GroupingVector[move.Index] == sgmAttr.AssignedBin)
+                  return true;
+        }
+      }
+      return false;
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveMaker.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveMaker.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveMaker.cs	(revision 9440)
@@ -0,0 +1,79 @@
+﻿#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.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Single Grouping Move Maker", "Peforms a single grouping move on a given grouping vector and updates the quality.")]
+  [StorableClass]
+  public class SingleGroupingMoveMaker : SingleSuccessorOperator, IMoveMaker, IGroupingVectorMoveOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<SingleGroupingMove> SingleGroupingMoveParameter {
+      get { return (ILookupParameter<SingleGroupingMove>)Parameters["SingleGroupingMove"]; }
+    }
+    public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
+      get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
+    }
+
+    [StorableConstructor]
+    protected SingleGroupingMoveMaker(bool deserializing) : base(deserializing) { }
+    protected SingleGroupingMoveMaker(SingleGroupingMoveMaker original, Cloner cloner) : base(original, cloner) { }
+    public SingleGroupingMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new LookupParameter<SingleGroupingMove>("SingleGroupingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
+      Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The solution as grouping vector."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleGroupingMoveMaker(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      SingleGroupingMove move = SingleGroupingMoveParameter.ActualValue;
+      GroupingVectorEncoding groupingVector = GroupingVectorParameter.ActualValue;
+      DoubleValue moveQuality = MoveQualityParameter.ActualValue;
+      DoubleValue quality = QualityParameter.ActualValue;
+
+      groupingVector.GroupingVector[move.Index] = move.NewGroup;
+
+      quality.Value = moveQuality.Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveSoftTabuCriterion.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveSoftTabuCriterion.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveSoftTabuCriterion.cs	(revision 9440)
@@ -0,0 +1,110 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("SingleGroupingMoveSoftTabuCriterion", "<Missing>")]
+  [StorableClass]
+  public class SingleGroupingMoveSoftTabuCriterion : SingleSuccessorOperator, IGroupingVectorMoveOperator, ITabuChecker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<SingleGroupingMove> SingleGroupingMoveParameter {
+      get { return (ILookupParameter<SingleGroupingMove>)Parameters["SingleGroupingMove"]; }
+    }
+    public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
+      get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
+    }
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    [StorableConstructor]
+    protected SingleGroupingMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected SingleGroupingMoveSoftTabuCriterion(SingleGroupingMoveSoftTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public SingleGroupingMoveSoftTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<SingleGroupingMove>("SingleGroupingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The solution to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleGroupingMoveSoftTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      SingleGroupingMove move = SingleGroupingMoveParameter.ActualValue;
+      GroupingVectorEncoding groupingVector = GroupingVectorParameter.ActualValue;
+      int length = groupingVector.GroupingVector.Length;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;   
+      bool useAspiration = UseAspirationCriterionParameter.Value.Value;
+      bool isTabu = IsMoveTabu(tabuList, move, groupingVector, moveQuality, maximization, useAspiration);
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+
+    private bool IsMoveTabu(ItemList<IItem> tabuList, SingleGroupingMove move, GroupingVectorEncoding groupingVector, double moveQuality, bool maximization, bool useAspiration) {
+      var movedGroupingVector = new IntegerVector(groupingVector.GroupingVector);
+      movedGroupingVector[move.Index] = move.NewGroup;
+      foreach (IItem tabuMove in tabuList) {
+        SingleGroupingMoveAttribute sgmAttr = (tabuMove as SingleGroupingMoveAttribute);
+        if (sgmAttr != null
+          && (!useAspiration
+              || maximization && moveQuality <= sgmAttr.MoveQuality
+              || !maximization && moveQuality >= sgmAttr.MoveQuality)) {
+                if (move.Index == sgmAttr.ItemIndex && groupingVector.GroupingVector[move.Index] == sgmAttr.AssignedBin)
+                  return true;
+        }
+      }
+      return false;
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingTabuMaker.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingTabuMaker.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingTabuMaker.cs	(revision 9440)
@@ -0,0 +1,64 @@
+﻿#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.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Single grouping tabu maker", "Declares a given single grouping move as tabu, by adding its attributes to the tabu list and also store the solution quality or the move quality (whichever is better).")]
+  [StorableClass]
+  public class SingleGroupingTabuMaker : TabuMaker, IGroupingVectorMoveOperator{
+    public ILookupParameter<SingleGroupingMove> SingleGroupingMoveParameter {
+      get { return (ILookupParameter<SingleGroupingMove>)Parameters["SingleGroupingMove"]; }
+    }
+    public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
+      get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
+    }
+
+    [StorableConstructor]
+    protected SingleGroupingTabuMaker(bool deserializing) : base(deserializing) { }
+    protected SingleGroupingTabuMaker(SingleGroupingTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public SingleGroupingTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<SingleGroupingMove>("SingleGroupingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The solution to evaluate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleGroupingTabuMaker(this, cloner);
+    }
+
+    protected override IItem GetTabuAttribute(bool maximization, double quality, double moveQuality) {
+      SingleGroupingMove move = SingleGroupingMoveParameter.ActualValue;
+      GroupingVectorEncoding groupingVector = GroupingVectorParameter.ActualValue;    
+      double baseQuality = moveQuality;
+      if (maximization && quality > moveQuality || !maximization && quality < moveQuality) 
+        baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
+            
+      return new SingleGroupingMoveAttribute (move.Index, move.NewGroup, baseQuality);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Attributes/MultiComponentVectorMoveAttribute.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Attributes/MultiComponentVectorMoveAttribute.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Attributes/MultiComponentVectorMoveAttribute.cs	(revision 9440)
@@ -0,0 +1,49 @@
+﻿#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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MultiComponentVectorMoveAttribute", "Base class for specifying a move attribute for multi component vector moves.")]
+  [StorableClass]
+  public class MultiComponentVectorMoveAttribute : Item {
+    [Storable]
+    public double MoveQuality { get; protected set; }
+
+    [StorableConstructor]
+    protected MultiComponentVectorMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorMoveAttribute(MultiComponentVectorMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.MoveQuality = original.MoveQuality;
+    }
+    public MultiComponentVectorMoveAttribute() : this(0) { }
+    public MultiComponentVectorMoveAttribute( double moveQuality)
+      : base() {
+      MoveQuality = moveQuality;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiComponentVectorMoveAttribute(this, cloner);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Attributes/SingleGroupingMoveAttribute.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Attributes/SingleGroupingMoveAttribute.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Attributes/SingleGroupingMoveAttribute.cs	(revision 9440)
@@ -0,0 +1,53 @@
+﻿#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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("SingleGroupingMoveAttribute", "Specifies the tabu attributes for a single grouping move on an multi component vector.")]
+  [StorableClass]
+  public class SingleGroupingMoveAttribute : MultiComponentVectorMoveAttribute {
+    [Storable]
+    public int ItemIndex { get; protected set; }
+    [Storable]
+    public int AssignedBin { get; protected set; }
+
+    [StorableConstructor]
+    protected SingleGroupingMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected SingleGroupingMoveAttribute(SingleGroupingMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.ItemIndex = original.ItemIndex;
+      this.AssignedBin = original.AssignedBin;
+    }
+    public SingleGroupingMoveAttribute() : this(-1, -1, -1) { }
+    public SingleGroupingMoveAttribute(int itemIndex, int assignedBin, double moveQuality)
+      : base(moveQuality) {
+      ItemIndex = itemIndex;
+      AssignedBin = assignedBin;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleGroupingMoveAttribute(this, cloner);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Attributes/SingleItemRotationMoveAttribute.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Attributes/SingleItemRotationMoveAttribute.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Attributes/SingleItemRotationMoveAttribute.cs	(revision 9440)
@@ -0,0 +1,53 @@
+﻿#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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("SingleItemRotationMoveAttribute", "Specifies the tabu attributes for a single item rotation move on an multi component vector.")]
+  [StorableClass]
+  public class SingleItemRotationMoveAttribute : MultiComponentVectorMoveAttribute {
+    [Storable]
+    public int ItemIndex { get; protected set; }
+    [Storable]
+    public bool ItemRotation { get; protected set; }
+
+    [StorableConstructor]
+    protected SingleItemRotationMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected SingleItemRotationMoveAttribute(SingleItemRotationMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.ItemIndex = original.ItemIndex;
+      this.ItemRotation = original.ItemRotation;
+    }
+    public SingleItemRotationMoveAttribute() : this(-1, false, -1) { }
+    public SingleItemRotationMoveAttribute(int itemIndex, bool itemRotation, double moveQuality)
+      : base(moveQuality) {
+      ItemIndex = itemIndex;
+      ItemRotation = itemRotation;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleItemRotationMoveAttribute(this, cloner);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Attributes/SwapSequenceMoveAttribute.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Attributes/SwapSequenceMoveAttribute.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Attributes/SwapSequenceMoveAttribute.cs	(revision 9440)
@@ -0,0 +1,59 @@
+﻿#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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("SwapSequenceMoveAttribute", "Specifies the tabu attributes for a swap sequence move on an multi component vector.")]
+  [StorableClass]
+  public class SwapSequenceMoveAttribute : MultiComponentVectorMoveAttribute {
+    [Storable]
+    public int Index1 { get; protected set; }
+    [Storable]
+    public int Index2 { get; protected set; }
+    [Storable]
+    public int ItemIndex1 { get; protected set; }
+    [Storable]
+    public int ItemIndex2 { get; protected set; }
+
+    [StorableConstructor]
+    protected SwapSequenceMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected SwapSequenceMoveAttribute(SwapSequenceMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.ItemIndex1 = original.ItemIndex1;
+      this.ItemIndex2 = original.ItemIndex2;
+    }
+    public SwapSequenceMoveAttribute() : this(-1, -1, -1, -1, -1) { }
+    public SwapSequenceMoveAttribute(int index1, int index2, int itemIndex1, int itemIndex2, double moveQuality)
+      : base(moveQuality) {
+        Index1 = index1;
+        Index2 = index2;
+        ItemIndex1 = itemIndex1;
+        ItemIndex2 = itemIndex2;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapSequenceMoveAttribute(this, cloner);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/ExhaustiveMultiComponentVectorMoveGenerator.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/ExhaustiveMultiComponentVectorMoveGenerator.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/ExhaustiveMultiComponentVectorMoveGenerator.cs	(revision 9440)
@@ -0,0 +1,87 @@
+﻿#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.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Exhaustive MultiComponentVector Move Generator", "Generates all possible multi component moves from a given multiComponentVector.")]
+  [StorableClass]
+  public class ExhaustiveMultiComponentVectorMoveGenerator : MultiComponentVectorMoveGenerator, IExhaustiveMoveGenerator {
+    [StorableConstructor]
+    protected ExhaustiveMultiComponentVectorMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ExhaustiveMultiComponentVectorMoveGenerator(ExhaustiveMultiComponentVectorMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ExhaustiveMultiComponentVectorMoveGenerator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExhaustiveMultiComponentVectorMoveGenerator(this, cloner);
+    }
+
+
+    public static MultiComponentVectorMove[] Apply(MultiComponentVectorEncoding multiComponentVector) {
+      //NrOfMoves = nrOfRotationMoves + nrOfSingleGroupingMoves + nrOfSwapSequenceMoves
+      //  nrOfRotationMoves       = nrOfItems
+      //  nrOfSingleGroupingMoves = nrOfItems * (nrOfBins - 1)
+      //  nrOfSwapSequenceMoves   = SUM(foreach binNr: !nrOfItemsInBin)
+
+      int lastBinNr = 0;
+      foreach (var pi in multiComponentVector.PackingInformations) {
+        if (pi.AssignedBin > lastBinNr)
+          lastBinNr = pi.AssignedBin;
+      }
+      int nrOfBins = lastBinNr + 1;
+
+      int nrOfRotationMoves = multiComponentVector.PackingInformations.Count;
+      int nrOfSingleGroupingMoves = nrOfRotationMoves * (nrOfBins - 1);
+
+      int[] itemsPerBin = new int[nrOfBins];
+      foreach (var pi in multiComponentVector.PackingInformations) {
+        itemsPerBin[pi.AssignedBin]++;
+      }
+      int nrOfSwapSequenceMoves = 0;
+      foreach (int items in itemsPerBin) {
+        nrOfSwapSequenceMoves += (items * (items - 1)) / 2;
+      }
+
+      int totalMoves = nrOfRotationMoves + nrOfSingleGroupingMoves + nrOfSwapSequenceMoves;
+      MultiComponentVectorMove[] moves = new MultiComponentVectorMove[totalMoves];
+      int count = 0;
+      foreach (MultiComponentVectorMove move in GenerateRotationMoves(multiComponentVector)) {
+        moves[count++] = move;
+      }
+      foreach (MultiComponentVectorMove move in GenerateSingleGroupingMoves(multiComponentVector)) {
+        moves[count++] = move;
+      }
+      foreach (MultiComponentVectorMove move in GenerateSwapSequenceMoves(multiComponentVector)) {
+        moves[count++] = move;
+      }
+      return moves;
+    }    
+
+    protected override MultiComponentVectorMove[] GenerateMoves(MultiComponentVectorEncoding multiComponentVector) {
+      return Apply(multiComponentVector);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Moves/MultiComponentVectorMove.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Moves/MultiComponentVectorMove.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Moves/MultiComponentVectorMove.cs	(revision 9440)
@@ -0,0 +1,50 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PackingEncoding.MultiComponentVector;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MultiComponentVectorMove", "An abstract move for a multi component vector encoded solution.")]
+  [StorableClass]
+  public abstract class MultiComponentVectorMove : Item {
+    [Storable]
+    public MultiComponentVectorEncoding MultiComponentVector { get; protected set; }
+
+    [StorableConstructor]
+    protected MultiComponentVectorMove(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorMove(MultiComponentVectorMove original, Cloner cloner)
+      : base(original, cloner) {
+        if (original.MultiComponentVector != null)
+          this.MultiComponentVector = cloner.Clone(original.MultiComponentVector);
+    }
+    public MultiComponentVectorMove(MultiComponentVectorEncoding multiComponentVector)
+      : base() {
+        MultiComponentVector = multiComponentVector;
+    }
+
+    public abstract MultiComponentVectorEncoding GetVectorAfterMove();
+    public abstract Type GetMoveAttributeType();
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Moves/SingleGroupingMove.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Moves/SingleGroupingMove.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Moves/SingleGroupingMove.cs	(revision 9440)
@@ -0,0 +1,73 @@
+﻿#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.Encodings.PackingEncoding.MultiComponentVector;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("SingleGroupingMove", "A move on a multi component vector that is specified by a single index and a new grouping-value. The grouping of the item on the specified index is changed to the new value.")]
+  [StorableClass]
+  public class SingleGroupingMove : MultiComponentVectorMove {
+    [Storable]
+    public int ItemIndex { get; protected set; }
+    [Storable]
+    public int NewGroup { get; protected set; }
+
+    [StorableConstructor]
+    protected SingleGroupingMove(bool deserializing) : base(deserializing) { }
+    protected SingleGroupingMove(SingleGroupingMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.ItemIndex = original.ItemIndex;
+      this.NewGroup = original.NewGroup;
+    }
+    public SingleGroupingMove(int index, int newGroup, MultiComponentVectorEncoding multiComponentVector)
+      : base(multiComponentVector) {
+      ItemIndex = index;
+      NewGroup = newGroup;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleGroupingMove(this, cloner);
+    }
+
+    public override MultiComponentVectorEncoding GetVectorAfterMove() {
+      //var result = new MultiComponentVectorEncoding();
+      //result.PackingInformations = new ItemList<PackingInformation>(this.MultiComponentVector.PackingInformations);
+      //result.PackingInformations[ItemIndex].AssignedBin = NewGroup;
+      //return result;
+      return InsertItemgeneAfterLastItemgeneOfUsedBin(MultiComponentVector, ItemIndex, NewGroup);
+    }
+    private MultiComponentVectorEncoding InsertItemgeneAfterLastItemgeneOfUsedBin(MultiComponentVectorEncoding solution, int itemIndex, int binNr) {
+      var itemgene = solution.PackingInformations[itemIndex];
+      solution.PackingInformations.Remove(itemgene);
+      itemgene.AssignedBin = binNr;
+      int targetIndex = solution.PackingInformations.FindLastIndex(pi => pi.AssignedBin == binNr);
+      solution.PackingInformations.Insert(targetIndex + 1, itemgene);
+      return solution;
+    }
+
+    public override System.Type GetMoveAttributeType() {
+      return typeof(SingleGroupingMoveAttribute);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Moves/SingleItemRotationMove.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Moves/SingleItemRotationMove.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Moves/SingleItemRotationMove.cs	(revision 9440)
@@ -0,0 +1,60 @@
+﻿#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.Encodings.PackingEncoding.MultiComponentVector;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("SingleItemRotationMove", "A move on a multi component vector that is specified by a single index. The item at the specified index is rotated.")]
+  [StorableClass]
+  public class SingleItemRotationMove : MultiComponentVectorMove {
+    [Storable]
+    public int ItemIndex { get; protected set; }
+
+    [StorableConstructor]
+    protected SingleItemRotationMove(bool deserializing) : base(deserializing) { }
+    protected SingleItemRotationMove(SingleItemRotationMove original, Cloner cloner)
+      : base(original, cloner) {
+        this.ItemIndex = original.ItemIndex;
+    }
+    public SingleItemRotationMove(int index, MultiComponentVectorEncoding multiComponentVector)
+      : base(multiComponentVector) {
+        ItemIndex = index;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleItemRotationMove(this, cloner);
+    }
+
+    public override MultiComponentVectorEncoding GetVectorAfterMove() {
+      var result = new MultiComponentVectorEncoding();
+      result.PackingInformations = new ItemList<PackingInformation>(this.MultiComponentVector.PackingInformations);
+      result.PackingInformations[ItemIndex].Rotated = !result.PackingInformations[ItemIndex].Rotated;
+      return result;
+    }
+
+    public override System.Type GetMoveAttributeType() {
+      return typeof(SingleItemRotationMoveAttribute);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Moves/SwapSequenceMove.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Moves/SwapSequenceMove.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/Moves/SwapSequenceMove.cs	(revision 9440)
@@ -0,0 +1,66 @@
+﻿#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.Encodings.PackingEncoding.MultiComponentVector;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("SwapSequenceMove", "A move on a multi component vector that is specified by two indexes. The packing informations at the speciefied indexes are beeing swapped.")]
+  [StorableClass]
+  public class SwapSequenceMove : MultiComponentVectorMove {
+    [Storable]
+    public int Index1 { get; protected set; }
+    [Storable]
+    public int Index2 { get; protected set; }
+
+    [StorableConstructor]
+    protected SwapSequenceMove(bool deserializing) : base(deserializing) { }
+    protected SwapSequenceMove(SwapSequenceMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index1 = original.Index1;
+      this.Index2 = original.Index2;
+    }
+    public SwapSequenceMove(int index1, int index2, MultiComponentVectorEncoding multiComponentVector)
+      : base(multiComponentVector) {
+        Index1 = index1;
+        Index2 = index2;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapSequenceMove(this, cloner);
+    }
+
+    public override MultiComponentVectorEncoding GetVectorAfterMove() {
+      var result = new MultiComponentVectorEncoding();
+      result.PackingInformations = new ItemList<PackingInformation>(this.MultiComponentVector.PackingInformations);
+      var aux = result.PackingInformations[Index1];
+      result.PackingInformations[Index1] = result.PackingInformations[Index2];
+      result.PackingInformations[Index2] = aux;
+      return result;
+    }
+
+    public override System.Type GetMoveAttributeType() {
+      return typeof(SwapSequenceMoveAttribute);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveGenerator.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveGenerator.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveGenerator.cs	(revision 9440)
@@ -0,0 +1,110 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MultiComponentVectorMoveGenerator", "Base class for all multi-component vector move generators.")]
+  [StorableClass]
+  public abstract class MultiComponentVectorMoveGenerator : SingleSuccessorOperator, IMultiComponentVectorMoveOperator, IMoveGenerator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<MultiComponentVectorEncoding> MultiComponentVectorParameter {
+      get { return (ILookupParameter<MultiComponentVectorEncoding>)Parameters["MultiComponentVector"]; }
+    }
+    public ILookupParameter<MultiComponentVectorMove> MultiComponentVectorMoveParameter {
+      get { return (LookupParameter<MultiComponentVectorMove>)Parameters["MultiComponentVectorMove"]; }
+    }
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiComponentVectorMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorMoveGenerator(MultiComponentVectorMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorMoveGenerator()
+      : base() {
+        Parameters.Add(new LookupParameter<MultiComponentVectorEncoding>("MultiComponentVector", "The multi component vector for which moves should be generated."));
+      Parameters.Add(new LookupParameter<MultiComponentVectorMove>("MultiComponentVectorMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+
+
+
+    public static IEnumerable<MultiComponentVectorMove> GenerateRotationMoves(MultiComponentVectorEncoding multiComponentVector) {
+      for (int i = 0; i < multiComponentVector.PackingInformations.Count; i++)
+        yield return new SingleItemRotationMove(i, multiComponentVector);
+    }
+
+    public static IEnumerable<MultiComponentVectorMove> GenerateSingleGroupingMoves(MultiComponentVectorEncoding multiComponentVector) {
+      int nrOfBins = 0;
+      foreach (var pi in multiComponentVector.PackingInformations) {
+        if (pi.AssignedBin > nrOfBins)
+          nrOfBins = pi.AssignedBin;
+      }
+      nrOfBins++;
+      for (int i = 0; i < multiComponentVector.PackingInformations.Count; i++)
+        for (int j = 0; j < nrOfBins; j++) {
+          if (j != multiComponentVector.PackingInformations[i].AssignedBin)
+            yield return new SingleGroupingMove(i, j, multiComponentVector);
+        }
+    }
+
+    public static IEnumerable<MultiComponentVectorMove> GenerateSwapSequenceMoves(MultiComponentVectorEncoding multiComponentVector) {
+      Dictionary<int, List<int>> indexesPerBin = new Dictionary<int, List<int>>();
+      for (int i = 0; i < multiComponentVector.PackingInformations.Count; i++) {
+        int currentBin = multiComponentVector.PackingInformations[i].AssignedBin;
+        if (!indexesPerBin.ContainsKey(currentBin))
+          indexesPerBin[currentBin] = new List<int>();
+        indexesPerBin[currentBin].Add(i);
+      }
+      foreach (var entry in indexesPerBin) {
+        for (int i = 0; i < entry.Value.Count - 1; i++)
+          for (int j = i + 1; j < entry.Value.Count; j++)
+            yield return new SwapSequenceMove(entry.Value[i], entry.Value[j], multiComponentVector);
+      }
+    }
+
+
+    public override IOperation Apply() {
+      MultiComponentVectorEncoding mcv = MultiComponentVectorParameter.ActualValue;
+      MultiComponentVectorMove[] moves = GenerateMoves(mcv);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(MultiComponentVectorMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+      return base.Apply();
+    }
+
+    protected abstract MultiComponentVectorMove[] GenerateMoves(MultiComponentVectorEncoding multiComponentVector);
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveHardTabuCriterion.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveHardTabuCriterion.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveHardTabuCriterion.cs	(revision 9440)
@@ -0,0 +1,147 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MultiComponentVectorMoveHardTabuCriterion", "<Missing>")]
+  [StorableClass]
+  public class MultiComponentVectorMoveHardTabuCriterion : SingleSuccessorOperator, IMultiComponentVectorMoveOperator, ITabuChecker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<MultiComponentVectorMove> MultiComponentVectorMoveParameter {
+      get { return (ILookupParameter<MultiComponentVectorMove>)Parameters["MultiComponentVectorMove"]; }
+    }
+    public ILookupParameter<MultiComponentVectorEncoding> MultiComponentVectorParameter {
+      get { return (ILookupParameter<MultiComponentVectorEncoding>)Parameters["MultiComponentVector"]; }
+    }
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiComponentVectorMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorMoveHardTabuCriterion(MultiComponentVectorMoveHardTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorMoveHardTabuCriterion()
+      : base() {
+        Parameters.Add(new LookupParameter<MultiComponentVectorMove>("MultiComponentVectorMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<MultiComponentVectorEncoding>("MultiComponentVector", "The solution to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiComponentVectorMoveHardTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      MultiComponentVectorMove move = MultiComponentVectorMoveParameter.ActualValue;
+      MultiComponentVectorEncoding multiComponentVector = MultiComponentVectorParameter.ActualValue;
+      int length = multiComponentVector.PackingInformations.Count;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterionParameter.Value.Value;
+      bool isTabu = IsMoveTabu(tabuList, move, multiComponentVector, moveQuality, maximization, useAspiration);
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+
+    private bool IsMoveTabu(ItemList<IItem> tabuList, MultiComponentVectorMove move, MultiComponentVectorEncoding multiComponentVector, double moveQuality, bool maximization, bool useAspiration) {
+      bool isTabu = false;
+      SingleItemRotationMove sirm = move as SingleItemRotationMove;  
+      SingleGroupingMove sgm = move as SingleGroupingMove;   
+      SwapSequenceMove ssm = move as SwapSequenceMove;
+      var attributes = tabuList.FindAll(ta => ta.GetType().Equals(move.GetMoveAttributeType()));
+
+      if (sirm != null) {
+        foreach (IItem tabuMove in attributes) {
+          SingleItemRotationMoveAttribute sirmAttr = (tabuMove as SingleItemRotationMoveAttribute);
+          if (sirmAttr != null
+            && (!useAspiration
+                || maximization && moveQuality <= sirmAttr.MoveQuality
+                || !maximization && moveQuality >= sirmAttr.MoveQuality)) {
+                  if (sirm.ItemIndex == sirmAttr.ItemIndex || multiComponentVector.PackingInformations[sirm.ItemIndex].Rotated == sirmAttr.ItemRotation)
+                    isTabu = true;
+          }
+          if (isTabu) break;
+        }
+      } else if (sgm != null) {
+        foreach (IItem tabuMove in attributes) {
+          SingleGroupingMoveAttribute sgmAttr = (tabuMove as SingleGroupingMoveAttribute);
+          if (sgmAttr != null
+            && (!useAspiration
+                || maximization && moveQuality <= sgmAttr.MoveQuality
+                || !maximization && moveQuality >= sgmAttr.MoveQuality)) {
+                  if (sgm.ItemIndex == sgmAttr.ItemIndex || multiComponentVector.PackingInformations[sgm.ItemIndex].AssignedBin == sgmAttr.AssignedBin)
+                    isTabu = true;
+          }
+          if (isTabu) break;
+        }
+      } else if (ssm != null) {
+        foreach (IItem tabuMove in attributes) {
+          SwapSequenceMoveAttribute ssmAttr = (tabuMove as SwapSequenceMoveAttribute);
+          if (ssmAttr != null
+            && (!useAspiration
+                || maximization && moveQuality <= ssmAttr.MoveQuality
+                || !maximization && moveQuality >= ssmAttr.MoveQuality)) {
+                  if (ssm.Index1 == ssmAttr.Index1
+                    || ssm.Index2 == ssmAttr.Index2
+                    || multiComponentVector.PackingInformations[ssm.Index1].ItemIndex == ssmAttr.ItemIndex1
+                    || multiComponentVector.PackingInformations[ssm.Index2].ItemIndex == ssmAttr.ItemIndex2)
+              isTabu = true;
+          }
+          if (isTabu) break;
+        }
+      } 
+
+      
+
+      return isTabu;
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveMaker.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveMaker.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveMaker.cs	(revision 9440)
@@ -0,0 +1,79 @@
+﻿#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.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MultiComponentVectorMoveMaker", "Peforms a single move on a given multi-component vector and updates the quality.")]
+  [StorableClass]
+  public class MultiComponentVectorMoveMaker : SingleSuccessorOperator, IMoveMaker, IMultiComponentVectorMoveOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<MultiComponentVectorMove> MultiComponentVectorMoveParameter {
+      get { return (ILookupParameter<MultiComponentVectorMove>)Parameters["MultiComponentVectorMove"]; }
+    }
+    public ILookupParameter<MultiComponentVectorEncoding> MultiComponentVectorParameter {
+      get { return (ILookupParameter<MultiComponentVectorEncoding>)Parameters["MultiComponentVector"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiComponentVectorMoveMaker(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorMoveMaker(MultiComponentVectorMoveMaker original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new LookupParameter<MultiComponentVectorMove>("MultiComponentVectorMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
+      Parameters.Add(new LookupParameter<MultiComponentVectorEncoding>("MultiComponentVector", "The solution as grouping vector."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiComponentVectorMoveMaker(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      MultiComponentVectorMove move = MultiComponentVectorMoveParameter.ActualValue;
+      MultiComponentVectorEncoding MultiComponentVector = MultiComponentVectorParameter.ActualValue;
+      DoubleValue moveQuality = MoveQualityParameter.ActualValue;
+      DoubleValue quality = QualityParameter.ActualValue;
+
+      MultiComponentVector = move.GetVectorAfterMove();
+
+      quality.Value = moveQuality.Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveSoftTabuCriterion.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveSoftTabuCriterion.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveSoftTabuCriterion.cs	(revision 9440)
@@ -0,0 +1,147 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MultiComponentVectorMoveSoftTabuCriterion", "<Missing>")]
+  [StorableClass]
+  public class MultiComponentVectorMoveSoftTabuCriterion : SingleSuccessorOperator, IMultiComponentVectorMoveOperator, ITabuChecker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<MultiComponentVectorMove> MultiComponentVectorMoveParameter {
+      get { return (ILookupParameter<MultiComponentVectorMove>)Parameters["MultiComponentVectorMove"]; }
+    }
+    public ILookupParameter<MultiComponentVectorEncoding> MultiComponentVectorParameter {
+      get { return (ILookupParameter<MultiComponentVectorEncoding>)Parameters["MultiComponentVector"]; }
+    }
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiComponentVectorMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorMoveSoftTabuCriterion(MultiComponentVectorMoveSoftTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorMoveSoftTabuCriterion()
+      : base() {
+        Parameters.Add(new LookupParameter<MultiComponentVectorMove>("MultiComponentVectorMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<MultiComponentVectorEncoding>("MultiComponentVector", "The solution to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiComponentVectorMoveSoftTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      MultiComponentVectorMove move = MultiComponentVectorMoveParameter.ActualValue;
+      MultiComponentVectorEncoding multiComponentVector = MultiComponentVectorParameter.ActualValue;
+      int length = multiComponentVector.PackingInformations.Count;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterionParameter.Value.Value;
+      bool isTabu = IsMoveTabu(tabuList, move, multiComponentVector, moveQuality, maximization, useAspiration);
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+
+    private bool IsMoveTabu(ItemList<IItem> tabuList, MultiComponentVectorMove move, MultiComponentVectorEncoding multiComponentVector, double moveQuality, bool maximization, bool useAspiration) {
+      bool isTabu = false;
+      SingleItemRotationMove sirm = move as SingleItemRotationMove;  
+      SingleGroupingMove sgm = move as SingleGroupingMove;   
+      SwapSequenceMove ssm = move as SwapSequenceMove;
+      var attributes = tabuList.FindAll(ta => ta.GetType().Equals(move.GetMoveAttributeType()));
+
+      if (sirm != null) {
+        foreach (IItem tabuMove in attributes) {
+          SingleItemRotationMoveAttribute sirmAttr = (tabuMove as SingleItemRotationMoveAttribute);
+          if (sirmAttr != null
+            && (!useAspiration
+                || maximization && moveQuality <= sirmAttr.MoveQuality
+                || !maximization && moveQuality >= sirmAttr.MoveQuality)) {
+                  if (sirm.ItemIndex == sirmAttr.ItemIndex && multiComponentVector.PackingInformations[sirm.ItemIndex].Rotated == sirmAttr.ItemRotation)
+                    isTabu = true;
+          }
+          if (isTabu) break;
+        }
+      } else if (sgm != null) {
+        foreach (IItem tabuMove in attributes) {
+          SingleGroupingMoveAttribute sgmAttr = (tabuMove as SingleGroupingMoveAttribute);
+          if (sgmAttr != null
+            && (!useAspiration
+                || maximization && moveQuality <= sgmAttr.MoveQuality
+                || !maximization && moveQuality >= sgmAttr.MoveQuality)) {
+                  if (sgm.ItemIndex == sgmAttr.ItemIndex && multiComponentVector.PackingInformations[sgm.ItemIndex].AssignedBin == sgmAttr.AssignedBin)
+                    isTabu = true;
+          }
+          if (isTabu) break;
+        }
+      } else if (ssm != null) {
+        foreach (IItem tabuMove in attributes) {
+          SwapSequenceMoveAttribute ssmAttr = (tabuMove as SwapSequenceMoveAttribute);
+          if (ssmAttr != null
+            && (!useAspiration
+                || maximization && moveQuality <= ssmAttr.MoveQuality
+                || !maximization && moveQuality >= ssmAttr.MoveQuality)) {
+                  if (ssm.Index1 == ssmAttr.Index1
+                    && ssm.Index2 == ssmAttr.Index2
+                    && multiComponentVector.PackingInformations[ssm.Index1].ItemIndex == ssmAttr.ItemIndex1
+                    && multiComponentVector.PackingInformations[ssm.Index2].ItemIndex == ssmAttr.ItemIndex2)
+              isTabu = true;
+          }
+          if (isTabu) break;
+        }
+      } 
+
+      
+
+      return isTabu;
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorTabuMaker.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorTabuMaker.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorTabuMaker.cs	(revision 9440)
@@ -0,0 +1,74 @@
+﻿#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.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Multi component tabu maker", "Declares a given single grouping move as tabu, by adding its attributes to the tabu list and also store the solution quality or the move quality (whichever is better).")]
+  [StorableClass]
+  public class MultiComponentVectorTabuMaker : TabuMaker, IMultiComponentVectorMoveOperator{
+    public ILookupParameter<MultiComponentVectorMove> MultiComponentVectorMoveParameter {
+      get { return (ILookupParameter<MultiComponentVectorMove>)Parameters["MultiComponentVectorMove"]; }
+    }
+    public ILookupParameter<MultiComponentVectorEncoding> MultiComponentVectorParameter {
+      get { return (ILookupParameter<MultiComponentVectorEncoding>)Parameters["MultiComponentVector"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiComponentVectorTabuMaker(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorTabuMaker(MultiComponentVectorTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<MultiComponentVectorMove>("MultiComponentVectorMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<MultiComponentVectorEncoding>("MultiComponentVector", "The solution to evaluate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiComponentVectorTabuMaker(this, cloner);
+    }
+
+    protected override IItem GetTabuAttribute(bool maximization, double quality, double moveQuality) {
+      MultiComponentVectorMove move = MultiComponentVectorMoveParameter.ActualValue;
+      MultiComponentVectorEncoding solution = MultiComponentVectorParameter.ActualValue;
+      double baseQuality = moveQuality;
+      if (maximization && quality > moveQuality || !maximization && quality < moveQuality) 
+        baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
+                              
+      SingleItemRotationMove sirm = move as SingleItemRotationMove;
+      if (sirm != null)
+        return new SingleItemRotationMoveAttribute(sirm.ItemIndex, solution.PackingInformations[sirm.ItemIndex].Rotated, baseQuality);
+      SingleGroupingMove sgm = move as SingleGroupingMove;
+      if (sgm != null)
+        return new SingleGroupingMoveAttribute(sgm.ItemIndex, solution.PackingInformations[sgm.ItemIndex].AssignedBin, baseQuality);
+      SwapSequenceMove ssm = move as SwapSequenceMove;
+      if (ssm != null)
+        return new SwapSequenceMoveAttribute(ssm.Index1, ssm.Index2, solution.PackingInformations[ssm.Index1].ItemIndex, solution.PackingInformations[ssm.Index2].ItemIndex, baseQuality);
+
+      else return solution;
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/StochasticMultiComponentVectorMoveGenerator.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/StochasticMultiComponentVectorMoveGenerator.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/StochasticMultiComponentVectorMoveGenerator.cs	(revision 9440)
@@ -0,0 +1,86 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("StochasticMultiComponentVectorMoveGenerator", "Generates all possible multi component moves from a given multiComponentVector.")]
+  [StorableClass]
+  public class StochasticMultiComponentVectorMoveGenerator : MultiComponentVectorMoveGenerator, IMultiMoveGenerator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public IntValue SampleSize {
+      get { return SampleSizeParameter.Value; }
+      set { SampleSizeParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected StochasticMultiComponentVectorMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticMultiComponentVectorMoveGenerator(StochasticMultiComponentVectorMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public StochasticMultiComponentVectorMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticMultiComponentVectorMoveGenerator(this, cloner);
+    }
+
+    public static MultiComponentVectorMove[] Apply(MultiComponentVectorEncoding multiComponentVector, IRandom random, int sampleSize) {
+      MultiComponentVectorMove[] moves = new MultiComponentVectorMove[sampleSize];
+      var rm = new List<MultiComponentVectorMove> (GenerateRotationMoves(multiComponentVector));
+      var gm = new List<MultiComponentVectorMove> (GenerateSingleGroupingMoves(multiComponentVector));
+      var sm = new List<MultiComponentVectorMove> (GenerateSwapSequenceMoves(multiComponentVector));
+
+      for (int i = 0; i < sampleSize; i++) {
+        int typeDecision = random.Next(3);
+        switch (typeDecision) {
+          case 0: moves[i] = rm[random.Next(rm.Count)];
+            break;
+          case 1: moves[i] = gm[random.Next(gm.Count)];
+            break;
+          case 2: moves[i] = sm[random.Next(sm.Count)];
+            break;
+          default:
+            break;
+        }
+      }
+      return moves;
+    }
+
+    protected override MultiComponentVectorMove[] GenerateMoves(MultiComponentVectorEncoding multiComponentVector) {
+      IRandom random = RandomParameter.ActualValue;
+      return Apply(multiComponentVector, random, SampleSizeParameter.ActualValue.Value);
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorCrossover.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorCrossover.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorCrossover.cs	(revision 9440)
@@ -0,0 +1,54 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Multi Component Vector Crossover", "An operator which crosses two GroupingVector representations.")]
+  [StorableClass]
+  public abstract class MultiComponentVectorCrossover : PackingSolutionCrossover, IMultiComponentVectorOperator {
+
+    [StorableConstructor]
+    protected MultiComponentVectorCrossover(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorCrossover(MultiComponentVectorCrossover original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorCrossover()
+      : base() {
+        ParentsParameter.ActualName = "MultiComponentVector";
+        ChildParameter.ActualName = "MultiComponentVector";
+    }
+
+    public abstract MultiComponentVectorEncoding Cross(IRandom random, MultiComponentVectorEncoding parent1, MultiComponentVectorEncoding parent2);
+
+    public override IOperation Apply() {
+      var parents = ParentsParameter.ActualValue;
+
+      ChildParameter.ActualValue =
+        Cross(RandomParameter.ActualValue, parents[0] as MultiComponentVectorEncoding, parents[1] as MultiComponentVectorEncoding);
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorEncoding.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorEncoding.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorEncoding.cs	(revision 9440)
@@ -0,0 +1,142 @@
+﻿#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.Text;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Multi Component Vector Encoding", "Represents an encoding for a bin packing problem using an array of objects containing multiple packing-informations for every packing-item.")]
+  [StorableClass]
+  public class MultiComponentVectorEncoding : Item, IPackingSolutionEncoding {
+
+    [Storable]
+    public ItemList<PackingInformation> PackingInformations {get;set;}   
+
+    [StorableConstructor]
+    protected MultiComponentVectorEncoding(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorEncoding(MultiComponentVectorEncoding original, Cloner cloner)
+      : base(original, cloner) {
+        this.PackingInformations = cloner.Clone(original.PackingInformations);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiComponentVectorEncoding(this, cloner);
+    }
+
+    public MultiComponentVectorEncoding()
+      : base() {
+        PackingInformations = new ItemList<PackingInformation>();
+    }
+
+    public override string ToString() {
+      StringBuilder sb = new StringBuilder();
+      sb.Append("[ ");
+      foreach (var pi in PackingInformations) {
+        sb.Append(pi.ToString() + " ");        
+      }
+      sb.Append("]");
+      return sb.ToString();
+    }
+
+
+    public override bool Equals(object obj) {
+      MultiComponentVectorEncoding mce = obj as MultiComponentVectorEncoding;
+      if (mce != null && mce.PackingInformations != null && mce.PackingInformations.Count == this.PackingInformations.Count) {
+        for (int i = 0; i <= mce.PackingInformations.Count; i++) {
+          if (mce.PackingInformations[i] != this.PackingInformations[i])
+            return false;
+        }
+      }
+
+      return true;
+    }
+    public override int GetHashCode() {
+      return PackingInformations.GetHashCode();
+    }
+  }
+
+  [Item("Packing Information", "Represents a composition of packing informations for the multi-component packing-encoding.")]
+  [StorableClass]
+  public class PackingInformation : Item {
+    [Storable]
+    public int ItemIndex { get; set; }
+    [Storable]
+    public int AssignedBin { get; set; }
+    [Storable]
+    public bool Rotated { get; set; }
+
+    public PackingInformation(int itemIndex, int assignedBin, bool rotated) {
+      this.AssignedBin  = assignedBin;
+      this.ItemIndex   = itemIndex;
+      this.Rotated      = rotated;
+    }     
+    public PackingInformation(PackingInformation original) {
+      this.AssignedBin = original.AssignedBin;
+      this.ItemIndex = original.ItemIndex;
+      this.Rotated = original.Rotated;
+    }
+
+    [StorableConstructor]
+    protected PackingInformation(bool deserializing) : base(deserializing) { }
+    protected PackingInformation(PackingInformation original, Cloner cloner)
+      : base(original, cloner) {
+        this.AssignedBin  = original.AssignedBin;
+        this.ItemIndex   = original.ItemIndex;
+        this.Rotated      = original.Rotated;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingInformation(this, cloner);
+    }
+
+    public override string ToString() {
+      return String.Format("({0}, {1}, {2}) ", ItemIndex, AssignedBin, Rotated);
+    }
+
+    public override bool Equals(object obj) {
+      PackingInformation pi = obj as PackingInformation;
+      if (pi != null)
+        return this.ItemIndex.Equals(pi.ItemIndex) && this.AssignedBin.Equals(pi.AssignedBin) && this.Rotated.Equals(pi.Rotated);
+
+      return false;
+    }
+
+    public override int GetHashCode() {
+      return base.GetHashCode();
+    }
+
+    public static ItemList<PackingInformation> CreateListRandomly(int items, int lowerBound, IRandom random) {
+      Permutation permutation = new Permutation(PermutationTypes.Absolute, items, random);
+      var result = new ItemList<PackingInformation>();
+      foreach (int itemIndex in permutation) {
+        result.Add(new PackingInformation (itemIndex, random.Next(0, lowerBound + 1), random.Next(0,100) > 60 ? true : false));
+      }
+      return result;
+    }
+  }
+
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorManipulator.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorManipulator.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorManipulator.cs	(revision 9440)
@@ -0,0 +1,50 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Multi Component Vector Manipulator", "An operator which manipulates a PackingSequence representation.")]
+  [StorableClass]
+  public abstract class MultiComponentVectorManipulator : PackingSolutionManipulator, IMultiComponentVectorOperator {
+    [StorableConstructor]
+    protected MultiComponentVectorManipulator(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorManipulator(MultiComponentVectorManipulator original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorManipulator()
+      : base() {
+        EncodedSolutionParameter.ActualName = "MultiComponentVector";
+    }
+
+    protected abstract void Manipulate(IRandom random, MultiComponentVectorEncoding individual);
+    public override IOperation Apply() {
+      var solution = EncodedSolutionParameter.ActualValue as MultiComponentVectorEncoding;
+      if (solution == null) throw new InvalidOperationException("PackingSolutionEncoding was not found or is not of type MultiComponentVectorEncoding.");
+      Manipulate(RandomParameter.ActualValue, solution);
+      return base.Apply();
+    }
+
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorRandomCreator.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorRandomCreator.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorRandomCreator.cs	(revision 9440)
@@ -0,0 +1,74 @@
+﻿#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;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+	[Item("Multi Component Vector Creator", "Creator class used to create MultiComponentVector solutions for bin packing problems.")]
+	[StorableClass]
+	public class MultiComponentVectorRandomCreator : PackingSolutionCreator, IStochasticOperator {
+
+		public ILookupParameter<IRandom> RandomParameter {
+			get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+		}
+		public IValueLookupParameter<IntValue> PackingItemsParameter {
+			get { return (IValueLookupParameter<IntValue>)Parameters["PackingItems"]; }
+		}
+		public IValueLookupParameter<IntValue> LowerBoundParameter {
+			get { return (IValueLookupParameter<IntValue>)Parameters["LowerBound"]; }
+		}
+
+		[StorableConstructor]
+		protected MultiComponentVectorRandomCreator(bool deserializing) : base(deserializing) { }
+		protected MultiComponentVectorRandomCreator(MultiComponentVectorRandomCreator original, Cloner cloner) : base(original, cloner) {
+		}
+		public override IDeepCloneable Clone(Cloner cloner) {
+			return new MultiComponentVectorRandomCreator(this, cloner);
+		}
+
+    public MultiComponentVectorRandomCreator()
+			: base() {
+			Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
+			Parameters.Add(new ValueLookupParameter<IntValue>("PackingItems", "The number of packing-items handled in this problem instance."));
+			Parameters.Add(new ValueLookupParameter<IntValue>("LowerBound", "The lower possible number of bins needed to solve this problem (taken from Dell'Amico, Martello and Vigo; 2002)"));
+
+			EncodedSolutionParameter.ActualName = "MultiComponentVector";
+		}
+
+
+    public static MultiComponentVectorEncoding Apply(int items, int lowerBound, IRandom random) {
+			var solution = new MultiComponentVectorEncoding();
+      solution.PackingInformations = PackingInformation.CreateListRandomly(items, lowerBound, random);
+			return solution;
+		}
+
+		protected override IPackingSolutionEncoding CreateSolution() {
+			return Apply(PackingItemsParameter.ActualValue.Value, LowerBoundParameter.ActualValue.Value, RandomParameter.ActualValue);
+		}
+	}
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/PartiallyMatchedMultiComponentVectorCrossover.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/PartiallyMatchedMultiComponentVectorCrossover.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/PartiallyMatchedMultiComponentVectorCrossover.cs	(revision 9440)
@@ -0,0 +1,82 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Partially Matched Multi Component Vector Crossover", "An operator which crosses two MultiComponentVector representations.")]
+  [StorableClass]
+  public class PartiallyMatchedMultiComponentVectorCrossover :  MultiComponentVectorCrossover {
+    [StorableConstructor]
+    protected PartiallyMatchedMultiComponentVectorCrossover(bool deserializing) : base(deserializing) { }
+    protected PartiallyMatchedMultiComponentVectorCrossover(PartiallyMatchedMultiComponentVectorCrossover original, Cloner cloner) : base(original, cloner) { }
+    public PartiallyMatchedMultiComponentVectorCrossover()
+      : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PartiallyMatchedMultiComponentVectorCrossover(this, cloner);
+    }
+
+    public override MultiComponentVectorEncoding Cross(IRandom random, MultiComponentVectorEncoding parent1, MultiComponentVectorEncoding parent2) {
+      if (parent1.PackingInformations.Count != parent2.PackingInformations.Count) throw new ArgumentException("PartiallyMatchedCrossover: The parent permutations are of unequal length.");
+      if (parent1.PackingInformations.Count < 4) throw new ArgumentException("PartiallyMatchedCrossover: The parent permutation must be at least of size 4.");
+      int length = parent1.PackingInformations.Count;
+      PackingInformation[] result = new PackingInformation[length];
+      int[] invResult = new int[length];
+
+      int breakPoint1, breakPoint2;
+      do {
+        breakPoint1 = random.Next(length - 1);
+        breakPoint2 = random.Next(breakPoint1 + 1, length);
+      } while (breakPoint2 - breakPoint1 >= length - 2); // prevent the case [0,length-1) -> clone of parent1
+
+      // clone parent2 and calculate inverse permutation (number -> index)
+      try {
+        for (int j = 0; j < length; j++) {
+          result[j] = parent2.PackingInformations[j];
+          invResult[result[j].ItemIndex] = j;
+        }
+      }
+      catch (IndexOutOfRangeException) {
+        throw new InvalidOperationException("PartiallyMatchedCrossover: The permutation must consist of consecutive numbers from 0 to N-1 with N = length of the permutation.");
+      }
+
+      for (int j = breakPoint1; j <= breakPoint2; j++) {
+        PackingInformation orig = new PackingInformation (result[j]); // save the former value
+        result[j] = parent1.PackingInformations[j]; // overwrite the former value with the new value
+        int index = invResult[result[j].ItemIndex]; // look where the new value is in the offspring
+        result[index] = orig; // write the former value to this position
+        invResult[orig.ItemIndex] = index; // update the inverse mapping
+        // it's not necessary to do 'invResult[result[j]] = j' as this will not be needed again
+      }
+
+      var childSolution = new MultiComponentVectorEncoding();
+      childSolution.PackingInformations = new ItemList<PackingInformation> (result);
+      return childSolution; //new Permutation(parent1.PermutationType, result);
+    }
+
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/ThreeWayMultiComponentVectorManipulator.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/ThreeWayMultiComponentVectorManipulator.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/ThreeWayMultiComponentVectorManipulator.cs	(revision 9440)
@@ -0,0 +1,80 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Uniform Multi Component Vector Manipulator", "An operator which manipulates a PackingSequence representation.")]
+  [StorableClass]
+  public class ThreeWayMultiComponentVectorManipulator :  MultiComponentVectorManipulator {
+    [StorableConstructor]
+    protected ThreeWayMultiComponentVectorManipulator(bool deserializing) : base(deserializing) { }
+    protected ThreeWayMultiComponentVectorManipulator(ThreeWayMultiComponentVectorManipulator original, Cloner cloner) : base(original, cloner) { }
+    public ThreeWayMultiComponentVectorManipulator()
+      : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ThreeWayMultiComponentVectorManipulator(this, cloner);
+    }
+
+    protected override void Manipulate(IRandom random, MultiComponentVectorEncoding individual) {
+      int manipulatorDecision = random.Next(0, 3);
+
+      //Randomly rotate one item
+      if (manipulatorDecision == 0) {
+        bool r = individual.PackingInformations[random.Next(individual.PackingInformations.Count - 1)].Rotated;
+        individual.PackingInformations[random.Next(individual.PackingInformations.Count - 1)].Rotated = !r;
+      } 
+      //Randomly change the bin-assignment for one item
+      else if (manipulatorDecision == 1) {
+        individual.PackingInformations[random.Next(individual.PackingInformations.Count - 1)].AssignedBin = 0;
+      }
+      //Swap the sequence of two items assigned to the same bin
+      else if (manipulatorDecision == 2) {
+        int length = individual.PackingInformations.Count;
+
+        int counter = 0;
+        int swappedIndex1 = random.Next(length); 
+        int swappedIndex2 = random.Next(length);
+        while ((swappedIndex1 == swappedIndex2 || individual.PackingInformations[swappedIndex1].AssignedBin != individual.PackingInformations[swappedIndex2].AssignedBin) && counter < 10)
+        {
+          swappedIndex1 = random.Next(length); 
+          swappedIndex2 = random.Next(length);
+          counter++;
+        }
+
+        if (swappedIndex1 != swappedIndex2 && individual.PackingInformations[swappedIndex1].AssignedBin == individual.PackingInformations[swappedIndex2].AssignedBin) {
+          int temp = individual.PackingInformations[swappedIndex1].ItemIndex;
+          individual.PackingInformations[swappedIndex1].ItemIndex = individual.PackingInformations[swappedIndex2].ItemIndex;
+          individual.PackingInformations[swappedIndex2].ItemIndex = temp;
+        }
+
+      }
+
+    }
+
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/PackingPlan.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/PackingPlan.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/PackingPlan.cs	(revision 9440)
@@ -0,0 +1,145 @@
+﻿#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.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+using HeuristicLab.Problems.BinPacking.PackingItem;
+using HeuristicLab.Problems.BinPacking.Shapes;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Parameters;
+using HeuristicLab.Data;
+using HeuristicLab.Collections;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingPlan {
+  //RegularPackingPlan defines that the packingItems have to be parallel to the packingBin in every moment
+  //SimpleRotation defines that the items may be rotated 
+  //  only in one dimension, 
+  //  only once and 
+  //  only by 90degree
+  //    so that parallelism to the correlating bin is ensured
+  //This definition implies that the floor of the (3D) objects never changes (what may be a wanted constraint in most cases..)
+  [Item("PackingPlan", "Represents a concrete solution for a bin-packing problem.")]
+  [StorableClass]
+  public class PackingPlan<D, B, I> : ParameterizedNamedItem, IPackingPlan
+    where D : class, IPackingDimensions
+    where B : PackingShape<D>, IPackingBin
+    where I : PackingShape<D>, IPackingItem {
+
+    #region Properties
+    public int NrOfBins {
+      get {
+        if (PackingItemPositions != null)
+          return PackingItemPositions.Select(p => p.Value.AssignedBin).Max() + 1;
+        else return 0;
+      }
+    }
+
+    [Storable]
+    public ObservableDictionary<int, D> PackingItemPositions { get; set; }
+
+    //[Storable]
+    //public ItemList<BoolValue> PackingItemsRotated { get; set; }
+
+    [Storable]
+    public B PackingBinMeasures {
+      get;
+      set;
+    }
+    [Storable]
+    public ItemList<I> PackingItemMeasures {
+      get;
+      set;
+    }
+    [Storable]
+    private DoubleValue quality;
+    public DoubleValue Quality {
+      get { return quality; }
+      set {
+        if (quality != value) {
+          if (quality != null) DeregisterQualityEvents();
+          quality = value;
+          if (quality != null) RegisterQualityEvents();
+          OnQualityChanged();
+        }
+      }
+    }
+    #endregion
+
+    public PackingPlan(B binMeasures, ItemList<I> itemMeasures) : base() {
+      this.PackingBinMeasures = binMeasures;
+      this.PackingItemMeasures = itemMeasures;
+    }
+
+    [StorableConstructor]
+    protected PackingPlan(bool deserializing) : base(deserializing) { }
+    protected PackingPlan(PackingPlan<D,B,I> original, Cloner cloner)
+      : base(original, cloner) {
+        PackingItemPositions = new ObservableDictionary<int, D>(original.PackingItemPositions);
+      PackingBinMeasures = original.PackingBinMeasures;
+      PackingItemMeasures = original.PackingItemMeasures;
+      //PackingItemsRotated = cloner.Clone(original.PackingItemsRotated);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingPlan<D,B,I>(this, cloner);
+    }
+
+
+    #region Events
+    public event EventHandler QualityChanged;
+    private void OnQualityChanged() {
+      var changed = QualityChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+    private void RegisterQualityEvents() {
+      Quality.ValueChanged += new EventHandler(Quality_ValueChanged);
+    }
+    private void DeregisterQualityEvents() {
+      Quality.ValueChanged -= new EventHandler(Quality_ValueChanged);
+    }
+    private void Quality_ValueChanged(object sender, EventArgs e) {
+      OnQualityChanged();
+    }
+
+    public event EventHandler PackingItemPositionChanged;
+    private void OnPackingItemPositionChanged() {
+      var changed = PackingItemPositionChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+    private void RegisterPackingItemPositionEvents() {
+      PackingItemPositions.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(PackingItemPosition_PropertyChanged);
+    }
+    private void DeregisterPackingItemPositionEvents() {
+      PackingItemPositions.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(PackingItemPosition_PropertyChanged);
+    }
+    private void PackingItemPosition_PropertyChanged(object sender, EventArgs e) {
+      OnPackingItemPositionChanged();
+    }
+    #endregion
+  }
+}
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/RegularSimpleRotationPackingPlan.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/RegularSimpleRotationPackingPlan.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/RegularSimpleRotationPackingPlan.cs	(revision 9440)
@@ -0,0 +1,68 @@
+﻿#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.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+using HeuristicLab.Problems.BinPacking.PackingItem;
+using HeuristicLab.Problems.BinPacking.Shapes;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingPlan {
+  //RegularPackingPlan defines that the packingItems have to be parallel to the packingBin in every moment
+  //SimpleRotation defines that the items may be rotated 
+  //  only in one dimension, 
+  //  only once and 
+  //  only by 90degree
+  //    so that parallelism to the correlating bin is ensured
+  //This definition implies that the floor of the (3D) objects never changes (what may be a wanted constraint in most cases..)
+  [Item("RegularSimpleRotationPackingPlan", "Represents a concrete solution for a bin-packing problem using simple rotation (90degrees-steps) and regular shapes (e.g. rectangle)")]
+  [StorableClass]
+  public class RegularSimpleRotationPackingPlan<D, B, I> : PackingPlan<D, B, I>
+    where D : class, IPackingDimensions
+    where B : PackingShape<D>, IRegularPackingShape, IPackingBin
+    where I : PackingShape<D>, IRegularPackingShape, IPackingItem {
+    
+    #region Properties
+    public ItemList<BoolValue> PackingItemsRotated { get; set; }
+    #endregion
+
+    public RegularSimpleRotationPackingPlan(B binMeasures, ItemList<I> itemMeasures) : base(binMeasures, itemMeasures) {
+
+    }
+
+    [StorableConstructor]
+    protected RegularSimpleRotationPackingPlan(bool deserializing) : base(deserializing) { }
+    protected RegularSimpleRotationPackingPlan(RegularSimpleRotationPackingPlan<D,B,I> original, Cloner cloner)
+      : base(original, cloner) {
+        PackingItemsRotated = cloner.Clone(original.PackingItemsRotated);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RegularSimpleRotationPackingPlan<D,B,I>(this, cloner);
+    }
+
+  }
+}
