Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+using HeuristicLab.Problems.Instances.TSPLIB;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public abstract class CordeauFormatInstanceProvider : VRPInstanceProvider<MDCVRPTWData> {
+    protected override MDCVRPTWData LoadData(Stream stream) {
+      return LoadInstance(new CordeauParser(stream));
+    }
+
+    public override MDCVRPTWData LoadData(string path) {
+      return LoadInstance(new CordeauParser(path));
+    }
+
+    private MDCVRPTWData LoadInstance(CordeauParser parser) {
+      parser.Parse();
+
+      var instance = new MDCVRPTWData();
+      instance.Dimension = parser.Cities + 1;
+      instance.Depots = parser.Depots;
+      instance.Coordinates = parser.Coordinates;
+      instance.Capacity = parser.Capacity;
+      instance.Demands = parser.Demands;
+      instance.DistanceMeasure = DistanceMeasure.Euclidean;
+      instance.ReadyTimes = parser.Readytimes;
+      instance.ServiceTimes = parser.Servicetimes;
+      instance.DueTimes = parser.Duetimes;
+      instance.MaximumVehicles = parser.Vehicles;
+
+      int depots = parser.Depots;
+      int vehicles = parser.Vehicles / parser.Depots;
+      instance.VehicleDepotAssignment = new int[depots * vehicles];
+      int index = 0;
+
+      for (int i = 0; i < depots; i++)
+        for (int j = 0; j < vehicles; j++) {
+          instance.VehicleDepotAssignment[index] = i;
+          index++;
+        }
+
+      instance.Name = parser.ProblemName;
+
+      return instance;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public class CordeauInstanceProvider : CordeauFormatInstanceProvider {
+    public override string Name {
+      get { return "Cordeau (MDCVRPTW)"; }
+    }
+
+    public override string Description {
+      get { return "Cordeau test set"; }
+    }
+    
+    public override Uri WebLink {
+      get { return new Uri(@"http://neo.lcc.uma.es/radi-aeb/WebVRP/"); }
+    }
+
+    public override string ReferencePublication {
+      get { return null; }
+    }
+
+    protected override string FileName {
+      get { return "Cordeau"; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauParser.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauParser.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauParser.cs	(revision 7898)
@@ -0,0 +1,232 @@
+﻿#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.Collections.Generic;
+using System.IO;
+using System.Text.RegularExpressions;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  class CordeauParser {
+    private string file;
+    private Stream stream;
+    private string problemName;
+    private int cities;
+    private int depots;
+    private int vehicles;
+    private List<double> capacity;
+    private List<double> xCoord;
+    private List<double> yCoord;
+    private List<double> demand;
+    private List<double> readyTime;
+    private List<double> dueTime;
+    private List<double> serviceTime;
+
+    public int Cities {
+      get {
+        return cities;
+      }
+    }
+
+    public int Depots {
+      get {
+        return depots;
+      }
+    }
+
+    public int Vehicles {
+      get {
+        return vehicles;
+      }
+    }
+
+    public double[] Capacity {
+      get {
+        return capacity.ToArray();
+      }
+    }
+
+    public double[,] Coordinates {
+      get {
+        double[] x = xCoord.ToArray();
+        double[] y = yCoord.ToArray();
+        double[,] coord = new double[x.Length, 2];
+        for (int i = 0; i < x.Length; i++) {
+          coord[i, 0] = x[i];
+          coord[i, 1] = y[i];
+        }
+        return coord;
+      }
+    }
+
+    public double[] Demands {
+      get {
+        return demand.ToArray();
+      }
+    }
+
+    public double[] Readytimes {
+      get {
+        return readyTime.ToArray();
+      }
+    }
+
+    public double[] Duetimes {
+      get {
+        return dueTime.ToArray();
+      }
+    }
+
+    public double[] Servicetimes {
+      get {
+        return serviceTime.ToArray();
+      }
+    }
+
+    public String ProblemName {
+      get {
+        return problemName;
+      }
+    }
+
+    public CordeauParser() {
+      capacity = new List<double>();
+      xCoord = new List<double>();
+      yCoord = new List<double>();
+      demand = new List<double>();
+      readyTime = new List<double>();
+      dueTime = new List<double>();
+      serviceTime = new List<double>();
+    }
+
+     public CordeauParser(string file): this() {
+      this.file = file;
+    }
+
+     public CordeauParser(Stream stream)
+       : this() {
+      this.stream = stream;
+    }
+
+     public void Parse() {
+       string line;
+       Regex reg = new Regex(@"-?\d+(\.\d+)?");
+       MatchCollection m;
+
+       StreamReader reader;
+       if (stream != null) {
+         reader = new StreamReader(stream);
+       } else {
+         reader = new StreamReader(file);
+         problemName = Path.GetFileNameWithoutExtension(file);
+       }
+
+       using (reader) {
+         List<double> depotXcoord = new List<double>();
+         List<double> depotYcoord = new List<double>();
+         List<double> depotReadyTime = new List<double>();
+         List<double> depotDueTime = new List<double>();
+         
+         List<double> routeDueTime = new List<double>();
+
+         line = reader.ReadLine();
+
+         m = reg.Matches(line);
+         if (m.Count != 4)
+           throw new InvalidDataException("File has wrong format!");
+
+         int type = int.Parse(m[0].Value);
+         if(type != 2 && type != 6)
+           throw new InvalidDataException("Unsupported instance type");
+
+         bool timeWindows = type == 6;
+         vehicles = int.Parse(m[1].Value);
+         cities = int.Parse(m[2].Value);
+         depots = int.Parse(m[3].Value);
+         line = reader.ReadLine();
+
+         for (int i = 0; i < depots; i++) {
+           m = reg.Matches(line);
+           if (m.Count != 2) { continue; }
+
+           routeDueTime.Add(double.Parse(m[0].Value, System.Globalization.CultureInfo.InvariantCulture));
+           capacity.Add(double.Parse(m[1].Value, System.Globalization.CultureInfo.InvariantCulture));
+
+           line = reader.ReadLine();
+         }
+
+         while ((line != null)) {
+           m = reg.Matches(line);
+
+           if (demand.Count < cities) {
+             xCoord.Add(double.Parse(m[1].Value, System.Globalization.CultureInfo.InvariantCulture));
+             yCoord.Add(double.Parse(m[2].Value, System.Globalization.CultureInfo.InvariantCulture));
+             demand.Add((double)int.Parse(m[4].Value, System.Globalization.CultureInfo.InvariantCulture));
+             serviceTime.Add(int.Parse(m[3].Value));
+
+             if (timeWindows) {
+               readyTime.Add(int.Parse(m[m.Count - 2].Value));
+               dueTime.Add(int.Parse(m[m.Count - 1].Value));
+             } else {
+               readyTime.Add(0);
+               dueTime.Add(double.MaxValue);
+             }
+           } else {
+             depotXcoord.Add(double.Parse(m[1].Value, System.Globalization.CultureInfo.InvariantCulture));
+             depotYcoord.Add(double.Parse(m[2].Value, System.Globalization.CultureInfo.InvariantCulture));
+
+             if (timeWindows) {
+               depotReadyTime.Add(int.Parse(m[m.Count - 2].Value));
+               depotDueTime.Add(int.Parse(m[m.Count - 1].Value));
+             } else {
+               depotReadyTime.Add(0);
+               depotDueTime.Add(double.MaxValue);
+             }
+           }
+
+           line = reader.ReadLine();
+         }
+
+         for (int i = 0; i < depotDueTime.Count; i++) {
+           if (!timeWindows) {
+             depotDueTime[i] = routeDueTime[i];
+           }
+           if (depotDueTime[i] < double.Epsilon)
+             depotDueTime[i] = double.MaxValue;
+         }
+
+         xCoord.InsertRange(0, depotXcoord);
+         yCoord.InsertRange(0, depotYcoord);
+         readyTime.InsertRange(0, depotReadyTime);
+         dueTime.InsertRange(0, depotDueTime);
+
+         List<double> originalCapacities = new List<double>(capacity);
+         capacity.Clear();
+         for (int i = 0; i < depots; i++) {
+           for (int j = 0; j < vehicles; j++) {
+             capacity.Add(originalCapacities[i]);
+           }
+         }
+         vehicles *= depots;
+       }
+     }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/ChristofidesInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/ChristofidesInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/ChristofidesInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public class ChristofidesInstanceProvider : GoldenFormatInstanceProvider {
+    public override string Name {
+      get { return "Christofides (DCVRP)"; }
+    }
+
+    public override string Description {
+      get { return "Christofides test set"; }
+    }
+    
+    public override Uri WebLink {
+      get { return new Uri(@"http://www.rhsmith.umd.edu/faculty/bgolden/vrp_data.htm"); }
+    }
+
+    public override string ReferencePublication {
+      get { return null; }
+    }
+
+    protected override string FileName {
+      get { return "Christofides"; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenFormatInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenFormatInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenFormatInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,82 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+using HeuristicLab.Problems.Instances.TSPLIB;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public abstract class GoldenFormatInstanceProvider : VRPInstanceProvider<CVRPTWData> {
+    protected override CVRPTWData LoadData(Stream stream) {
+      return LoadInstance(new GoldenParser(stream));
+    }
+
+    public override CVRPTWData LoadData(string path) {
+      return LoadInstance(new GoldenParser(path));
+    }
+
+    private CVRPTWData LoadInstance(GoldenParser parser) {
+      parser.Parse();
+
+      var instance = new CVRPTWData();
+      instance.Dimension = parser.Vertices.GetLength(0) + 1;
+      instance.Coordinates = parser.Vertices;
+      instance.Capacity = parser.Capacity;
+      instance.Demands = parser.Demands;
+      switch (parser.WeightType) {
+        case GoldenParser.GoldenEdgeWeightType.EUC_2D:
+          instance.DistanceMeasure = DistanceMeasure.Euclidean; break;
+        case GoldenParser.GoldenEdgeWeightType.GEO:
+          instance.DistanceMeasure = DistanceMeasure.Geo; break;
+        default:
+          throw new InvalidDataException("The given edge weight is not supported by HeuristicLab.");
+      }
+
+      instance.ReadyTimes = new double[instance.Dimension];
+      instance.ServiceTimes = new double[instance.Dimension];
+      instance.DueTimes = new double[instance.Dimension];
+
+      for (int i = 0; i < instance.Dimension; i++) {
+        instance.ReadyTimes[i] = 0;
+        instance.ServiceTimes[i] = 0;
+        instance.DueTimes[i] = double.MaxValue;
+      }
+
+      if(parser.Distance > 0)
+        instance.DueTimes[0] = parser.Distance;
+
+      if (parser.Vehicles > 0)
+        instance.MaximumVehicles = parser.Vehicles;
+
+      instance.Name = parser.ProblemName;
+      instance.Description = parser.Comment
+        + Environment.NewLine + Environment.NewLine
+        + GetInstanceDescription();
+
+      return instance;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public class GoldenInstanceProvider : GoldenFormatInstanceProvider {
+    public override string Name {
+      get { return "Golden (DCVRP)"; }
+    }
+
+    public override string Description {
+      get { return "Golden test set"; }
+    }
+    
+    public override Uri WebLink {
+      get { return new Uri(@"http://www.rhsmith.umd.edu/faculty/bgolden/vrp_data.htm"); }
+    }
+
+    public override string ReferencePublication {
+      get { return null; }
+    }
+
+    protected override string FileName {
+      get { return "Golden"; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenParser.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenParser.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenParser.cs	(revision 7898)
@@ -0,0 +1,377 @@
+#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.Problems.Instances.VehicleRouting {
+  public class GoldenParser {
+    private string file;
+    private Stream stream;
+    private string problemName;
+    
+    #region Inner Enum TSPLIBEdgeWeightType
+    public enum GoldenEdgeWeightType {
+      UNDEFINED,
+      EUC_2D,
+      GEO
+    }
+    #endregion
+
+    private const int EOF = 0;
+    private const int NAME = 1;
+    private const int TYPE = 2;
+    private const int COMMENT = 3;
+    private const int DIM = 4;
+    private const int WEIGHTTYPE = 5;
+    private const int WEIGHTFORMAT = 11;
+    private const int NODETYPE = 6;
+    private const int NODESECTION = 7;
+    private const int CAPACITY = 8;
+    private const int DISTANCE = 12;
+    private const int VEHICLES = 13;
+    private const int DEPOTSECTION = 9;
+    private const int DEMANDSECTION = 10;
+
+    private string comment;
+    /// <summary>
+    /// Gets the comment of the parsed VRP.
+    /// </summary>
+    public string Comment {
+      get { return comment; }
+    }
+    private double[,] vertices;
+    /// <summary>
+    /// Gets the vertices of the parsed VRP.
+    /// </summary>
+    public double[,] Vertices {
+      get { return vertices; }
+    }
+    private GoldenEdgeWeightType weightType;
+    /// <summary>
+    /// Gets the weight format of the parsed VRP.
+    /// </summary>
+    public GoldenEdgeWeightType WeightType {
+      get { return weightType; }
+    }
+
+    private double capacity;
+    public double Capacity {
+      get {
+        return capacity;
+      }
+    }
+
+    private int vehicles;
+    public int Vehicles {
+      get {
+        return vehicles;
+      }
+    }
+
+    private double distance;
+    public double Distance {
+      get {
+        return distance;
+      }
+    }
+
+    private double[] demands;
+    public double[] Demands {
+      get {
+        return demands;
+      }
+    }
+
+    public String ProblemName {
+      get {
+        return problemName;
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="TSPLIBParser"/> with the given <paramref name="path"/>.
+    /// </summary>
+    /// <exception cref="ArgumentException">Thrown if the input file is not a TSPLIB TSP file (*.vrp)
+    /// </exception>
+    /// <param name="path">The path where the VRP is stored.</param>
+    public GoldenParser() {
+      comment = string.Empty;
+      vertices = null;
+      weightType = GoldenEdgeWeightType.UNDEFINED;
+      capacity = -1;
+      vehicles = -1;
+      distance = -1;
+      demands = null;
+    }
+
+    public GoldenParser(string file): this() {
+      this.file = file;
+    }
+
+    public GoldenParser(Stream stream)
+       : this() {
+      this.stream = stream;
+    }
+
+    /// <summary>
+    /// Reads the TSPLIB VRP file and parses the elements.
+    /// </summary>
+    /// <exception cref="InvalidDataException">Thrown if the file has an invalid format or contains invalid data.</exception>
+    public void Parse() {
+      StreamReader reader;
+      if (stream != null) {
+        reader = new StreamReader(stream);
+      } else {
+        reader = new StreamReader(file);
+        problemName = Path.GetFileNameWithoutExtension(file);
+      }
+
+      using (reader) {
+        int section = -1;
+        string str = null;
+        bool weightFormatIsChecked = false;
+
+        do {
+          str = reader.ReadLine();
+          section = GetSection(str);
+
+          if (section != -1) {
+            switch (section) {
+              case NAME:
+                ReadName(str);
+                break;
+              case TYPE:
+                CheckType(str);
+                break;
+              case COMMENT:
+                ReadComment(str);
+                break;
+              case DIM:
+                InitArrays(str);
+                break;
+              case WEIGHTTYPE:
+                ReadWeightType(str);
+                break;
+              case WEIGHTFORMAT:
+                ReadWeightFormat(str);
+                weightFormatIsChecked = true;
+                break;
+              case NODETYPE:
+                CheckNodeType(str);
+                break;
+              case NODESECTION:
+                ReadVertices(reader);
+                break;
+              case CAPACITY:
+                ReadCapacity(str);
+                break;
+              case VEHICLES:
+                ReadVehicles(str);
+                break;
+              case DISTANCE:
+                ReadDistance(str);
+                break;
+              case DEPOTSECTION:
+                ReadDepot(reader);
+                break;
+              case DEMANDSECTION:
+                ReadDemands(reader);
+                break;
+            }
+          }
+        } while (!((section == EOF) || (str == null)));
+
+        if (!weightFormatIsChecked || weightType == GoldenEdgeWeightType.UNDEFINED)
+          throw new InvalidDataException("Input file does not contain format or edge weight format information.");
+      }
+    }
+
+    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("comment", StringComparison.OrdinalIgnoreCase))
+        return COMMENT;
+      if (token.Equals("dimension", StringComparison.OrdinalIgnoreCase))
+        return DIM;
+      if (token.Equals("edge_weight_type", StringComparison.OrdinalIgnoreCase))
+        return WEIGHTTYPE;
+      if (token.Equals("edge_weight_format", StringComparison.OrdinalIgnoreCase))
+        return WEIGHTFORMAT;
+      if (token.Equals("node_coord_type", StringComparison.OrdinalIgnoreCase))
+        return NODETYPE;
+      if (token.Equals("node_coord_section", StringComparison.OrdinalIgnoreCase))
+        return NODESECTION;
+      if (token.Equals("capacity", StringComparison.OrdinalIgnoreCase))
+        return CAPACITY;
+      if (token.Equals("vehicles", StringComparison.OrdinalIgnoreCase))
+        return VEHICLES;
+      if (token.Equals("distance", StringComparison.OrdinalIgnoreCase))
+        return DISTANCE;
+      if (token.Equals("depot_section", StringComparison.OrdinalIgnoreCase))
+        return DEPOTSECTION;
+      if (token.Equals("demand_section", StringComparison.OrdinalIgnoreCase))
+        return DEMANDSECTION;
+
+      return -1;
+    }
+
+    private void ReadName(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      problemName = 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("cvrp", StringComparison.OrdinalIgnoreCase))
+        throw new InvalidDataException("Input file format is not \"CVRP\"");
+    }
+
+    private void ReadComment(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      comment = tokens[tokens.Length - 1].Trim();
+    }
+
+    private void InitArrays(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string dimension = tokens[tokens.Length - 1].Trim();
+
+      int dim = Int32.Parse(dimension);
+      vertices = new double[dim, 2];
+      demands = new double[dim];
+    }
+
+    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))
+        weightType = GoldenEdgeWeightType.EUC_2D;
+      else if (type.Equals("geo", StringComparison.OrdinalIgnoreCase))
+        weightType = GoldenEdgeWeightType.GEO;
+      else if (type.Equals("function", StringComparison.OrdinalIgnoreCase)) {
+        weightType = GoldenEdgeWeightType.UNDEFINED;
+      } else
+        throw new InvalidDataException("Input file contains an unsupported edge weight format (only \"EUC_2D\" and \"GEO\" are supported).");
+    }
+
+    private void ReadWeightFormat(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      string format = tokens[tokens.Length - 1].Trim();
+
+      if (format.Equals("euc_2d", StringComparison.OrdinalIgnoreCase))
+        weightType = GoldenEdgeWeightType.EUC_2D;
+      else if (format.Equals("geo", StringComparison.OrdinalIgnoreCase))
+        weightType = GoldenEdgeWeightType.GEO;
+      else
+        throw new InvalidDataException("Input file contains an unsupported edge weight format.");
+    }
+
+    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("Input file contains an unsupported node coordinates format (only \"TWOD_COORDS\" is supported).");
+    }
+
+    private void ReadVertices(StreamReader reader) {
+      if (vertices == null)
+        throw new InvalidDataException("Input file does not contain dimension information.");
+
+      for (int i = 1; i < (vertices.Length / 2); i++) {
+        string str = reader.ReadLine();
+        string[] tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+        if (tokens.Length != 3)
+          throw new InvalidDataException("Input file contains invalid node coordinates.");
+
+        vertices[i, 0] = double.Parse(tokens[1], System.Globalization.CultureInfo.InvariantCulture);
+        vertices[i, 1] = double.Parse(tokens[2], System.Globalization.CultureInfo.InvariantCulture);
+      }
+    }
+
+    private void ReadCapacity(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      capacity = double.Parse(tokens[tokens.Length - 1].Trim(), System.Globalization.CultureInfo.InvariantCulture);
+    }
+
+    private void ReadVehicles(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      vehicles = int.Parse(tokens[tokens.Length - 1].Trim());
+    }
+
+    private void ReadDistance(string str) {
+      string[] tokens = str.Split(new string[] { ":" }, StringSplitOptions.None);
+      distance = double.Parse(tokens[tokens.Length - 1].Trim(), System.Globalization.CultureInfo.InvariantCulture);
+    }
+
+    private void ReadDepot(StreamReader reader) {
+      string[] tokens;
+      do {
+        string str = reader.ReadLine();
+        tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+        if (tokens.Length == 2) {
+          vertices[0, 0] = double.Parse(tokens[0], System.Globalization.CultureInfo.InvariantCulture);
+          vertices[0, 1] = double.Parse(tokens[1], System.Globalization.CultureInfo.InvariantCulture);
+        }
+      } while (tokens.Length == 2);
+    }
+
+    private void ReadDemands(StreamReader reader) {
+      if (demands == null)
+        throw new InvalidDataException("Input file does not contain dimension information.");
+
+      for (int i = 0; i < demands.Length; i++) {
+        if (i != 0) {
+          string str = reader.ReadLine();
+          string[] tokens = str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+          if (tokens.Length != 2)
+            throw new InvalidDataException("Input file contains invalid demands.");
+
+          int index = int.Parse(tokens[0]);
+          double value = double.Parse(tokens[1]);
+
+          demands[index] = value;
+        } else {
+          demands[0] = 0;
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/KytojokiInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/KytojokiInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/KytojokiInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public class KytojokiInstanceProvider : GoldenFormatInstanceProvider {
+    public override string Name {
+      get { return "Kytojoki (DCVRP)"; }
+    }
+
+    public override string Description {
+      get { return "Kytojoki test set"; }
+    }
+    
+    public override Uri WebLink {
+      get { return new Uri(@"http://www.rhsmith.umd.edu/faculty/bgolden/vrp_data.htm"); }
+    }
+
+    public override string ReferencePublication {
+      get { return null; }
+    }
+
+    protected override string FileName {
+      get { return "Kytojoki"; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/HeuristicLab.Problems.Instances.VehicleRouting-3.4.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/HeuristicLab.Problems.Instances.VehicleRouting-3.4.csproj	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/HeuristicLab.Problems.Instances.VehicleRouting-3.4.csproj	(revision 7898)
@@ -0,0 +1,197 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{CE0F99D6-1C56-48A9-9B68-3E5B833703EF}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.Instances.VehicleRouting</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.Instances.VehicleRouting-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\bin\HeuristicLab.Problems.Instances.VehicleRouting-3.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\bin\HeuristicLab.Problems.Instances.VehicleRouting-3.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\bin\HeuristicLab.Problems.Instances.VehicleRouting-3.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\bin\HeuristicLab.Problems.Instances.VehicleRouting-3.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+      <EmbedInteropTypes>False</EmbedInteropTypes>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+      <EmbedInteropTypes>False</EmbedInteropTypes>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
+      <EmbedInteropTypes>False</EmbedInteropTypes>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances.TSPLIB-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+      <EmbedInteropTypes>False</EmbedInteropTypes>
+    </Reference>
+    <Reference Include="ICSharpCode.SharpZipLib">
+      <HintPath>..\..\..\..\trunk\sources\bin\ICSharpCode.SharpZipLib.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="GoldenFormat\ChristofidesInstanceProvider.cs" />
+    <Compile Include="GoldenFormat\KytojokiInstanceProvider.cs" />
+    <Compile Include="GoldenFormat\GoldenInstanceProvider.cs" />
+    <Compile Include="GoldenFormat\GoldenParser.cs" />
+    <Compile Include="GoldenFormat\GoldenFormatInstanceProvider.cs" />
+    <Compile Include="TaillardFormat\TaillardInstanceProvider.cs" />
+    <Compile Include="TaillardFormat\TaillardParser.cs" />
+    <Compile Include="TaillardFormat\TaillardFormatInstanceProvider.cs" />
+    <Compile Include="TSPLibFormat\AugeratInstanceProvider.cs" />
+    <Compile Include="TSPLibFormat\ChristofidesEilonInstanceProvider.cs" />
+    <Compile Include="CordeauFormat\CordeauInstanceProvider.cs" />
+    <Compile Include="CordeauFormat\CordeauFormatInstanceProvider.cs" />
+    <Compile Include="LiLimFormat\LiLimInstanceProvider.cs" />
+    <Compile Include="LiLimFormat\LiLimFormatInstanceProvider.cs" />
+    <Compile Include="SolomonFormat\HombergerInstanceProvider.cs" />
+    <Compile Include="LiLimFormat\LiLimParser.cs" />
+    <Compile Include="CordeauFormat\CordeauParser.cs" />
+    <Compile Include="SolomonFormat\SolomonInstanceProvider.cs" />
+    <Compile Include="SolomonFormat\SolomonFormatInstanceProvider.cs" />
+    <Compile Include="SolomonFormat\SolomonParser.cs" />
+    <Compile Include="TSPLibFormat\TSPLibFormatInstanceProvider.cs" />
+    <Compile Include="VRPInstanceProvider.cs" />
+    <Compile Include="VRPDataDescriptor.cs" />
+    <EmbeddedResource Include="Data\Augerat.opt.zip" />
+    <EmbeddedResource Include="Data\Augerat.zip" />
+    <EmbeddedResource Include="Data\ChristofidesEilon.opt.zip" />
+    <EmbeddedResource Include="Data\ChristofidesEilon.zip" />
+    <EmbeddedResource Include="Data\Solomon.zip" />
+    <EmbeddedResource Include="Data\Homberger.zip" />
+    <EmbeddedResource Include="Data\LiLim.zip" />
+    <EmbeddedResource Include="Data\Cordeau.zip" />
+    <EmbeddedResource Include="Data\Golden.zip" />
+    <EmbeddedResource Include="Data\Christofides.zip" />
+    <EmbeddedResource Include="Data\Kytojoki.zip" />
+    <EmbeddedResource Include="Data\Taillard.opt.zip" />
+    <EmbeddedResource Include="Data\Taillard.zip" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimFormatInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimFormatInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimFormatInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+using HeuristicLab.Problems.Instances.TSPLIB;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public abstract class LiLimFormatInstanceProvider : VRPInstanceProvider<PDPTWData> {
+    protected override PDPTWData LoadData(Stream stream) {
+      return LoadInstance(new LiLimParser(stream));
+    }
+
+    public override PDPTWData LoadData(string path) {
+      return LoadInstance(new LiLimParser(path));
+    }
+
+    private PDPTWData LoadInstance(LiLimParser parser) {
+      parser.Parse();
+
+      var instance = new PDPTWData();
+
+      instance.Dimension = parser.Cities + 1;
+      instance.Coordinates = parser.Coordinates;
+      instance.Capacity = parser.Capacity;
+      instance.Demands = parser.Demands;
+      instance.DistanceMeasure = DistanceMeasure.Euclidean;
+      instance.ReadyTimes = parser.Readytimes;
+      instance.ServiceTimes = parser.Servicetimes;
+      instance.DueTimes = parser.Duetimes;
+      instance.MaximumVehicles = parser.Vehicles;
+      instance.PickupDeliveryLocations = parser.PickupDeliveryLocations;
+
+      instance.Name = parser.ProblemName;
+
+      return instance;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public class LiLimInstanceProvider : LiLimFormatInstanceProvider {
+    public override string Name {
+      get { return "LiLim (PDPTW)"; }
+    }
+
+    public override string Description {
+      get { return "LiLim test set"; }
+    }
+    
+    public override Uri WebLink {
+      get { return new Uri(@"http://www.sintef.no/Projectweb/TOP/Problems/PDPTW/Li--Lim-benchmark/"); }
+    }
+
+    public override string ReferencePublication {
+      get { return null; }
+    }
+
+    protected override string FileName {
+      get { return "LiLim"; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimParser.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimParser.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimParser.cs	(revision 7898)
@@ -0,0 +1,175 @@
+﻿#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.Collections.Generic;
+using System.IO;
+using System.Text.RegularExpressions;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  class LiLimParser {
+    private string file;
+    private Stream stream;
+    private string problemName;
+    private int cities;
+    private int vehicles;
+    private double capacity;
+    private List<double> xCoord;
+    private List<double> yCoord;
+    private List<double> demand;
+    private List<double> readyTime;
+    private List<double> dueTime;
+    private List<double> serviceTime;
+    private List<int> pickipDeliveryLocation;
+
+    public int Cities {
+      get {
+        return cities;
+      }
+    }
+
+    public int Vehicles {
+      get {
+        return vehicles;
+      }
+    }
+
+    public double Capacity {
+      get {
+        return capacity;
+      }
+    }
+
+    public double[,] Coordinates {
+      get {
+        double[] x = xCoord.ToArray();
+        double[] y = yCoord.ToArray();
+        double[,] coord = new double[x.Length, 2];
+        for (int i = 0; i < x.Length; i++) {
+          coord[i, 0] = x[i];
+          coord[i, 1] = y[i];
+        }
+        return coord;
+      }
+    }
+
+    public double[] Demands {
+      get {
+        return demand.ToArray();
+      }
+    }
+
+    public double[] Readytimes {
+      get {
+        return readyTime.ToArray();
+      }
+    }
+
+    public double[] Duetimes {
+      get {
+        return dueTime.ToArray();
+      }
+    }
+
+    public double[] Servicetimes {
+      get {
+        return serviceTime.ToArray();
+      }
+    }
+
+    public int[] PickupDeliveryLocations {
+      get {
+        return pickipDeliveryLocation.ToArray();
+      }
+    }
+
+    public String ProblemName {
+      get {
+        return problemName;
+      }
+    }
+
+    public LiLimParser() {
+      xCoord = new List<double>();
+      yCoord = new List<double>();
+      demand = new List<double>();
+      readyTime = new List<double>();
+      dueTime = new List<double>();
+      serviceTime = new List<double>();
+      pickipDeliveryLocation = new List<int>();
+    }
+
+     public LiLimParser(string file): this() {
+      this.file = file;
+    }
+
+     public LiLimParser(Stream stream): this() {
+      this.stream = stream;
+    }
+
+     public void Parse() {
+       string line;
+       Regex reg = new Regex(@"-?\d+");
+       MatchCollection m;
+
+       StreamReader reader;
+       if (stream != null) {
+         reader = new StreamReader(stream);   
+       }
+       else {
+         reader = new StreamReader(file);
+         problemName = Path.GetFileNameWithoutExtension(file);
+       }
+
+       using (reader) {
+         line = reader.ReadLine();
+
+         m = reg.Matches(line);
+         if (m.Count != 3)
+           throw new InvalidDataException("File has wrong format!");
+
+         vehicles = int.Parse(m[0].Value);
+         capacity = double.Parse(m[1].Value);
+
+         line = reader.ReadLine();
+         while ((line != null) && (line.Length > 5)) {
+           m = reg.Matches(line);
+           if (m.Count != 9) { continue; }
+           xCoord.Add((double)int.Parse(m[1].Value));
+           yCoord.Add((double)int.Parse(m[2].Value));
+           demand.Add((double)int.Parse(m[3].Value));
+           readyTime.Add((double)int.Parse(m[4].Value));
+           double st = (double)int.Parse(m[6].Value);
+           dueTime.Add((double)int.Parse(m[5].Value));
+           serviceTime.Add(st);
+
+           int location = int.Parse(m[7].Value);
+           if (location == 0)
+             location = int.Parse(m[8].Value);
+           pickipDeliveryLocation.Add(location);
+
+           line = reader.ReadLine();
+         }
+         cities = serviceTime.Count;
+       }
+     }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/Plugin.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/Plugin.cs.frame	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/Plugin.cs.frame	(revision 7898)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  [Plugin("HeuristicLab.Problems.Instances.VehicleRouting", "3.4.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.Instances.VehicleRouting-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances.TSPLIB", "3.3")]
+  public class HeuristicLabProblemsInstancesVehicleRoutingPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/Properties/AssemblyInfo.cs.frame	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/Properties/AssemblyInfo.cs.frame	(revision 7898)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.Instances.VehicleRouting")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("58BA2315-C550-44DF-ACAE-E1323626F2E6")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.0.$WCREV$")]
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/HombergerInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/HombergerInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/HombergerInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public class HombergerInstanceProvider : SolomonFormatInstanceProvider {
+    public override string Name {
+      get { return "Homberger (CVRPTW)"; }
+    }
+
+    public override string Description {
+      get { return "Homberger test set"; }
+    }
+    
+    public override Uri WebLink {
+      get { return new Uri(@"http://www.fernuni-hagen.de/WINF/touren/inhalte/probinst.htm"); }
+    }
+
+    public override string ReferencePublication {
+      get { return null; }
+    }
+
+    protected override string FileName {
+      get { return "Homberger"; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonFormatInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonFormatInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonFormatInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+using HeuristicLab.Problems.Instances.TSPLIB;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public abstract class SolomonFormatInstanceProvider : VRPInstanceProvider<CVRPTWData> {
+    protected override CVRPTWData LoadData(Stream stream) {
+      return LoadInstance(new SolomonParser(stream));
+    }
+
+    public override CVRPTWData LoadData(string path) {
+      return LoadInstance(new SolomonParser(path));
+    }
+
+    private CVRPTWData LoadInstance(SolomonParser parser) {
+      parser.Parse();
+
+      var instance = new CVRPTWData();
+
+      instance.Dimension = parser.Cities + 1;
+      instance.Coordinates = parser.Coordinates;
+      instance.Capacity = parser.Capacity;
+      instance.Demands = parser.Demands;
+      instance.DistanceMeasure = DistanceMeasure.Euclidean;
+      instance.ReadyTimes = parser.Readytimes;
+      instance.ServiceTimes = parser.Servicetimes;
+      instance.DueTimes = parser.Duetimes;
+      instance.MaximumVehicles = parser.Vehicles;
+
+      instance.Name = parser.ProblemName;
+
+      return instance;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public class SolomonInstanceProvider : SolomonFormatInstanceProvider {
+    public override string Name {
+      get { return "Solomon (CVRPTW)"; }
+    }
+
+    public override string Description {
+      get { return "Solomon test set"; }
+    }
+    
+    public override Uri WebLink {
+      get { return new Uri(@"http://web.cba.neu.edu/~msolomon/problems.htm"); }
+    }
+
+    public override string ReferencePublication {
+      get { return null; }
+    }
+
+    protected override string FileName {
+      get { return "Solomon"; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonParser.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonParser.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonParser.cs	(revision 7898)
@@ -0,0 +1,166 @@
+﻿#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.Collections.Generic;
+using System.IO;
+using System.Text.RegularExpressions;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  class SolomonParser {
+    private string file;
+    private Stream stream;
+    private string problemName;
+    private int cities;
+    private int vehicles;
+    private double capacity;
+    private List<double> xCoord;
+    private List<double> yCoord;
+    private List<double> demand;
+    private List<double> readyTime;
+    private List<double> dueTime;
+    private List<double> serviceTime;
+
+    public int Cities {
+      get {
+        return cities;
+      }
+    }
+
+    public int Vehicles {
+      get {
+        return vehicles;
+      }
+    }
+
+    public double Capacity {
+      get {
+        return capacity;
+      }
+    }
+
+    public double[,] Coordinates {
+      get {
+        double[] x = xCoord.ToArray();
+        double[] y = yCoord.ToArray();
+        double[,] coord = new double[x.Length, 2];
+        for (int i = 0; i < x.Length; i++) {
+          coord[i, 0] = x[i];
+          coord[i, 1] = y[i];
+        }
+        return coord;
+      }
+    }
+
+    public double[] Demands {
+      get {
+        return demand.ToArray();
+      }
+    }
+
+    public double[] Readytimes {
+      get {
+        return readyTime.ToArray();
+      }
+    }
+
+    public double[] Duetimes {
+      get {
+        return dueTime.ToArray();
+      }
+    }
+
+    public double[] Servicetimes {
+      get {
+        return serviceTime.ToArray();
+      }
+    }
+
+    public String ProblemName {
+      get {
+        return problemName;
+      }
+    }
+
+    public SolomonParser() {
+      xCoord = new List<double>();
+      yCoord = new List<double>();
+      demand = new List<double>();
+      readyTime = new List<double>();
+      dueTime = new List<double>();
+      serviceTime = new List<double>();
+    }
+
+    public SolomonParser(string file): this() {
+      this.file = file;
+    }
+
+    public SolomonParser(Stream stream): this() {
+      this.stream = stream;
+    }
+
+    public void Parse() {
+      string line;
+      Regex reg = new Regex(@"-?\d+");
+      MatchCollection m;
+
+      StreamReader reader;
+      if (stream != null)
+        reader = new StreamReader(stream);
+      else
+        reader = new StreamReader(file);
+
+      using (reader) {
+        problemName = reader.ReadLine();
+        for (int i = 0; i < 3; i++) {
+          reader.ReadLine();
+        }
+        line = reader.ReadLine();
+
+        m = reg.Matches(line);
+        if (m.Count != 2)
+          throw new InvalidDataException("File has wrong format!");
+
+        vehicles = int.Parse(m[0].Value);
+        capacity = double.Parse(m[1].Value);
+
+        for (int i = 0; i < 4; i++) {
+          reader.ReadLine();
+        }
+
+        line = reader.ReadLine();
+        while ((line != null) && (line.Length > 5)) {
+          m = reg.Matches(line);
+          if (m.Count != 7) { continue; }
+          xCoord.Add((double)int.Parse(m[1].Value));
+          yCoord.Add((double)int.Parse(m[2].Value));
+          demand.Add((double)int.Parse(m[3].Value));
+          readyTime.Add((double)int.Parse(m[4].Value));
+          double st = (double)int.Parse(m[6].Value);
+          dueTime.Add((double)int.Parse(m[5].Value));
+          serviceTime.Add(st);
+          line = reader.ReadLine();
+        }
+        cities = serviceTime.Count;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/AugeratInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/AugeratInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/AugeratInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public class AugeratInstanceProvider : TSPLibFormatInstanceProvider {
+    public override string Name {
+      get { return "Augerat (CVRP)"; }
+    }
+
+    public override string Description {
+      get { return "Augerat test set"; }
+    }
+    
+    public override Uri WebLink {
+      get { return new Uri(@"http://www.branchandcut.org/VRP/data"); }
+    }
+
+    public override string ReferencePublication {
+      get { return null; }
+    }
+
+    protected override string FileName {
+      get { return "Augerat"; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/ChristofidesEilonInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/ChristofidesEilonInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/ChristofidesEilonInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public class ChristofidesEilonInstanceProvider : TSPLibFormatInstanceProvider {
+    public override string Name {
+      get { return "Christofides and Eilon (CVRP)"; }
+    }
+
+    public override string Description {
+      get { return "Christofides and Eilon test set"; }
+    }
+    
+    public override Uri WebLink {
+      get { return new Uri(@"http://www.branchandcut.org/VRP/data"); }
+    }
+
+    public override string ReferencePublication {
+      get { return null; }
+    }
+
+    protected override string FileName {
+      get { return "ChristofidesEilon"; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/TSPLibFormatInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/TSPLibFormatInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/TSPLibFormatInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+using HeuristicLab.Problems.Instances.TSPLIB;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public abstract class TSPLibFormatInstanceProvider : VRPInstanceProvider<CVRPData> {
+    protected override CVRPData LoadData(Stream stream) {
+      return LoadInstance(new TSPLIBParser(stream));
+    }
+
+    public override CVRPData LoadData(string path) {
+      return LoadInstance(new TSPLIBParser(path));
+    }
+
+    private CVRPData LoadInstance(TSPLIBParser parser) {
+      parser.Parse();
+
+      var instance = new CVRPData();
+      instance.Dimension = parser.Dimension;
+      instance.Coordinates = parser.Vertices != null ? parser.Vertices : parser.DisplayVertices;
+      instance.Distances = parser.Distances;
+      instance.Capacity = parser.Capacity.Value;
+      instance.Demands = parser.Demands;
+      switch (parser.EdgeWeightType) {
+        case TSPLIBEdgeWeightTypes.ATT:
+          instance.DistanceMeasure = DistanceMeasure.Att; break;
+        case TSPLIBEdgeWeightTypes.CEIL_2D:
+          instance.DistanceMeasure = DistanceMeasure.UpperEuclidean; break;
+        case TSPLIBEdgeWeightTypes.EUC_2D:
+        case TSPLIBEdgeWeightTypes.EUC_3D:
+          instance.DistanceMeasure = DistanceMeasure.RoundedEuclidean; break;
+        case TSPLIBEdgeWeightTypes.EXPLICIT:
+          instance.DistanceMeasure = DistanceMeasure.Direct; break;
+        case TSPLIBEdgeWeightTypes.GEO:
+          instance.DistanceMeasure = DistanceMeasure.Geo; break;
+        case TSPLIBEdgeWeightTypes.MAN_2D:
+        case TSPLIBEdgeWeightTypes.MAN_3D:
+          instance.DistanceMeasure = DistanceMeasure.Manhattan; break;
+        case TSPLIBEdgeWeightTypes.MAX_2D:
+        case TSPLIBEdgeWeightTypes.MAX_3D:
+          instance.DistanceMeasure = DistanceMeasure.Maximum; break;
+        default:
+          throw new InvalidDataException("The given edge weight is not supported by HeuristicLab.");
+      }
+
+      instance.Name = parser.Name;
+      instance.Description = parser.Comment
+        + Environment.NewLine + Environment.NewLine
+        + GetInstanceDescription();
+
+      return instance;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardFormatInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardFormatInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardFormatInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+using HeuristicLab.Problems.Instances.TSPLIB;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public abstract class TaillardFormatInstanceProvider : VRPInstanceProvider<CVRPData> {
+    protected override CVRPData LoadData(Stream stream) {
+      return LoadInstance(new TaillardParser(stream));
+    }
+
+    public override CVRPData LoadData(string path) {
+      return LoadInstance(new TaillardParser(path));
+    }
+
+    private CVRPData LoadInstance(TaillardParser parser) {
+      parser.Parse();
+
+      var instance = new CVRPData();
+      instance.Dimension = parser.Cities + 1;
+      instance.Coordinates = parser.Coordinates;
+      instance.Capacity = parser.Capacity;
+      instance.Demands = parser.Demands;
+      instance.DistanceMeasure = DistanceMeasure.Euclidean;
+
+      instance.Name = parser.ProblemName;
+
+      return instance;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public class TaillardInstanceProvider : TaillardFormatInstanceProvider {
+    public override string Name {
+      get { return "Taillard (CVRP)"; }
+    }
+
+    public override string Description {
+      get { return "Taillard test set"; }
+    }
+    
+    public override Uri WebLink {
+      get { return new Uri(@"http://mistic.heig-vd.ch/taillard/problemes.dir/vrp.dir/vrp.html"); }
+    }
+
+    public override string ReferencePublication {
+      get { return null; }
+    }
+
+    protected override string FileName {
+      get { return "Taillard"; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardParser.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardParser.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardParser.cs	(revision 7898)
@@ -0,0 +1,131 @@
+﻿#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.Collections.Generic;
+using System.IO;
+using System.Text.RegularExpressions;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  class TaillardParser {
+    private string file;
+    private Stream stream;
+    private string problemName;
+    private int cities;
+    private double capacity;
+    private List<double> xCoord;
+    private List<double> yCoord;
+    private List<double> demand;
+
+    public int Cities {
+      get {
+        return cities;
+      }
+    }
+
+    public double Capacity {
+      get {
+        return capacity;
+      }
+    }
+
+    public double[,] Coordinates {
+      get {
+        double[] x = xCoord.ToArray();
+        double[] y = yCoord.ToArray();
+        double[,] coord = new double[x.Length, 2];
+        for (int i = 0; i < x.Length; i++) {
+          coord[i, 0] = x[i];
+          coord[i, 1] = y[i];
+        }
+        return coord;
+      }
+    }
+
+    public double[] Demands {
+      get {
+        return demand.ToArray();
+      }
+    }
+
+    public String ProblemName {
+      get {
+        return problemName;
+      }
+    }
+
+    public TaillardParser() {
+      xCoord = new List<double>();
+      yCoord = new List<double>();
+      demand = new List<double>();
+    }
+
+    public TaillardParser(string file): this() {
+      this.file = file;
+    }
+
+    public TaillardParser(Stream stream)
+      : this() {
+      this.stream = stream;
+    }
+
+    public void Parse() {
+      string line;
+      Regex reg = new Regex(@"-?\d+(\.\d+)?");
+      MatchCollection m;
+
+      StreamReader reader;
+      if (stream != null) {
+        reader = new StreamReader(stream);
+      } else {
+        reader = new StreamReader(file);
+        problemName = Path.GetFileNameWithoutExtension(file);
+      }
+
+      using (reader) {
+        line = reader.ReadLine();
+        m = reg.Matches(line);
+        if (m.Count != 2)
+          throw new InvalidDataException("File has wrong format!");
+
+        cities = int.Parse(m[0].Value);
+
+        line = reader.ReadLine();
+        m = reg.Matches(line);
+        capacity = int.Parse(m[0].Value);
+
+        line = reader.ReadLine();
+        m = reg.Matches(line);
+        xCoord.Add(double.Parse(m[0].Value, System.Globalization.CultureInfo.InvariantCulture));
+        yCoord.Add(double.Parse(m[1].Value, System.Globalization.CultureInfo.InvariantCulture));
+        demand.Add(0);
+
+        for (int i = 0; i < cities; i++) {
+          line = reader.ReadLine();
+          m = reg.Matches(line);
+          xCoord.Add(double.Parse(m[1].Value, System.Globalization.CultureInfo.InvariantCulture));
+          yCoord.Add(double.Parse(m[2].Value, System.Globalization.CultureInfo.InvariantCulture));
+          demand.Add(int.Parse(m[3].Value));
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPDataDescriptor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPDataDescriptor.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPDataDescriptor.cs	(revision 7898)
@@ -0,0 +1,37 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Problems.Instances.VehicleRouting {
+  internal class VRPDataDescriptor : IDataDescriptor {
+    public string Name { get; internal set; }
+    public string Description { get; internal set; }
+
+    internal string InstanceIdentifier { get; set; }
+    internal string SolutionIdentifier { get; set; }
+
+    internal VRPDataDescriptor(string name, string description, string instanceIdentifier, string solutionIdentifier) {
+      this.Name = name;
+      this.Description = description;
+      this.InstanceIdentifier = instanceIdentifier;
+      this.SolutionIdentifier = solutionIdentifier;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs	(revision 7898)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs	(revision 7898)
@@ -0,0 +1,136 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public abstract class VRPInstanceProvider<T> : ProblemInstanceProvider<T> where T : IVRPData {
+    protected abstract string FileName { get; }
+
+    public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
+      Dictionary<string, string> solutions = new Dictionary<string, string>();
+      var solutionsArchiveName = GetResourceName(FileName + @"\.opt\.zip");
+      if (!String.IsNullOrEmpty(solutionsArchiveName)) {
+        using (var solutionsZipFile = new ZipInputStream(GetType().Assembly.GetManifestResourceStream(solutionsArchiveName))) {
+          foreach (var entry in GetZipContents(solutionsZipFile))
+            solutions.Add(entry.Substring(0, entry.Length - ".opt".Length) + "." + FileName, entry);
+        }
+      }
+      var instanceArchiveName = GetResourceName(FileName + @"\.zip");
+      if (String.IsNullOrEmpty(instanceArchiveName)) yield break;
+
+      using (var instanceStream = new ZipInputStream(GetType().Assembly.GetManifestResourceStream(instanceArchiveName))) {
+        foreach (var entry in GetZipContents(instanceStream).OrderBy(x => x)) {
+          string solutionEntry = entry.Substring(0, entry.Length - ".opt".Length) + "." + FileName;
+          yield return new VRPDataDescriptor(Path.GetFileNameWithoutExtension(entry), GetInstanceDescription(), entry, solutions.ContainsKey(solutionEntry) ? solutions[solutionEntry] : String.Empty);
+        }
+      }
+    }
+
+    public override T LoadData(IDataDescriptor id) {
+      var descriptor = (VRPDataDescriptor)id;
+      var instanceArchiveName = GetResourceName(FileName + @"\.zip");
+      using (var instancesZipFile = new ZipFile(GetType().Assembly.GetManifestResourceStream(instanceArchiveName))) {
+        var entry = instancesZipFile.GetEntry(descriptor.InstanceIdentifier);
+        var stream = instancesZipFile.GetInputStream(entry);
+        var instance = LoadData(stream);
+        if (string.IsNullOrEmpty(instance.Name)) {
+          instance.Name = Path.GetFileNameWithoutExtension(entry.ToString());
+        }
+
+        if (!String.IsNullOrEmpty(descriptor.SolutionIdentifier)) {
+          var solutionsArchiveName = GetResourceName(FileName + @"\.opt\.zip");
+          using (var solutionsZipFile = new ZipFile(GetType().Assembly.GetManifestResourceStream(solutionsArchiveName))) {
+            entry = solutionsZipFile.GetEntry(descriptor.SolutionIdentifier);
+            stream = solutionsZipFile.GetInputStream(entry);
+            LoadSolution(stream, instance);
+          }
+        }
+
+        return instance;
+      }
+    }
+
+    private static void LoadSolution(Stream stream, T instance) {
+      List<List<int>> routes = new List<List<int>>();
+
+      using (StreamReader reader = new StreamReader(stream)) {
+        String line;
+        while ((line = reader.ReadLine()) != null) {
+          if (line.StartsWith("Route")) {
+            string[] token = line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+            List<int> route = new List<int>();
+
+            for (int i = 2; i < token.Length; i++) {
+              route.Add(int.Parse(token[i]) - 1);
+            }
+
+            routes.Add(route);
+          }
+        }
+      }
+
+      instance.BestKnownTour = routes.Select(x => x.ToArray()).ToArray();
+    }
+
+    public static void LoadSolution(string path, T instance) {
+      using (FileStream stream = new FileStream(path, FileMode.Open)) {
+        LoadSolution(stream, instance);
+      }
+    }
+
+    protected abstract T LoadData(Stream stream);
+    public override void SaveData(T instance, string path) {
+      throw new NotSupportedException();
+    }
+
+    public T LoadData(string vrpFile, string tourFile) {
+      var data = LoadData(vrpFile);
+      if (!String.IsNullOrEmpty(tourFile)) {
+        LoadSolution(tourFile, data);
+      }
+      return data;
+    }
+
+    protected virtual string GetResourceName(string fileName) {
+      return Assembly.GetExecutingAssembly().GetManifestResourceNames()
+              .Where(x => Regex.Match(x, @".*\.Data\." + fileName).Success).SingleOrDefault();
+    }
+
+    protected virtual string GetInstanceDescription() {
+      return "Embedded instance of plugin version " + Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true).Cast<AssemblyFileVersionAttribute>().First().Version + ".";
+    }
+
+    protected IEnumerable<string> GetZipContents(ZipInputStream zipFile) {
+      ZipEntry entry;
+      while ((entry = zipFile.GetNextEntry()) != null) {
+        yield return entry.Name;
+      }
+    }
+  }
+}
