Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/QAPAfterCrossoverCombinedOperator.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/QAPAfterCrossoverCombinedOperator.cs	(revision 9044)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/QAPAfterCrossoverCombinedOperator.cs	(revision 9044)
@@ -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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
+  [Item("QAPAfterCrossoverCombinedOperator", "An operator that contains all operators that need to be executed after crossover for the QAP.")]
+  [StorableClass]
+  public class QAPAfterCrossoverCombinedOperator : AfterCrossoverCombinedOperator {
+
+    [StorableConstructor]
+    protected QAPAfterCrossoverCombinedOperator(bool deserializing) : base(deserializing) { }
+    protected QAPAfterCrossoverCombinedOperator(QAPAfterCrossoverCombinedOperator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public QAPAfterCrossoverCombinedOperator()
+      : base() {
+    }
+
+    protected override void SimilarityCalculatorParameter_ValueChanged(object sender, System.EventArgs e) {
+      SimilarityCalculatorParameter.Value.QualityVariableName = "Assignment";
+      SimilarityCalculatorParameter.Value.SolutionVariableName = "Quality";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new QAPAfterCrossoverCombinedOperator(this, cloner);
+    }
+
+    public override void InitializeOperators() {
+      base.InitializeOperators();
+
+      cxAnalyzer.ParentsQualityParameter.ActualName = "Quality";
+      cxAnalyzer.QualityParameter.ActualName = "Quality";
+
+      varDuplicator.OriginalParameter.ActualName = "Assignment";
+      varDuplicator.CloneParameter.ActualName = "AssignmentClone";
+
+      var umAnalyzer = new PermutationUnwantedMutationAnalyzer();
+      umAnalyzer.SolutionVariableName = "Assignment";
+      cxAnalyzer.UnwantedMutationAnalyzerParameter.Value = umAnalyzer;  
+    }
+  }
+}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/QAPAfterMutationCombinedOperator.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/QAPAfterMutationCombinedOperator.cs	(revision 9044)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/QAPAfterMutationCombinedOperator.cs	(revision 9044)
@@ -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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
+  [Item("QAPAfterMutationCombinedOperator", "An operator that contains all operators that need to be executed after mutation for the QAP.")]
+  [StorableClass]
+  public class QAPAfterMutationCombinedOperator : AfterMutationCombinedOperator {
+    [StorableConstructor]
+    protected QAPAfterMutationCombinedOperator(bool deserializing) : base(deserializing) { }
+    protected QAPAfterMutationCombinedOperator(QAPAfterMutationCombinedOperator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public QAPAfterMutationCombinedOperator()
+      : base() { }
+
+    protected override void SimilarityCalculatorParameter_ValueChanged(object sender, System.EventArgs e) {
+      SimilarityCalculatorParameter.Value.QualityVariableName = "Quality";
+      SimilarityCalculatorParameter.Value.SolutionVariableName = "Assignment";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new QAPAfterMutationCombinedOperator(this, cloner);
+    }
+
+    public override void InitializeOperators() {
+      base.InitializeOperators();
+      ((ILookupParameter)evaluatorClone.Parameters["Quality"]).ActualName = "QualityM";
+
+      mAnalyzer.QualityAfterCrossoverParameter.ActualName = "Quality";
+      mAnalyzer.QualityAfterMutationParameter.ActualName = "QualityM";
+      mAnalyzer.PermutationBeforeMutationParameter.ActualName = "AssignmentClone";
+      mAnalyzer.PermutationAfterMutationParameter.ActualName = "Assignment";
+
+      varRemover.VariableNameParameter.Value.Value = "TSPTourClone";
+    }
+  }
+}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/TFAfterCrossoverCombinedOperator.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/TFAfterCrossoverCombinedOperator.cs	(revision 9044)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/TFAfterCrossoverCombinedOperator.cs	(revision 9044)
@@ -0,0 +1,62 @@
+﻿#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.Analysis.AlgorithmBehavior.Analyzers {
+  [Item("TFAfterCrossoverCombinedOperator", "An operator that contains all operators that need to be executed after crossover for test functions.")]
+  [StorableClass]
+  public class TFAfterCrossoverCombinedOperator : AfterCrossoverCombinedOperator {
+
+    [StorableConstructor]
+    protected TFAfterCrossoverCombinedOperator(bool deserializing) : base(deserializing) { }
+    protected TFAfterCrossoverCombinedOperator(TFAfterCrossoverCombinedOperator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public TFAfterCrossoverCombinedOperator()
+      : base() {
+    }
+
+    protected override void SimilarityCalculatorParameter_ValueChanged(object sender, System.EventArgs e) {
+      SimilarityCalculatorParameter.Value.QualityVariableName = "Point";
+      SimilarityCalculatorParameter.Value.SolutionVariableName = "Quality";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TFAfterCrossoverCombinedOperator(this, cloner);
+    }
+
+    public override void InitializeOperators() {
+      base.InitializeOperators();
+
+      cxAnalyzer.ParentsQualityParameter.ActualName = "Quality";
+      cxAnalyzer.QualityParameter.ActualName = "Quality";
+
+      varDuplicator.OriginalParameter.ActualName = "Point";
+      varDuplicator.CloneParameter.ActualName = "PointClone";
+
+      //TODO: add unwanted mutation analyzer for TF
+    }
+  }
+}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/TSPAfterCrossoverCombinedOperator.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/TSPAfterCrossoverCombinedOperator.cs	(revision 9044)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/TSPAfterCrossoverCombinedOperator.cs	(revision 9044)
@@ -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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
+  [Item("TSPAfterCrossoverCombinedOperator", "An operator that contains all operators that need to be executed after crossover for the TSP.")]
+  [StorableClass]
+  public class TSPAfterCrossoverCombinedOperator : AfterCrossoverCombinedOperator {
+    [StorableConstructor]
+    protected TSPAfterCrossoverCombinedOperator(bool deserializing) : base(deserializing) { }
+    protected TSPAfterCrossoverCombinedOperator(TSPAfterCrossoverCombinedOperator original, Cloner cloner)
+      : base(original, cloner) { }
+
+    public TSPAfterCrossoverCombinedOperator()
+      : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TSPAfterCrossoverCombinedOperator(this, cloner);
+    }
+
+    public override void InitializeOperators() {
+      base.InitializeOperators();
+
+      var umAnalyzer = new PermutationUnwantedMutationAnalyzer();
+      umAnalyzer.SolutionVariableName = "TSPTour";
+      cxAnalyzer.UnwantedMutationAnalyzerParameter.Value = umAnalyzer;
+    }
+  }
+}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/TSPAfterMutationCombinedOperator.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/TSPAfterMutationCombinedOperator.cs	(revision 9044)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperators/TSPAfterMutationCombinedOperator.cs	(revision 9044)
@@ -0,0 +1,42 @@
+﻿#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.Analysis.AlgorithmBehavior.Analyzers {
+  [Item("TSPAfterMutationCombinedOperator", "An operator that contains all operators that need to be executed after mutation for the TSP.")]
+  [StorableClass]
+  public class TSPAfterMutationCombinedOperator : AfterMutationCombinedOperator {
+    [StorableConstructor]
+    protected TSPAfterMutationCombinedOperator(bool deserializing) : base(deserializing) { }
+    protected TSPAfterMutationCombinedOperator(TSPAfterMutationCombinedOperator original, Cloner cloner)
+      : base(original, cloner) { }
+
+    public TSPAfterMutationCombinedOperator()
+      : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TSPAfterMutationCombinedOperator(this, cloner);
+    }
+  }
+}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CrossoverPerformanceAnalyzer.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CrossoverPerformanceAnalyzer.cs	(revision 9042)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CrossoverPerformanceAnalyzer.cs	(revision 9044)
@@ -53,13 +53,7 @@
       get { return (ILookupParameter<IntValue>)Parameters[GenerationsParameterName]; }
     }
-    public ILookupParameter<ItemArray<Permutation>> ParentsParameter {
-      get { return (ScopeTreeLookupParameter<Permutation>)Parameters["Parents"]; }
-    }
     public ILookupParameter<ItemArray<DoubleValue>> ParentsQualityParameter {
       get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["ParentsQuality"]; }
     }
-    public ILookupParameter<Permutation> ChildParameter {
-      get { return ((LookupParameter<Permutation>)Parameters["Child"]); }
-    }
     public ILookupParameter<DoubleValue> QualityParameter {
       get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
@@ -67,4 +61,7 @@
     public IValueParameter<ISingleObjectiveSolutionSimilarityCalculator> SimilarityCalculatorParameter {
       get { return (IValueParameter<ISingleObjectiveSolutionSimilarityCalculator>)Parameters["SimilarityCalculator"]; }
+    }
+    public IValueParameter<IUnwantedMutationAnalyzer> UnwantedMutationAnalyzerParameter {
+      get { return (IValueParameter<IUnwantedMutationAnalyzer>)Parameters["UnwantedMutationAnalyzer"]; }
     }
     public ILookupParameter<ItemCollection<IItem>> OperatorsParameter {
@@ -117,8 +114,6 @@
 
       Parameters.Add(new ScopeTreeLookupParameter<Permutation>("Parents", "The parent permutations which have been crossed."));
-      ParentsParameter.ActualName = "TSPTour";
 
       Parameters.Add(new LookupParameter<Permutation>("Child", "The child permutation resulting from the crossover."));
-      ChildParameter.ActualName = "TSPTour";
 
       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("ParentsQuality", "The quality of the parent solutions."));
@@ -129,4 +124,5 @@
 
       Parameters.Add(new ValueParameter<ISingleObjectiveSolutionSimilarityCalculator>("SimilarityCalculator"));
+      Parameters.Add(new ValueParameter<IUnwantedMutationAnalyzer>("UnwantedMutationAnalyzer"));
       Parameters.Add(new LookupParameter<ItemCollection<IItem>>("Operators", "The operators and items that the problem provides to the algorithms."));
       Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, false otherwise"));
@@ -187,9 +183,6 @@
 
       Point2D<double> worseQualityPoint, betterQualityPoint, childDiversityToWorseParent, childDiversityToBetterParent, diversityPointParent, qualityPointParent, unwantedMutationPoint;
-      var parent1 = ParentsParameter.ActualValue.First();
-      var parent2 = ParentsParameter.ActualValue.Last();
       var qualityParent1 = ParentsQualityParameter.ActualValue.First().Value;
       var qualityParent2 = ParentsQualityParameter.ActualValue.Last().Value;
-      var child = ChildParameter.ActualValue;
       var qualityChild = QualityParameter.ActualValue.Value;
 
@@ -199,5 +192,10 @@
       diversityPointParent = new Point2D<double>(cnt, parentDiversity);
       qualityPointParent = new Point2D<double>(cnt, Math.Abs(qualityParent1 - qualityParent2));
-      unwantedMutationPoint = new Point2D<double>(cnt, UnwantedMutationAnalyzer.AnalyzeUnwantedMutationsForPermutationEncoding(parent1, parent2, child));
+      if (UnwantedMutationAnalyzerParameter.Value != null) {
+        unwantedMutationPoint = new Point2D<double>(cnt, UnwantedMutationAnalyzerParameter.Value.AnalyzeUnwantedMutations(ExecutionContext.Scope.SubScopes.First(), ExecutionContext.Scope.SubScopes.Last(), ExecutionContext.Scope));
+      } else {
+        //TODO: this is not a good solution
+        unwantedMutationPoint = new Point2D<double>(cnt, 0.0);
+      }
 
       double worseQuality, betterQuality;
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers-3.3.csproj
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers-3.3.csproj	(revision 9042)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers-3.3.csproj	(revision 9044)
@@ -120,10 +120,13 @@
     <Compile Include="AfterCrossoverCombinedOperator.cs" />
     <Compile Include="AfterMutationCombinedOperator.cs" />
-    <Compile Include="TSPAfterMutationCombinedOperator.cs" />
-    <Compile Include="TSPAfterCrossoverCombinedOperator.cs" />
-    <Compile Include="QAPAfterMutationCombinedOperator.cs" />
-    <Compile Include="QAPAfterCrossoverCombinedOperator.cs" />
+    <Compile Include="CombinedOperators\TFAfterCrossoverCombinedOperator.cs" />
+    <Compile Include="CombinedOperators\TSPAfterMutationCombinedOperator.cs" />
+    <Compile Include="CombinedOperators\TSPAfterCrossoverCombinedOperator.cs" />
+    <Compile Include="CombinedOperators\QAPAfterMutationCombinedOperator.cs" />
+    <Compile Include="CombinedOperators\QAPAfterCrossoverCombinedOperator.cs" />
     <Compile Include="InitializableOperator.cs" />
-    <Compile Include="UnwantedMutationAnalyzer.cs" />
+    <Compile Include="UnwantedMutationAnalyzers\PermutationUnwantedMutationAnalyzer.cs" />
+    <Compile Include="UnwantedMutationAnalyzers\IUnwantedMutationAnalyzer.cs" />
+    <Compile Include="UnwantedMutationAnalyzers\UnwantedMutationAnalyzer.cs" />
     <Compile Include="VariableRemover.cs" />
     <Compile Include="LinearLeastSquaresFitting.cs" />
@@ -149,4 +152,5 @@
     <None Include="Properties\AssemblyInfo.cs.frame" />
   </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/QAPAfterCrossoverCombinedOperator.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/QAPAfterCrossoverCombinedOperator.cs	(revision 9042)
+++ 	(revision )
@@ -1,62 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
-  [Item("QAPAfterCrossoverCombinedOperator", "An operator that contains all operators that need to be executed after crossover for the QAP.")]
-  [StorableClass]
-  public class QAPAfterCrossoverCombinedOperator : AfterCrossoverCombinedOperator {
-
-    [StorableConstructor]
-    protected QAPAfterCrossoverCombinedOperator(bool deserializing) : base(deserializing) { }
-    protected QAPAfterCrossoverCombinedOperator(QAPAfterCrossoverCombinedOperator original, Cloner cloner)
-      : base(original, cloner) {
-    }
-
-    public QAPAfterCrossoverCombinedOperator()
-      : base() {
-    }
-
-    protected override void SimilarityCalculatorParameter_ValueChanged(object sender, System.EventArgs e) {
-      SimilarityCalculatorParameter.Value.QualityVariableName = "Assignment";
-      SimilarityCalculatorParameter.Value.SolutionVariableName = "Quality";
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new QAPAfterCrossoverCombinedOperator(this, cloner);
-    }
-
-    public override void InitializeOperators() {
-      base.InitializeOperators();
-
-      cxAnalyzer.ParentsParameter.ActualName = "Assignment";
-      cxAnalyzer.ChildParameter.ActualName = "Assignment";
-      cxAnalyzer.ParentsQualityParameter.ActualName = "Quality";
-      cxAnalyzer.QualityParameter.ActualName = "Quality";
-
-      varDuplicator.OriginalParameter.ActualName = "Assignment";
-      varDuplicator.CloneParameter.ActualName = "AssignmentClone";
-    }
-  }
-}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/QAPAfterMutationCombinedOperator.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/QAPAfterMutationCombinedOperator.cs	(revision 9042)
+++ 	(revision )
@@ -1,60 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
-  [Item("QAPAfterMutationCombinedOperator", "An operator that contains all operators that need to be executed after mutation for the QAP.")]
-  [StorableClass]
-  public class QAPAfterMutationCombinedOperator : AfterMutationCombinedOperator {
-    [StorableConstructor]
-    protected QAPAfterMutationCombinedOperator(bool deserializing) : base(deserializing) { }
-    protected QAPAfterMutationCombinedOperator(QAPAfterMutationCombinedOperator original, Cloner cloner)
-      : base(original, cloner) {
-    }
-
-    public QAPAfterMutationCombinedOperator()
-      : base() { }
-
-    protected override void SimilarityCalculatorParameter_ValueChanged(object sender, System.EventArgs e) {
-      SimilarityCalculatorParameter.Value.QualityVariableName = "Quality";
-      SimilarityCalculatorParameter.Value.SolutionVariableName = "Assignment";
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new QAPAfterMutationCombinedOperator(this, cloner);
-    }
-
-    public override void InitializeOperators() {
-      base.InitializeOperators();
-      ((ILookupParameter)evaluatorClone.Parameters["Quality"]).ActualName = "QualityM";
-
-      mAnalyzer.QualityAfterCrossoverParameter.ActualName = "Quality";
-      mAnalyzer.QualityAfterMutationParameter.ActualName = "QualityM";
-      mAnalyzer.PermutationBeforeMutationParameter.ActualName = "AssignmentClone";
-      mAnalyzer.PermutationAfterMutationParameter.ActualName = "Assignment";
-
-      varRemover.VariableNameParameter.Value.Value = "TSPTourClone";
-    }
-  }
-}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/TSPAfterCrossoverCombinedOperator.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/TSPAfterCrossoverCombinedOperator.cs	(revision 9042)
+++ 	(revision )
@@ -1,39 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
-  [Item("TSPAfterCrossoverCombinedOperator", "An operator that contains all operators that need to be executed after crossover for the TSP.")]
-  [StorableClass]
-  public class TSPAfterCrossoverCombinedOperator : AfterCrossoverCombinedOperator {
-    [StorableConstructor]
-    protected TSPAfterCrossoverCombinedOperator(bool deserializing) : base(deserializing) { }
-    protected TSPAfterCrossoverCombinedOperator(TSPAfterCrossoverCombinedOperator original, Cloner cloner)
-      : base(original, cloner) { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new TSPAfterCrossoverCombinedOperator(this, cloner);
-    }
-  }
-}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/TSPAfterMutationCombinedOperator.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/TSPAfterMutationCombinedOperator.cs	(revision 9042)
+++ 	(revision )
@@ -1,39 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
-  [Item("TSPAfterMutationCombinedOperator", "An operator that contains all operators that need to be executed after mutation for the TSP.")]
-  [StorableClass]
-  public class TSPAfterMutationCombinedOperator : AfterMutationCombinedOperator {
-    [StorableConstructor]
-    protected TSPAfterMutationCombinedOperator(bool deserializing) : base(deserializing) { }
-    protected TSPAfterMutationCombinedOperator(TSPAfterMutationCombinedOperator original, Cloner cloner)
-      : base(original, cloner) { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new TSPAfterMutationCombinedOperator(this, cloner);
-    }
-  }
-}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/UnwantedMutationAnalyzer.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/UnwantedMutationAnalyzer.cs	(revision 9042)
+++ 	(revision )
@@ -1,53 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Encodings.PermutationEncoding;
-namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
-  public class UnwantedMutationAnalyzer {
-    public static double AnalyzeUnwantedMutationsForPermutationEncoding(Permutation parent1, Permutation parent2, Permutation child) {
-      int cnt = 0;
-      int[] edgesP1 = CalculateEdgesVector(parent1);
-      int[] edgesP2 = CalculateEdgesVector(parent2);
-      int[] edgesC = CalculateEdgesVector(child);
-
-      for (int i = 0; i < edgesP1.Length; i++) {
-        if (edgesC[i] != edgesP1[i] &&
-            edgesC[i] != edgesP2[i] &&
-            edgesP1[edgesC[i]] != i &&
-            edgesP2[edgesC[i]] != i) {
-          cnt += 1;
-        }
-      }
-
-      return ((double)cnt) / parent1.Length;
-    }
-
-    //copied from PermutationEqualityComparer
-    private static int[] CalculateEdgesVector(Permutation permutation) {
-      // transform path representation into adjacency representation
-      int[] edgesVector = new int[permutation.Length];
-      for (int i = 0; i < permutation.Length - 1; i++)
-        edgesVector[permutation[i]] = permutation[i + 1];
-      edgesVector[permutation[permutation.Length - 1]] = permutation[0];
-      return edgesVector;
-    }
-  }
-}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/UnwantedMutationAnalyzers/IUnwantedMutationAnalyzer.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/UnwantedMutationAnalyzers/IUnwantedMutationAnalyzer.cs	(revision 9044)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/UnwantedMutationAnalyzers/IUnwantedMutationAnalyzer.cs	(revision 9044)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
+  public interface IUnwantedMutationAnalyzer : IItem {
+    string SolutionVariableName { get; set; }
+    double AnalyzeUnwantedMutations(IScope parent1, IScope parent2, IScope child);
+  }
+}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/UnwantedMutationAnalyzers/PermutationUnwantedMutationAnalyzer.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/UnwantedMutationAnalyzers/PermutationUnwantedMutationAnalyzer.cs	(revision 9044)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/UnwantedMutationAnalyzers/PermutationUnwantedMutationAnalyzer.cs	(revision 9044)
@@ -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.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
+  [Item("PermutationUnwantedMutationAnalyzer", "An item that calculates unwanted mutations for the permutation encoding.")]
+  [StorableClass]
+  public class PermutationUnwantedMutationAnalyzer : UnwantedMutationAnalyzer {
+    [StorableConstructor]
+    protected PermutationUnwantedMutationAnalyzer(bool deserializing) : base(deserializing) { }
+    protected PermutationUnwantedMutationAnalyzer(PermutationUnwantedMutationAnalyzer original, Cloner cloner)
+      : base(original, cloner) { }
+
+    public PermutationUnwantedMutationAnalyzer()
+      : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PermutationUnwantedMutationAnalyzer(this, cloner);
+    }
+
+    public override double AnalyzeUnwantedMutations(IScope parent1, IScope parent2, IScope child) {
+      Permutation p1 = parent1.Variables[SolutionVariableName].Value as Permutation;
+      Permutation p2 = parent2.Variables[SolutionVariableName].Value as Permutation;
+      Permutation c = child.Variables[SolutionVariableName].Value as Permutation;
+
+      return AnalyzeUnwantedMutations(p1, p2, c);
+    }
+
+    private double AnalyzeUnwantedMutations(Permutation parent1, Permutation parent2, Permutation child) {
+      int cnt = 0;
+      int[] edgesP1 = CalculateEdgesVector(parent1);
+      int[] edgesP2 = CalculateEdgesVector(parent2);
+      int[] edgesC = CalculateEdgesVector(child);
+
+      for (int i = 0; i < edgesP1.Length; i++) {
+        if (edgesC[i] != edgesP1[i] &&
+            edgesC[i] != edgesP2[i] &&
+            edgesP1[edgesC[i]] != i &&
+            edgesP2[edgesC[i]] != i) {
+          cnt += 1;
+        }
+      }
+
+      return ((double)cnt) / parent1.Length;
+    }
+
+    //copied from PermutationEqualityComparer
+    private int[] CalculateEdgesVector(Permutation permutation) {
+      // transform path representation into adjacency representation
+      int[] edgesVector = new int[permutation.Length];
+      for (int i = 0; i < permutation.Length - 1; i++)
+        edgesVector[permutation[i]] = permutation[i + 1];
+      edgesVector[permutation[permutation.Length - 1]] = permutation[0];
+      return edgesVector;
+    }
+  }
+}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/UnwantedMutationAnalyzers/UnwantedMutationAnalyzer.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/UnwantedMutationAnalyzers/UnwantedMutationAnalyzer.cs	(revision 9044)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/UnwantedMutationAnalyzers/UnwantedMutationAnalyzer.cs	(revision 9044)
@@ -0,0 +1,45 @@
+﻿#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.Analysis.AlgorithmBehavior.Analyzers {
+  [Item("UnwantedMutationAnalyzer", "A base class for items that calculate unwanted mutations.")]
+  [StorableClass]
+  public abstract class UnwantedMutationAnalyzer : Item, IUnwantedMutationAnalyzer {
+    [Storable]
+    public string SolutionVariableName { get; set; }
+
+    [StorableConstructor]
+    protected UnwantedMutationAnalyzer(bool deserializing) : base(deserializing) { }
+    protected UnwantedMutationAnalyzer(UnwantedMutationAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+      this.SolutionVariableName = original.SolutionVariableName;
+    }
+
+    public UnwantedMutationAnalyzer()
+      : base() { }
+
+    public abstract double AnalyzeUnwantedMutations(IScope parent1, IScope parent2, IScope child);
+  }
+}
