Index: trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.3/ArtificialAntProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.3/ArtificialAntProblem.cs	(revision 3244)
+++ trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.3/ArtificialAntProblem.cs	(revision 3245)
@@ -114,6 +114,6 @@
     }
 
-    public OptionalValueParameter<IAntTrailVisualizer> VisualizerParameter {
-      get { return (OptionalValueParameter<IAntTrailVisualizer>)Parameters["Visualizer"]; }
+    public OptionalValueParameter<ISingleObjectiveSolutionsVisualizer> VisualizerParameter {
+      get { return (OptionalValueParameter<ISingleObjectiveSolutionsVisualizer>)Parameters["Visualizer"]; }
     }
     IParameter IProblem.VisualizerParameter {
@@ -165,5 +165,5 @@
       get { return ArtificialAntExpressionGrammarParameter.Value; }
     }
-    public IAntTrailVisualizer Visualizer {
+    public ISingleObjectiveSolutionsVisualizer Visualizer {
       get { return VisualizerParameter.Value; }
       set { VisualizerParameter.Value = value; }
@@ -197,5 +197,5 @@
       Parameters.Add(new ValueParameter<BoolMatrix>("World", "The world for the artificial ant with scattered food items.", world));
       Parameters.Add(new ValueParameter<IntValue>("MaxTimeSteps", "The number of time steps the artificial ant has available to collect all food items.", new IntValue(600)));
-      Parameters.Add(new ValueParameter<IAntTrailVisualizer>("Visualizer", "The operator which should be used to visualize artificial ant solutions.", visualizer));
+      Parameters.Add(new ValueParameter<ISingleObjectiveSolutionsVisualizer>("Visualizer", "The operator which should be used to visualize artificial ant solutions.", visualizer));
 
       creator.SymbolicExpressionTreeParameter.ActualName = "AntTrailSolution";
@@ -310,4 +310,8 @@
           antTrailVisualizer.WorldParameter.ActualName = WorldParameter.Name;
           antTrailVisualizer.MaxTimeStepsParameter.ActualName = MaxTimeStepsParameter.Name;
+        }
+        var bestSymExpressionVisualizer = Visualizer as BestSymbolicExpressionTreeVisualizer;
+        if (bestSymExpressionVisualizer != null) {
+          bestSymExpressionVisualizer.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
         }
       }
Index: trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.3/BestSymbolicExpressionTreeVisualizer.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.3/BestSymbolicExpressionTreeVisualizer.cs	(revision 3245)
+++ trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.3/BestSymbolicExpressionTreeVisualizer.cs	(revision 3245)
@@ -0,0 +1,72 @@
+#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.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+
+namespace HeuristicLab.Problems.ArtificialAnt {
+  /// <summary>
+  /// An operator for visualizing the best symbolic expression tree of an artificial ant problem.
+  /// </summary>
+  [Item("BestSymbolicExpressionTreeVisualizer", "An operator for visualizing the best symbolic expression tree of an artificial ant problem.")]
+  [StorableClass]
+  public sealed class BestSymbolicExpressionTreeVisualizer : SingleSuccessorOperator, ISingleObjectiveSolutionsVisualizer, ISolutionsVisualizer {
+    public ILookupParameter<ItemArray<SymbolicExpressionTree>> SymbolicExpressionTreeParameter {
+      get { return (ILookupParameter<ItemArray<SymbolicExpressionTree>>)Parameters["SymbolicExpressionTree"]; }
+    }
+    public ILookupParameter<ItemArray<DoubleValue>> QualityParameter {
+      get { return (ILookupParameter<ItemArray<DoubleValue>>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<SymbolicExpressionTree> BestSymbolicExpressionTreeParameter {
+      get { return (ILookupParameter<SymbolicExpressionTree>)Parameters["BestSymbolicExpressionTree"]; }
+    }
+    ILookupParameter ISolutionsVisualizer.VisualizationParameter {
+      get { return BestSymbolicExpressionTreeParameter; }
+    }
+
+    public BestSymbolicExpressionTreeVisualizer()
+      : base() {
+      Parameters.Add(new SubScopesLookupParameter<SymbolicExpressionTree>("SymbolicExpressionTree", "The artificial ant solutions from which the best solution should be visualized."));
+      Parameters.Add(new SubScopesLookupParameter<DoubleValue>("Quality", "The qualities of the artificial ant solutions which should be visualized."));
+      Parameters.Add(new LookupParameter<SymbolicExpressionTree>("BestSymbolicExpressionTree", "The best symbolic expression tree of the artificial ant problem."));
+    }
+
+    public override IOperation Apply() {
+      ItemArray<SymbolicExpressionTree> expressions = SymbolicExpressionTreeParameter.ActualValue;
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+
+      int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => -x.Value).First().index;
+
+      SymbolicExpressionTree bestTree = BestSymbolicExpressionTreeParameter.ActualValue;
+      if (bestTree == null) BestSymbolicExpressionTreeParameter.ActualValue = (SymbolicExpressionTree)expressions[i].Clone();
+      else {
+        bestTree.Root = expressions[i].Root;
+      }
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.3/HeuristicLab.Problems.ArtificialAnt-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.3/HeuristicLab.Problems.ArtificialAnt-3.3.csproj	(revision 3244)
+++ trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.3/HeuristicLab.Problems.ArtificialAnt-3.3.csproj	(revision 3245)
@@ -83,4 +83,5 @@
     <Compile Include="AntInterpreter.cs" />
     <Compile Include="BestAntTrailVisualizer.cs" />
+    <Compile Include="BestSymbolicExpressionTreeVisualizer.cs" />
     <Compile Include="HeuristicLabProblemsArtificialAntPlugin.cs" />
     <Compile Include="IAntTrailVisualizer.cs" />
