Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/30/16 09:24:40 (7 years ago)
Author:
jzenisek
Message:

#2707 added temporal distance clustering

File:
1 copied

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.VRPEnhancements/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/TemporalDistanceClusterCreator.cs

    r14424 r14430  
    2020#endregion
    2121
     22using System;
    2223using System.Collections.Generic;
    2324using System.Linq;
     
    3031
    3132namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
    32   [Item("GeographicDistanceClusterCreator", "Creates a VRP solution by clustering customers first with a KMeans-algorithm based on their geographic position and building tours afterwards alternatevly in a random or a greedy fashion.")]
     33  [Item("TemporalDistanceClusterCreator", "Creates a VRP solution by clustering customers first with a KMeans-algorithm based on their geographic position and building tours afterwards alternatevly in a random or a greedy fashion.")]
    3334  [StorableClass]
    34   public sealed class GeographicDistanceClusterCreator : ClusterCreator {
     35  public sealed class TemporalDistanceClusterCreator : ClusterCreator {
    3536
    3637    [StorableConstructor]
    37     private GeographicDistanceClusterCreator(bool deserializing) : base(deserializing) { }
     38    private TemporalDistanceClusterCreator(bool deserializing) : base(deserializing) { }
    3839
    39     public GeographicDistanceClusterCreator() : base() {
     40    public TemporalDistanceClusterCreator() : base() {
    4041    }
    4142
    42     private GeographicDistanceClusterCreator(GeographicDistanceClusterCreator original, Cloner cloner)
     43    private TemporalDistanceClusterCreator(TemporalDistanceClusterCreator original, Cloner cloner)
    4344      : base(original, cloner) {
    4445    }
    4546
    4647    public override IDeepCloneable Clone(Cloner cloner) {
    47       return new GeographicDistanceClusterCreator(this, cloner);
     48      return new TemporalDistanceClusterCreator(this, cloner);
    4849    }
    4950
    50     public static List<SpatialDistanceClusterElement> CreateClusterObjects(IVRPProblemInstance instance) {
     51    public static List<TemporalDistanceClusterElement> CreateClusterObjects(ITimeWindowedProblemInstance instance) {
    5152      IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
    5253
     
    5859      }
    5960
    60       // wrap stops in SpatialDistanceClusterElement
    61       List<SpatialDistanceClusterElement> clusterObjects = new List<SpatialDistanceClusterElement>();
     61      // wrap stops in TemporalDistanceClusterElement
     62      List<TemporalDistanceClusterElement> clusterObjects = new List<TemporalDistanceClusterElement>();
    6263      foreach (int customer in customers) {
    63         clusterObjects.Add(new SpatialDistanceClusterElement(customer, instance.GetCoordinates(customer)));
     64        clusterObjects.Add(new TemporalDistanceClusterElement(customer, instance.ReadyTime[customer], instance.DueTime[customer]));
    6465      }
    6566      return clusterObjects;
    6667    }
    6768
    68     public static PotvinEncoding CreateSolution(IVRPProblemInstance instance, IRandom random, int minK, int maxK, double clusterChangeThreshold, int creationOption) {
     69    public static PotvinEncoding CreateSolution(ITimeWindowedProblemInstance instance, IRandom random, int minK, int maxK, double clusterChangeThreshold, int creationOption) {
    6970      PotvinEncoding result = new PotvinEncoding(instance);
    7071
    71       List<SpatialDistanceClusterElement> clusterObjects = CreateClusterObjects(instance);
     72      List<TemporalDistanceClusterElement> clusterObjects = CreateClusterObjects(instance);
    7273
    7374      int k = random.Next(minK, maxK);
    74       List<SpatialDistanceCluster> clusters = KMeans(instance, random, clusterObjects, k, clusterChangeThreshold);
     75      List<TemporalDistanceCluster> clusters = KMeans(instance, random, clusterObjects, k, clusterChangeThreshold);
    7576
    7677      // (3) build tours
     
    8384        if (creationOption == 0) {
    8485          // (a) shuffle
    85           c.Objects.Shuffle(random);
    86           foreach (var o in c.Objects) {
     86          c.Elements.Shuffle(random);
     87          foreach (var o in c.Elements) {
    8788            newTour.Stops.Add(o.Id);
    8889          }
    8990        } else {
    9091          // (b) greedy
    91           foreach (var o in c.Objects) {
     92          foreach (var o in c.Elements) {
    9293            newTour.Stops.Add(o.Id);
    9394          }
     
    99100    }
    100101
    101     private static List<SpatialDistanceCluster> KMeans(IVRPProblemInstance instance, IRandom random, List<SpatialDistanceClusterElement> objects, int k, double changeTreshold) {
     102    private static List<TemporalDistanceCluster> KMeans(ITimeWindowedProblemInstance instance, IRandom random, List<TemporalDistanceClusterElement> objects, int k, double changeTreshold) {
    102103
    103       List<SpatialDistanceCluster> clusters = new List<SpatialDistanceCluster>();
     104      List<TemporalDistanceCluster> clusters = new List<TemporalDistanceCluster>();
    104105      HashSet<int> initMeans = new HashSet<int>();
    105106      int nextMean = -1;
     
    107108      // (1) initialize each cluster with a random first object (i.e. mean)
    108109      for (int i = 0; i < k && i < objects.Count; i++) {
    109         SpatialDistanceCluster cluster = new SpatialDistanceCluster(instance, i);
     110        TemporalDistanceCluster cluster = new TemporalDistanceCluster(instance, i);
    110111
    111112        do {
     
    128129
    129130      // remove empty clusters
    130       clusters.RemoveAll(c => c.Objects.Count.Equals(0));
     131      clusters.RemoveAll(c => c.Elements.Count.Equals(0));
    131132
    132133      return clusters;
    133134    }
    134135
    135     private static int KMeansRun(List<SpatialDistanceCluster> clusters, List<SpatialDistanceClusterElement> objects) {
     136    private static int KMeansRun(List<TemporalDistanceCluster> clusters, List<TemporalDistanceClusterElement> objects) {
    136137      int changes = 0;
    137138
    138139      foreach (var c in clusters) {
    139         c.Objects.Clear();
     140        c.Elements.Clear();
    140141      }
    141142
    142143      foreach (var o in objects) {
    143         int bestClusterIdx = -1;
    144         double minImpact = double.MaxValue;
    145         for (int i = 0; i < clusters.Count; i++) {
     144        int bestClusterIdx = 0;
     145        double minImpact = clusters[0].CalculateImpact(o);
     146        for (int i = 1; i < clusters.Count; i++) {
    146147          double impact = clusters[i].CalculateImpact(o);
    147           if (impact < minImpact) {
     148          if ((minImpact > 0 && impact < minImpact) || (minImpact < 0 && impact > minImpact)) { // V1: min positive impact
     149          //if(impact > minImpact) { // V2: max impact
    148150            minImpact = impact;
    149151            bestClusterIdx = i;
     
    156158      foreach (var c in clusters) {
    157159        c.CalculateMean();
     160        c.CalculateVariance();
    158161      }
    159162
     
    181184      int creationOption = creationOptions.SampleProportional(random, 1, probabilites, false, false).First();
    182185
    183       VRPToursParameter.ActualValue = CreateSolution(ProblemInstance, random, minK, maxK, clusterChangeThreshold, creationOption);
     186      var instance = ProblemInstance as ITimeWindowedProblemInstance;
     187      if (instance == null) {
     188        throw new ArgumentException(string.Format("Cannot initialize {0} with data from {1}", instance.GetType(), ProblemInstance.GetType()));
     189      }
     190
     191      VRPToursParameter.ActualValue = CreateSolution(instance, random, minK, maxK, clusterChangeThreshold, creationOption);
    184192      return base.InstrumentedApply();
    185193    }
Note: See TracChangeset for help on using the changeset viewer.