Changeset 11931 for stable/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs
- Timestamp:
- 02/06/15 09:24:18 (9 years ago)
- Location:
- stable
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 11420,11428-11429,11432,11442,11455-11456,11478,11930
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs
r11334 r11931 20 20 #endregion 21 21 22 using System; 23 using System.Collections.Generic; 24 using System.Globalization; 22 25 using System.IO; 26 using System.Linq; 23 27 24 28 namespace HeuristicLab.Problems.Instances.VehicleRouting { 25 public abstract class CordeauFormatInstanceProvider<T > : VRPInstanceProvider<T> where T: MDCVRPData {26 protected override T LoadData(Stream stream) {29 public abstract class CordeauFormatInstanceProvider<TData> : VRPInstanceProvider<TData> where TData : MDCVRPData { 30 protected override TData LoadData(Stream stream) { 27 31 return LoadInstance(new CordeauParser(stream)); 28 32 } … … 31 35 get { return true; } 32 36 } 33 public override T ImportData(string path) {37 public override TData ImportData(string path) { 34 38 return LoadInstance(new CordeauParser(path)); 35 39 } 36 40 37 internal abstract T LoadInstance(CordeauParser parser); 41 internal abstract TData LoadInstance(CordeauParser parser); 42 43 protected override void LoadSolution(Stream stream, TData instance) { 44 using (var reader = new StreamReader(stream)) { 45 double costs = double.Parse(reader.ReadLine(), CultureInfo.InvariantCulture); 46 47 var toursPerDepotQuery = 48 from line in reader.ReadAllLines() 49 where !string.IsNullOrEmpty(line) 50 let tokens = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) 51 let depot = int.Parse(tokens[0]) 52 //let vehicle = int.Parse(tokens[1]) 53 //let duration = double.Parse(tokens[2], CultureInfo.InvariantCulture) 54 //let load = double.Parse(tokens[3], new CultureInfo.InvariantCulture) 55 let customers = tokens.Skip(4).Where(t => !t.StartsWith("(")).Select(int.Parse) 56 let numberOfCustomers = customers.Count() 57 //let serviceTimes = tokens.Skip(5).Where(t => t.StartsWith("(")).Select(t => double.Parse(t.Trim('(', ')'), CultureInfo.InvariantCulture)) 58 let stops = customers.Skip(1).Take(numberOfCustomers - 2).Select(s => s - 1) 59 select new { depot, /*vehicle,*/ stops } into assignment 60 group assignment by assignment.depot; 61 62 var toursPerDepot = toursPerDepotQuery.Select(d => d.Select(v => v.stops.ToArray()).ToArray()).ToArray(); 63 64 instance.BestKnownTour = toursPerDepot.SelectMany(depot => depot).ToArray(); 65 66 instance.BestKnownTourVehicleAssignment = DetermineTourToVehicleAssignment(toursPerDepot, instance.VehicleDepotAssignment); 67 } 68 } 69 70 private static int[] DetermineTourToVehicleAssignment(int[][][] toursPerDepot, int[] vehicleDepotAssignments) { 71 var usedVehiclesPerDepot = toursPerDepot.Select((d, i) => new { i, d }).ToDictionary(k => k.i, v => v.d.Length); 72 var availableVehiclesPerDepot = vehicleDepotAssignments.GroupBy(a => a).ToDictionary(k => k.Key, v => v.Count()); 73 74 var tourToVehicle = new List<int>(vehicleDepotAssignments.Length); 75 var unusedVehicles = new List<int>(); 76 77 int vehicle = 0; 78 for (int depot = 0; depot < toursPerDepot.Length; depot++) { 79 int used = usedVehiclesPerDepot[depot]; 80 tourToVehicle.AddRange(Enumerable.Range(vehicle, used)); 81 vehicle += used; 82 83 int unused = availableVehiclesPerDepot[depot] - used; 84 unusedVehicles.AddRange(Enumerable.Range(vehicle, unused)); 85 vehicle += unused; 86 } 87 tourToVehicle.AddRange(unusedVehicles); 88 89 return tourToVehicle.ToArray(); 90 } 38 91 } 39 92 }
Note: See TracChangeset
for help on using the changeset viewer.