Index: trunk/sources/HeuristicLab 3.3.sln
===================================================================
--- trunk/sources/HeuristicLab 3.3.sln	(revision 2803)
+++ trunk/sources/HeuristicLab 3.3.sln	(revision 2805)
@@ -76,4 +76,5 @@
 		{958B43BC-CC5C-4FA2-8628-2B3B01D890B6} = {958B43BC-CC5C-4FA2-8628-2B3B01D890B6}
 		{AB687BBE-1BFE-476B-906D-44237135431D} = {AB687BBE-1BFE-476B-906D-44237135431D}
+		{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C} = {DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}
 		{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B} = {102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}
 		{EE2034D9-6E27-48A1-B855-42D45F69A4FC} = {EE2034D9-6E27-48A1-B855-42D45F69A4FC}
@@ -145,4 +146,6 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.SharpDevelop-3.1.1.5327", "HeuristicLab.ExtLibs\HeuristicLab.SharpDevelop\3.1.1.5327\HeuristicLab.SharpDevelop-3.1.1.5327.csproj", "{4ABA047D-46DD-4608-9E4A-41C5F92FDBB1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Routing.TSP.Views-3.3", "HeuristicLab.Routing.TSP.Views\3.3\HeuristicLab.Routing.TSP.Views-3.3.csproj", "{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}"
 EndProject
 Global
@@ -638,4 +641,12 @@
 		{4ABA047D-46DD-4608-9E4A-41C5F92FDBB1}.Release|x86.ActiveCfg = Release|x86
 		{4ABA047D-46DD-4608-9E4A-41C5F92FDBB1}.Release|x86.Build.0 = Release|x86
+		{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}.Release|x64.ActiveCfg = Release|Any CPU
+		{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}.Release|x86.ActiveCfg = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: trunk/sources/HeuristicLab 3.3/Files.txt
===================================================================
--- trunk/sources/HeuristicLab 3.3/Files.txt	(revision 2803)
+++ trunk/sources/HeuristicLab 3.3/Files.txt	(revision 2805)
@@ -50,8 +50,4 @@
 HeuristicLab.ExtLibs\HeuristicLab.Netron\3.0.2672.12446\HeuristicLab.Netron-3.0.2672.12446:Netron.Diagramming.Core License.txt
 
-HeuristicLab.ExtLibs\HeuristicLab.WinFormsUI\2.3.1\WinFormsUI-2.3.1:WeifenLuo.WinFormsUI.Docking-2.3.1.dll
-HeuristicLab.ExtLibs\HeuristicLab.WinFormsUI\2.3.1\HeuristicLab.WinFormsUI-2.3.1:HeuristicLab.WinFormsUI-2.3.1.dll
-HeuristicLab.ExtLibs\HeuristicLab.WinFormsUI\2.3.1\HeuristicLab.WinFormsUI-2.3.1:WeifenLuo.WinFormsUI.Docking License.txt
-
 HeuristicLab.ExtLibs\HeuristicLab.SharpDevelop\3.1.1.5327:HeuristicLab.SharpDevelop-3.1.1.5327.dll
 HeuristicLab.ExtLibs\HeuristicLab.SharpDevelop\3.1.1.5327:ICSharpCode.NRefactory.dll
@@ -61,2 +57,6 @@
 HeuristicLab.ExtLibs\HeuristicLab.SharpDevelop\3.1.1.5327:Mono License.txt
 HeuristicLab.ExtLibs\HeuristicLab.SharpDevelop\3.1.1.5327:SharpDevelop License.txt
+
+HeuristicLab.ExtLibs\HeuristicLab.WinFormsUI\2.3.1\WinFormsUI-2.3.1:WeifenLuo.WinFormsUI.Docking-2.3.1.dll
+HeuristicLab.ExtLibs\HeuristicLab.WinFormsUI\2.3.1\HeuristicLab.WinFormsUI-2.3.1:HeuristicLab.WinFormsUI-2.3.1.dll
+HeuristicLab.ExtLibs\HeuristicLab.WinFormsUI\2.3.1\HeuristicLab.WinFormsUI-2.3.1:WeifenLuo.WinFormsUI.Docking License.txt
Index: trunk/sources/HeuristicLab.Core.Views/3.3/HeuristicLab.Core.Views-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/HeuristicLab.Core.Views-3.3.csproj	(revision 2803)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/HeuristicLab.Core.Views-3.3.csproj	(revision 2805)
@@ -131,10 +131,4 @@
       <DependentUpon>OperatorTreeView.cs</DependentUpon>
     </Compile>
-    <Compile Include="OperatorView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="OperatorView.Designer.cs">
-      <DependentUpon>OperatorView.cs</DependentUpon>
-    </Compile>
     <Compile Include="ProblemView.cs">
       <SubType>UserControl</SubType>
Index: trunk/sources/HeuristicLab.Core.Views/3.3/OperatorView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/OperatorView.Designer.cs	(revision 2803)
+++ 	(revision )
@@ -1,97 +1,0 @@
-#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.Core.Views {
-  partial class OperatorView {
-    /// <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.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
-      this.SuspendLayout();
-      // 
-      // nameTextBox
-      // 
-      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
-      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      this.nameTextBox.Size = new System.Drawing.Size(418, 20);
-      // 
-      // descriptionTextBox
-      // 
-      this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.descriptionTextBox.Size = new System.Drawing.Size(418, 87);
-      // 
-      // parameterCollectionView
-      // 
-      this.parameterCollectionView.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.parameterCollectionView.Caption = "ParameterCollection";
-      this.parameterCollectionView.Location = new System.Drawing.Point(0, 119);
-      this.parameterCollectionView.Name = "parameterCollectionView";
-      this.parameterCollectionView.Size = new System.Drawing.Size(490, 234);
-      this.parameterCollectionView.TabIndex = 4;
-      // 
-      // OperatorView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.parameterCollectionView);
-      this.Name = "OperatorView";
-      this.Size = new System.Drawing.Size(490, 353);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.descriptionLabel, 0);
-      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
-      this.Controls.SetChildIndex(this.parameterCollectionView, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    protected HeuristicLab.Core.Views.ParameterCollectionView parameterCollectionView;
-
-  }
-}
Index: trunk/sources/HeuristicLab.Core.Views/3.3/OperatorView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/OperatorView.cs	(revision 2803)
+++ 	(revision )
@@ -1,60 +1,0 @@
-#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.MainForm;
-
-namespace HeuristicLab.Core.Views {
-  /// <summary>
-  /// The base class for visual representations of items.
-  /// </summary>
-  [Content(typeof(Operator), true)]
-  [Content(typeof(IOperator), false)]
-  public partial class OperatorView : NamedItemView {
-    public new IOperator Content {
-      get { return (IOperator)base.Content; }
-      set { base.Content = value; }
-    }
-
-    /// <summary>
-    /// Initializes a new instance of <see cref="ItemBaseView"/>.
-    /// </summary>
-    public OperatorView() {
-      InitializeComponent();
-    }
-    /// <summary>
-    /// Intializes a new instance of <see cref="ItemBaseView"/> with the given <paramref name="item"/>.
-    /// </summary>
-    /// <param name="item">The item that should be displayed.</param>
-    public OperatorView(IOperator content)
-      : this() {
-      Content = content;
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        parameterCollectionView.Content = null;
-      } else {
-        parameterCollectionView.Content = ((IOperator)Content).Parameters;
-      }
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ProblemView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ProblemView.Designer.cs	(revision 2803)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ProblemView.Designer.cs	(revision 2805)
@@ -93,6 +93,5 @@
     #endregion
 
-    private ValueParameterCollectionView valueParameterCollectionView;
-
+    protected ValueParameterCollectionView valueParameterCollectionView;
 
   }
Index: trunk/sources/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj	(revision 2803)
+++ trunk/sources/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj	(revision 2805)
@@ -117,5 +117,4 @@
     <Compile Include="Item.cs" />
     <Compile Include="NamedItem.cs" />
-    <Compile Include="Operator.cs" />
     <Compile Include="Problem.cs" />
     <Compile Include="OperatorGraph.cs" />
Index: trunk/sources/HeuristicLab.Core/3.3/Operator.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Operator.cs	(revision 2803)
+++ 	(revision )
@@ -1,184 +1,0 @@
-#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 System.Drawing;
-using HeuristicLab.Collections;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Core {
-  /// <summary>
-  /// The base class for all operators.
-  /// </summary>
-  [Item("Operator", "Base class for operators.")]
-  public abstract class Operator : NamedItem, IOperator {
-    public override Image ItemImage {
-      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Method; }
-    }
-    public override bool CanChangeDescription {
-      get { return false; }
-    }
-
-    private ParameterCollection parameters;
-    [Storable]
-    protected ParameterCollection Parameters {
-      get { return parameters;}
-      private set {
-        if (parameters != null) parameters.Changed -= new ChangedEventHandler(Parameters_Changed);
-        parameters = value;
-        readOnlyParameters = null;
-        if (parameters != null) parameters.Changed += new ChangedEventHandler(Parameters_Changed);
-      }
-    }
-    private ReadOnlyObservableKeyedCollection<string, IParameter> readOnlyParameters;
-    IObservableKeyedCollection<string, IParameter> IOperator.Parameters {
-      get {
-        if (readOnlyParameters == null) readOnlyParameters = parameters.AsReadOnly();
-        return readOnlyParameters;
-      }
-    }
-
-    [Storable]
-    private ExecutionContext executionContext;
-    protected ExecutionContext ExecutionContext {
-      get { return executionContext; }
-      private set {
-        if (value != executionContext) {
-          executionContext = value;
-          OnExecutionContextChanged();
-        }
-      }
-    }
-
-    /// <summary>
-    /// Flag whether the current instance has been canceled.
-    /// </summary>
-    private bool canceled;
-    /// <inheritdoc/>
-    protected bool Canceled {
-      get { return canceled; }
-      private set {
-        if (value != canceled) {
-          canceled = value;
-          OnCanceledChanged();
-        }
-      }
-    }
-
-    [Storable]
-    private bool breakpoint;
-    /// <inheritdoc/>
-    /// <remarks>Calls <see cref="OnBreakpointChanged"/> in the setter.</remarks>
-    public bool Breakpoint {
-      get { return breakpoint; }
-      set {
-        if (value != breakpoint) {
-          breakpoint = value;
-          OnBreakpointChanged();
-        }
-      }
-    }
-
-    /// <summary>
-    /// Initializes a new instance of <see cref="OperatorBase"/> setting the breakpoint flag and 
-    /// the canceled flag to <c>false</c> and the name of the operator to the type name. 
-    /// </summary>
-    protected Operator() {
-      Name = ItemName;
-      Parameters = new ParameterCollection();
-      readOnlyParameters = null;
-      canceled = false;
-      breakpoint = false;
-    }
-
-    /// <summary>
-    /// Clones the current instance (deep clone).
-    /// </summary>
-    /// <remarks>Clones also sub operators, variables and variable infos.</remarks>
-    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
-    /// <returns>The cloned object as <see cref="OperatorBase"/>.</returns>
-    public override IDeepCloneable Clone(Cloner cloner) {
-      Operator clone = (Operator)base.Clone(cloner);
-      clone.Parameters = (ParameterCollection)cloner.Clone(parameters);
-      clone.canceled = canceled;
-      clone.breakpoint = breakpoint;
-      clone.executionContext = (ExecutionContext)cloner.Clone(executionContext);
-      return clone;
-    }
-
-    /// <inheritdoc/>
-    public virtual IExecutionSequence Execute(ExecutionContext context) {
-      try {
-        Canceled = false;
-        ExecutionContext = context;
-        foreach (IParameter param in Parameters)
-          param.ExecutionContext = context;
-        IExecutionSequence next = Apply();
-        OnExecuted();
-        return next;
-      }
-      finally {
-        foreach (IParameter param in Parameters)
-          param.ExecutionContext = null;
-        ExecutionContext = null;
-      }
-    }
-    /// <inheritdoc/>
-    /// <remarks>Sets property <see cref="Canceled"/> to <c>true</c>.</remarks>
-    public void Abort() {
-      Canceled = true;
-    }
-    /// <summary>
-    /// Performs the current operator on the specified <paramref name="scope"/>.
-    /// </summary>
-    /// <param name="scope">The scope where to execute the operator</param>
-    /// <returns><c>null</c>.</returns>
-    public abstract IExecutionSequence Apply();
-
-    protected virtual void OnExecutionContextChanged() { }
-    protected virtual void OnCanceledChanged() { }
-    /// <inheritdoc/>
-    public event EventHandler BreakpointChanged;
-    /// <summary>
-    /// Fires a new <c>BreakpointChanged</c> event.
-    /// </summary>
-    protected virtual void OnBreakpointChanged() {
-      if (BreakpointChanged != null) {
-        BreakpointChanged(this, EventArgs.Empty);
-      }
-      OnChanged();
-    }
-    /// <inheritdoc/>
-    public event EventHandler Executed;
-    /// <summary>
-    /// Fires a new <c>Executed</c> event.
-    /// </summary>
-    protected virtual void OnExecuted() {
-      if (Executed != null) {
-        Executed(this, EventArgs.Empty);
-      }
-    }
-
-    private void Parameters_Changed(object sender, ChangedEventArgs e) {
-      OnChanged(e);
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Operators.Views/3.3/HeuristicLab.Operators.Views-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views/3.3/HeuristicLab.Operators.Views-3.3.csproj	(revision 2803)
+++ trunk/sources/HeuristicLab.Operators.Views/3.3/HeuristicLab.Operators.Views-3.3.csproj	(revision 2805)
@@ -81,4 +81,10 @@
       <DependentUpon>MultipleCallsOperatorView.cs</DependentUpon>
     </Compile>
+    <Compile Include="OperatorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorView.Designer.cs">
+      <DependentUpon>OperatorView.cs</DependentUpon>
+    </Compile>
     <Compile Include="ValuesCollectorView.cs">
       <SubType>UserControl</SubType>
Index: trunk/sources/HeuristicLab.Operators.Views/3.3/OperatorView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views/3.3/OperatorView.Designer.cs	(revision 2805)
+++ trunk/sources/HeuristicLab.Operators.Views/3.3/OperatorView.Designer.cs	(revision 2805)
@@ -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.Operators.Views {
+  partial class OperatorView {
+    /// <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.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(418, 20);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.descriptionTextBox.Size = new System.Drawing.Size(418, 87);
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.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.parameterCollectionView.Caption = "ParameterCollection";
+      this.parameterCollectionView.Location = new System.Drawing.Point(0, 119);
+      this.parameterCollectionView.Name = "parameterCollectionView";
+      this.parameterCollectionView.Size = new System.Drawing.Size(490, 234);
+      this.parameterCollectionView.TabIndex = 4;
+      // 
+      // OperatorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.parameterCollectionView);
+      this.Name = "OperatorView";
+      this.Size = new System.Drawing.Size(490, 353);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      this.Controls.SetChildIndex(this.parameterCollectionView, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected HeuristicLab.Core.Views.ParameterCollectionView parameterCollectionView;
+
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views/3.3/OperatorView.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views/3.3/OperatorView.cs	(revision 2805)
+++ trunk/sources/HeuristicLab.Operators.Views/3.3/OperatorView.cs	(revision 2805)
@@ -0,0 +1,62 @@
+#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.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Operators.Views {
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  [Content(typeof(Operator), true)]
+  [Content(typeof(IOperator), false)]
+  public partial class OperatorView : NamedItemView {
+    public new IOperator Content {
+      get { return (IOperator)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public OperatorView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Intializes a new instance of <see cref="ItemBaseView"/> with the given <paramref name="item"/>.
+    /// </summary>
+    /// <param name="item">The item that should be displayed.</param>
+    public OperatorView(IOperator content)
+      : this() {
+      Content = content;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        parameterCollectionView.Content = null;
+      } else {
+        parameterCollectionView.Content = ((IOperator)Content).Parameters;
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj	(revision 2803)
+++ trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj	(revision 2805)
@@ -91,4 +91,5 @@
     <Compile Include="Assigner.cs" />
     <Compile Include="MultipleCallsOperator.cs" />
+    <Compile Include="Operator.cs" />
     <Compile Include="ParallelSubScopesProcessor.cs" />
     <Compile Include="Placeholder.cs" />
Index: trunk/sources/HeuristicLab.Operators/3.3/Operator.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/Operator.cs	(revision 2805)
+++ trunk/sources/HeuristicLab.Operators/3.3/Operator.cs	(revision 2805)
@@ -0,0 +1,185 @@
+#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 System.Drawing;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// The base class for all operators.
+  /// </summary>
+  [Item("Operator", "Base class for operators.")]
+  public abstract class Operator : NamedItem, IOperator {
+    public override Image ItemImage {
+      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Method; }
+    }
+    public override bool CanChangeDescription {
+      get { return false; }
+    }
+
+    private ParameterCollection parameters;
+    [Storable]
+    protected ParameterCollection Parameters {
+      get { return parameters;}
+      private set {
+        if (parameters != null) parameters.Changed -= new ChangedEventHandler(Parameters_Changed);
+        parameters = value;
+        readOnlyParameters = null;
+        if (parameters != null) parameters.Changed += new ChangedEventHandler(Parameters_Changed);
+      }
+    }
+    private ReadOnlyObservableKeyedCollection<string, IParameter> readOnlyParameters;
+    IObservableKeyedCollection<string, IParameter> IOperator.Parameters {
+      get {
+        if (readOnlyParameters == null) readOnlyParameters = parameters.AsReadOnly();
+        return readOnlyParameters;
+      }
+    }
+
+    [Storable]
+    private ExecutionContext executionContext;
+    protected ExecutionContext ExecutionContext {
+      get { return executionContext; }
+      private set {
+        if (value != executionContext) {
+          executionContext = value;
+          OnExecutionContextChanged();
+        }
+      }
+    }
+
+    /// <summary>
+    /// Flag whether the current instance has been canceled.
+    /// </summary>
+    private bool canceled;
+    /// <inheritdoc/>
+    protected bool Canceled {
+      get { return canceled; }
+      private set {
+        if (value != canceled) {
+          canceled = value;
+          OnCanceledChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private bool breakpoint;
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnBreakpointChanged"/> in the setter.</remarks>
+    public bool Breakpoint {
+      get { return breakpoint; }
+      set {
+        if (value != breakpoint) {
+          breakpoint = value;
+          OnBreakpointChanged();
+        }
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorBase"/> setting the breakpoint flag and 
+    /// the canceled flag to <c>false</c> and the name of the operator to the type name. 
+    /// </summary>
+    protected Operator() {
+      Name = ItemName;
+      Parameters = new ParameterCollection();
+      readOnlyParameters = null;
+      canceled = false;
+      breakpoint = false;
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Clones also sub operators, variables and variable infos.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="OperatorBase"/>.</returns>
+    public override IDeepCloneable Clone(Cloner cloner) {
+      Operator clone = (Operator)base.Clone(cloner);
+      clone.Parameters = (ParameterCollection)cloner.Clone(parameters);
+      clone.canceled = canceled;
+      clone.breakpoint = breakpoint;
+      clone.executionContext = (ExecutionContext)cloner.Clone(executionContext);
+      return clone;
+    }
+
+    /// <inheritdoc/>
+    public virtual IExecutionSequence Execute(ExecutionContext context) {
+      try {
+        Canceled = false;
+        ExecutionContext = context;
+        foreach (IParameter param in Parameters)
+          param.ExecutionContext = context;
+        IExecutionSequence next = Apply();
+        OnExecuted();
+        return next;
+      }
+      finally {
+        foreach (IParameter param in Parameters)
+          param.ExecutionContext = null;
+        ExecutionContext = null;
+      }
+    }
+    /// <inheritdoc/>
+    /// <remarks>Sets property <see cref="Canceled"/> to <c>true</c>.</remarks>
+    public void Abort() {
+      Canceled = true;
+    }
+    /// <summary>
+    /// Performs the current operator on the specified <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope where to execute the operator</param>
+    /// <returns><c>null</c>.</returns>
+    public abstract IExecutionSequence Apply();
+
+    protected virtual void OnExecutionContextChanged() { }
+    protected virtual void OnCanceledChanged() { }
+    /// <inheritdoc/>
+    public event EventHandler BreakpointChanged;
+    /// <summary>
+    /// Fires a new <c>BreakpointChanged</c> event.
+    /// </summary>
+    protected virtual void OnBreakpointChanged() {
+      if (BreakpointChanged != null) {
+        BreakpointChanged(this, EventArgs.Empty);
+      }
+      OnChanged();
+    }
+    /// <inheritdoc/>
+    public event EventHandler Executed;
+    /// <summary>
+    /// Fires a new <c>Executed</c> event.
+    /// </summary>
+    protected virtual void OnExecuted() {
+      if (Executed != null) {
+        Executed(this, EventArgs.Empty);
+      }
+    }
+
+    private void Parameters_Changed(object sender, ChangedEventArgs e) {
+      OnChanged(e);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Parameters/3.3/LookupParameter.cs
===================================================================
--- trunk/sources/HeuristicLab.Parameters/3.3/LookupParameter.cs	(revision 2803)
+++ trunk/sources/HeuristicLab.Parameters/3.3/LookupParameter.cs	(revision 2805)
@@ -111,22 +111,40 @@
       return scope != null ? scope.Variables[actualName] : null;
     }
+    private IValueParameter<T> GetProblemParameter(string name) {
+      IValueParameter<T> param = null;
+      if (ExecutionContext.Problem.Parameters.ContainsKey(name)) {
+        param = ExecutionContext.Problem.Parameters[name] as IValueParameter<T>;
+        if (param == null)
+          throw new InvalidOperationException(
+            string.Format("Parameter look-up chain broken. Parameter \"{0}\" is not an \"{1}\".",
+                          name,
+                          typeof(IValueParameter<T>).GetPrettyName())
+          );
+      }
+      return param;
+    }
     protected override IItem GetActualValue() {
       string name;
-      // try to get local value from context stack
+      // try to get value from context stack
       IValueParameter<T> param = GetParameter(out name);
       if (param != null) return param.Value;
-      else {  // try to get variable from scope
-        IVariable var = LookupVariable(name);
-        if (var != null) {
-          T value = var.Value as T;
-          if (value == null)
-            throw new InvalidOperationException(
-              string.Format("Type mismatch. Variable \"{0}\" does not contain a \"{1}\".",
-                            name,
-                            typeof(T).GetPrettyName())
-            );
-          return value;
-        }
-      }
+
+      // try to get variable from scope
+      IVariable var = LookupVariable(name);
+      if (var != null) {
+        T value = var.Value as T;
+        if (value == null)
+          throw new InvalidOperationException(
+            string.Format("Type mismatch. Variable \"{0}\" does not contain a \"{1}\".",
+                          name,
+                          typeof(T).GetPrettyName())
+          );
+        return value;
+      }
+
+      // try to get value from problem
+      IValueParameter<T> problemParam = GetProblemParameter(name);
+      if (problemParam != null) return problemParam.Value;
+
       return null;
     }
@@ -138,13 +156,28 @@
                         typeof(T).GetPrettyName())
         );
-      // try to get local value from context stack
+      // try to set value in context stack
       string name;
       IValueParameter<T> param = GetParameter(out name);
-      if (param != null) param.Value = val;
-      else {  // try to get variable from scope
-        IVariable var = LookupVariable(name);
-        if (var != null) var.Value = val;
-        else ExecutionContext.Scope.Variables.Add(new Variable(name, value));
-      }
+      if (param != null) {
+        param.Value = val;
+        return;
+      }
+
+      // try to set value in scope
+      IVariable var = LookupVariable(name);
+      if (var != null) {
+        var.Value = val;
+        return;
+      }
+
+      // try to set value in problem
+      IValueParameter<T> problemParam = GetProblemParameter(name);
+      if (problemParam != null) {
+        problemParam.Value = val;
+        return;
+      }
+
+      // create new variable
+      ExecutionContext.Scope.Variables.Add(new Variable(name, value));
     }
 
Index: trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/HeuristicLab.Routing.TSP.Views-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/HeuristicLab.Routing.TSP.Views-3.3.csproj	(revision 2803)
+++ trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/HeuristicLab.Routing.TSP.Views-3.3.csproj	(revision 2805)
@@ -39,4 +39,6 @@
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
     </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml.Linq">
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
@@ -50,4 +52,10 @@
   <ItemGroup>
     <Compile Include="HeuristicLabRoutingTSPViewsPlugin.cs" />
+    <Compile Include="TSPView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TSPView.Designer.cs">
+      <DependentUpon>TSPView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
@@ -58,7 +66,31 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core.Views\3.3\HeuristicLab.Core.Views-3.3.csproj">
+      <Project>{E226881D-315F-423D-B419-A766FE0D8685}</Project>
+      <Name>HeuristicLab.Core.Views-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.2\HeuristicLab.MainForm.WindowsForms-3.2.csproj">
+      <Project>{AB687BBE-1BFE-476B-906D-44237135431D}</Project>
+      <Name>HeuristicLab.MainForm.WindowsForms-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm\3.2\HeuristicLab.MainForm-3.2.csproj">
+      <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
+      <Name>HeuristicLab.MainForm-3.2</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
       <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
       <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Routing.TSP\3.3\HeuristicLab.Routing.TSP-3.3.csproj">
+      <Project>{600287A3-8714-453E-B875-A05F3EB72315}</Project>
+      <Name>HeuristicLab.Routing.TSP-3.3</Name>
     </ProjectReference>
   </ItemGroup>
Index: trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/HeuristicLabRoutingTSPViewsPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/HeuristicLabRoutingTSPViewsPlugin.cs.frame	(revision 2803)
+++ trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/HeuristicLabRoutingTSPViewsPlugin.cs.frame	(revision 2805)
@@ -28,12 +28,10 @@
   [Plugin("HeuristicLab.Routing.TSP.Views", "3.3.0.$WCREV$")]
   [PluginFile("HeuristicLab.Routing.TSP.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
-  [PluginDependency("HeuristicLab.Data", "3.3")]
   [PluginDependency("HeuristicLab.MainForm", "3.2")]
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.2")]
-  [PluginDependency("HeuristicLab.Operators", "3.3")]
-  [PluginDependency("HeuristicLab.Permutation", "3.3")]
-  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Routing.TSP", "3.3")]
   public class HeuristicLabRoutingTSPViewsPlugin : PluginBase {
   }
Index: trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/TSPView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/TSPView.Designer.cs	(revision 2805)
+++ trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/TSPView.Designer.cs	(revision 2805)
@@ -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
+
+namespace HeuristicLab.Routing.TSP.Views {
+  partial class TSPView {
+    /// <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.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.importButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // valueParameterCollectionView
+      // 
+      this.valueParameterCollectionView.Size = new System.Drawing.Size(490, 205);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "tsp";
+      this.openFileDialog.FileName = "tspdata";
+      this.openFileDialog.Filter = "TSPLIB Files|*.tsp|All Files|*.*";
+      this.openFileDialog.Title = "Import TSP Data";
+      // 
+      // importButton
+      // 
+      this.importButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.importButton.Location = new System.Drawing.Point(0, 330);
+      this.importButton.Name = "importButton";
+      this.importButton.Size = new System.Drawing.Size(490, 23);
+      this.importButton.TabIndex = 5;
+      this.importButton.Text = "&Import from TSPLIB";
+      this.importButton.UseVisualStyleBackColor = true;
+      this.importButton.Click += new System.EventHandler(this.importButton_Click);
+      // 
+      // TSPView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.importButton);
+      this.Name = "TSPView";
+      this.Controls.SetChildIndex(this.importButton, 0);
+      this.Controls.SetChildIndex(this.valueParameterCollectionView, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.Button importButton;
+
+  }
+}
Index: trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/TSPView.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/TSPView.cs	(revision 2805)
+++ trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/TSPView.cs	(revision 2805)
@@ -0,0 +1,64 @@
+#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 System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Routing.TSP.Views {
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  [Content(typeof(TSP), true)]
+  public sealed partial class TSPView : ProblemView {
+    public new TSP Content {
+      get { return (TSP)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public TSPView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Intializes a new instance of <see cref="ItemBaseView"/> with the given <paramref name="item"/>.
+    /// </summary>
+    /// <param name="item">The item that should be displayed.</param>
+    public TSPView(TSP content)
+      : this() {
+      Content = content;
+    }
+
+    private void importButton_Click(object sender, System.EventArgs e) {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          Content.ImportFromTSPLIB(openFileDialog.FileName);
+        }
+        catch (Exception ex) {
+          Auxiliary.ShowErrorMessageBox(ex);
+        }
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/DistanceMatrixPathTSPEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/DistanceMatrixPathTSPEvaluator.cs	(revision 2803)
+++ 	(revision )
@@ -1,67 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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 System.Collections.Generic;
-using System.Text;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-using HeuristicLab.Permutation;
-
-namespace HeuristicLab.Routing.TSP {
-  /// <summary>
-  /// Evaluates the TSP path by using values in the distance matrix.
-  /// </summary>
-  public class DistanceMatrixPathTSPEvaluator : SingleObjectiveEvaluatorBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
-    }
-
-    /// <summary>
-    /// Initializes a new instance of <see cref="DistanceMatrixPathTSPEvaluator"/> with two variable 
-    /// infos (<c>Permutation</c>, <c>DistanceMatrix</c>).
-    /// </summary>
-    public DistanceMatrixPathTSPEvaluator()
-      : base() {
-      AddVariableInfo(new VariableInfo("Permutation", "Permutation representing a TSP solution in path encoding", typeof(Permutation.Permutation), VariableKind.In));
-      AddVariableInfo(new VariableInfo("DistanceMatrix", "Distance matrix containing all distances between cities", typeof(DoubleMatrixData), VariableKind.In));
-    }
-
-    /// <summary>
-    /// Calculates the length of the path in the given <paramref name="scope"/> by taking the 
-    /// values of the distance matrix.
-    /// </summary>
-    /// <param name="scope">The current scope with the permutation and the distance matrix.</param>
-    /// <returns>The calculated length.</returns>
-    protected override double Evaluate(IScope scope) {
-      double[,] distanceMatrix = GetVariableValue<DoubleMatrixData>("DistanceMatrix", scope, true).Data;
-      int[] perm = GetVariableValue<Permutation.Permutation>("Permutation", scope, false).Data;
-      double length = 0;
-
-      for (int i = 0; i < perm.Length - 1; i++)
-        length += distanceMatrix[perm[i], perm[i + 1]];
-      length += distanceMatrix[perm[perm.Length - 1], perm[0]];
-      return length;
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/HeuristicLab.Routing.TSP-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/HeuristicLab.Routing.TSP-3.3.csproj	(revision 2803)
+++ trunk/sources/HeuristicLab.Routing.TSP/3.3/HeuristicLab.Routing.TSP-3.3.csproj	(revision 2805)
@@ -86,8 +86,11 @@
   <ItemGroup>
     <None Include="HeuristicLabRoutingTSPPlugin.cs.frame" />
+    <Compile Include="TSPDistanceMatrixPathEvaluator.cs" />
+    <Compile Include="TSPLIBParser.cs" />
+    <Compile Include="TSPRoundedEuclideanPathEvaluator.cs" />
+    <Compile Include="TSPPathEvaluator.cs" />
     <Compile Include="TSP.cs" />
     <Compile Include="HeuristicLabRoutingTSPPlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="TSPParser.cs" />
   </ItemGroup>
   <ItemGroup>
@@ -108,4 +111,8 @@
       <Name>HeuristicLab.Operators-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Permutation\3.3\HeuristicLab.Permutation-3.3.csproj">
       <Project>{00282156-589D-424F-9CE4-A8038636C926}</Project>
@@ -122,4 +129,6 @@
   </ItemGroup>
   <ItemGroup>
+    <None Include="ch130.tsp" />
+    <None Include="fl1400.tsp" />
     <None Include="HeuristicLab.snk" />
     <None Include="Properties\AssemblyInfo.frame" />
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/HeuristicLabRoutingTSPPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/HeuristicLabRoutingTSPPlugin.cs.frame	(revision 2803)
+++ trunk/sources/HeuristicLab.Routing.TSP/3.3/HeuristicLabRoutingTSPPlugin.cs.frame	(revision 2805)
@@ -32,4 +32,5 @@
   [PluginDependency("HeuristicLab.Data", "3.3")]
   [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Permutation", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/PathTSPEvaluatorBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/PathTSPEvaluatorBase.cs	(revision 2803)
+++ 	(revision )
@@ -1,77 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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 System.Collections.Generic;
-using System.Text;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-using HeuristicLab.Permutation;
-
-namespace HeuristicLab.Routing.TSP {
-  /// <summary>
-  /// Base class for TSP path evaluation, based on length calculation.
-  /// </summary>
-  public abstract class PathTSPEvaluatorBase : SingleObjectiveEvaluatorBase {
-    /// <summary>
-    /// Initializes a new instance of <see cref="PathTSPEvaluatorBase"/> with two variable infos
-    /// (<c>Coordinates</c> and <c>Permutation</c>).
-    /// </summary>
-    public PathTSPEvaluatorBase()
-      : base() {
-      AddVariableInfo(new VariableInfo("Coordinates", "City coordinates", typeof(DoubleMatrixData), VariableKind.In));
-      AddVariableInfo(new VariableInfo("Permutation", "Permutation representing a TSP solution in path encoding", typeof(Permutation.Permutation), VariableKind.In));
-    }
-
-    /// <summary>
-    /// Calculates the length of a whole path of the given <paramref name="scope"/>.
-    /// </summary>
-    /// <param name="scope">The scope where to evaluate the path.</param>
-    /// <returns>The calculated length.</returns>
-    protected sealed override double Evaluate(IScope scope) {
-      double[,] coordinates = GetVariableValue<DoubleMatrixData>("Coordinates", scope, true).Data;
-      int[] perm = GetVariableValue<Permutation.Permutation>("Permutation", scope, false).Data;
-      double length = 0;
-
-      for (int i = 0; i < perm.Length - 1; i++)
-        length += CalculateDistance(coordinates[perm[i], 0],
-                                    coordinates[perm[i], 1],
-                                    coordinates[perm[i + 1], 0],
-                                    coordinates[perm[i + 1], 1]);
-      length += CalculateDistance(coordinates[perm[perm.Length - 1], 0],
-                                  coordinates[perm[perm.Length - 1], 1],
-                                  coordinates[perm[0], 0],
-                                  coordinates[perm[0], 1]);
-      return length;
-    }
-
-    /// <summary>
-    /// Calculates the distance between two given points.
-    /// </summary>
-    /// <param name="x1">The x coordinate of point 1.</param>
-    /// <param name="y1">The y coordinate of point 1.</param>
-    /// <param name="x2">The x coordinate of point 2.</param>
-    /// <param name="y2">The y coordinate of point 2.</param>
-    /// <returns>The calculated distance.</returns>
-    protected abstract double CalculateDistance(double x1, double y1, double x2, double y2);
-  }
-}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/RoundedEuclideanPathTSPEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/RoundedEuclideanPathTSPEvaluator.cs	(revision 2803)
+++ 	(revision )
@@ -1,52 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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 System.Collections.Generic;
-using System.Text;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-using HeuristicLab.Permutation;
-
-namespace HeuristicLab.Routing.TSP {
-  /// <summary>
-  /// Evaluates the TSP path by using the euclidean distance between two points.
-  /// </summary>
-  public class RoundedEuclideanPathTSPEvaluator : PathTSPEvaluatorBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
-    }
-
-    /// <summary>
-    /// Calculates the distance between two points by using the euclidean distance.
-    /// </summary>
-    /// <param name="x1">The x coordinate of point 1.</param>
-    /// <param name="y1">The y coordinate of point 1.</param>
-    /// <param name="x2">The x coordinate of point 2.</param>
-    /// <param name="y2">The y coordinate of point 2.</param>
-    /// <returns>The euclidean distance between the two points.</returns>
-    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
-      return Math.Round(Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSP.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSP.cs	(revision 2803)
+++ trunk/sources/HeuristicLab.Routing.TSP/3.3/TSP.cs	(revision 2805)
@@ -20,19 +20,57 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Xml;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Permutation;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
-namespace HeuristicLab.Data {
+namespace HeuristicLab.Routing.TSP {
   [Item("TSP", "Represents a symmetric Traveling Salesman Problem.")]
   [Creatable("Problems")]
+  [EmptyStorableClass]
   public sealed class TSP : Problem {
+    private ValueParameter<DoubleMatrixData> CoordinatesParameter {
+      get { return (ValueParameter<DoubleMatrixData>)Parameters["Coordinates"]; }
+    }
+    private OperatorParameter SolutionGeneratorParameter {
+      get { return (OperatorParameter)Parameters["SolutionGenerator"]; }
+    }
+    private OperatorParameter EvaluatorParameter {
+      get { return (OperatorParameter)Parameters["Evaluator"]; }
+    }
+
+    public DoubleMatrixData Coordinates {
+      get { return CoordinatesParameter.Value; }
+      set { CoordinatesParameter.Value = value; }
+    }
+    public IOperator SolutionGenerator {
+      get { return SolutionGeneratorParameter.Value; }
+      set { SolutionGeneratorParameter.Value = value; }
+    }
+    public IOperator Evaluator {
+      get { return EvaluatorParameter.Value; }
+      set { EvaluatorParameter.Value = value; }
+    }
+
     public TSP()
       : base() {
+      Parameters.Add(new ValueParameter<BoolData>("Maximization", "Set to false as the TSP is a minimization problem.", new BoolData(false)));
+      Parameters.Add(new ValueParameter<DoubleMatrixData>("Coordinates", "The x- and y-Coordinates of the cities.", new DoubleMatrixData(0, 0)));
+      Parameters.Add(new ValueParameter<DoubleData>("BestKnownQuality", "The quality of the best known solution of this TSP instance."));
+      Parameters.Add(new OperatorParameter("SolutionGenerator", "The operator which should be used to generate new solutions."));
+      Parameters.Add(new OperatorParameter("Evaluator", "The operator which should be used to evaluate solutions."));
+    }
 
+    public void ImportFromTSPLIB(string filename) {
+      TSPLIBParser parser = new TSPLIBParser(filename);
+      parser.Parse();
+      Coordinates = new DoubleMatrixData(parser.Vertices);
+      int cities = Coordinates.Rows;
+      RandomPermutationCreator creator = new RandomPermutationCreator();
+      creator.LengthParameter.Value = new IntData(cities);
+      SolutionGenerator = creator;
+      TSPRoundedEuclideanPathEvaluator evaluator = new TSPRoundedEuclideanPathEvaluator();
+      Evaluator = evaluator;
     }
   }
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPDistanceMatrixInjectorBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPDistanceMatrixInjectorBase.cs	(revision 2803)
+++ 	(revision )
@@ -1,78 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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 System.Collections.Generic;
-using System.Text;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-
-namespace HeuristicLab.Routing.TSP {
-  /// <summary>
-  /// Base class to inject the calculated distance matrix of the TSP path into the current scope.
-  /// </summary>
-  public abstract class TSPDistanceMatrixInjectorBase : OperatorBase {
-    /// <summary>
-    /// Initializes a new instance of <see cref="TSPDistanceMatrixInjectorBase"/> with three variable infos
-    /// (<c>Cities</c>, <c>Coordinates</c> and <c>DistanceMatrix</c>).
-    /// </summary>
-    public TSPDistanceMatrixInjectorBase()
-      : base() {
-      AddVariableInfo(new VariableInfo("Cities", "Number of cities", typeof(IntData), VariableKind.In));
-      AddVariableInfo(new VariableInfo("Coordinates", "City coordinates", typeof(DoubleMatrixData), VariableKind.In));
-      AddVariableInfo(new VariableInfo("DistanceMatrix", "Distance matrix containing all distances between cities", typeof(DoubleMatrixData), VariableKind.New));
-    }
-
-    /// <summary>
-    /// Generates a distance matrix with the distances between all cities in the current path.
-    /// </summary>
-    /// <param name="scope">The current scope with the path.</param>
-    /// <returns><c>null</c>.</returns>
-    public override IOperation Apply(IScope scope) {
-      int cities = GetVariableValue<IntData>("Cities", scope, true).Data;
-      double[,] coordinates = GetVariableValue<DoubleMatrixData>("Coordinates", scope, true).Data;
-      double[,] distanceMatrix = new double[cities, cities];
-
-      for (int i = 0; i < cities; i++) {
-        for (int j = 0; j < cities; j++) {
-          distanceMatrix[i, j] = CalculateDistance(coordinates[i, 0],
-                                                   coordinates[i, 1],
-                                                   coordinates[j, 0],
-                                                   coordinates[j, 1]);
-        }
-      }
-      scope.AddVariable(new Variable(scope.TranslateName("DistanceMatrix"), new DoubleMatrixData(distanceMatrix)));
-
-      return null;
-    }
-
-    /// <summary>
-    /// Calculates the distance between two points in the path.
-    /// </summary>
-    /// <param name="x1">The x coordinate of point 1.</param>
-    /// <param name="y1">The y coordinate of point 1.</param>
-    /// <param name="x2">The x coordinate of point 2.</param>
-    /// <param name="y2">The y coordinate of point 2.</param>
-    /// <returns>The calculated distance.</returns>
-    protected abstract double CalculateDistance(double x1, double y1, double x2, double y2);
-  }
-}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPDistanceMatrixPathEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPDistanceMatrixPathEvaluator.cs	(revision 2805)
+++ trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPDistanceMatrixPathEvaluator.cs	(revision 2805)
@@ -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 HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Routing.TSP {
+  /// <summary>
+  /// An operator which evaluates TSP solutions given in path representation using a distance matrix.
+  /// </summary>
+  [Item("TSPDistanceMatrixPathEvaluator", "An operator which evaluates TSP solutions given in path representation using a distance matrix.")]
+  [Creatable("Test")]
+  [EmptyStorableClass]
+  public sealed class TSPDistanceMatrixPathEvaluator : SingleSuccessorOperator {
+    public LookupParameter<DoubleMatrixData> DistanceMatrixParameter {
+      get { return (LookupParameter<DoubleMatrixData>)Parameters["DistanceMatrix"]; }
+    }
+    public LookupParameter<Permutation.Permutation> PermutationParameter {
+      get { return (LookupParameter<Permutation.Permutation>)Parameters["Permutation"]; }
+    }
+    public LookupParameter<DoubleData> QualityParameter {
+      get { return (LookupParameter<DoubleData>)Parameters["Quality"]; }
+    }
+
+    public TSPDistanceMatrixPathEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleMatrixData>("DistanceMatrix", "The distance matrix of the cities."));
+      Parameters.Add(new LookupParameter<Permutation.Permutation>("Permutation", "The TSP solution given in path representation which should be evaluated."));
+      Parameters.Add(new LookupParameter<DoubleData>("Quality", "The evaluated quality of the given TSP solution."));
+    }
+
+    public override IExecutionSequence Apply() {
+      DoubleMatrixData distanceMatrix = DistanceMatrixParameter.ActualValue;
+      Permutation.Permutation permutation = PermutationParameter.ActualValue;
+
+      double length = 0;
+      for (int i = 0; i < permutation.Length - 1; i++)
+        length += distanceMatrix[permutation[i], permutation[i + 1]];
+      length += distanceMatrix[permutation[permutation.Length - 1], permutation[0]];
+      QualityParameter.ActualValue = new DoubleData(length);
+
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPInjector.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPInjector.cs	(revision 2803)
+++ 	(revision )
@@ -1,70 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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 System.Collections.Generic;
-using System.Text;
-using System.Xml;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-
-namespace HeuristicLab.Routing.TSP {
-  /// <summary>
-  /// Injects a new TSP in a given scope with all its needed variables....
-  /// </summary>
-  public class TSPInjector : OperatorBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
-    }
-
-    /// <summary>
-    /// Initializes a new instance of <see cref="TSPInjector"/> with four variable infos 
-    /// (<c>Maximization</c>, <c>Cities</c>, <c>Coordinates</c> and <c>BestKnownQuality</c>).
-    /// </summary>
-    public TSPInjector()
-      : base() {
-      AddVariableInfo(new VariableInfo("Maximization", "Set to false as TSP is a minimization problem", typeof(BoolData), VariableKind.New));
-      AddVariableInfo(new VariableInfo("Cities", "Number of cities", typeof(IntData), VariableKind.New));
-      AddVariable(new Variable("Cities", new IntData(0)));
-      AddVariableInfo(new VariableInfo("Coordinates", "City coordinates", typeof(DoubleMatrixData), VariableKind.New));
-      AddVariable(new Variable("Coordinates", new DoubleMatrixData(new double[0,0])));
-      AddVariableInfo(new VariableInfo("BestKnownQuality", "Quality of best known solution", typeof(DoubleData), VariableKind.New));
-      AddVariable(new Variable("InjectBestKnownQuality", new BoolData(false)));
-      AddVariable(new Variable("BestKnownQuality", new DoubleData(0)));
-    }
-
-    /// <summary>
-    /// Adds a new TSP to the given <paramref name="scope"/>, through adding the needed variables.
-    /// </summary>
-    /// <param name="scope">The current scope where to inject the variables.</param>
-    /// <returns><c>null</c>.</returns>
-    public override IOperation Apply(IScope scope) {
-      scope.AddVariable(new Variable(scope.TranslateName("Maximization"), new BoolData(false)));
-      scope.AddVariable(new Variable(scope.TranslateName("Cities"), (IItem)GetVariable("Cities").Value.Clone()));
-      scope.AddVariable(new Variable(scope.TranslateName("Coordinates"), (IItem)GetVariable("Coordinates").Value.Clone()));
-      if (GetVariable("InjectBestKnownQuality").GetValue<BoolData>().Data)
-        scope.AddVariable(new Variable(scope.TranslateName("BestKnownQuality"), (IItem)GetVariable("BestKnownQuality").Value.Clone()));
-      return null;
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPInjectorView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPInjectorView.Designer.cs	(revision 2803)
+++ 	(revision )
@@ -1,248 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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.Routing.TSP {
-  partial class TSPInjectorView {
-    /// <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 && (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.citiesLabel = new System.Windows.Forms.Label();
-      this.bestKnownQualityTextBox = new System.Windows.Forms.TextBox();
-      this.bestKnownQualityAvailableCheckBox = new System.Windows.Forms.CheckBox();
-      this.citiesTextBox = new System.Windows.Forms.TextBox();
-      this.importInstanceButton = new System.Windows.Forms.Button();
-      this.bestKnownQualityLabel = new System.Windows.Forms.Label();
-      this.bestKnownQualityAvailableLabel = new System.Windows.Forms.Label();
-      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
-      this.tabControl = new System.Windows.Forms.TabControl();
-      this.dataTabPage = new System.Windows.Forms.TabPage();
-      this.variableInfosTabPage = new System.Windows.Forms.TabPage();
-      this.operatorBaseVariableInfosView = new HeuristicLab.Core.Views.OperatorBaseVariableInfosView();
-      this.descriptionTabPage = new System.Windows.Forms.TabPage();
-      this.operatorBaseDescriptionView = new HeuristicLab.Core.Views.OperatorBaseDescriptionView();
-      this.tabControl.SuspendLayout();
-      this.dataTabPage.SuspendLayout();
-      this.variableInfosTabPage.SuspendLayout();
-      this.descriptionTabPage.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // citiesLabel
-      // 
-      this.citiesLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
-      this.citiesLabel.AutoSize = true;
-      this.citiesLabel.Location = new System.Drawing.Point(6, 36);
-      this.citiesLabel.Name = "citiesLabel";
-      this.citiesLabel.Size = new System.Drawing.Size(35, 13);
-      this.citiesLabel.TabIndex = 0;
-      this.citiesLabel.Text = "&Cities:";
-      // 
-      // bestKnownQualityTextBox
-      // 
-      this.bestKnownQualityTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
-      this.bestKnownQualityTextBox.Location = new System.Drawing.Point(166, 79);
-      this.bestKnownQualityTextBox.Name = "bestKnownQualityTextBox";
-      this.bestKnownQualityTextBox.Size = new System.Drawing.Size(96, 20);
-      this.bestKnownQualityTextBox.TabIndex = 5;
-      this.bestKnownQualityTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.bestKnownQualityTextBox_Validating);
-      // 
-      // bestKnownQualityAvailableCheckBox
-      // 
-      this.bestKnownQualityAvailableCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Left;
-      this.bestKnownQualityAvailableCheckBox.AutoSize = true;
-      this.bestKnownQualityAvailableCheckBox.Location = new System.Drawing.Point(166, 59);
-      this.bestKnownQualityAvailableCheckBox.Name = "bestKnownQualityAvailableCheckBox";
-      this.bestKnownQualityAvailableCheckBox.Size = new System.Drawing.Size(15, 14);
-      this.bestKnownQualityAvailableCheckBox.TabIndex = 3;
-      this.bestKnownQualityAvailableCheckBox.UseVisualStyleBackColor = true;
-      this.bestKnownQualityAvailableCheckBox.CheckedChanged += new System.EventHandler(this.bestKnownQualityAvailableCheckBox_CheckedChanged);
-      // 
-      // citiesTextBox
-      // 
-      this.citiesTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
-      this.citiesTextBox.Location = new System.Drawing.Point(166, 33);
-      this.citiesTextBox.Name = "citiesTextBox";
-      this.citiesTextBox.ReadOnly = true;
-      this.citiesTextBox.Size = new System.Drawing.Size(96, 20);
-      this.citiesTextBox.TabIndex = 1;
-      // 
-      // importInstanceButton
-      // 
-      this.importInstanceButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
-      this.importInstanceButton.Location = new System.Drawing.Point(6, 105);
-      this.importInstanceButton.Name = "importInstanceButton";
-      this.importInstanceButton.Size = new System.Drawing.Size(256, 21);
-      this.importInstanceButton.TabIndex = 6;
-      this.importInstanceButton.Text = "&Import Instance from TSPLib";
-      this.importInstanceButton.UseVisualStyleBackColor = true;
-      this.importInstanceButton.Click += new System.EventHandler(this.importInstanceButton_Click);
-      // 
-      // bestKnownQualityLabel
-      // 
-      this.bestKnownQualityLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
-      this.bestKnownQualityLabel.AutoSize = true;
-      this.bestKnownQualityLabel.Location = new System.Drawing.Point(6, 82);
-      this.bestKnownQualityLabel.Name = "bestKnownQualityLabel";
-      this.bestKnownQualityLabel.Size = new System.Drawing.Size(102, 13);
-      this.bestKnownQualityLabel.TabIndex = 4;
-      this.bestKnownQualityLabel.Text = "&Best Known Quality:";
-      // 
-      // bestKnownQualityAvailableLabel
-      // 
-      this.bestKnownQualityAvailableLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
-      this.bestKnownQualityAvailableLabel.AutoSize = true;
-      this.bestKnownQualityAvailableLabel.Location = new System.Drawing.Point(6, 59);
-      this.bestKnownQualityAvailableLabel.Name = "bestKnownQualityAvailableLabel";
-      this.bestKnownQualityAvailableLabel.Size = new System.Drawing.Size(148, 13);
-      this.bestKnownQualityAvailableLabel.TabIndex = 2;
-      this.bestKnownQualityAvailableLabel.Text = "Best Known Quality &Available:";
-      // 
-      // openFileDialog
-      // 
-      this.openFileDialog.DefaultExt = "tsp";
-      this.openFileDialog.FileName = "tsp";
-      this.openFileDialog.Filter = "TSPLib files|*.tsp|All files|*.*";
-      this.openFileDialog.Title = "Import TSPLib File";
-      // 
-      // tabControl
-      // 
-      this.tabControl.Controls.Add(this.dataTabPage);
-      this.tabControl.Controls.Add(this.variableInfosTabPage);
-      this.tabControl.Controls.Add(this.descriptionTabPage);
-      this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.tabControl.Location = new System.Drawing.Point(0, 0);
-      this.tabControl.Name = "tabControl";
-      this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(276, 184);
-      this.tabControl.TabIndex = 0;
-      // 
-      // dataTabPage
-      // 
-      this.dataTabPage.Controls.Add(this.citiesLabel);
-      this.dataTabPage.Controls.Add(this.bestKnownQualityAvailableLabel);
-      this.dataTabPage.Controls.Add(this.bestKnownQualityTextBox);
-      this.dataTabPage.Controls.Add(this.bestKnownQualityLabel);
-      this.dataTabPage.Controls.Add(this.bestKnownQualityAvailableCheckBox);
-      this.dataTabPage.Controls.Add(this.importInstanceButton);
-      this.dataTabPage.Controls.Add(this.citiesTextBox);
-      this.dataTabPage.Location = new System.Drawing.Point(4, 22);
-      this.dataTabPage.Name = "dataTabPage";
-      this.dataTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.dataTabPage.Size = new System.Drawing.Size(268, 158);
-      this.dataTabPage.TabIndex = 0;
-      this.dataTabPage.Text = "TSP Data";
-      this.dataTabPage.UseVisualStyleBackColor = true;
-      // 
-      // variableInfosTabPage
-      // 
-      this.variableInfosTabPage.Controls.Add(this.operatorBaseVariableInfosView);
-      this.variableInfosTabPage.Location = new System.Drawing.Point(4, 22);
-      this.variableInfosTabPage.Name = "variableInfosTabPage";
-      this.variableInfosTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.variableInfosTabPage.Size = new System.Drawing.Size(268, 158);
-      this.variableInfosTabPage.TabIndex = 1;
-      this.variableInfosTabPage.Text = "Variable Infos";
-      this.variableInfosTabPage.UseVisualStyleBackColor = true;
-      // 
-      // operatorBaseVariableInfosView
-      // 
-      this.operatorBaseVariableInfosView.Caption = "Operator";
-      this.operatorBaseVariableInfosView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.operatorBaseVariableInfosView.Location = new System.Drawing.Point(3, 3);
-      this.operatorBaseVariableInfosView.Name = "operatorBaseVariableInfosView";
-      this.operatorBaseVariableInfosView.Operator = null;
-      this.operatorBaseVariableInfosView.Size = new System.Drawing.Size(262, 152);
-      this.operatorBaseVariableInfosView.TabIndex = 0;
-      // 
-      // descriptionTabPage
-      // 
-      this.descriptionTabPage.Controls.Add(this.operatorBaseDescriptionView);
-      this.descriptionTabPage.Location = new System.Drawing.Point(4, 22);
-      this.descriptionTabPage.Name = "descriptionTabPage";
-      this.descriptionTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.descriptionTabPage.Size = new System.Drawing.Size(268, 158);
-      this.descriptionTabPage.TabIndex = 2;
-      this.descriptionTabPage.Text = "Description";
-      this.descriptionTabPage.UseVisualStyleBackColor = true;
-      // 
-      // operatorBaseDescriptionView
-      // 
-      this.operatorBaseDescriptionView.Caption = "Operator";
-      this.operatorBaseDescriptionView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.operatorBaseDescriptionView.Location = new System.Drawing.Point(3, 3);
-      this.operatorBaseDescriptionView.Name = "operatorBaseDescriptionView";
-      this.operatorBaseDescriptionView.Operator = null;
-      this.operatorBaseDescriptionView.Size = new System.Drawing.Size(262, 152);
-      this.operatorBaseDescriptionView.TabIndex = 0;
-      // 
-      // TSPInjectorView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.tabControl);
-      this.Name = "TSPInjectorView";
-      this.Size = new System.Drawing.Size(276, 184);
-      this.tabControl.ResumeLayout(false);
-      this.dataTabPage.ResumeLayout(false);
-      this.dataTabPage.PerformLayout();
-      this.variableInfosTabPage.ResumeLayout(false);
-      this.descriptionTabPage.ResumeLayout(false);
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.Label citiesLabel;
-    private System.Windows.Forms.TextBox bestKnownQualityTextBox;
-    private System.Windows.Forms.CheckBox bestKnownQualityAvailableCheckBox;
-    private System.Windows.Forms.TextBox citiesTextBox;
-    private System.Windows.Forms.Button importInstanceButton;
-    private System.Windows.Forms.Label bestKnownQualityLabel;
-    private System.Windows.Forms.Label bestKnownQualityAvailableLabel;
-    private System.Windows.Forms.OpenFileDialog openFileDialog;
-    private System.Windows.Forms.TabControl tabControl;
-    private System.Windows.Forms.TabPage dataTabPage;
-    private System.Windows.Forms.TabPage variableInfosTabPage;
-    private HeuristicLab.Core.Views.OperatorBaseVariableInfosView operatorBaseVariableInfosView;
-    private System.Windows.Forms.TabPage descriptionTabPage;
-    private HeuristicLab.Core.Views.OperatorBaseDescriptionView operatorBaseDescriptionView;
-  }
-}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPInjectorView.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPInjectorView.cs	(revision 2803)
+++ 	(revision )
@@ -1,156 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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 System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Text;
-using System.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Routing.TSP {
-  /// <summary>
-  /// Class to represent a <see cref="TSPInjector"/> visually.
-  /// </summary>
-  [Content(typeof(TSPInjector), true)]
-  public partial class TSPInjectorView : ItemViewBase {
-    /// <summary>
-    /// Gets or set the <see cref="TSPInjector"/> to represent visually.
-    /// </summary>        
-    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
-    /// No own data storage present.</remarks>
-    public TSPInjector TSPInjector {
-      get { return (TSPInjector)Item; }
-      set { base.Item = value; }
-    }
-
-    /// <summary>
-    /// Initializes a new instance of <see cref="TSPInjectorView"/>.
-    /// </summary>
-    public TSPInjectorView() {
-      InitializeComponent();
-    }
-    /// <summary>
-    /// Initializes a new instance of <see cref="TSPInjectorView"/> with the given 
-    /// <paramref name="tspInjector"/>.
-    /// </summary>
-    /// <param name="tspInjector">The <see cref="TSPInjector"/> to display.</param>
-    public TSPInjectorView(TSPInjector tspInjector)
-      : this() {
-      TSPInjector = tspInjector;
-    }
-
-    /// <summary>
-    /// Removes the event handlers in all children.
-    /// </summary>
-    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
-    protected override void RemoveItemEvents() {
-      operatorBaseVariableInfosView.Operator = null;
-      operatorBaseDescriptionView.Operator = null;
-      base.RemoveItemEvents();
-    }
-    /// <summary>
-    /// Adds event handlers in all children.
-    /// </summary>
-    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
-    protected override void AddItemEvents() {
-      base.AddItemEvents();
-      operatorBaseVariableInfosView.Operator = TSPInjector;
-      operatorBaseDescriptionView.Operator = TSPInjector;
-    }
-
-    /// <summary>
-    /// Updates all controls with the latest data of the model.
-    /// </summary>
-    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
-    protected override void UpdateControls() {
-      base.UpdateControls();
-      if (TSPInjector == null) {
-        citiesTextBox.Text = "-";
-        bestKnownQualityAvailableCheckBox.Checked = false;
-        bestKnownQualityAvailableCheckBox.Enabled = false;
-        bestKnownQualityTextBox.Text = "-";
-        bestKnownQualityTextBox.Enabled = false;
-        importInstanceButton.Enabled = false;
-      } else {
-        citiesTextBox.Text = TSPInjector.GetVariable("Cities").Value.ToString();
-        bestKnownQualityAvailableCheckBox.Checked = TSPInjector.GetVariable("InjectBestKnownQuality").GetValue<BoolData>().Data;
-        bestKnownQualityAvailableCheckBox.Enabled = true;
-        if (bestKnownQualityAvailableCheckBox.Checked) {
-          bestKnownQualityTextBox.Text = TSPInjector.GetVariable("BestKnownQuality").Value.ToString();
-          bestKnownQualityTextBox.Enabled = true;
-        } else {
-          bestKnownQualityTextBox.Text = "-";
-          bestKnownQualityTextBox.Enabled = false;
-        }
-        importInstanceButton.Enabled = true;
-      }
-    }
-
-    private void bestKnownQualityAvailableCheckBox_CheckedChanged(object sender, EventArgs e) {
-      TSPInjector.GetVariable("InjectBestKnownQuality").GetValue<BoolData>().Data = bestKnownQualityAvailableCheckBox.Checked;
-      if (bestKnownQualityAvailableCheckBox.Checked) {
-        bestKnownQualityTextBox.Text = TSPInjector.GetVariable("BestKnownQuality").Value.ToString();
-        bestKnownQualityTextBox.Enabled = true;
-      } else {
-        bestKnownQualityTextBox.Text = "-";
-        bestKnownQualityTextBox.Enabled = false;
-      }
-    }
-
-    private void bestKnownQualityTextBox_Validating(object sender, CancelEventArgs e) {
-      e.Cancel = false;
-      try {
-        TSPInjector.GetVariable("BestKnownQuality").GetValue<DoubleData>().Data = double.Parse(bestKnownQualityTextBox.Text);
-      }
-      catch (Exception) {
-        bestKnownQualityTextBox.SelectAll();
-        e.Cancel = true;
-      }
-    }
-
-    private void importInstanceButton_Click(object sender, EventArgs e) {
-      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
-        TSPParser parser = null;
-        bool success = false;
-        try {
-          parser = new TSPParser(openFileDialog.FileName);
-          parser.Parse();
-          success = true;
-        }
-        catch (Exception ex) {
-          MessageBox.Show(this, ex.Message, ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
-        }
-        if (success) {
-          TSPInjector.GetVariable("Cities").Value = new IntData(parser.Vertices.GetLength(0));
-          TSPInjector.GetVariable("Coordinates").Value = new DoubleMatrixData(parser.Vertices);
-          Refresh();
-        }
-      }
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPInjectorView.resx
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPInjectorView.resx	(revision 2803)
+++ 	(revision )
@@ -1,123 +1,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-</root>
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPLIBParser.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPLIBParser.cs	(revision 2805)
+++ trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPLIBParser.cs	(revision 2805)
@@ -0,0 +1,208 @@
+#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 System.Globalization;
+using System.IO;
+
+namespace HeuristicLab.Routing.TSP {
+  /// <summary>
+  /// Parses a *.tsp file in the TSPLIB format and extracts its information about a TSP.
+  /// </summary>
+  public class TSPLIBParser {
+    private const int EOF = 0;
+    private const int NAME = 1;
+    private const int TYPE = 2;
+    private const int DIM = 3;
+    private const int WEIGHTTYPE = 4;
+    private const int NODETYPE = 5;
+    private const int NODESECTION = 6;
+
+    private StreamReader source;
+
+    private string myName;
+    /// <summary>
+    /// Gets the name of the parsed TSP.
+    /// </summary>
+    public string Name {
+      get { return myName; }
+    }
+    private double[,] myVertices;
+    /// <summary>
+    /// Gets the vertices of the parsed TSP.
+    /// </summary>
+    public double[,] Vertices {
+      get { return myVertices; }
+    }
+    private int myWeightType;
+    /// <summary>
+    /// Gets the weight type of the parsed TSP.
+    /// </summary>
+    public int WeightType {
+      get { return myWeightType; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="TSPParser"/> with the given <paramref name="path"/>.
+    /// </summary>
+    /// <exception cref="ArgumentException">Thrown when the input file name is not in TSP format (*.tsp)
+    /// </exception>
+    /// <param name="path">The path where the TSP is stored.</param>
+    public TSPLIBParser(String path) {
+      if (!path.EndsWith(".tsp"))
+        throw new ArgumentException("Input file name has to be in TSP format (*.tsp)");
+
+      source = new StreamReader(path);
+      myName = path;
+      myVertices = null;
+      myWeightType = -1;
+    }
+
+    /// <summary>
+    /// Reads the TSP file and parses the elements.
+    /// </summary>
+    /// <exception cref="InvalidDataException">Thrown when file contains unknown (edge) types.</exception>
+    public void Parse() {
+      int section = -1;
+      string str = null;
+      bool typeIsChecked = false;
+      bool weightTypeIsChecked = false;
+
+      do {
+        str = source.ReadLine();
+        section = GetSection(str);
+
+        if (section != -1) {
+          switch (section) {
+            case NAME:
+              ReadName(str);
+              break;
+            case TYPE:
+              CheckType(str);
+              typeIsChecked = true;
+              break;
+            case DIM:
+              InitVerticesArray(str);
+              break;
+            case WEIGHTTYPE:
+              ReadWeightType(str);
+              weightTypeIsChecked = true;
+              break;
+            case NODETYPE:
+              CheckNodeType(str);
+              break;
+            case NODESECTION:
+              ReadVertices();
+              break;
+          }
+        }
+      } while (!((section == EOF) || (str == null)));
+
+      if (!(typeIsChecked && weightTypeIsChecked))
+        throw new InvalidDataException("File contains unknown (edge) types");
+    }
+
+    private int GetSection(string str) {
+      if (str == null)
+        return EOF;
+
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      if (tokens.Length == 0)
+        return -1;
+
+      string token = tokens[0].Trim();
+      if (token.Equals("eof", StringComparison.OrdinalIgnoreCase))
+        return EOF;
+      if (token.Equals("name", StringComparison.OrdinalIgnoreCase))
+        return NAME;
+      if (token.Equals("type", StringComparison.OrdinalIgnoreCase))
+        return TYPE;
+      if (token.Equals("dimension", StringComparison.OrdinalIgnoreCase))
+        return DIM;
+      if (token.Equals("edge_weight_type", StringComparison.OrdinalIgnoreCase))
+        return WEIGHTTYPE;
+      if (token.Equals("node_coord_type", StringComparison.OrdinalIgnoreCase))
+        return NODETYPE;
+      if (token.Equals("node_coord_section", StringComparison.OrdinalIgnoreCase))
+        return NODESECTION;
+
+      return -1;
+    }
+
+    private void ReadName(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      myName = tokens[tokens.Length - 1].Trim();
+    }
+
+    private void CheckType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+
+      string type = tokens[tokens.Length - 1].Trim();
+      if (!type.Equals("tsp", StringComparison.OrdinalIgnoreCase))
+        throw new InvalidDataException("Input data format is not \"TSP\"");
+    }
+
+    private void InitVerticesArray(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string dimension = tokens[tokens.Length - 1].Trim();
+
+      int dim = Int32.Parse(dimension);
+      myVertices = new double[dim, 2];
+    }
+
+    private void ReadWeightType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string type = tokens[tokens.Length - 1].Trim();
+
+      if (type.Equals("euc_2d", StringComparison.OrdinalIgnoreCase))
+        myWeightType = 0;
+      else if (type.Equals("geo", StringComparison.OrdinalIgnoreCase))
+        myWeightType = 1;
+      else
+        throw new InvalidDataException("Unsupported type of edge weights");
+    }
+
+    private void CheckNodeType(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string type = tokens[tokens.Length - 1].Trim();
+
+      if (!type.Equals("twod_coords", StringComparison.OrdinalIgnoreCase))
+        throw new InvalidDataException("Unsupported node type");
+    }
+
+    private void ReadVertices() {
+      if (myVertices == null)
+        throw new InvalidDataException("Dimension not found");
+
+      for (int i = 0; i < (myVertices.Length / 2); i++) {
+        string str = source.ReadLine();
+        string[] tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+        if (tokens.Length != 3)
+          throw new InvalidDataException("Invalid node format");
+
+        CultureInfo culture = new CultureInfo("en-US");
+        myVertices[i, 0] = Double.Parse(tokens[1], culture.NumberFormat);
+        myVertices[i, 1] = Double.Parse(tokens[2], culture.NumberFormat);
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPParser.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPParser.cs	(revision 2803)
+++ 	(revision )
@@ -1,208 +1,0 @@
-#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 System.Globalization;
-using System.IO;
-
-namespace HeuristicLab.Routing.TSP {
-  /// <summary>
-  /// Parses a *.tsp file in the TSPLIB format and extracts its information about a TSP.
-  /// </summary>
-  public class TSPParser {
-    private const int EOF = 0;
-    private const int NAME = 1;
-    private const int TYPE = 2;
-    private const int DIM = 3;
-    private const int WEIGHTTYPE = 4;
-    private const int NODETYPE = 5;
-    private const int NODESECTION = 6;
-
-    private StreamReader source;
-
-    private string myName;
-    /// <summary>
-    /// Gets the name of the parsed TSP.
-    /// </summary>
-    public string Name {
-      get { return myName; }
-    }
-    private double[,] myVertices;
-    /// <summary>
-    /// Gets the vertices of the parsed TSP.
-    /// </summary>
-    public double[,] Vertices {
-      get { return myVertices; }
-    }
-    private int myWeightType;
-    /// <summary>
-    /// Gets the weight type of the parsed TSP.
-    /// </summary>
-    public int WeightType {
-      get { return myWeightType; }
-    }
-
-    /// <summary>
-    /// Initializes a new instance of <see cref="TSPParser"/> with the given <paramref name="path"/>.
-    /// </summary>
-    /// <exception cref="ArgumentException">Thrown when the input file name is not in TSP format (*.tsp)
-    /// </exception>
-    /// <param name="path">The path where the TSP is stored.</param>
-    public TSPParser(String path) {
-      if (!path.EndsWith(".tsp"))
-        throw new ArgumentException("Input file name has to be in TSP format (*.tsp)");
-
-      source = new StreamReader(path);
-      myName = path;
-      myVertices = null;
-      myWeightType = -1;
-    }
-
-    /// <summary>
-    /// Reads the TSP file and parses the elements.
-    /// </summary>
-    /// <exception cref="InvalidDataException">Thrown when file contains unknown (edge) types.</exception>
-    public void Parse() {
-      int section = -1;
-      string str = null;
-      bool typeIsChecked = false;
-      bool weightTypeIsChecked = false;
-
-      do {
-        str = source.ReadLine();
-        section = GetSection(str);
-
-        if (section != -1) {
-          switch (section) {
-            case NAME:
-              ReadName(str);
-              break;
-            case TYPE:
-              CheckType(str);
-              typeIsChecked = true;
-              break;
-            case DIM:
-              InitVerticesArray(str);
-              break;
-            case WEIGHTTYPE:
-              ReadWeightType(str);
-              weightTypeIsChecked = true;
-              break;
-            case NODETYPE:
-              CheckNodeType(str);
-              break;
-            case NODESECTION:
-              ReadVertices();
-              break;
-          }
-        }
-      } while (!((section == EOF) || (str == null)));
-
-      if (!(typeIsChecked && weightTypeIsChecked))
-        throw new InvalidDataException("File contains unknown (edge) types");
-    }
-
-    private int GetSection(string str) {
-      if (str == null)
-        return EOF;
-
-      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
-      if (tokens.Length == 0)
-        return -1;
-
-      string token = tokens[0].Trim();
-      if (token.Equals("eof", StringComparison.OrdinalIgnoreCase))
-        return EOF;
-      if (token.Equals("name", StringComparison.OrdinalIgnoreCase))
-        return NAME;
-      if (token.Equals("type", StringComparison.OrdinalIgnoreCase))
-        return TYPE;
-      if (token.Equals("dimension", StringComparison.OrdinalIgnoreCase))
-        return DIM;
-      if (token.Equals("edge_weight_type", StringComparison.OrdinalIgnoreCase))
-        return WEIGHTTYPE;
-      if (token.Equals("node_coord_type", StringComparison.OrdinalIgnoreCase))
-        return NODETYPE;
-      if (token.Equals("node_coord_section", StringComparison.OrdinalIgnoreCase))
-        return NODESECTION;
-
-      return -1;
-    }
-
-    private void ReadName(string str) {
-      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
-      myName = tokens[tokens.Length - 1].Trim();
-    }
-
-    private void CheckType(string str) {
-      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
-
-      string type = tokens[tokens.Length - 1].Trim();
-      if (!type.Equals("tsp", StringComparison.OrdinalIgnoreCase))
-        throw new InvalidDataException("Input data format is not \"TSP\"");
-    }
-
-    private void InitVerticesArray(string str) {
-      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
-      string dimension = tokens[tokens.Length - 1].Trim();
-
-      int dim = Int32.Parse(dimension);
-      myVertices = new double[dim, 2];
-    }
-
-    private void ReadWeightType(string str) {
-      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
-      string type = tokens[tokens.Length - 1].Trim();
-
-      if (type.Equals("euc_2d", StringComparison.OrdinalIgnoreCase))
-        myWeightType = 0;
-      else if (type.Equals("geo", StringComparison.OrdinalIgnoreCase))
-        myWeightType = 1;
-      else
-        throw new InvalidDataException("Unsupported type of edge weights");
-    }
-
-    private void CheckNodeType(string str) {
-      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
-      string type = tokens[tokens.Length - 1].Trim();
-
-      if (!type.Equals("twod_coords", StringComparison.OrdinalIgnoreCase))
-        throw new InvalidDataException("Unsupported node type");
-    }
-
-    private void ReadVertices() {
-      if (myVertices == null)
-        throw new InvalidDataException("Dimension not found");
-
-      for (int i = 0; i < (myVertices.Length / 2); i++) {
-        string str = source.ReadLine();
-        string[] tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
-
-        if (tokens.Length != 3)
-          throw new InvalidDataException("Invalid node format");
-
-        CultureInfo culture = new CultureInfo("en-US");
-        myVertices[i, 0] = Double.Parse(tokens[1], culture.NumberFormat);
-        myVertices[i, 1] = Double.Parse(tokens[2], culture.NumberFormat);
-      }
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPPathEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPPathEvaluator.cs	(revision 2805)
+++ trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPPathEvaluator.cs	(revision 2805)
@@ -0,0 +1,81 @@
+#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.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Routing.TSP {
+  /// <summary>
+  /// A base class for operators which evaluate TSP solutions given in path representation.
+  /// </summary>
+  [Item("TSPPathEvaluator", "A base class for operators which evaluate TSP solutions given in path representation.")]
+  [EmptyStorableClass]
+  public abstract class TSPPathEvaluator : SingleSuccessorOperator {
+    public LookupParameter<DoubleMatrixData> CoordinatesParameter {
+      get { return (LookupParameter<DoubleMatrixData>)Parameters["Coordinates"]; }
+    }
+    public LookupParameter<Permutation.Permutation> PermutationParameter {
+      get { return (LookupParameter<Permutation.Permutation>)Parameters["Permutation"]; }
+    }
+    public LookupParameter<DoubleData> QualityParameter {
+      get { return (LookupParameter<DoubleData>)Parameters["Quality"]; }
+    }
+
+    protected TSPPathEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleMatrixData>("Coordinates", "The x- and y-Coordinates of the cities."));
+      Parameters.Add(new LookupParameter<Permutation.Permutation>("Permutation", "The TSP solution given in path representation which should be evaluated."));
+      Parameters.Add(new LookupParameter<DoubleData>("Quality", "The evaluated quality of the given TSP solution."));
+    }
+
+    public override IExecutionSequence Apply() {
+      DoubleMatrixData coordinates = CoordinatesParameter.ActualValue;
+      Permutation.Permutation permutation = PermutationParameter.ActualValue;
+
+      double length = 0;
+      for (int i = 0; i < permutation.Length - 1; i++)
+        length += CalculateDistance(coordinates[permutation[i], 0],
+                                    coordinates[permutation[i], 1],
+                                    coordinates[permutation[i + 1], 0],
+                                    coordinates[permutation[i + 1], 1]);
+      length += CalculateDistance(coordinates[permutation[permutation.Length - 1], 0],
+                                  coordinates[permutation[permutation.Length - 1], 1],
+                                  coordinates[permutation[0], 0],
+                                  coordinates[permutation[0], 1]);
+      QualityParameter.ActualValue = new DoubleData(length);
+
+      return base.Apply();
+    }
+
+    /// <summary>
+    /// Calculates the distance between two points.
+    /// </summary>
+    /// <param name="x1">The x-coordinate of point 1.</param>
+    /// <param name="y1">The y-coordinate of point 1.</param>
+    /// <param name="x2">The x-coordinate of point 2.</param>
+    /// <param name="y2">The y-coordinate of point 2.</param>
+    /// <returns>The calculated distance.</returns>
+    protected abstract double CalculateDistance(double x1, double y1, double x2, double y2);
+  }
+}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPRoundedEuclideanDistanceMatrixInjector.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPRoundedEuclideanDistanceMatrixInjector.cs	(revision 2803)
+++ 	(revision )
@@ -1,51 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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 System.Collections.Generic;
-using System.Text;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-
-namespace HeuristicLab.Routing.TSP {
-  /// <summary>
-  /// Injects a distance matrix with euclidean distances of a TSP path into the current scope.
-  /// </summary>
-  public class TSPRoundedEuclideanDistanceMatrixInjector : TSPDistanceMatrixInjectorBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
-    }
-
-    /// <summary>
-    /// Calculates the distance between two points by using the euclidean distance.
-    /// </summary>
-    /// <param name="x1">The x coordinate of point 1.</param>
-    /// <param name="y1">The y coordinate of point 1.</param>
-    /// <param name="x2">The x coordinate of point 2.</param>
-    /// <param name="y2">The y coordinate of point 2.</param>
-    /// <returns>The euclidean distance between the two points.</returns>
-    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
-      return Math.Round(Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPRoundedEuclideanPathEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPRoundedEuclideanPathEvaluator.cs	(revision 2805)
+++ trunk/sources/HeuristicLab.Routing.TSP/3.3/TSPRoundedEuclideanPathEvaluator.cs	(revision 2805)
@@ -0,0 +1,46 @@
+#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.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Routing.TSP {
+  /// <summary>
+  /// An operator which evaluates TSP solutions given in path representation using the rounded Euclidean distance metric.
+  /// </summary>
+  [Item("TSPRoundedEuclideanPathEvaluator", "An operator which evaluates TSP solutions given in path representation using the rounded Euclidean distance metric.")]
+  [Creatable("Test")]
+  [EmptyStorableClass]
+  public sealed class TSPRoundedEuclideanPathEvaluator : TSPPathEvaluator {
+    /// <summary>
+    /// Calculates the distance between two points using the rounded Euclidean distance metric.
+    /// </summary>
+    /// <param name="x1">The x-coordinate of point 1.</param>
+    /// <param name="y1">The y-coordinate of point 1.</param>
+    /// <param name="x2">The x-coordinate of point 2.</param>
+    /// <param name="y2">The y-coordinate of point 2.</param>
+    /// <returns>The calculated distance.</returns>
+    protected override double CalculateDistance(double x1, double y1, double x2, double y2) {
+      return Math.Round(Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Selection/3.3/HeuristicLab.Selection-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/HeuristicLab.Selection-3.3.csproj	(revision 2803)
+++ trunk/sources/HeuristicLab.Selection/3.3/HeuristicLab.Selection-3.3.csproj	(revision 2805)
@@ -82,6 +82,13 @@
   <ItemGroup>
     <None Include="HeuristicLabSelectionPlugin.cs.frame" />
+    <Compile Include="RightSelector.cs" />
+    <Compile Include="StochasticSelector.cs" />
+    <Compile Include="LeftSelector.cs" />
+    <Compile Include="RandomSelector.cs" />
+    <Compile Include="StochasticSingleObjectiveSelector.cs" />
     <Compile Include="HeuristicLabSelectionPlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Selector.cs" />
+    <Compile Include="TournamentSelector.cs" />
   </ItemGroup>
   <ItemGroup>
@@ -90,4 +97,8 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
       <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
@@ -101,4 +112,12 @@
       <Project>{23DA7FF4-D5B8-41B6-AA96-F0561D24F3EE}</Project>
       <Name>HeuristicLab.Operators-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
Index: trunk/sources/HeuristicLab.Selection/3.3/HeuristicLabSelectionPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/HeuristicLabSelectionPlugin.cs.frame	(revision 2803)
+++ trunk/sources/HeuristicLab.Selection/3.3/HeuristicLabSelectionPlugin.cs.frame	(revision 2805)
@@ -31,7 +31,10 @@
   [Plugin("HeuristicLab.Selection", "3.3.0.$WCREV$")]
   [PluginFile("HeuristicLab.Selection-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Data", "3.3")]
   [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
   public class HeuristicLabSelectionPlugin : PluginBase {
   }
Index: trunk/sources/HeuristicLab.Selection/3.3/LeftSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/LeftSelector.cs	(revision 2803)
+++ trunk/sources/HeuristicLab.Selection/3.3/LeftSelector.cs	(revision 2805)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -20,42 +20,33 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
-using System.Text;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Selection {
   /// <summary>
-  /// Copies or moves a defined number of sub scopes from a source scope to a target scope, starting at
-  /// the left side of the tree.
+  /// An operator which selects sub-scopes from left to right.
   /// </summary>
-  public class LeftSelector : StochasticSelectorBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
-    }
+  [Item("LeftSelector", "An operator which selects sub-scopes from left to right.")]
+  [EmptyStorableClass]
+  [Creatable("Test")]
+  public sealed class LeftSelector : Selector {
+    public LeftSelector() : base() { }
 
-    /// <summary>
-    /// Copies or moves a number of sub scopes (<paramref name="selected"/>) from <paramref name="source"/>
-    /// starting at the left end to the <paramref name="target"/>.
-    /// </summary>
-    /// <param name="random">A random number generator.</param>
-    /// <param name="source">The source scope from which to copy/move the sub scopes.</param>
-    /// <param name="selected">The number of sub scopes to move. Can be also bigger than the total 
-    /// number of sub scopes in <paramref name="source"/>, then the copying process starts again from the 
-    /// beginning.</param>
-    /// <param name="target">The target where to copy/move the sub scopes.</param>
-    /// <param name="copySelected">Boolean flag whether the sub scopes shall be copied or moved.</param>
-    protected override void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected) {
-      int index = 0;
-      for (int i = 0; i < selected; i++) {
-        if (copySelected) {
-          target.AddSubScope((IScope)source.SubScopes[index].Clone());
-          index++;
-          if (index >= source.SubScopes.Count) index = 0;
+    protected override void Select(ScopeList source, ScopeList target) {
+      int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
+      bool copy = CopySelectedParameter.Value.Value;
+
+      int j = 0;
+      for (int i = 0; i < count; i++) {
+        if (copy) {
+          target.Add((IScope)source[j].Clone());
+          j++;
+          if (j >= source.Count) j = 0;
         } else {
-          IScope s = source.SubScopes[0];
-          source.RemoveSubScope(s);
-          target.AddSubScope(s);
+          target.Add(source[0]);
+          source.RemoveAt(0);
         }
       }
Index: trunk/sources/HeuristicLab.Selection/3.3/RandomSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/RandomSelector.cs	(revision 2803)
+++ trunk/sources/HeuristicLab.Selection/3.3/RandomSelector.cs	(revision 2805)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -20,37 +20,32 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
-using System.Text;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Selection {
   /// <summary>
-  /// Copies or moves a defined number of sub scopes from a source scope to a target scope, being selected
-  /// randomly.
+  /// A random selection operator.
   /// </summary>
-  public class RandomSelector : StochasticSelectorBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
-    }
+  [Item("RandomSelector", "A random selection operator.")]
+  [EmptyStorableClass]
+  [Creatable("Test")]
+  public sealed class RandomSelector : StochasticSelector {
+    public RandomSelector() : base() { }
 
-    /// <summary>
-    /// Copies or moves a number of sub scopes (<paramref name="selected"/>) from <paramref name="source"/>
-    /// to the <paramref name="target"/>, chosen randomly.
-    /// </summary>
-    /// <param name="random">The random number generator.</param>
-    /// <param name="source">The source scope from which to copy/move the sub scopes.</param>
-    /// <param name="selected">The number of sub scopes to move.</param>
-    /// <param name="target">The target where to copy/move the sub scopes.</param>
-    /// <param name="copySelected">Boolean flag whether the sub scopes shall be copied or moved.</param>
-    protected override void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected) {
-      for (int i = 0; i < selected; i++) {
-        if (copySelected) {
-          target.AddSubScope((IScope)source.SubScopes[random.Next(source.SubScopes.Count)].Clone());
-        } else {
-          IScope s = source.SubScopes[random.Next(source.SubScopes.Count)];
-          source.RemoveSubScope(s);
-          target.AddSubScope(s);
+    protected override void Select(ScopeList source, ScopeList target) {
+      int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
+      bool copy = CopySelectedParameter.Value.Value;
+      IRandom random = RandomParameter.ActualValue;
+
+      for (int i = 0; i < count; i++) {
+        if (copy)
+          target.Add((IScope)source[random.Next(source.Count)].Clone());
+        else {
+          int index = random.Next(source.Count);
+          target.Add(source[index]);
+          source.RemoveAt(index);
         }
       }
Index: trunk/sources/HeuristicLab.Selection/3.3/RightSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/RightSelector.cs	(revision 2803)
+++ trunk/sources/HeuristicLab.Selection/3.3/RightSelector.cs	(revision 2805)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -20,42 +20,33 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
-using System.Text;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Selection {
   /// <summary>
-  /// Copies or moves a defined number of sub scopes from a source scope to a target scope, starting at
-  /// the right side of the tree.
+  /// An operator which selects sub-scopes from right to left.
   /// </summary>
-  public class RightSelector : StochasticSelectorBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
-    }
+  [Item("RightSelector", "An operator which selects sub-scopes from right to left.")]
+  [EmptyStorableClass]
+  [Creatable("Test")]
+  public sealed class RightSelector : Selector {
+    public RightSelector() : base() { }
 
-    /// <summary>
-    /// Copies or moves a number of sub scopes (<paramref name="selected"/>) from <paramref name="source"/>
-    /// starting at the right end to the <paramref name="target"/>.
-    /// </summary>
-    /// <param name="random">A random number generator.</param>
-    /// <param name="source">The source scope from which to copy/move the sub scopes.</param>
-    /// <param name="selected">The number of sub scopes to move. Can be also bigger than the total 
-    /// number of sub scopes in <paramref name="source"/>, then the copying process starts again from the 
-    /// beginning.</param>
-    /// <param name="target">The target where to copy/move the sub scopes.</param>
-    /// <param name="copySelected">Boolean flag whether the sub scopes shall be copied or moved.</param>
-    protected override void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected) {
-      int index = source.SubScopes.Count - 1;
-      for (int i = 0; i < selected; i++) {
-        if (copySelected) {
-          target.AddSubScope((IScope)source.SubScopes[index].Clone());
-          index--;
-          if (index < 0) index = source.SubScopes.Count - 1;
+    protected override void Select(ScopeList source, ScopeList target) {
+      int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
+      bool copy = CopySelectedParameter.Value.Value;
+
+      int j = source.Count - 1;
+      for (int i = 0; i < count; i++) {
+        if (copy) {
+          target.Add((IScope)source[j].Clone());
+          j--;
+          if (j < 0) j = source.Count - 1;
         } else {
-          IScope s = source.SubScopes[source.SubScopes.Count - 1];
-          source.RemoveSubScope(s);
-          target.AddSubScope(s);
+          target.Add(source[source.Count - 1]);
+          source.RemoveAt(source.Count - 1);
         }
       }
Index: trunk/sources/HeuristicLab.Selection/3.3/Selector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/Selector.cs	(revision 2805)
+++ trunk/sources/HeuristicLab.Selection/3.3/Selector.cs	(revision 2805)
@@ -0,0 +1,83 @@
+#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.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Selection {
+  /// <summary>
+  /// A base class for selection operators.
+  /// </summary>
+  [Item("Selector", "A base class for selection operators.")]
+  [EmptyStorableClass]
+  public abstract class Selector : SingleSuccessorOperator {
+    protected ValueParameter<BoolData> CopySelectedParameter {
+      get { return (ValueParameter<BoolData>)Parameters["CopySelected"]; }
+    }
+    public ValueLookupParameter<IntData> NumberOfSelectedSubScopesParameter {
+      get { return (ValueLookupParameter<IntData>)Parameters["NumberOfSelectedSubScopes"]; }
+    }
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    public BoolData CopySelected {
+      get { return CopySelectedParameter.Value; }
+      set { CopySelectedParameter.Value = value; }
+    }
+    public IScope CurrentScope {
+      get { return CurrentScopeParameter.ActualValue; }
+    }
+
+    protected Selector()
+      : base() {
+      Parameters.Add(new ValueParameter<BoolData>("CopySelected", "True if the selected sub-scopes should be copied, otherwise false.", new BoolData(false)));
+      Parameters.Add(new ValueLookupParameter<IntData>("NumberOfSelectedSubScopes", "The number of sub-scopes which should be selected."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope from which sub-scopes should be selected."));
+    }
+
+    public sealed override IExecutionSequence Apply() {
+      ScopeList source = new ScopeList(CurrentScope.SubScopes);
+      ScopeList target = new ScopeList();
+
+      Select(source, target);
+
+      CurrentScope.SubScopes.Clear();
+      IScope remaining = new Scope("Remaining");
+      CurrentScope.SubScopes.Add(remaining);
+      IScope selected = new Scope("Selected");
+      CurrentScope.SubScopes.Add(selected);
+
+      for (int i = 0; i < source.Count; i++)
+        remaining.SubScopes.Add(source[i]);
+      for (int i = 0; i < target.Count; i++)
+        selected.SubScopes.Add(target[i]);
+
+      return base.Apply();
+    }
+
+    protected abstract void Select(ScopeList source, ScopeList target);
+  }
+}
Index: trunk/sources/HeuristicLab.Selection/3.3/SelectorBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/SelectorBase.cs	(revision 2803)
+++ 	(revision )
@@ -1,79 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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 System.Collections.Generic;
-using System.Text;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-
-namespace HeuristicLab.Selection {
-  /// <summary>
-  /// Base class for all selectors.
-  /// </summary>
-  public abstract class SelectorBase : OperatorBase {
-    /// <summary>
-    /// Initializes a new instance of <see cref="SelectorBase"/> with one variable infos 
-    /// (<c>CopySelected</c>), which is a local one.
-    /// </summary>
-    public SelectorBase()
-      : base() {
-      AddVariableInfo(new VariableInfo("CopySelected", "Copy or move selected sub-scopes", typeof(BoolData), VariableKind.In));
-      GetVariableInfo("CopySelected").Local = true;
-      AddVariable(new Variable("CopySelected", new BoolData(false)));
-    }
-
-    /// <summary>
-    /// Inserts a new level of sub scopes in the given <paramref name="scope"/> with a scope containing the
-    /// remaining sub scopes and another with the selected ones.
-    /// </summary>
-    /// <remarks>Calls <see cref="Select"/>.</remarks>
-    /// <param name="scope">The scope where to select the sub scopes.</param>
-    /// <returns><c>null</c>.</returns>
-    public override IOperation Apply(IScope scope) {
-      BoolData copySelected = GetVariableValue<BoolData>("CopySelected", scope, true);
-
-      IScope source = new Scope("Remaining");
-      while (scope.SubScopes.Count > 0) {
-        IScope s = scope.SubScopes[0];
-        scope.RemoveSubScope(s);
-        source.AddSubScope(s);
-      }
-      scope.AddSubScope(source);
-      IScope target = new Scope("Selected");
-      scope.AddSubScope(target);
-
-      Select(source, target, copySelected.Data);
-
-      return null;
-    }
-
-    /// <summary>
-    /// Selects sub scopes from the specified <paramref name="source"/> and moves or copies it to the
-    /// specified <paramref name="target"/>.
-    /// </summary>
-    /// <param name="source">The source scope where to select the sub scopes.</param>
-    /// <param name="target">The target where to add the sub scopes.</param>
-    /// <param name="copySelected">Boolean flag whether to copy or move the selected sub scopes.</param>
-    protected abstract void Select(IScope source, IScope target, bool copySelected);
-  }
-}
Index: trunk/sources/HeuristicLab.Selection/3.3/StochasticSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/StochasticSelector.cs	(revision 2805)
+++ trunk/sources/HeuristicLab.Selection/3.3/StochasticSelector.cs	(revision 2805)
@@ -0,0 +1,44 @@
+#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.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Selection {
+  /// <summary>
+  /// A base class for stochastic selection operators.
+  /// </summary>
+  [Item("StochasticSelector", "A base class for stochastic selection operators.")]
+  [EmptyStorableClass]
+  public abstract class StochasticSelector : Selector {
+    public LookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    protected StochasticSelector()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator used for stochastic selection."));
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Selection/3.3/StochasticSelectorBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/StochasticSelectorBase.cs	(revision 2803)
+++ 	(revision )
@@ -1,71 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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 System.Collections.Generic;
-using System.Text;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-
-namespace HeuristicLab.Selection {
-  /// <summary>
-  /// Base class for all selectors that use a random number generator.
-  /// </summary>
-  public abstract class StochasticSelectorBase : SelectorBase {
-    /// <summary>
-    /// Initializes a new instance of <see cref="StochasticSelectorBase"/> with two variable infos
-    /// (<c>Random</c> and <c>Selected</c>).
-    /// </summary>
-    public StochasticSelectorBase()
-      : base() {
-      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
-      AddVariableInfo(new VariableInfo("Selected", "Number of selected sub-scopes", typeof(IntData), VariableKind.In));
-    }
-
-    /// <summary>
-    /// Copies or moves randomly chosen sub scopes from the given <paramref name="source"/> to the specified 
-    /// <paramref name="target"/>.
-    /// </summary>
-    /// <remarks>Calls <see cref="Select(HeuristicLab.Core.IRandom, HeuristicLab.Core.IScope, int,
-    /// HeuristicLab.Core.IScope, bool)"/></remarks>
-    /// <param name="source">The source scope from where to copy/move the sub scopes.</param>
-    /// <param name="target">The target scope where to add the sub scopes.</param>
-    /// <param name="copySelected">Boolean flag whether the sub scopes shall be moved or copied.</param>
-    protected sealed override void Select(IScope source, IScope target, bool copySelected) {
-      IRandom random = GetVariableValue<IRandom>("Random", source, true);
-      IntData selected = GetVariableValue<IntData>("Selected", source, true);
-
-      Select(random, source, selected.Data, target, copySelected);
-    }
-
-    /// <summary>
-    /// Copies or moves randomly chosen sub scopes from the given <paramref name="source"/> to the specified 
-    /// <paramref name="target"/>.
-    /// </summary>
-    /// <param name="random">The random number generator.</param>
-    /// <param name="source">The source scope from where to copy/move the sub scopes.</param>
-    /// <param name="selected">The number of sub scopes to copy/move.</param>
-    /// <param name="target">The target scope where to add the sub scopes.</param>
-    /// <param name="copySelected">Boolean flag whether the sub scopes shall be moved or copied.</param>
-    protected abstract void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected);
-  }
-}
Index: trunk/sources/HeuristicLab.Selection/3.3/StochasticSingleObjectiveSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/StochasticSingleObjectiveSelector.cs	(revision 2805)
+++ trunk/sources/HeuristicLab.Selection/3.3/StochasticSingleObjectiveSelector.cs	(revision 2805)
@@ -0,0 +1,48 @@
+#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.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Selection {
+  /// <summary>
+  /// A base class for stochastic selection operators which consider a single double quality value for selection.
+  /// </summary>
+  [Item("StochasticSingleObjectiveSelector", "A base class for stochastic selection operators which consider a single double quality value for selection.")]
+  [EmptyStorableClass]
+  public abstract class StochasticSingleObjectiveSelector : StochasticSelector {
+    public LookupParameter<BoolData> MaximizationParameter {
+      get { return (LookupParameter<BoolData>)Parameters["Maximization"]; }
+    }
+    public SubScopesLookupParameter<DoubleData> QualityParameter {
+      get { return (SubScopesLookupParameter<DoubleData>)Parameters["Quality"]; }
+    }
+
+    protected StochasticSingleObjectiveSelector()
+      : base() {
+      Parameters.Add(new LookupParameter<BoolData>("Maximization", "True if the current problem is a maximization problem, otherwise false."));
+      Parameters.Add(new SubScopesLookupParameter<DoubleData>("Quality", "The quality value contained in each sub-scope which is used for selection."));
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Selection/3.3/TournamentSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/TournamentSelector.cs	(revision 2803)
+++ trunk/sources/HeuristicLab.Selection/3.3/TournamentSelector.cs	(revision 2805)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -20,68 +20,51 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
-using System.Text;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Selection {
   /// <summary>
-  /// Moves or copies a defined number of the best sub scopes from a source scope to a target scope.
+  /// A tournament selection operator which considers a single double quality value for selection.
   /// </summary>
-  public class TournamentSelector : StochasticSelectorBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
+  [Item("TournamentSelector", "A tournament selection operator which considers a single double quality value for selection.")]
+  [EmptyStorableClass]
+  [Creatable("Test")]
+  public sealed class TournamentSelector : StochasticSingleObjectiveSelector {
+    public ValueLookupParameter<IntData> GroupSizeParameter {
+      get { return (ValueLookupParameter<IntData>)Parameters["GroupSize"]; }
     }
 
-    /// <summary>
-    /// Initializes a new instance of <see cref="TournamentSelector"/> with three variable infos 
-    /// (<c>Maximization</c>, <c>Quality</c> and <c>GroupSize</c>, being a local variable and set to 
-    /// <c>2</c>) with <c>CopySelected</c> set to <c>true</c>.
-    /// </summary>
-    public TournamentSelector() {
-      AddVariableInfo(new VariableInfo("Maximization", "Maximization problem", typeof(BoolData), VariableKind.In));
-      AddVariableInfo(new VariableInfo("Quality", "Quality value", typeof(DoubleData), VariableKind.In));
-      AddVariableInfo(new VariableInfo("GroupSize", "Size of the tournament group", typeof(IntData), VariableKind.In));
-      GetVariableInfo("GroupSize").Local = true;
-      AddVariable(new Variable("GroupSize", new IntData(2)));
-      GetVariable("CopySelected").GetValue<BoolData>().Data = true;
+    public TournamentSelector() : base() {
+      Parameters.Add(new ValueLookupParameter<IntData>("GroupSize", "The size of the tournament group.", new IntData(2)));
     }
 
-    /// <summary>
-    /// Copies or moves the best sub scopes from the given <paramref name="source"/> to the specified
-    /// <paramref name="target"/>.
-    /// </summary>
-    /// <exception cref="InvalidOperationException">Thrown when no source sub scopes are available.</exception>
-    /// <param name="random">The random number generator.</param>
-    /// <param name="source">The source scope from where to copy/move the sub scopes.</param>
-    /// <param name="selected">The number of sub scopes to copy/move.</param>
-    /// <param name="target">The target scope where to add the sub scopes.</param>
-    /// <param name="copySelected">Boolean flag whether the sub scopes shall be moved or copied.</param>
-    protected override void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected) {
-      IVariableInfo qualityInfo = GetVariableInfo("Quality");
-      bool maximization = GetVariableValue<BoolData>("Maximization", source, true).Data;
-      int groupSize = GetVariableValue<IntData>("GroupSize", source, true).Data;
-      for (int i = 0; i < selected; i++) {
-        if (source.SubScopes.Count < 1) throw new InvalidOperationException("No source scopes available to select.");
+    protected override void Select(ScopeList source, ScopeList target) {
+      int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
+      bool copy = CopySelectedParameter.Value.Value;
+      IRandom random = RandomParameter.ActualValue;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      List<DoubleData> qualities = new List<DoubleData>(QualityParameter.ActualValue);
+      int groupSize = GroupSizeParameter.ActualValue.Value;
 
-        IScope selectedScope = source.SubScopes[random.Next(source.SubScopes.Count)];
-        double best = selectedScope.GetVariableValue<DoubleData>(qualityInfo.FormalName, false).Data;
+      for (int i = 0; i < count; i++) {
+        int best = random.Next(source.Count);
+        int index;
         for (int j = 1; j < groupSize; j++) {
-          IScope scope = source.SubScopes[random.Next(source.SubScopes.Count)];
-          double quality = scope.GetVariableValue<DoubleData>(qualityInfo.FormalName, false).Data;
-          if (((maximization) && (quality > best)) ||
-              ((!maximization) && (quality < best))) {
-            best = quality;
-            selectedScope = scope;
+          index = random.Next(source.Count);
+          if (((maximization) && (qualities[index].Value > qualities[best].Value)) ||
+              ((!maximization) && (qualities[index].Value < qualities[best].Value))) {
+            best = index;
           }
         }
 
-        if (copySelected)
-          target.AddSubScope((IScope)selectedScope.Clone());
+        if (copy)
+          target.Add((IScope)source[best].Clone());
         else {
-          source.RemoveSubScope(selectedScope);
-          target.AddSubScope(selectedScope);
+          target.Add(source[best]);
+          source.RemoveAt(best);
+          qualities.RemoveAt(best);
         }
       }
