Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/06/15 09:24:18 (9 years ago)
Author:
abeham
Message:

#2229: merged to stable

Location:
stable
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • stable

  • stable/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs

    r11334 r11931  
    2020#endregion
    2121
     22using System;
     23using System.Collections.Generic;
     24using System.Globalization;
    2225using System.IO;
     26using System.Linq;
    2327
    2428namespace 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) {
    2731      return LoadInstance(new CordeauParser(stream));
    2832    }
     
    3135      get { return true; }
    3236    }
    33     public override T ImportData(string path) {
     37    public override TData ImportData(string path) {
    3438      return LoadInstance(new CordeauParser(path));
    3539    }
    3640
    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    }
    3891  }
    3992}
Note: See TracChangeset for help on using the changeset viewer.