Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs	(revision 11428)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs	(revision 11429)
@@ -20,9 +20,12 @@
 #endregion
 
+using System;
+using System.Collections.Generic;
 using System.IO;
+using System.Linq;
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
-  public abstract class CordeauFormatInstanceProvider<T> : VRPInstanceProvider<T> where T : MDCVRPData {
-    protected override T LoadData(Stream stream) {
+  public abstract class CordeauFormatInstanceProvider<TData> : VRPInstanceProvider<TData> where TData : MDCVRPData {
+    protected override TData LoadData(Stream stream) {
       return LoadInstance(new CordeauParser(stream));
     }
@@ -31,9 +34,61 @@
       get { return true; }
     }
-    public override T ImportData(string path) {
+    public override TData ImportData(string path) {
       return LoadInstance(new CordeauParser(path));
     }
 
-    internal abstract T LoadInstance(CordeauParser parser);
+    internal abstract TData LoadInstance(CordeauParser parser);
+
+    protected override void LoadSolution(Stream stream, TData instance) {
+      using (var reader = new StreamReader(stream)) {
+        double costs = double.Parse(reader.ReadLine());
+
+        var toursPerDepotQuery =
+          from line in ReadAllLines(reader)
+          let tokens = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
+          let depot = int.Parse(tokens[0])
+          //let vehicle = int.Parse(tokens[1])
+          //let duration = double.Parse(tokens[2])
+          //let load = double.Parse(tokens[3])
+          let customers = tokens.Skip(4).Where(t => !t.StartsWith("(")).Select(int.Parse)
+          //let serviceTimes = tokens.Skip(5).Where(t => t.StartsWith("(")).Select(t => int.Parse(t.Trim('(', ')')))
+          let stops = customers.Where(s => s != 0).Select(s => s - 1)
+          select new { depot, /*vehicle,*/ stops } into assignment
+          group assignment by assignment.depot;
+
+        var toursPerDepot = toursPerDepotQuery.Select(d => d.Select(v => v.stops.ToArray()).ToArray()).ToArray();
+
+        instance.BestKnownTour = toursPerDepot.SelectMany(depot => depot).ToArray();
+
+        instance.BestKnownTourVehicleAssignment = DetermineTourToVehicleAssignment(toursPerDepot, instance.VehicleDepotAssignment);
+      }
+    }
+
+    private static int[] DetermineTourToVehicleAssignment(int[][][] toursPerDepot, int[] vehicleDepotAssignments) {
+      var usedVehiclesPerDepot = toursPerDepot.Select((d, i) => new { i, d }).ToDictionary(k => k.i, v => v.d.Length);
+      var availableVehiclesPerDepot = vehicleDepotAssignments.GroupBy(a => a).ToDictionary(k => k.Key, v => v.Count());
+
+      var tourToVehicle = new List<int>(vehicleDepotAssignments.Length);
+      var unusedVehicles = new List<int>();
+
+      int vehicle = 0;
+      for (int depot = 0; depot < toursPerDepot.Length; depot++) {
+        int used = usedVehiclesPerDepot[depot];
+        tourToVehicle.AddRange(Enumerable.Range(vehicle, used));
+        vehicle += used;
+
+        int unused = availableVehiclesPerDepot[depot] - used;
+        unusedVehicles.AddRange(Enumerable.Range(vehicle, unused));
+        vehicle += unused;
+      }
+      tourToVehicle.AddRange(unusedVehicles);
+
+      return tourToVehicle.ToArray();
+    }
+
+    private IEnumerable<string> ReadAllLines(StreamReader reader) {
+      while (!reader.EndOfStream)
+        yield return reader.ReadLine();
+    }
   }
 }
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 11428)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/HeuristicLab.Problems.Instances.VehicleRouting-3.4.csproj	(revision 11429)
@@ -150,4 +150,6 @@
     <EmbeddedResource Include="Data\CordeauMD.zip" />
     <EmbeddedResource Include="Data\CordeauMDTW.zip" />
+    <EmbeddedResource Include="Data\CordeauMD.opt.zip" />
+    <EmbeddedResource Include="Data\CordeauMDTW.opt.zip" />
     <None Include="Plugin.cs.frame" />
     <Compile Include="Plugin.cs" />
