Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/HeuristicLab.Encodings.Permutation-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/HeuristicLab.Encodings.Permutation-3.3.csproj	(revision 3034)
+++ trunk/sources/HeuristicLab.Encodings.Permutation/3.3/HeuristicLab.Encodings.Permutation-3.3.csproj	(revision 3044)
@@ -96,6 +96,7 @@
     <Compile Include="Interfaces\IPermutationCrossover.cs" />
     <Compile Include="Interfaces\IPermutationManipulator.cs" />
-    <Compile Include="Interfaces\IPermutationMoveGenerator.cs" />
+    <Compile Include="Interfaces\IPermutationMoveOperator.cs" />
     <Compile Include="Interfaces\IPermutationOperator.cs" />
+    <Compile Include="Interfaces\ITwoOptPermutationMoveOperator.cs" />
     <Compile Include="Manipulators\InsertionManipulator.cs" />
     <Compile Include="Manipulators\InversionManipulator.cs" />
@@ -105,5 +106,5 @@
     <Compile Include="Manipulators\TranslocationInversionManipulator.cs" />
     <Compile Include="Manipulators\TranslocationManipulator.cs" />
-    <Compile Include="Moves\ExhaustiveTwoOptMoveGenerator.cs">
+    <Compile Include="Moves\TwoOpt\ExhaustiveTwoOptMoveGenerator.cs">
       <SubType>Code</SubType>
     </Compile>
@@ -111,17 +112,19 @@
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="Moves\TwoOptMove.cs">
+    <Compile Include="Moves\TwoOpt\StochasticTwoOptMoveGenerator.cs" />
+    <Compile Include="Moves\TwoOpt\TwoOptMove.cs">
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="Moves\TwoOptMoveMaker.cs">
+    <Compile Include="Moves\TwoOpt\TwoOptMoveGenerator.cs" />
+    <Compile Include="Moves\TwoOpt\TwoOptMoveMaker.cs">
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="Moves\TwoOptMoveTabuAttribute.cs">
+    <Compile Include="Moves\TwoOpt\TwoOptMoveTabuAttribute.cs">
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="Moves\TwoOptMoveTabuEvaluator.cs">
+    <Compile Include="Moves\TwoOpt\TwoOptMoveTabuEvaluator.cs">
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="Moves\TwoOptMoveTabuMaker.cs">
+    <Compile Include="Moves\TwoOpt\TwoOptMoveTabuMaker.cs">
       <SubType>Code</SubType>
     </Compile>
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Interfaces/IPermutationMoveGenerator.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Interfaces/IPermutationMoveGenerator.cs	(revision 3034)
+++ 	(revision )
@@ -1,32 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-
-namespace HeuristicLab.Encodings.Permutation {
-  /// <summary>
-  /// An interface which represents an operator for manipulating solutions.
-  /// </summary>
-  public interface IPermutationMoveGenerator : IPermutationOperator, IMoveGenerator {
-    ILookupParameter<Permutation> PermutationParameter { get; }
-  }
-}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Interfaces/IPermutationMoveOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Interfaces/IPermutationMoveOperator.cs	(revision 3044)
+++ trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Interfaces/IPermutationMoveOperator.cs	(revision 3044)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Encodings.Permutation {
+  public interface IPermutationMoveOperator : IPermutationOperator, IMoveOperator {
+    ILookupParameter<Permutation> PermutationParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Interfaces/ITwoOptPermutationMoveOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Interfaces/ITwoOptPermutationMoveOperator.cs	(revision 3044)
+++ trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Interfaces/ITwoOptPermutationMoveOperator.cs	(revision 3044)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Encodings.Permutation {
+  public interface ITwoOptPermutationMoveOperator : IPermutationMoveOperator {
+    ILookupParameter<TwoOptMove> TwoOptMoveParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/ExhaustiveTwoOptMoveGenerator.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/ExhaustiveTwoOptMoveGenerator.cs	(revision 3034)
+++ 	(revision )
@@ -1,71 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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.Core;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Encodings.Permutation {
-  [Item("ExhaustiveTwoOptMoveGenerator", "Generates all possible 2-opt moves from a given permutation.")]
-  [StorableClass]
-  public class ExhaustiveTwoOptMoveGenerator : SingleSuccessorOperator, IPermutationMoveGenerator {
-    public ILookupParameter<Permutation> PermutationParameter {
-      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
-    }
-    public LookupParameter<TwoOptMove> MoveParameter {
-      get { return (LookupParameter<TwoOptMove>)Parameters["Move"]; }
-    }
-    private ScopeParameter CurrentScopeParameter {
-      get { return (ScopeParameter)Parameters["CurrentScope"]; }
-    }
-
-    public ExhaustiveTwoOptMoveGenerator()
-      : base() {
-      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The permutation for which moves should be generated."));
-      Parameters.Add(new LookupParameter<TwoOptMove>("Move", "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() {
-      Permutation p = PermutationParameter.ActualValue;
-      int length = p.Length;
-      int totalMoves = (length) * (length - 1) / 2 - 3;
-      Scope[] moveScopes = new Scope[totalMoves];
-      int count = 0;
-      for (int i = 0; i < length - 1; i++)
-        for (int j = i + 1; j < length; j++) {
-          // doesn't make sense to inverse the whole permutation or the whole but one
-          if (i == 0 && j >= length - 2) continue;
-          else if (i == 1 && j >= length - 1) continue;
-          Scope s = new Scope(count.ToString());
-          s.Variables.Add(new Variable(MoveParameter.ActualName, new TwoOptMove(i, j)));
-          moveScopes[count] = s;
-          count++;
-        }
-      // FIXME: remove the line below
-      if (count != totalMoves) throw new InvalidOperationException(Name + ": totalMoves != count");
-      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
-      return base.Apply();
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/ExhaustiveTwoOptMoveGenerator.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/ExhaustiveTwoOptMoveGenerator.cs	(revision 3044)
+++ trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/ExhaustiveTwoOptMoveGenerator.cs	(revision 3044)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.Permutation {
+  [Item("ExhaustiveTwoOptMoveGenerator", "Generates all possible 2-opt moves from a given permutation.")]
+  [StorableClass]
+  public class ExhaustiveTwoOptMoveGenerator : TwoOptMoveGenerator {
+    public static TwoOptMove[] Apply(Permutation permutation) {
+      int length = permutation.Length;
+      int totalMoves = (length) * (length - 1) / 2 - 3;
+      TwoOptMove[] moves = new TwoOptMove[totalMoves];
+      int count = 0;
+      for (int i = 0; i < length - 1; i++)
+        for (int j = i + 1; j < length; j++) {
+          // doesn't make sense to inverse the whole permutation or the whole but one
+          if (i == 0 && j >= length - 2) continue;
+          else if (i == 1 && j >= length - 1) continue;
+          moves[count++] = new TwoOptMove(i, j);
+        }
+      return moves;
+    }
+
+    protected override TwoOptMove[] GenerateMoves(Permutation permutation) {
+      return Apply(permutation);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/StochasticTwoOptMoveGenerator.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/StochasticTwoOptMoveGenerator.cs	(revision 3044)
+++ trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/StochasticTwoOptMoveGenerator.cs	(revision 3044)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.Permutation {
+  [Item("StochasticTwoOptMoveGenerator", "Randomly samples n from all possible 2-opt moves from a given permutation.")]
+  [StorableClass]
+  public class StochasticTwoOptMoveGenerator : TwoOptMoveGenerator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    private ValueLookupParameter<IntData> SampleSizeParameter {
+      get { return (ValueLookupParameter<IntData>)Parameters["SampleSize"]; }
+    }
+
+    public StochasticTwoOptMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntData>("SampleSize", "The number of moves to generate."));
+    }
+
+    public static TwoOptMove[] Apply(Permutation permutation, IRandom random, int sampleSize) {
+      int length = permutation.Length;
+      int totalMoves = (length) * (length - 1) / 2 - 3;
+      if (sampleSize >= totalMoves) throw new InvalidOperationException("StochasticTwoOptMoveGenerator: Sample size (" + sampleSize + ") is larger than the set of all possible moves (" + totalMoves + "), use the ExhaustiveTwoOptMoveGenerator instead.");
+      TwoOptMove[] moves = new TwoOptMove[sampleSize];
+      for (int i = 0; i < sampleSize; i++) {
+        int index1 = random.Next(length - 1);
+        int index2 = random.Next(index1 + 1, length);
+        moves[i] = new TwoOptMove(index1, index2);
+      }
+      return moves;
+    }
+
+    protected override TwoOptMove[] GenerateMoves(Permutation permutation) {
+      IRandom random = RandomParameter.ActualValue;
+      return Apply(permutation, random, SampleSizeParameter.ActualValue.Value);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMove.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMove.cs	(revision 3044)
+++ trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMove.cs	(revision 3044)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.Permutation {
+  [Item("TwoOptMove", "Item that describes a 2-Opt move.")]
+  [StorableClass]
+  public class TwoOptMove : TwoIndexMove {
+    public TwoOptMove()
+      : base() {
+    }
+
+    public TwoOptMove(int index1, int index2)
+      : base(index1, index2, null) {
+    }
+
+    public TwoOptMove(int index1, int index2, Permutation permutation)
+      : base(index1, index2, permutation) {
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveGenerator.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveGenerator.cs	(revision 3044)
+++ trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveGenerator.cs	(revision 3044)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.Permutation {
+  [Item("TwoOptMoveGenerator", "Base class for all 2-opt move generators.")]
+  [StorableClass]
+  public abstract class TwoOptMoveGenerator : SingleSuccessorOperator, ITwoOptPermutationMoveOperator, IMoveGenerator {
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public ILookupParameter<TwoOptMove> TwoOptMoveParameter {
+      get { return (LookupParameter<TwoOptMove>)Parameters["Move"]; }
+    }
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    public TwoOptMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The permutation for which moves should be generated."));
+      Parameters.Add(new LookupParameter<TwoOptMove>("Move", "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() {
+      Permutation p = PermutationParameter.ActualValue;
+      TwoOptMove[] moves = GenerateMoves(p);
+      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(TwoOptMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+      return base.Apply();
+    }
+
+    protected abstract TwoOptMove[] GenerateMoves(Permutation permutation);
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveMaker.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveMaker.cs	(revision 3044)
+++ trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveMaker.cs	(revision 3044)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.Permutation {
+  [Item("TwoOptMoveMaker", "Peforms a 2-opt move on a given permutation and updates the quality.")]
+  [StorableClass]
+  public class TwoOptMoveMaker : SingleSuccessorOperator, ITwoOptPermutationMoveOperator, IMoveMaker {
+    public ILookupParameter<DoubleData> QualityParameter {
+      get { return (LookupParameter<DoubleData>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleData> MoveQualityParameter {
+      get { return (LookupParameter<DoubleData>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<TwoOptMove> TwoOptMoveParameter {
+      get { return (LookupParameter<TwoOptMove>)Parameters["Move"]; }
+    }
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+
+    public TwoOptMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleData>("Quality", "The quality of the solution."));
+      Parameters.Add(new LookupParameter<TwoOptMove>("Move", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<DoubleData>("MoveQuality", "The relative quality of the move."));
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
+    }
+
+    public override IOperation Apply() {
+      TwoOptMove move = TwoOptMoveParameter.ActualValue;
+      Permutation permutation = PermutationParameter.ActualValue;
+      DoubleData moveQuality = MoveQualityParameter.ActualValue;
+      DoubleData quality = QualityParameter.ActualValue;
+
+      InversionManipulator.Apply(permutation, move.Index1, move.Index2);
+      quality.Value = moveQuality.Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveTabuAttribute.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveTabuAttribute.cs	(revision 3044)
+++ trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveTabuAttribute.cs	(revision 3044)
@@ -0,0 +1,51 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.Permutation {
+  [Item("TwoOptMoveTabuAttribute", "Specifies the tabu attributes for a 2-opt move.")]
+  [StorableClass]
+  public class TwoOptMoveTabuAttribute : Item {
+    [Storable]
+    public int Edge1Source { get; private set; }
+    [Storable]
+    public int Edge1Target { get; private set; }
+    [Storable]
+    public int Edge2Source { get; private set; }
+    [Storable]
+    public int Edge2Target { get; private set; }
+
+    [StorableConstructor]
+    private TwoOptMoveTabuAttribute()
+      : base() {
+    }
+
+    public TwoOptMoveTabuAttribute(int edge1Source, int edge1Target, int edge2Source, int edge2Target)
+      : base() {
+      Edge1Source = edge1Source;
+      Edge1Target = edge1Target;
+      Edge2Source = edge2Source;
+      Edge2Target = edge2Target;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveTabuEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveTabuEvaluator.cs	(revision 3044)
+++ trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveTabuEvaluator.cs	(revision 3044)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.Permutation {
+  [Item("TwoOptMoveTabuEvaluator", "Evaluates whether a given 2-opt move is tabu.")]
+  [StorableClass]
+  public class TwoOptMoveTabuEvaluator : SingleSuccessorOperator, ITwoOptPermutationMoveOperator, ITabuMoveEvaluator {
+    public ILookupParameter<TwoOptMove> TwoOptMoveParameter {
+      get { return (LookupParameter<TwoOptMove>)Parameters["Move"]; }
+    }
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return (LookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public LookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (LookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public LookupParameter<BoolData> MoveTabuParameter {
+      get { return (LookupParameter<BoolData>)Parameters["MoveTabu"]; }
+    }
+    private ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    public TwoOptMoveTabuEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<TwoOptMove>("Move", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<BoolData>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope."));
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      TwoOptMove move = TwoOptMoveParameter.ActualValue;
+      Permutation permutation = PermutationParameter.ActualValue;
+      int length = permutation.Length;
+      int E1S = permutation.GetCircular(move.Index1 - 1);
+      int E1T = permutation[move.Index1];
+      int E2S = permutation[move.Index2];
+      int E2T = permutation.GetCircular(move.Index2 + 1);
+      bool isTabu = false;
+      foreach (IItem tabuMove in tabuList) {
+        TwoOptMoveTabuAttribute attribute = (tabuMove as TwoOptMoveTabuAttribute);
+        if (attribute != null) {
+          // if previously deleted Edge1Source-Target is readded
+          if (attribute.Edge1Source == E1S && attribute.Edge1Target == E2S || attribute.Edge1Source == E2S && attribute.Edge1Target == E1S
+            // if previously deleted Edge2Source-Target is readded
+            || attribute.Edge2Source == E1T && attribute.Edge2Target == E2T || attribute.Edge2Source == E2T && attribute.Edge2Target == E1T
+            // if previously added Edge1Source-Edge2Source is deleted
+            || attribute.Edge1Source == E1S && attribute.Edge2Source == E1T || attribute.Edge1Source == E1T && attribute.Edge2Source == E1S
+            // if previously added Edge1Target-Edge2Target is deleted
+            || attribute.Edge1Target == E2S && attribute.Edge2Target == E2T || attribute.Edge1Target == E2T && attribute.Edge2Target == E2S) {
+            isTabu = true;
+            break;
+          }
+        }
+      }
+      MoveTabuParameter.ActualValue = new BoolData(isTabu);
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveTabuMaker.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveTabuMaker.cs	(revision 3044)
+++ trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOpt/TwoOptMoveTabuMaker.cs	(revision 3044)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.Permutation.Moves {
+  [Item("TwoOptMoveTabuMaker", "Declares a given 2-opt move as tabu, by adding its attributes to the tabu list. It also removes the oldest entry in the tabu list when its size is greater than tenure.")]
+  [StorableClass]
+  public class TwoOptMoveTabuMaker : SingleSuccessorOperator, ITwoOptPermutationMoveOperator, ITabuMoveMaker {
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public ILookupParameter<TwoOptMove> TwoOptMoveParameter {
+      get { return (LookupParameter<TwoOptMove>)Parameters["Move"]; }
+    }
+    public LookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (LookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ValueLookupParameter<IntData> TabuTenureParameter {
+      get { return (ValueLookupParameter<IntData>)Parameters["TabuTenure"]; }
+    }
+
+    public TwoOptMoveTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<TwoOptMove>("Move", "The move that was made."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list where move attributes are stored."));
+      Parameters.Add(new ValueLookupParameter<IntData>("TabuTenure", "The tenure of the tabu list."));
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      TwoOptMove move = TwoOptMoveParameter.ActualValue;
+      IntData tabuTenure = TabuTenureParameter.ActualValue;
+      Permutation permutation = PermutationParameter.ActualValue;
+      
+      if (tabuList.Count >= tabuTenure.Value) {
+        for (int i = 0; i < tabuTenure.Value - 1; i++)
+          tabuList[i] = tabuList[i + 1];
+        tabuList.RemoveAt(tabuList.Count - 1);
+      }
+
+      TwoOptMoveTabuAttribute attribute = new TwoOptMoveTabuAttribute(
+        permutation.GetCircular(move.Index1 - 1), permutation[move.Index1],
+        permutation[move.Index2], permutation.GetCircular(move.Index2 + 1));
+      tabuList.Add(attribute);
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOptMove.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOptMove.cs	(revision 3034)
+++ 	(revision )
@@ -1,41 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Encodings.Permutation {
-  [Item("TwoOptMove", "Item that describes a 2-Opt move.")]
-  [StorableClass]
-  public class TwoOptMove : TwoIndexMove {
-    public TwoOptMove()
-      : base() {
-    }
-
-    public TwoOptMove(int index1, int index2)
-      : base(index1, index2, null) {
-    }
-
-    public TwoOptMove(int index1, int index2, Permutation permutation)
-      : base(index1, index2, permutation) {
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOptMoveMaker.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOptMoveMaker.cs	(revision 3034)
+++ 	(revision )
@@ -1,66 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Encodings.Permutation {
-  [Item("TwoOptMoveMaker", "Peforms a 2-opt move on a given permutation and updates the quality.")]
-  [StorableClass]
-  public class TwoOptMoveMaker : SingleSuccessorOperator {
-    public LookupParameter<DoubleData> QualityParameter {
-      get { return (LookupParameter<DoubleData>)Parameters["Quality"]; }
-    }
-    public LookupParameter<TwoOptMove> MoveParameter {
-      get { return (LookupParameter<TwoOptMove>)Parameters["Move"]; }
-    }
-    public LookupParameter<DoubleData> MoveQualityParameter {
-      get { return (LookupParameter<DoubleData>)Parameters["MoveQuality"]; }
-    }
-    public ILookupParameter<Permutation> PermutationParameter {
-      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
-    }
-
-    public TwoOptMoveMaker()
-      : base() {
-      Parameters.Add(new LookupParameter<DoubleData>("Quality", "The quality of the solution."));
-      Parameters.Add(new LookupParameter<TwoOptMove>("Move", "The move to evaluate."));
-      Parameters.Add(new LookupParameter<DoubleData>("MoveQuality", "The relative quality of the move."));
-      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
-    }
-
-    public override IOperation Apply() {
-      TwoOptMove move = MoveParameter.ActualValue;
-      Permutation permutation = PermutationParameter.ActualValue;
-      DoubleData moveQuality = MoveQualityParameter.ActualValue;
-      DoubleData quality = QualityParameter.ActualValue;
-
-      InversionManipulator.Apply(permutation, move.Index1, move.Index2);
-      quality.Value = moveQuality.Value;
-
-      return base.Apply();
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOptMoveTabuAttribute.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOptMoveTabuAttribute.cs	(revision 3034)
+++ 	(revision )
@@ -1,51 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Encodings.Permutation {
-  [Item("TwoOptMoveTabuAttribute", "Specifies the tabu attributes for a 2-opt move.")]
-  [StorableClass]
-  public class TwoOptMoveTabuAttribute : Item {
-    [Storable]
-    public int Edge1Source { get; private set; }
-    [Storable]
-    public int Edge1Target { get; private set; }
-    [Storable]
-    public int Edge2Source { get; private set; }
-    [Storable]
-    public int Edge2Target { get; private set; }
-
-    [StorableConstructor]
-    private TwoOptMoveTabuAttribute()
-      : base() {
-    }
-
-    public TwoOptMoveTabuAttribute(int edge1Source, int edge1Target, int edge2Source, int edge2Target)
-      : base() {
-      Edge1Source = edge1Source;
-      Edge1Target = edge1Target;
-      Edge2Source = edge2Source;
-      Edge2Target = edge2Target;
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOptMoveTabuEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOptMoveTabuEvaluator.cs	(revision 3034)
+++ 	(revision )
@@ -1,88 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Encodings.Permutation {
-  [Item("TwoOptMoveTabuEvaluator", "Evaluates whether a given 2-opt move is tabu.")]
-  [StorableClass]
-  public class TwoOptMoveTabuEvaluator : SingleSuccessorOperator {
-    public LookupParameter<TwoOptMove> MoveParameter {
-      get { return (LookupParameter<TwoOptMove>)Parameters["Move"]; }
-    }
-    public LookupParameter<Permutation> PermutationParameter {
-      get { return (LookupParameter<Permutation>)Parameters["Permutation"]; }
-    }
-    public LookupParameter<ItemList<IItem>> TabuListParameter {
-      get { return (LookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
-    }
-    public LookupParameter<BoolData> MoveTabuParameter {
-      get { return (LookupParameter<BoolData>)Parameters["MoveTabu"]; }
-    }
-    private ScopeParameter CurrentScopeParameter {
-      get { return (ScopeParameter)Parameters["CurrentScope"]; }
-    }
-
-    public TwoOptMoveTabuEvaluator()
-      : base() {
-      Parameters.Add(new LookupParameter<TwoOptMove>("Move", "The move to evaluate."));
-      Parameters.Add(new LookupParameter<BoolData>("MoveTabu", "The variable to store if a move was tabu."));
-      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
-      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
-      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope."));
-    }
-
-    public override IOperation Apply() {
-      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
-      TwoOptMove move = MoveParameter.ActualValue;
-      Permutation permutation = PermutationParameter.ActualValue;
-      int length = permutation.Length;
-      int E1S = permutation.GetCircular(move.Index1 - 1);
-      int E1T = permutation[move.Index1];
-      int E2S = permutation[move.Index2];
-      int E2T = permutation.GetCircular(move.Index2 + 1);
-      bool isTabu = false;
-      foreach (IItem tabuMove in tabuList) {
-        TwoOptMoveTabuAttribute attribute = (tabuMove as TwoOptMoveTabuAttribute);
-        if (attribute != null) {
-          // if previously deleted Edge1Source-Target is readded
-          if (attribute.Edge1Source == E1S && attribute.Edge1Target == E2S || attribute.Edge1Source == E2S && attribute.Edge1Target == E1S
-            // if previously deleted Edge2Source-Target is readded
-            || attribute.Edge2Source == E1T && attribute.Edge2Target == E2T || attribute.Edge2Source == E2T && attribute.Edge2Target == E1T
-            // if previously added Edge1Source-Edge2Source is deleted
-            || attribute.Edge1Source == E1S && attribute.Edge2Source == E1T || attribute.Edge1Source == E1T && attribute.Edge2Source == E1S
-            // if previously added Edge1Target-Edge2Target is deleted
-            || attribute.Edge1Target == E2S && attribute.Edge2Target == E2T || attribute.Edge1Target == E2T && attribute.Edge2Target == E2S) {
-            isTabu = true;
-            break;
-          }
-        }
-      }
-      MoveTabuParameter.ActualValue = new BoolData(isTabu);
-      return base.Apply();
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOptMoveTabuMaker.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.Permutation/3.3/Moves/TwoOptMoveTabuMaker.cs	(revision 3034)
+++ 	(revision )
@@ -1,73 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Encodings.Permutation.Moves {
-  [Item("TwoOptMoveTabuMaker", "Declares a given 2-opt move as tabu, by adding its attributes to the tabu list. It also removes the oldest entry in the tabu list when its size is greater than tenure.")]
-  [StorableClass]
-  public class TwoOptMoveTabuMaker : SingleSuccessorOperator {
-    public LookupParameter<TwoOptMove> MoveParameter {
-      get { return (LookupParameter<TwoOptMove>)Parameters["Move"]; }
-    }
-    public LookupParameter<ItemList<IItem>> TabuListParameter {
-      get { return (LookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
-    }
-    public ValueLookupParameter<IntData> TabuTenureParameter {
-      get { return (ValueLookupParameter<IntData>)Parameters["TabuTenure"]; }
-    }
-    public ILookupParameter<Permutation> PermutationParameter {
-      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
-    }
-
-    public TwoOptMoveTabuMaker()
-      : base() {
-      Parameters.Add(new LookupParameter<TwoOptMove>("Move", "The move that was made."));
-      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list where move attributes are stored."));
-      Parameters.Add(new ValueLookupParameter<IntData>("TabuTenure", "The tenure of the tabu list."));
-      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
-    }
-
-    public override IOperation Apply() {
-      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
-      TwoOptMove move = MoveParameter.ActualValue;
-      IntData tabuTenure = TabuTenureParameter.ActualValue;
-      Permutation permutation = PermutationParameter.ActualValue;
-      
-      if (tabuList.Count >= tabuTenure.Value) {
-        for (int i = 0; i < tabuTenure.Value - 1; i++)
-          tabuList[i] = tabuList[i + 1];
-        tabuList.RemoveAt(tabuList.Count - 1);
-      }
-
-      TwoOptMoveTabuAttribute attribute = new TwoOptMoveTabuAttribute(
-        permutation.GetCircular(move.Index1 - 1), permutation[move.Index1],
-        permutation[move.Index2], permutation.GetCircular(move.Index2 + 1));
-      tabuList.Add(attribute);
-      return base.Apply();
-    }
-  }
-}
