Index: /branches/MCTS-SymbReg-2796/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis.MCTSSymbReg.csproj
===================================================================
--- /branches/MCTS-SymbReg-2796/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis.MCTSSymbReg.csproj	(revision 15359)
+++ /branches/MCTS-SymbReg-2796/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis.MCTSSymbReg.csproj	(revision 15360)
@@ -10,5 +10,5 @@
     <RootNamespace>HeuristicLab.Algorithms.DataAnalysis.MCTSSymbReg</RootNamespace>
     <AssemblyName>HeuristicLab.Algorithms.DataAnalysis.MCTSSymbReg</AssemblyName>
-    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <TargetFrameworkProfile />
Index: /branches/MCTS-SymbReg-2796/HeuristicLab.Algorithms.DataAnalysis/3.4/MctsSymbolicRegression/MctsSymbolicRegressionAlgorithm.cs
===================================================================
--- /branches/MCTS-SymbReg-2796/HeuristicLab.Algorithms.DataAnalysis/3.4/MctsSymbolicRegression/MctsSymbolicRegressionAlgorithm.cs	(revision 15359)
+++ /branches/MCTS-SymbReg-2796/HeuristicLab.Algorithms.DataAnalysis/3.4/MctsSymbolicRegression/MctsSymbolicRegressionAlgorithm.cs	(revision 15360)
@@ -33,4 +33,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
 
 namespace HeuristicLab.Algorithms.DataAnalysis.MctsSymbolicRegression {
@@ -228,4 +229,6 @@
       var gradEvals = new IntValue();
       Results.Add(new Result("Gradient evaluations", gradEvals));
+      var paretoBestModelsResult = new Result("ParetoBestModels", typeof(ItemList<ISymbolicRegressionSolution>));
+      Results.Add(paretoBestModelsResult);
 
 
@@ -283,4 +286,6 @@
           totalRollouts.Value = state.TotalRollouts;
 
+          paretoBestModelsResult.Value = new ItemList<ISymbolicRegressionSolution>(state.ParetoBestModels);
+
           table.Rows["Best quality"].Values.Add(bestQuality.Value);
           table.Rows["Current best quality"].Values.Add(curQuality.Value);
Index: /branches/MCTS-SymbReg-2796/HeuristicLab.Algorithms.DataAnalysis/3.4/MctsSymbolicRegression/MctsSymbolicRegressionStatic.cs
===================================================================
--- /branches/MCTS-SymbReg-2796/HeuristicLab.Algorithms.DataAnalysis/3.4/MctsSymbolicRegression/MctsSymbolicRegressionStatic.cs	(revision 15359)
+++ /branches/MCTS-SymbReg-2796/HeuristicLab.Algorithms.DataAnalysis/3.4/MctsSymbolicRegression/MctsSymbolicRegressionStatic.cs	(revision 15360)
@@ -27,4 +27,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Optimization;
 using HeuristicLab.Problems.DataAnalysis;
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
@@ -44,4 +45,5 @@
       double BestSolutionTrainingQuality { get; }
       double BestSolutionTestQuality { get; }
+      IEnumerable<ISymbolicRegressionSolution> ParetoBestModels { get; }
       int TotalRollouts { get; }
       int EffectiveRollouts { get; }
@@ -76,4 +78,6 @@
       private readonly int constOptIterations;
       private readonly double lowerEstimationLimit, upperEstimationLimit;
+      private readonly List<ISymbolicRegressionSolution> paretoBestModels = new List<ISymbolicRegressionSolution>();
+      private readonly List<double[]> paretoFront = new List<double[]>(); // matching the models
 
       private readonly ExpressionEvaluator evaluator, testEvaluator;
@@ -182,4 +186,7 @@
         }
       }
+      public IEnumerable<ISymbolicRegressionSolution> ParetoBestModels {
+        get { return paretoBestModels; }
+      }
 
       public int TotalRollouts { get { return totalRollouts; } }
@@ -195,4 +202,5 @@
         Eval(code, nParams, out q, out optConsts);
 
+        // single objective best
         if (q > bestRSq) {
           bestRSq = q;
@@ -204,6 +212,48 @@
           Array.Copy(optConsts, bestConsts, bestNParams);
         }
+        // multi-objective best
+        var complexity = // SymbolicDataAnalysisModelComplexityCalculator.CalculateComplexity() TODO
+          Array.FindIndex(code, (opc)=>opc==(byte)OpCodes.Exit);
+        UpdateParetoFront(q, complexity, code, optConsts, nParams, scalingFactor, scalingOffset);
 
         return q;
+      }
+
+      private void UpdateParetoFront(double q, int complexity, byte[] code, double[] param, int nParam,
+        double[] scalingFactor, double[] scalingOffset) {
+        double[] best = new double[2];
+        double[] cur = new double[2] { q, complexity };
+        bool[] max = new[] { true, false };
+        var isNonDominated = true;
+        foreach (var e in paretoFront) {
+          var domRes = DominationCalculator<int>.Dominates(cur, e, max, true);
+          if (domRes == DominationResult.IsDominated) {
+            isNonDominated = false;
+            break;
+          }
+        }
+        if(isNonDominated) {
+          paretoFront.Add(cur);
+
+          // create model
+          var treeGen = new SymbolicExpressionTreeGenerator(problemData.AllowedInputVariables.ToArray());
+          var interpreter = new SymbolicDataAnalysisExpressionTreeLinearInterpreter();
+
+          var t = new SymbolicExpressionTree(treeGen.Exec(code, param, nParam, scalingFactor, scalingOffset));
+          var model = new SymbolicRegressionModel(problemData.TargetVariable, t, interpreter, lowerEstimationLimit, upperEstimationLimit);
+
+          var sol = model.CreateRegressionSolution(this.problemData);
+          sol.Name = string.Format("{0:N5} {1}", q, complexity);
+          
+          paretoBestModels.Add(sol);
+        }
+        for(int i=paretoFront.Count-2;i>=0;i--) {
+          var @ref = paretoFront[i];
+          var domRes = DominationCalculator<int>.Dominates(cur, @ref, max, true);
+          if(domRes == DominationResult.Dominates) {
+            paretoFront.RemoveAt(i);
+            paretoBestModels.RemoveAt(i);
+          }
+        }
       }
 
