Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/AlgorithmBehaviorHelpers.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/AlgorithmBehaviorHelpers.cs	(revision 8496)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/AlgorithmBehaviorHelpers.cs	(revision 8496)
@@ -0,0 +1,103 @@
+﻿#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 HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior {
+  public static class AlgorithmBehaviorHelpers {
+    public static bool IsSubtour(IntArray tour, Permutation permutation) {
+      // determine starting position for subtour match
+      int idx = permutation.Select((x, index) => new { Value = x, Index = index }).Single(x => x.Value == tour[0]).Index;
+      bool isSubtour = true;
+      for (int i = 1; i < tour.Length; i++) {
+        if (tour[i] == permutation[(idx + 1) % permutation.Length]) { // check right side
+          idx = (idx + 1) % permutation.Length;
+        } else if (tour[i] == permutation[(idx - 1 + permutation.Length) % permutation.Length]) { // check left side
+          idx = (idx - 1 + permutation.Length) % permutation.Length;
+        } else {
+          isSubtour = false;
+          break;
+        }
+      }
+      return isSubtour;
+    }
+
+    public static List<IntArray> ExtractSubtours(Permutation permutation) {
+      var subtours = new List<IntArray>();
+      for (int i = 2; i <= permutation.Count() / 2; i++) { // increase schema length from 2 to n/2
+        for (int j = 0; j < permutation.Count(); j++) { // visit all positions in the permutation
+          var schema = new IntArray(i);
+          for (int k = 0; k < i; k++) schema[k] = permutation[(j + k) % permutation.Length]; // copy edge to schema
+          subtours.Add(schema);
+        }
+      }
+      return subtours;
+    }
+
+    public static List<IntArray> ExtractSubtours(Permutation permutation, int length) {
+      var subtours = new List<IntArray>();
+      int i = 2;
+      for (int j = 0; j < permutation.Count(); j++) { // visit all positions in the permutation
+        var schema = new IntArray(i);
+        for (int k = 0; k < i; k++) schema[k] = permutation[(j + k) % permutation.Length]; // copy edge to schema
+        subtours.Add(schema);
+      }
+      return subtours;
+    }
+
+    public static IList<IntArray> GenerateWildcardSchemata(IntArray schema) {
+      string formatString = "{0:d" + schema.Length + "}";
+      var combs = new List<bool[]>();
+      string comb = string.Empty;
+
+      // create all desired wildcard combinations
+      long i = 0;
+      int wildcardCount = 0; // first wildcard combination contains no wildcards
+      while (wildcardCount < schema.Length) {
+        wildcardCount = (comb = Convert.ToString(i++, 2)).PadLeft(schema.Length, '0').Count(x => x == '1');
+        if (wildcardCount > (schema.Length / 8) && wildcardCount < (schema.Length / 2)) // only include wildcards within certain limits
+          combs.Add(comb.Select(x => x == '1').ToArray()); // '1' becomes true which indicates a wildcard
+      }
+
+      // create all desired wildcard instances
+      var wildcardSchemata = new List<IntArray>();
+      foreach (var c in combs) {
+        wildcardSchemata.Add(new IntArray(schema.Select((x, index) => c[index] ? -1 : x).ToArray())); // -1 is a wildcard in the schema
+      }
+
+      return wildcardSchemata;
+    }
+
+    // attention: brute force matching
+    // should be replaced with KMP, BM or RK
+    public static bool IsMatch(IntArray pattern, int[] tour) {
+      bool match = false;
+      for (int i = 0; i <= tour.Length - pattern.Length && !match; i++) {
+        for (int j = 0; j < pattern.Length && (match = pattern[j] == tour[i + j] || pattern[j] == -1); j++) ;
+      }
+      return match;
+    }
+  }
+}
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 8415)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers-3.3.csproj	(revision 8496)
@@ -49,7 +49,4 @@
       <Private>False</Private>
     </Reference>
-    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <Private>False</Private>
-    </Reference>
     <Reference Include="HeuristicLab.Core-3.3">
       <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
@@ -98,4 +95,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="AlgorithmBehaviorHelpers.cs" />
     <Compile Include="DuplicateSolutionsAnalyzer.cs" />
     <Compile Include="MutationPerformanceAnalyzer.cs" />
@@ -104,10 +102,4 @@
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="VariableDuplicator.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\HeuristicLab.Analysis.AlgorithmBehavior\3.3\HeuristicLab.Analysis.AlgorithmBehavior-3.3.csproj">
-      <Project>{1F75CEA3-464F-4A6F-B2F0-04B9841EBC16}</Project>
-      <Name>HeuristicLab.Analysis.AlgorithmBehavior-3.3</Name>
-    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/Plugin.cs.frame
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/Plugin.cs.frame	(revision 8415)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/Plugin.cs.frame	(revision 8496)
@@ -23,8 +23,9 @@
 
 namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
-  [Plugin("HeuristicLab.Analysis.AlgorithmBehavior.Analyzers", "Provides operators and related classes for tracking the evolution within a GA.", "3.3.6.$WCREV$")]
+  [Plugin("HeuristicLab.Analysis.AlgorithmBehavior.Analyzers", "Provides analyzers for tracking the behavior of GAs.", "3.3.7.$WCREV$")]
   [PluginFile("HeuristicLab.Analysis.AlgorithmBehavior.Analyzers-3.3.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Data", "3.3")]
@@ -35,5 +36,6 @@
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
-  public class HeuristicLabAnalysisAlgorithmBehaviorAnalyzers : PluginBase {
+  [PluginDependency("HeuristicLab.Problems.TravelingSalesman", "3.3")]
+  public class HeuristicLabAnalysisAlgorithmBehaviorAnalyzersPlugin : PluginBase {
   }
 }
