Index: branches/DataAnalysis.PopulationDiversityAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj
===================================================================
--- branches/DataAnalysis.PopulationDiversityAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj	(revision 4877)
+++ branches/DataAnalysis.PopulationDiversityAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj	(revision 4881)
@@ -182,4 +182,5 @@
     <Compile Include="SupportVectorRegression\SupportVectorRegressionSolution.cs" />
     <Compile Include="Symbolic\Analyzers\BestSymbolicRegressionSolutionAnalyzer.cs" />
+    <Compile Include="Symbolic\Analyzers\VariablesUsagePopulationDiversityAnalyzer.cs" />
     <Compile Include="Symbolic\Analyzers\FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs" />
     <Compile Include="Symbolic\Analyzers\ISymbolicRegressionAnalyzer.cs" />
Index: branches/DataAnalysis.PopulationDiversityAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/VariablesUsagePopulationDiversityAnalyzer.cs
===================================================================
--- branches/DataAnalysis.PopulationDiversityAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/VariablesUsagePopulationDiversityAnalyzer.cs	(revision 4881)
+++ branches/DataAnalysis.PopulationDiversityAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/VariablesUsagePopulationDiversityAnalyzer.cs	(revision 4881)
@@ -0,0 +1,124 @@
+#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.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using System.Collections.Generic;
+using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols;
+
+namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers {
+  /// <summary>
+  /// An operator that analyzes the population diversity with respect to the sets of used variables.
+  /// </summary>
+  [Item("VariablesUsagePopulationDiversityAnalysisOperator", "An operator that analyzes the population diversity with respect to the sets of used variables.")]
+  [StorableClass]
+  public sealed class VariablesUsagePopulationDiversityAnalyzer : PopulationDiversityAnalyzer<SymbolicExpressionTree>, ISymbolicRegressionAnalyzer {
+
+    private const string ProblemDataParameterName = "ProblemData";
+
+    public IValueLookupParameter<DataAnalysisProblemData> ProblemDataParameter {
+      get { return (IValueLookupParameter<DataAnalysisProblemData>)Parameters[ProblemDataParameterName]; }
+    }
+    public DataAnalysisProblemData ProblemData {
+      get { return ProblemDataParameter.ActualValue; }
+    }
+
+    #region ISymbolicRegressionAnalyzer Members
+
+    public ScopeTreeLookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
+      get { return base.SolutionParameter; }
+    }
+
+    public new ILookupParameter<ResultCollection> ResultsParameter {
+      get { return base.ResultsParameter; }
+    }
+
+    #endregion
+
+    [StorableConstructor]
+    private VariablesUsagePopulationDiversityAnalyzer(bool deserializing) : base(deserializing) { }
+    private VariablesUsagePopulationDiversityAnalyzer(VariablesUsagePopulationDiversityAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public VariablesUsagePopulationDiversityAnalyzer() : base() {
+      Parameters.Add(new ValueLookupParameter<DataAnalysisProblemData>(ProblemDataParameterName, "The problem data for which the symbolic expression tree is a solution."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new VariablesUsagePopulationDiversityAnalyzer(this, cloner);
+    }
+
+    protected override double[,] CalculateSimilarities(SymbolicExpressionTree[] solutions) {
+      int n = solutions.Length;
+      List<string> variableNames = new List<string>() ;
+      foreach (StringValue inputVariable in ProblemData.InputVariables)
+        variableNames.Add(inputVariable.Value);
+      List<int>[] usedVariables = new List<int>[n];
+      for (int i = 0; i < n; i++) {
+        usedVariables[i] = collectUsedVariables(solutions[i], variableNames);
+      }
+      double[,] result = new double[n, n];
+      for (int i = 0; i < n; i++) {
+        for (int j = 0; j < n; j++) {
+          if (i == j)
+            result[i, j] = 1;
+          else
+            result[i, j] = overlapRatio(usedVariables[i], usedVariables[j]);
+        }
+      }
+      return result;
+    }
+
+    private List<int> collectUsedVariables(SymbolicExpressionTree tree, List<string> variableNames) {
+      List<int> variables = new List<int>();
+      collectUsedVariables(tree.Root, variables, variableNames);
+      return variables;
+    }
+
+    private void collectUsedVariables(SymbolicExpressionTreeNode node, List<int> variables, List<string> variableNames) {
+      if (node is VariableTreeNode) {
+        string varName = (node as VariableTreeNode).VariableName;
+        int varIndex = variableNames.IndexOf(varName);
+        if (!variables.Contains(varIndex))
+          variables.Add(varIndex);
+      }
+      foreach (SymbolicExpressionTreeNode subnode in node.SubTrees)
+        collectUsedVariables(subnode, variables, variableNames);
+    }
+
+    private double overlapRatio(List<int> list1, List<int> list2) {
+      int found = 0;
+      foreach (int i in list1)
+        if (list2.Contains(i))
+          found++;
+      return ((double)found) / list1.Count;
+    }
+
+  }
+}
Index: branches/DataAnalysis.PopulationDiversityAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblemBase.cs
===================================================================
--- branches/DataAnalysis.PopulationDiversityAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblemBase.cs	(revision 4877)
+++ branches/DataAnalysis.PopulationDiversityAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblemBase.cs	(revision 4881)
@@ -146,4 +146,9 @@
       get { return DataAnalysisProblemData.TestSamplesEnd; }
     }
+
+    private VariablesUsagePopulationDiversityAnalyzer VariablesUsagePopulationDiversityAnalyzer {
+      get { return operators.OfType<VariablesUsagePopulationDiversityAnalyzer>().FirstOrDefault(); }
+    }
+
     #endregion
 
@@ -297,4 +302,5 @@
       operators.Add(new MinAverageMaxSymbolicExpressionTreeSizeAnalyzer());
       operators.Add(new SymbolicRegressionModelQualityAnalyzer());
+      operators.Add(new VariablesUsagePopulationDiversityAnalyzer());
       ParameterizeOperators();
       ParameterizeAnalyzers();
@@ -324,4 +330,14 @@
           varFreqAnalyzer.ProblemDataParameter.ActualName = DataAnalysisProblemDataParameter.Name;
         }
+        var populationDiversityAnalyzer = analyzer as HeuristicLab.Analysis.PopulationDiversityAnalyzer<SymbolicExpressionTree>;
+        if (populationDiversityAnalyzer != null) {
+          // ??? VariablesUsagePopulationDiversityAnalysisOperator.MaximizationParameter.ActualName = 
+          VariablesUsagePopulationDiversityAnalyzer.SolutionParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
+          // ??? VariablesUsagePopulationDiversityAnalysisOperator.QualityParameter.ActualName 
+          VariablesUsagePopulationDiversityAnalyzer.ResultsParameter.ActualName = "Results";
+        }
+        if (VariablesUsagePopulationDiversityAnalyzer != null) {
+          VariablesUsagePopulationDiversityAnalyzer.ProblemDataParameter.ActualName = DataAnalysisProblemDataParameter.Name;
+        }
       }
       foreach (ISymbolicExpressionTreeAnalyzer analyzer in Operators.OfType<ISymbolicExpressionTreeAnalyzer>()) {
