Index: branches/PerformanceComparison/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionRLDView.Designer.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionRLDView.Designer.cs	(revision 12887)
+++ branches/PerformanceComparison/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionRLDView.Designer.cs	(revision 12888)
@@ -69,7 +69,7 @@
       this.byCostViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.byTableTabPage = new System.Windows.Forms.TabPage();
-      this.ertViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.problemComboBox = new System.Windows.Forms.ComboBox();
       this.problemLabel = new System.Windows.Forms.Label();
+      this.ertTableView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
@@ -137,7 +137,7 @@
       this.targetsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      this.targetsTextBox.Location = new System.Drawing.Point(65, 8);
+      this.targetsTextBox.Location = new System.Drawing.Point(59, 8);
       this.targetsTextBox.Name = "targetsTextBox";
-      this.targetsTextBox.Size = new System.Drawing.Size(320, 20);
+      this.targetsTextBox.Size = new System.Drawing.Size(326, 20);
       this.targetsTextBox.TabIndex = 1;
       this.toolTip.SetToolTip(this.targetsTextBox, "The order of the targets is important, first to-hit targets\r\nshould be given firs" +
@@ -194,7 +194,7 @@
       this.budgetsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      this.budgetsTextBox.Location = new System.Drawing.Point(65, 8);
+      this.budgetsTextBox.Location = new System.Drawing.Point(59, 8);
       this.budgetsTextBox.Name = "budgetsTextBox";
-      this.budgetsTextBox.Size = new System.Drawing.Size(320, 20);
+      this.budgetsTextBox.Size = new System.Drawing.Size(326, 20);
       this.budgetsTextBox.TabIndex = 6;
       this.budgetsTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.budgetsTextBox_Validating);
@@ -340,5 +340,5 @@
       // byTableTabPage
       // 
-      this.byTableTabPage.Controls.Add(this.ertViewHost);
+      this.byTableTabPage.Controls.Add(this.ertTableView);
       this.byTableTabPage.Location = new System.Drawing.Point(4, 22);
       this.byTableTabPage.Name = "byTableTabPage";
@@ -349,18 +349,4 @@
       this.byTableTabPage.UseVisualStyleBackColor = true;
       // 
-      // ertViewHost
-      // 
-      this.ertViewHost.Caption = "View";
-      this.ertViewHost.Content = null;
-      this.ertViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.ertViewHost.Enabled = false;
-      this.ertViewHost.Location = new System.Drawing.Point(3, 3);
-      this.ertViewHost.Name = "ertViewHost";
-      this.ertViewHost.ReadOnly = false;
-      this.ertViewHost.Size = new System.Drawing.Size(640, 381);
-      this.ertViewHost.TabIndex = 0;
-      this.ertViewHost.ViewsLabelVisible = true;
-      this.ertViewHost.ViewType = null;
-      // 
       // problemComboBox
       // 
@@ -383,4 +369,17 @@
       this.problemLabel.TabIndex = 2;
       this.problemLabel.Text = "Problem:";
+      // 
+      // ertTableView
+      // 
+      this.ertTableView.Caption = "StringConvertibleMatrix View";
+      this.ertTableView.Content = null;
+      this.ertTableView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.ertTableView.Location = new System.Drawing.Point(3, 3);
+      this.ertTableView.Name = "ertTableView";
+      this.ertTableView.ReadOnly = false;
+      this.ertTableView.ShowRowsAndColumnsTextBox = false;
+      this.ertTableView.ShowStatisticalInformation = false;
+      this.ertTableView.Size = new System.Drawing.Size(640, 381);
+      this.ertTableView.TabIndex = 0;
       // 
       // RunCollectionRLDView
@@ -434,7 +433,7 @@
     private System.Windows.Forms.Button generateBudgetsButton;
     private System.Windows.Forms.CheckBox budgetLogScalingCheckBox;
-    private MainForm.WindowsForms.ViewHost ertViewHost;
     private System.Windows.Forms.Label problemLabel;
     private System.Windows.Forms.ComboBox problemComboBox;
+    private Data.Views.StringConvertibleMatrixView ertTableView;
   }
 }
Index: branches/PerformanceComparison/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionRLDView.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionRLDView.cs	(revision 12887)
+++ branches/PerformanceComparison/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionRLDView.cs	(revision 12888)
@@ -93,5 +93,5 @@
       byCostDataTable = new IndexedDataTable<double>("ECDF by Cost", "A data table containing the ECDF of each of a number of groups.") {
         VisualProperties = {
-          YAxisTitle = "Proportion of required budgets",
+          YAxisTitle = "Proportion of unused budgets",
           YAxisMinimumFixedValue = 0, YAxisMinimumAuto = false,
           YAxisMaximumFixedValue = 1, YAxisMaximumAuto = false
@@ -280,16 +280,8 @@
       var maximization = IsMaximization();
 
-      var targetsPerProblem = (from r in Content
-                               let pd = new ProblemDescription(r).ToString()
-                               let target = r.Parameters.ContainsKey("BestKnownQuality")
-                                && r.Parameters["BestKnownQuality"] is DoubleValue
-                                  ? ((DoubleValue)r.Parameters["BestKnownQuality"]).Value
-                                  : ((IndexedDataTable<double>)r.Results[table]).Rows.First().Values.Last().Item2
-                               group target by pd into g
-                               select new { Problem = g.Key, Target = maximization ? g.Max() : g.Min() })
-                              .ToDictionary(x => x.Problem, x => x.Target);
+      var targetsPerProblem = CalculateBestTargetPerProblemInstance(table, maximization);
 
       foreach (var x in (from r in Content
-                         where selectedGroup == AllRuns || r.Parameters.ContainsKey(selectedGroup)
+                         where (selectedGroup == AllRuns || r.Parameters.ContainsKey(selectedGroup))
                            && selectedProblem.Match(r)
                            && r.Results.ContainsKey(table)
@@ -310,16 +302,4 @@
     }
 
-    private void UpdateRuns() {
-      if (InvokeRequired) {
-        Invoke((Action)UpdateRuns);
-        return;
-      }
-      SuspendRepaint();
-      try {
-        UpdateResultsByTarget();
-        UpdateResultsByCost();
-      } finally { ResumeRepaint(true); }
-    }
-
     #region Performance analysis by (multiple) target(s)
     private void UpdateResultsByTarget() {
@@ -383,4 +363,7 @@
       }
 
+      if (targets.Length == 1)
+        ByTargetDataTable.VisualProperties.YAxisTitle = "Probability to be " + (targets[0] * 100) + "% worse than best";
+      else ByTargetDataTable.VisualProperties.YAxisTitle = "Proportion of reached targets";
       byTargetDataTable.VisualProperties.XAxisTitle = string.Join(" / ", xAxisTitles);
       byTargetDataTable.VisualProperties.XAxisLogScale = byTargetDataTable.Rows.Count > 0 && targetLogScalingCheckBox.Checked;
@@ -392,5 +375,5 @@
       targets = new[] { 0.1, 0.05, 0.02, 0.01, 0 };
       suppressTargetsEvents = true;
-      targetsTextBox.Text = string.Join("% ; ", targets.Select(x => x * 100));
+      targetsTextBox.Text = string.Join("% ; ", targets.Select(x => x * 100)) + "%";
       suppressTargetsEvents = false;
     }
@@ -434,5 +417,5 @@
 
     private void UpdateErtTables(Dictionary<string, Dictionary<string, Tuple<double, List<IRun>>>> groupedRuns) {
-      ertViewHost.Content = null;
+      ertTableView.Content = null;
       var columns = 1 + targets.Length + 1;
       var matrix = new string[groupedRuns.Count * groupedRuns.Max(x => x.Value.Count) + groupedRuns.Max(x => x.Value.Count), columns];
@@ -440,14 +423,5 @@
       var maximization = IsMaximization();
 
-
-      var targetsPerProblem = (from r in Content
-                               let pd = new ProblemDescription(r).ToString()
-                               let target = r.Parameters.ContainsKey("BestKnownQuality")
-                                && r.Parameters["BestKnownQuality"] is DoubleValue
-                                  ? ((DoubleValue)r.Parameters["BestKnownQuality"]).Value
-                                  : ((IndexedDataTable<double>)r.Results[(string)dataTableComboBox.SelectedItem]).Rows.First().Values.Last().Item2
-                               group target by pd into g
-                               select new { Problem = g.Key, Target = maximization ? g.Max() : g.Min() })
-                              .ToDictionary(x => x.Problem, x => x.Target);
+      var targetsPerProblem = CalculateBestTargetPerProblemInstance((string)dataTableComboBox.SelectedItem, maximization);
 
       var colNames = new string[columns];
@@ -479,5 +453,6 @@
         }
       }
-      ertViewHost.Content = new StringMatrix(matrix) { ColumnNames = colNames };
+      ertTableView.Content = new StringMatrix(matrix) { ColumnNames = colNames };
+      ertTableView.DataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
     }
 
@@ -527,13 +502,5 @@
 
       var maximization = IsMaximization();
-      var targetsPerProblem = (from r in Content
-                               let pd = new ProblemDescription(r).ToString()
-                               let target = r.Parameters.ContainsKey("BestKnownQuality")
-                                && r.Parameters["BestKnownQuality"] is DoubleValue
-                                  ? ((DoubleValue)r.Parameters["BestKnownQuality"]).Value
-                                  : ((IndexedDataTable<double>)r.Results[(string)dataTableComboBox.SelectedItem]).Rows.First().Values.Last().Item2
-                               group target by pd into g
-                               select new { Problem = g.Key, Target = maximization ? g.Max() : g.Min() })
-                              .ToDictionary(x => x.Problem, x => x.Target);
+      var targetsPerProblem = CalculateBestTargetPerProblemInstance((string)dataTableComboBox.SelectedItem, maximization);
 
       foreach (var group in groupedRuns) {
@@ -699,5 +666,8 @@
       e.Cancel = false;
       errorProvider.SetError(targetsTextBox, null);
-      targets = targetList.Select(x => (double)x).ToArray();
+      targets = targetList.Select(x => (double)x).OrderByDescending(x => x).ToArray();
+      suppressTargetsEvents = true;
+      try { targetsTextBox.Text = string.Join("% ; ", targets.Select(x => x * 100)) + "%"; } finally { suppressTargetsEvents = false; }
+
       UpdateResultsByTarget();
       SetEnabledStateOfControls();
@@ -746,13 +716,5 @@
       var maximization = IsMaximization();
 
-      var targetsPerProblem = (from r in Content
-                               let pd = new ProblemDescription(r).ToString()
-                               let target = r.Parameters.ContainsKey("BestKnownQuality")
-                                && r.Parameters["BestKnownQuality"] is DoubleValue
-                                  ? ((DoubleValue)r.Parameters["BestKnownQuality"]).Value
-                                  : ((IndexedDataTable<double>)r.Results[table]).Rows.First().Values.Last().Item2
-                               group target by pd into g
-                               select new { Problem = g.Key, Target = maximization ? g.Max() : g.Min() })
-                              .ToDictionary(x => x.Problem, x => x.Target);
+      var targetsPerProblem = CalculateBestTargetPerProblemInstance(table, maximization);
 
       foreach (var run in Content) {
@@ -911,4 +873,29 @@
       return false;
     }
+
+    private Dictionary<string, double> CalculateBestTargetPerProblemInstance(string table, bool maximization) {
+      return (from r in Content
+              where r.Visible
+              let pd = new ProblemDescription(r).ToString()
+              let target = r.Parameters.ContainsKey("BestKnownQuality")
+                           && r.Parameters["BestKnownQuality"] is DoubleValue
+                ? ((DoubleValue)r.Parameters["BestKnownQuality"]).Value
+                : ((IndexedDataTable<double>)r.Results[table]).Rows.First().Values.Last().Item2
+              group target by pd into g
+              select new { Problem = g.Key, Target = maximization ? g.Max() : g.Min() })
+        .ToDictionary(x => x.Problem, x => x.Target);
+    }
+
+    private void UpdateRuns() {
+      if (InvokeRequired) {
+        Invoke((Action)UpdateRuns);
+        return;
+      }
+      SuspendRepaint();
+      try {
+        UpdateResultsByTarget();
+        UpdateResultsByCost();
+      } finally { ResumeRepaint(true); }
+    }
     #endregion
 
