Index: branches/LearningClassifierSystems/HeuristicLab.Encodings.ConditionActionEncoding/3.3/Analyzer/BestTrainingXCSSolutionAnalyzer.cs
===================================================================
--- branches/LearningClassifierSystems/HeuristicLab.Encodings.ConditionActionEncoding/3.3/Analyzer/BestTrainingXCSSolutionAnalyzer.cs	(revision 9175)
+++ branches/LearningClassifierSystems/HeuristicLab.Encodings.ConditionActionEncoding/3.3/Analyzer/BestTrainingXCSSolutionAnalyzer.cs	(revision 9175)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ConditionActionEncoding {
+  [Item("BestTrainingXCSSolutionAnalyzer", "")]
+  [StorableClass]
+  public sealed class BestTrainingXCSSolutionAnalyzer : XCSSolutionAnalyzer {
+    private const string BestTrainingSolutionName = "Best Training Solution";
+
+
+    [StorableConstructor]
+    private BestTrainingXCSSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    private BestTrainingXCSSolutionAnalyzer(BestTrainingXCSSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestTrainingXCSSolutionAnalyzer(this, cloner);
+    }
+    public BestTrainingXCSSolutionAnalyzer()
+      : base() {
+    }
+
+    protected override void UseCurrentXCSSolution(IXCSSolution xcsSolution) {
+      if (!Results.ContainsKey(BestTrainingSolutionName)) {
+        Results.Add(new Result(BestTrainingSolutionName, (IXCSSolution)xcsSolution.Clone()));
+      } else {
+        if (xcsSolution.TrainingAccuracy > ((IXCSSolution)Results[BestTrainingSolutionName].Value).TrainingAccuracy) {
+          Results[BestTrainingSolutionName].Value = (IXCSSolution)xcsSolution.Clone();
+        }
+      }
+    }
+  }
+}
Index: branches/LearningClassifierSystems/HeuristicLab.Encodings.ConditionActionEncoding/3.3/Analyzer/CurrentXCSSolutionAnalyzer.cs
===================================================================
--- branches/LearningClassifierSystems/HeuristicLab.Encodings.ConditionActionEncoding/3.3/Analyzer/CurrentXCSSolutionAnalyzer.cs	(revision 9175)
+++ branches/LearningClassifierSystems/HeuristicLab.Encodings.ConditionActionEncoding/3.3/Analyzer/CurrentXCSSolutionAnalyzer.cs	(revision 9175)
@@ -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.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ConditionActionEncoding {
+  [Item("CurrentXCSSolutionAnalyzer", "")]
+  [StorableClass]
+  public sealed class CurrentXCSSolutionAnalyzer : XCSSolutionAnalyzer {
+    private const string CurrentSolutionName = "Current Solution";
+    private const string TrainingAccuracyDataTableName = "TrainingAccuracy";
+
+    [StorableConstructor]
+    private CurrentXCSSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    private CurrentXCSSolutionAnalyzer(CurrentXCSSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CurrentXCSSolutionAnalyzer(this, cloner);
+    }
+    public CurrentXCSSolutionAnalyzer()
+      : base() {
+    }
+
+    protected override void UseCurrentXCSSolution(IXCSSolution xcsSolution) {
+      XCSSolution xcs;
+      if (!Results.ContainsKey(CurrentSolutionName)) {
+        Results.Add(new Result(CurrentSolutionName, (IXCSSolution)xcsSolution.Clone()));
+        xcs = Results[CurrentSolutionName].Value as XCSSolution;
+        DataTable dataTable = new DataTable("Training Accuracy DataTable");
+        xcs.Add(new Result(TrainingAccuracyDataTableName, dataTable));
+        DataRow row = new DataRow("TrainingAccuracy");
+        dataTable.Rows.Add(row);
+        row.Values.Add(xcs.TrainingAccuracy);
+      } else {
+        DataTable dataTable = (Results[CurrentSolutionName].Value as XCSSolution)[TrainingAccuracyDataTableName].Value as DataTable;
+        Results[CurrentSolutionName].Value = (IXCSSolution)xcsSolution.Clone();
+        xcs = Results[CurrentSolutionName].Value as XCSSolution;
+        dataTable.Rows["TrainingAccuracy"].Values.Add(xcs.TrainingAccuracy);
+        xcs.Add(new Result(TrainingAccuracyDataTableName, dataTable));
+      }
+    }
+  }
+}
Index: branches/LearningClassifierSystems/HeuristicLab.Encodings.ConditionActionEncoding/3.3/Analyzer/XCSSolutionAnalyzer.cs
===================================================================
--- branches/LearningClassifierSystems/HeuristicLab.Encodings.ConditionActionEncoding/3.3/Analyzer/XCSSolutionAnalyzer.cs	(revision 9154)
+++ branches/LearningClassifierSystems/HeuristicLab.Encodings.ConditionActionEncoding/3.3/Analyzer/XCSSolutionAnalyzer.cs	(revision 9175)
@@ -31,5 +31,5 @@
   [Item("ConditionActionSolutionAnalyzer", "")]
   [StorableClass]
-  public sealed class XCSSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public abstract class XCSSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
     public bool EnabledByDefault {
       get { return true; }
@@ -67,10 +67,9 @@
     }
 
+    public ResultCollection Results { get { return ResultsParameter.ActualValue; } }
+
     [StorableConstructor]
-    private XCSSolutionAnalyzer(bool deserializing) : base(deserializing) { }
-    private XCSSolutionAnalyzer(XCSSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new XCSSolutionAnalyzer(this, cloner);
-    }
+    protected XCSSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    protected XCSSolutionAnalyzer(XCSSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
     public XCSSolutionAnalyzer()
       : base() {
@@ -96,5 +95,4 @@
       ItemArray<DoubleValue> averageActionSetSizes = AverageActionSetSizeParameter.ActualValue;
       ItemArray<IntValue> numerosities = NumerosityParameter.ActualValue;
-      ResultCollection results = ResultsParameter.ActualValue;
       IConditionActionProblemData problemData = ProblemDataParameter.ActualValue;
 
@@ -108,11 +106,9 @@
       XCSModel xcsModel = new XCSModel(xcsClassifiers);
 
-      if (results.ContainsKey("XCSSolution")) {
-        results.Remove("XCSSolution");
-      }
-      results.Add(new Result("XCSSolution", xcsModel.CreateConditionActionSolution(problemData)));
-
+      UseCurrentXCSSolution(xcsModel.CreateConditionActionSolution(problemData));
       return base.Apply();
     }
+
+    protected abstract void UseCurrentXCSSolution(IXCSSolution xcsSolution);
   }
 }
