Index: trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyArrayView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyArrayView.Designer.cs	(revision 4623)
+++ trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyArrayView.Designer.cs	(revision 4623)
@@ -0,0 +1,97 @@
+#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
+
+namespace HeuristicLab.Analysis.Views {
+  partial class AlleleFrequencyArrayView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+      System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
+      System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
+      this.chart = new System.Windows.Forms.DataVisualization.Charting.Chart();
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // chart
+      // 
+      this.chart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.chart.BorderlineColor = System.Drawing.Color.Black;
+      this.chart.BorderlineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Solid;
+      chartArea1.CursorX.IsUserEnabled = true;
+      chartArea1.CursorX.IsUserSelectionEnabled = true;
+      chartArea1.CursorY.IsUserEnabled = true;
+      chartArea1.CursorY.IsUserSelectionEnabled = true;
+      chartArea1.Name = "ChartArea1";
+      this.chart.ChartAreas.Add(chartArea1);
+      legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
+      legend1.Name = "Legend1";
+      this.chart.Legends.Add(legend1);
+      this.chart.Location = new System.Drawing.Point(0, 0);
+      this.chart.Name = "chart";
+      series1.ChartArea = "ChartArea1";
+      series1.Legend = "Legend1";
+      series1.Name = "Series1";
+      this.chart.Series.Add(series1);
+      this.chart.Size = new System.Drawing.Size(498, 359);
+      this.chart.TabIndex = 4;
+      this.chart.Text = "chart1";
+      // 
+      // AlleleFrequencyArrayView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.chart);
+      this.Name = "AlleleFrequencyArrayView";
+      this.Size = new System.Drawing.Size(498, 359);
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.DataVisualization.Charting.Chart chart;
+
+  }
+}
Index: trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyArrayView.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyArrayView.cs	(revision 4623)
+++ trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyArrayView.cs	(revision 4623)
@@ -0,0 +1,87 @@
+#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.Windows.Forms;
+using System.Windows.Forms.DataVisualization.Charting;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Analysis.Views {
+  [View("AlleleFrequencyArray View")]
+  [Content(typeof(AlleleFrequencyArray), true)]
+  public partial class AlleleFrequencyArrayView : ItemView {
+    public new AlleleFrequencyArray Content {
+      get { return (AlleleFrequencyArray)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public AlleleFrequencyArrayView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      // ...
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // ...
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      chart.Titles.Clear();
+      chart.Series.Clear();
+      chart.DataSource = null;
+      if (Content != null)
+        PopulateChart();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      chart.Enabled = Content != null;
+    }
+
+    private void PopulateChart() {
+      chart.Titles.Add(new Title("Allele Frequencies", Docking.Top));
+      chart.DataSource = Content;
+      Series frequencies = new Series("Frequencies");
+      frequencies.ChartType = SeriesChartType.Column;
+      frequencies.XValueMember = "Id";
+      frequencies.XValueType = ChartValueType.String;
+      frequencies.YValueMembers = "Frequency";
+      frequencies.YValueType = ChartValueType.Double;
+      frequencies.YAxisType = AxisType.Primary;
+      frequencies.ToolTip = "X = #INDEX, Y = #VAL";
+      chart.Series.Add(frequencies);
+      Series qualities = new Series("Average Solution Qualities");
+      qualities.ChartType = SeriesChartType.FastLine;
+      qualities.XValueMember = "Id";
+      qualities.XValueType = ChartValueType.String;
+      qualities.YValueMembers = "AverageSolutionQuality";
+      qualities.YValueType = ChartValueType.Double;
+      qualities.YAxisType = AxisType.Secondary;
+      qualities.ToolTip = "X = #INDEX, Y = #VAL";
+      chart.Series.Add(qualities);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyView.Designer.cs	(revision 4623)
+++ trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyView.Designer.cs	(revision 4623)
@@ -0,0 +1,216 @@
+#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
+
+namespace HeuristicLab.Analysis.Views {
+  partial class AlleleFrequencyView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.idLabel = new System.Windows.Forms.Label();
+      this.idTextBox = new System.Windows.Forms.TextBox();
+      this.frequencyTextBox = new System.Windows.Forms.TextBox();
+      this.averageImpactTextBox = new System.Windows.Forms.TextBox();
+      this.averageSolutionQualityTextBox = new System.Windows.Forms.TextBox();
+      this.frequencyLabel = new System.Windows.Forms.Label();
+      this.averageImpactLabel = new System.Windows.Forms.Label();
+      this.averageSolutionQualityLabel = new System.Windows.Forms.Label();
+      this.containedInBestKnownSolutionLabel = new System.Windows.Forms.Label();
+      this.containedInBestSolutionLabel = new System.Windows.Forms.Label();
+      this.containedInBestKnownSolutionCheckBox = new System.Windows.Forms.CheckBox();
+      this.containedInBestSolutionCheckBox = new System.Windows.Forms.CheckBox();
+      this.SuspendLayout();
+      // 
+      // idLabel
+      // 
+      this.idLabel.AutoSize = true;
+      this.idLabel.Location = new System.Drawing.Point(3, 3);
+      this.idLabel.Name = "idLabel";
+      this.idLabel.Size = new System.Drawing.Size(19, 13);
+      this.idLabel.TabIndex = 0;
+      this.idLabel.Text = "&Id:";
+      // 
+      // idTextBox
+      // 
+      this.idTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.idTextBox.Location = new System.Drawing.Point(179, 0);
+      this.idTextBox.Name = "idTextBox";
+      this.idTextBox.ReadOnly = true;
+      this.idTextBox.Size = new System.Drawing.Size(188, 20);
+      this.idTextBox.TabIndex = 1;
+      // 
+      // frequencyTextBox
+      // 
+      this.frequencyTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.frequencyTextBox.Location = new System.Drawing.Point(179, 26);
+      this.frequencyTextBox.Name = "frequencyTextBox";
+      this.frequencyTextBox.ReadOnly = true;
+      this.frequencyTextBox.Size = new System.Drawing.Size(188, 20);
+      this.frequencyTextBox.TabIndex = 3;
+      // 
+      // averageImpactTextBox
+      // 
+      this.averageImpactTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.averageImpactTextBox.Location = new System.Drawing.Point(179, 52);
+      this.averageImpactTextBox.Name = "averageImpactTextBox";
+      this.averageImpactTextBox.ReadOnly = true;
+      this.averageImpactTextBox.Size = new System.Drawing.Size(188, 20);
+      this.averageImpactTextBox.TabIndex = 5;
+      // 
+      // averageSolutionQualityTextBox
+      // 
+      this.averageSolutionQualityTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.averageSolutionQualityTextBox.Location = new System.Drawing.Point(179, 78);
+      this.averageSolutionQualityTextBox.Name = "averageSolutionQualityTextBox";
+      this.averageSolutionQualityTextBox.ReadOnly = true;
+      this.averageSolutionQualityTextBox.Size = new System.Drawing.Size(188, 20);
+      this.averageSolutionQualityTextBox.TabIndex = 7;
+      // 
+      // frequencyLabel
+      // 
+      this.frequencyLabel.AutoSize = true;
+      this.frequencyLabel.Location = new System.Drawing.Point(3, 29);
+      this.frequencyLabel.Name = "frequencyLabel";
+      this.frequencyLabel.Size = new System.Drawing.Size(60, 13);
+      this.frequencyLabel.TabIndex = 2;
+      this.frequencyLabel.Text = "&Frequency:";
+      // 
+      // averageImpactLabel
+      // 
+      this.averageImpactLabel.AutoSize = true;
+      this.averageImpactLabel.Location = new System.Drawing.Point(3, 55);
+      this.averageImpactLabel.Name = "averageImpactLabel";
+      this.averageImpactLabel.Size = new System.Drawing.Size(85, 13);
+      this.averageImpactLabel.TabIndex = 4;
+      this.averageImpactLabel.Text = "Average &Impact:";
+      // 
+      // averageSolutionQualityLabel
+      // 
+      this.averageSolutionQualityLabel.AutoSize = true;
+      this.averageSolutionQualityLabel.Location = new System.Drawing.Point(3, 81);
+      this.averageSolutionQualityLabel.Name = "averageSolutionQualityLabel";
+      this.averageSolutionQualityLabel.Size = new System.Drawing.Size(126, 13);
+      this.averageSolutionQualityLabel.TabIndex = 6;
+      this.averageSolutionQualityLabel.Text = "Average Solution &Quality:";
+      // 
+      // containedInBestKnownSolutionLabel
+      // 
+      this.containedInBestKnownSolutionLabel.AutoSize = true;
+      this.containedInBestKnownSolutionLabel.Location = new System.Drawing.Point(3, 104);
+      this.containedInBestKnownSolutionLabel.Name = "containedInBestKnownSolutionLabel";
+      this.containedInBestKnownSolutionLabel.Size = new System.Drawing.Size(170, 13);
+      this.containedInBestKnownSolutionLabel.TabIndex = 8;
+      this.containedInBestKnownSolutionLabel.Text = "Contained in Best &Known Solution:";
+      // 
+      // containedInBestSolutionLabel
+      // 
+      this.containedInBestSolutionLabel.AutoSize = true;
+      this.containedInBestSolutionLabel.Location = new System.Drawing.Point(3, 124);
+      this.containedInBestSolutionLabel.Name = "containedInBestSolutionLabel";
+      this.containedInBestSolutionLabel.Size = new System.Drawing.Size(134, 13);
+      this.containedInBestSolutionLabel.TabIndex = 10;
+      this.containedInBestSolutionLabel.Text = "Contained in &Best Solution:";
+      // 
+      // containedInBestKnownSolutionCheckBox
+      // 
+      this.containedInBestKnownSolutionCheckBox.AutoSize = true;
+      this.containedInBestKnownSolutionCheckBox.Enabled = false;
+      this.containedInBestKnownSolutionCheckBox.Location = new System.Drawing.Point(179, 104);
+      this.containedInBestKnownSolutionCheckBox.Name = "containedInBestKnownSolutionCheckBox";
+      this.containedInBestKnownSolutionCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.containedInBestKnownSolutionCheckBox.TabIndex = 9;
+      this.containedInBestKnownSolutionCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // containedInBestSolutionCheckBox
+      // 
+      this.containedInBestSolutionCheckBox.AutoSize = true;
+      this.containedInBestSolutionCheckBox.Enabled = false;
+      this.containedInBestSolutionCheckBox.Location = new System.Drawing.Point(179, 124);
+      this.containedInBestSolutionCheckBox.Name = "containedInBestSolutionCheckBox";
+      this.containedInBestSolutionCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.containedInBestSolutionCheckBox.TabIndex = 11;
+      this.containedInBestSolutionCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // AlleleFrequencyView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.containedInBestSolutionCheckBox);
+      this.Controls.Add(this.containedInBestKnownSolutionCheckBox);
+      this.Controls.Add(this.averageSolutionQualityTextBox);
+      this.Controls.Add(this.averageImpactTextBox);
+      this.Controls.Add(this.frequencyTextBox);
+      this.Controls.Add(this.idTextBox);
+      this.Controls.Add(this.containedInBestSolutionLabel);
+      this.Controls.Add(this.containedInBestKnownSolutionLabel);
+      this.Controls.Add(this.averageSolutionQualityLabel);
+      this.Controls.Add(this.averageImpactLabel);
+      this.Controls.Add(this.frequencyLabel);
+      this.Controls.Add(this.idLabel);
+      this.Name = "AlleleFrequencyView";
+      this.Size = new System.Drawing.Size(367, 151);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.ToolTip toolTip;
+    protected System.Windows.Forms.Label idLabel;
+    protected System.Windows.Forms.TextBox idTextBox;
+    protected System.Windows.Forms.TextBox frequencyTextBox;
+    protected System.Windows.Forms.TextBox averageImpactTextBox;
+    protected System.Windows.Forms.TextBox averageSolutionQualityTextBox;
+    protected System.Windows.Forms.Label frequencyLabel;
+    protected System.Windows.Forms.Label averageImpactLabel;
+    protected System.Windows.Forms.Label averageSolutionQualityLabel;
+    protected System.Windows.Forms.Label containedInBestKnownSolutionLabel;
+    protected System.Windows.Forms.Label containedInBestSolutionLabel;
+    protected System.Windows.Forms.CheckBox containedInBestKnownSolutionCheckBox;
+    protected System.Windows.Forms.CheckBox containedInBestSolutionCheckBox;
+  }
+}
Index: trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyView.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyView.cs	(revision 4623)
+++ trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyView.cs	(revision 4623)
@@ -0,0 +1,66 @@
+#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.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Analysis.Views {
+  [View("AlleleFrequency View")]
+  [Content(typeof(AlleleFrequency), true)]
+  public partial class AlleleFrequencyView : ItemView {
+    public new AlleleFrequency Content {
+      get { return (AlleleFrequency)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public AlleleFrequencyView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        idTextBox.Text = string.Empty;
+        frequencyTextBox.Text = string.Empty;
+        averageImpactTextBox.Text = string.Empty;
+        averageSolutionQualityTextBox.Text = string.Empty;
+        containedInBestKnownSolutionCheckBox.Checked = false;
+        containedInBestSolutionCheckBox.Checked = false;
+      } else {
+        idTextBox.Text = Content.Id;
+        frequencyTextBox.Text = Content.Frequency.ToString();
+        averageImpactTextBox.Text = Content.AverageImpact.ToString();
+        averageSolutionQualityTextBox.Text = Content.AverageSolutionQuality.ToString();
+        containedInBestKnownSolutionCheckBox.Checked = Content.ContainedInBestKnownSolution;
+        containedInBestSolutionCheckBox.Checked = Content.ContainedInBestSolution;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      idTextBox.Enabled = Content != null;
+      frequencyTextBox.Enabled = Content != null;
+      averageImpactTextBox.Enabled = Content != null;
+      averageSolutionQualityTextBox.Enabled = Content != null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Analysis.Views/3.3/DataTableView.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis.Views/3.3/DataTableView.cs	(revision 4622)
+++ trunk/sources/HeuristicLab.Analysis.Views/3.3/DataTableView.cs	(revision 4623)
@@ -332,5 +332,6 @@
     }
     #endregion
-    #region chart events
+
+    #region Chart Events
     private void chart_MouseDown(object sender, MouseEventArgs e) {
       HitTestResult result = chart.HitTest(e.X, e.Y);
Index: trunk/sources/HeuristicLab.Analysis.Views/3.3/HeuristicLab.Analysis.Views-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Analysis.Views/3.3/HeuristicLab.Analysis.Views-3.3.csproj	(revision 4622)
+++ trunk/sources/HeuristicLab.Analysis.Views/3.3/HeuristicLab.Analysis.Views-3.3.csproj	(revision 4623)
@@ -112,5 +112,17 @@
   <ItemGroup>
     <None Include="HeuristicLabAnalysisViewsPlugin.cs.frame" />
+    <Compile Include="AlleleFrequencyArrayView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="AlleleFrequencyArrayView.Designer.cs">
+      <DependentUpon>AlleleFrequencyArrayView.cs</DependentUpon>
+    </Compile>
     <Compile Include="HeuristicLabAnalysisViewsPlugin.cs" />
+    <Compile Include="AlleleFrequencyView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="AlleleFrequencyView.Designer.cs">
+      <DependentUpon>AlleleFrequencyView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="DataTableView.cs">
Index: trunk/sources/HeuristicLab.Analysis.Views/3.3/HeuristicLabAnalysisViewsPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Analysis.Views/3.3/HeuristicLabAnalysisViewsPlugin.cs.frame	(revision 4622)
+++ trunk/sources/HeuristicLab.Analysis.Views/3.3/HeuristicLabAnalysisViewsPlugin.cs.frame	(revision 4623)
@@ -33,4 +33,5 @@
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
   [PluginDependency("HeuristicLab.MainForm", "3.3")]
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
Index: trunk/sources/HeuristicLab.Analysis/3.3/Allele.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis/3.3/Allele.cs	(revision 4623)
+++ trunk/sources/HeuristicLab.Analysis/3.3/Allele.cs	(revision 4623)
@@ -0,0 +1,84 @@
+#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis {
+  /// <summary>
+  /// Represents an allele of a solution which is used for allele analysis.
+  /// </summary>
+  [Item("Allele", "Represents an allele of a solution which is used for allele analysis.")]
+  [StorableClass]
+  public class Allele : Item {
+    private string id;
+    public string Id {
+      get { return id; }
+    }
+    private double impact;
+    public double Impact {
+      get { return impact; }
+    }
+
+    #region Storable Properties
+    [Storable(Name = "Id")]
+    private string StorableId {
+      get { return id; }
+      set { id = value; }
+    }
+    [Storable(Name = "Impact")]
+    private double StorableImpact {
+      get { return impact; }
+      set { impact = value; }
+    }
+    #endregion
+
+    public Allele()
+      : base() {
+      this.id = string.Empty;
+      this.impact = 0;
+    }
+    public Allele(string id)
+      : base() {
+      this.id = id;
+      this.impact = 0;
+    }
+    public Allele(string id, double impact)
+      : base() {
+      this.id = id;
+      this.impact = impact;
+    }
+    [StorableConstructor]
+    protected Allele(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      Allele clone = (Allele)base.Clone(cloner);
+      clone.id = id;
+      clone.impact = impact;
+      return clone;
+    }
+
+    public override string ToString() {
+      return id + " (" + impact + ")";
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequency.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequency.cs	(revision 4623)
+++ trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequency.cs	(revision 4623)
@@ -0,0 +1,127 @@
+#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis {
+  /// <summary>
+  /// Represents the frequency of an allele.
+  /// </summary>
+  [Item("AlleleFrequency", "Represents the frequency of an allele.")]
+  [StorableClass]
+  public class AlleleFrequency : Item {
+    private string id;
+    public string Id {
+      get { return id; }
+    }
+    private double frequency;
+    public double Frequency {
+      get { return frequency; }
+    }
+    private double averageImpact;
+    public double AverageImpact {
+      get { return averageImpact; }
+    }
+    private double averageSolutionQuality;
+    public double AverageSolutionQuality {
+      get { return averageSolutionQuality; }
+    }
+    private bool containedInBestKnownSolution;
+    public bool ContainedInBestKnownSolution {
+      get { return containedInBestKnownSolution; }
+    }
+    private bool containedInBestSolution;
+    public bool ContainedInBestSolution {
+      get { return containedInBestSolution; }
+    }
+
+    #region Storable Properties
+    [Storable(Name = "Id")]
+    private string StorableId {
+      get { return id; }
+      set { id = value; }
+    }
+    [Storable(Name = "Frequency")]
+    private double StorableFrequency {
+      get { return frequency; }
+      set { frequency = value; }
+    }
+    [Storable(Name = "AverageImpact")]
+    private double StorableAverageImpact {
+      get { return averageImpact; }
+      set { averageImpact = value; }
+    }
+    [Storable(Name = "AverageSolutionQuality")]
+    private double StorableAverageSolutionQuality {
+      get { return averageSolutionQuality; }
+      set { averageSolutionQuality = value; }
+    }
+    [Storable(Name = "ContainedInBestKnownSolution")]
+    private bool StorableContainedInBestKnownSolution {
+      get { return containedInBestKnownSolution; }
+      set { containedInBestKnownSolution = value; }
+    }
+    [Storable(Name = "ContainedInBestSolution")]
+    private bool StorableContainedInBestSolution {
+      get { return containedInBestSolution; }
+      set { containedInBestSolution = value; }
+    }
+    #endregion
+
+    public AlleleFrequency()
+      : base() {
+      id = string.Empty;
+      frequency = 0;
+      averageImpact = 0;
+      averageSolutionQuality = 0;
+      containedInBestKnownSolution = false;
+      containedInBestSolution = false;
+    }
+    public AlleleFrequency(string id, double frequency, double averageImpact, double averageSolutionQuality, bool containedInBestKnownSolution, bool containedInBestSolution)
+      : base() {
+      this.id = id;
+      this.frequency = frequency;
+      this.averageImpact = averageImpact;
+      this.averageSolutionQuality = averageSolutionQuality;
+      this.containedInBestKnownSolution = containedInBestKnownSolution;
+      this.containedInBestSolution = containedInBestSolution;
+    }
+    [StorableConstructor]
+    protected AlleleFrequency(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      AlleleFrequency clone = (AlleleFrequency)base.Clone(cloner);
+      clone.id = id;
+      clone.frequency = frequency;
+      clone.averageImpact = averageImpact;
+      clone.averageSolutionQuality = averageSolutionQuality;
+      clone.containedInBestKnownSolution = containedInBestKnownSolution;
+      clone.containedInBestSolution = containedInBestSolution;
+      return clone;
+    }
+
+    public override string ToString() {
+      return id;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyAnalyzer.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyAnalyzer.cs	(revision 4623)
+++ trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyAnalyzer.cs	(revision 4623)
@@ -0,0 +1,104 @@
+#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;
+
+namespace HeuristicLab.Analysis {
+  /// <summary>
+  /// An operator for analyzing the frequency of alleles.
+  /// </summary>
+  [Item("AlleleFrequencyAnalyzer", "An operator for analyzing the frequency of alleles.")]
+  [StorableClass]
+  public abstract class AlleleFrequencyAnalyzer<T> : SingleSuccessorOperator, IAnalyzer where T : class, IItem {
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ScopeTreeLookupParameter<T> SolutionParameter {
+      get { return (ScopeTreeLookupParameter<T>)Parameters["Solution"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public LookupParameter<T> BestKnownSolutionParameter {
+      get { return (LookupParameter<T>)Parameters["BestKnownSolution"]; }
+    }
+    public LookupParameter<AlleleFrequencyArray> AlleleFrequenciesParameter {
+      get { return (LookupParameter<AlleleFrequencyArray>)Parameters["AlleleFrequencies"]; }
+    }
+
+    public AlleleFrequencyAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem."));
+      Parameters.Add(new ScopeTreeLookupParameter<T>("Solution", "The solutions whose alleles should be analyzed."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the allele frequency analysis results should be stored."));
+      Parameters.Add(new LookupParameter<T>("BestKnownSolution", "The best known solution."));
+      Parameters.Add(new LookupParameter<AlleleFrequencyArray>("AlleleFrequencies", "The frequencies of the alleles in the current iteration."));
+    }
+
+    public override IOperation Apply() {
+      bool max = MaximizationParameter.ActualValue.Value;
+      ItemArray<T> solutions = SolutionParameter.ActualValue;
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+      T bestKnownSolution = BestKnownSolutionParameter.ActualValue;
+
+      int bestIndex = -1;
+      if (!max) bestIndex = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      else bestIndex = qualities.Select((x, index) => new { index, x.Value }).OrderByDescending(x => x.Value).First().index;
+
+      Allele[] bestAlleles = CalculateAlleles(solutions[bestIndex]);
+      Allele[] bestKnownAlleles = null;
+      if (bestKnownSolution != null) {
+        bestKnownAlleles = CalculateAlleles(bestKnownSolution);
+      }
+
+      var frequencies = solutions.SelectMany((s, index) => CalculateAlleles(s).Select(a => new { Allele = a, Quality = qualities[index] })).
+                        GroupBy(x => x.Allele.Id).
+                        Select(x => new AlleleFrequency(x.Key,
+                                                        x.Count() / ((double)solutions.Length),
+                                                        x.Average(a => a.Allele.Impact),
+                                                        x.Average(a => a.Quality.Value),
+                                                        bestKnownAlleles == null ? false : bestKnownAlleles.Any(a => a.Id == x.Key),
+                                                        bestAlleles.Any(a => a.Id == x.Key)));
+
+      AlleleFrequencyArray frequenciesArray = new AlleleFrequencyArray(frequencies.OrderBy(x => x.AverageImpact));
+      AlleleFrequenciesParameter.ActualValue = frequenciesArray;
+      if (results.ContainsKey("Allele Frequencies"))
+        results["Allele Frequencies"].Value = frequenciesArray;
+      else
+        results.Add(new Result("Allele Frequencies", frequenciesArray));
+
+      return base.Apply();
+    }
+
+    protected abstract Allele[] CalculateAlleles(T solution);
+  }
+}
Index: trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyArray.cs	(revision 4623)
+++ trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyArray.cs	(revision 4623)
@@ -0,0 +1,38 @@
+#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.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis {
+  /// <summary>
+  /// Represents an array of allele frequencies.
+  /// </summary>
+  [Item("AlleleFrequencyArray", "Represents an array of allele frequencies.")]
+  [StorableClass]
+  public class AlleleFrequencyArray : ReadOnlyItemArray<AlleleFrequency> {
+    public AlleleFrequencyArray() : base() { }
+    public AlleleFrequencyArray(IEnumerable<AlleleFrequency> frequencies) : base(new ItemArray<AlleleFrequency>(frequencies)) { }
+    [StorableConstructor]
+    protected AlleleFrequencyArray(bool deserializing) : base(deserializing) { }
+  }
+}
Index: trunk/sources/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 4622)
+++ trunk/sources/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 4623)
@@ -114,4 +114,7 @@
     <Compile Include="BestScopeSolutionAnalyzer.cs" />
     <Compile Include="BestQualityMemorizer.cs" />
+    <Compile Include="Allele.cs" />
+    <Compile Include="AlleleFrequency.cs" />
+    <Compile Include="AlleleFrequencyArray.cs" />
     <Compile Include="QualityAnalyzer.cs" />
     <Compile Include="MinAverageMaxValueAnalyzer.cs" />
@@ -124,4 +127,5 @@
     <Compile Include="DataTable.cs" />
     <Compile Include="DataTableValuesCollector.cs" />
+    <Compile Include="AlleleFrequencyAnalyzer.cs" />
     <Compile Include="ValueAnalyzer.cs" />
   </ItemGroup>
Index: trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/Analyzers/TSPAlleleFrequencyAnalyzer.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/Analyzers/TSPAlleleFrequencyAnalyzer.cs	(revision 4623)
+++ trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/Analyzers/TSPAlleleFrequencyAnalyzer.cs	(revision 4623)
@@ -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;
+using HeuristicLab.Analysis;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.TravelingSalesman {
+  /// <summary>
+  /// An operator for analyzing the frequency of alleles in solutions of Traveling Salesman Problems given in path representation.
+  /// </summary>
+  [Item("TSPAlleleFrequencyAnalyzer", "An operator for analyzing the frequency of alleles in solutions of Traveling Salesman Problems given in path representation.")]
+  [StorableClass]
+  public sealed class TSPAlleleFrequencyAnalyzer : AlleleFrequencyAnalyzer<Permutation> {
+    public LookupParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (LookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    }
+
+    public TSPAlleleFrequencyAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities."));
+    }
+
+    protected override Allele[] CalculateAlleles(Permutation solution) {
+      Allele[] alleles = new Allele[solution.Length];
+      DoubleMatrix coords = CoordinatesParameter.ActualValue;
+
+      for (int i = 0; i < solution.Length - 1; i++)
+        alleles[i] = CreateAllele(solution[i], solution[i + 1], coords);
+      alleles[alleles.Length - 1] = CreateAllele(solution[solution.Length - 1], solution[0], coords);
+
+      return alleles;
+    }
+
+    private Allele CreateAllele(int source, int target, DoubleMatrix coords) {
+      if (source > target) {
+        int h = source;
+        source = target;
+        target = h;
+      }
+
+      return new Allele(source.ToString() + "-" + target.ToString(),
+                        CalculateLength(coords[source, 0], coords[source, 1], coords[target, 0], coords[target, 1]));
+    }
+
+    private double CalculateLength(double x1, double y1, double x2, double y2) {
+      return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLab.Problems.TravelingSalesman-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLab.Problems.TravelingSalesman-3.3.csproj	(revision 4622)
+++ trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLab.Problems.TravelingSalesman-3.3.csproj	(revision 4623)
@@ -107,4 +107,5 @@
   <ItemGroup>
     <Compile Include="Analyzers\BestTSPSolutionAnalyzer.cs" />
+    <Compile Include="Analyzers\TSPAlleleFrequencyAnalyzer.cs" />
     <Compile Include="Evaluators\TSPEuclideanPathEvaluator.cs" />
     <Compile Include="Evaluators\TSPGeoPathEvaluator.cs" />
@@ -135,4 +136,8 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
+      <Project>{887425B4-4348-49ED-A457-B7D2C26DDBF9}</Project>
+      <Name>HeuristicLab.Analysis-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
       <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
Index: trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLabProblemsTravelingSalesmanPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLabProblemsTravelingSalesmanPlugin.cs.frame	(revision 4622)
+++ trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLabProblemsTravelingSalesmanPlugin.cs.frame	(revision 4623)
@@ -28,4 +28,5 @@
   [Plugin("HeuristicLab.Problems.TravelingSalesman", "3.3.1.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.TravelingSalesman-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
Index: trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 4622)
+++ trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 4623)
@@ -128,4 +128,7 @@
       get { return operators.OfType<BestTSPSolutionAnalyzer>().FirstOrDefault(); }
     }
+    private TSPAlleleFrequencyAnalyzer TSPAlleleFrequencyAnalyzer {
+      get { return operators.OfType<TSPAlleleFrequencyAnalyzer>().FirstOrDefault(); }
+    }
     #endregion
 
@@ -212,5 +215,5 @@
       ParameterizeSolutionCreator();
       ParameterizeEvaluator();
-      ParameterizeAnalyzer();
+      ParameterizeAnalyzers();
       ParameterizeOperators();
       OnSolutionCreatorChanged();
@@ -218,5 +221,5 @@
     private void SolutionCreator_PermutationParameter_ActualNameChanged(object sender, EventArgs e) {
       ParameterizeEvaluator();
-      ParameterizeAnalyzer();
+      ParameterizeAnalyzers();
       ParameterizeOperators();
     }
@@ -225,10 +228,10 @@
       ParameterizeEvaluator();
       UpdateMoveEvaluators();
-      ParameterizeAnalyzer();
+      ParameterizeAnalyzers();
       ClearDistanceMatrix();
       OnEvaluatorChanged();
     }
     private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
-      ParameterizeAnalyzer();
+      ParameterizeAnalyzers();
     }
     private void MoveGenerator_InversionMoveParameter_ActualNameChanged(object sender, EventArgs e) {
@@ -269,5 +272,6 @@
       operators = new List<IOperator>();
       operators.Add(new BestTSPSolutionAnalyzer());
-      ParameterizeAnalyzer();
+      operators.Add(new TSPAlleleFrequencyAnalyzer());
+      ParameterizeAnalyzers();
       operators.AddRange(ApplicationManager.Manager.GetInstances<IPermutationOperator>().Cast<IOperator>());
       ParameterizeOperators();
@@ -310,5 +314,5 @@
       }
     }
-    private void ParameterizeAnalyzer() {
+    private void ParameterizeAnalyzers() {
       BestTSPSolutionAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
       BestTSPSolutionAnalyzer.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
@@ -318,4 +322,11 @@
       BestTSPSolutionAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
       BestTSPSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
+
+      TSPAlleleFrequencyAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
+      TSPAlleleFrequencyAnalyzer.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+      TSPAlleleFrequencyAnalyzer.SolutionParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+      TSPAlleleFrequencyAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+      TSPAlleleFrequencyAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
+      TSPAlleleFrequencyAnalyzer.ResultsParameter.ActualName = "Results";
     }
     private void ParameterizeOperators() {
