Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/22/12 17:38:36 (12 years ago)
Author:
svonolfe
Message:

Moved distance measure to helper class (#1782)

Location:
trunk/sources/HeuristicLab.Problems.Instances/3.3
Files:
3 added
2 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.Instances/3.3/HeuristicLab.Problems.Instances-3.3.csproj

    r7849 r7872  
    117117    <Compile Include="Types\CTAPData.cs" />
    118118    <Compile Include="IDataDescriptor.cs" />
    119     <Compile Include="Types\CVRPData.cs" />
     119    <Compile Include="Types\DistanceHelper.cs" />
     120    <Compile Include="Types\VRP\CVRPData.cs" />
    120121    <Compile Include="Types\GQAPData.cs" />
     122    <Compile Include="Types\VRP\IVRPData.cs" />
    121123    <Compile Include="Types\QAPData.cs" />
    122124    <Compile Include="Types\TSPData.cs" />
  • trunk/sources/HeuristicLab.Problems.Instances/3.3/Types/TSPData.cs

    r7548 r7872  
    2323
    2424namespace HeuristicLab.Problems.Instances {
    25   public enum TSPDistanceMeasure { Direct, Euclidean, RoundedEuclidean, UpperEuclidean, Geo, Manhattan, Maximum, Att };
    26 
    2725  /// <summary>
    2826  /// Describes instances of the Traveling Salesman Problem (TSP).
     
    4543    /// Specifies the distance measure that is to be used.
    4644    /// </summary>
    47     public TSPDistanceMeasure DistanceMeasure { get; set; }
     45    public DistanceMeasure DistanceMeasure { get; set; }
    4846    /// <summary>
    4947    /// Optional! The distances are given in form of a distance matrix.
     
    8179    /// <returns>A full distance matrix between all cities.</returns>
    8280    public double[,] GetDistanceMatrix() {
    83       if (Distances != null) return Distances;
    84       Distances = new double[Dimension, Dimension];
    85       for (int i = 0; i < Dimension - 1; i++)
    86         for (int j = i + 1; j < Dimension; j++) {
    87           Distances[i, j] = GetDistance(i, j);
    88           Distances[j, i] = Distances[i, j];
    89         }
    90       return Distances;
     81      return DistanceHelper.GetDistanceMatrix(DistanceMeasure, Coordinates, Distances, Dimension);
    9182    }
    92 
    93     #region Private Helpers
    94     private double GetDistance(int i, int j) {
    95       switch (DistanceMeasure) {
    96         case TSPDistanceMeasure.Att:
    97           return AttDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
    98         case TSPDistanceMeasure.Direct:
    99           return Distances[i, j];
    100         case TSPDistanceMeasure.Euclidean:
    101           return EuclideanDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
    102         case TSPDistanceMeasure.Geo:
    103           return GeoDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
    104         case TSPDistanceMeasure.Manhattan:
    105           return ManhattanDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
    106         case TSPDistanceMeasure.Maximum:
    107           return MaximumDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
    108         case TSPDistanceMeasure.RoundedEuclidean:
    109           return Math.Round(EuclideanDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]));
    110         case TSPDistanceMeasure.UpperEuclidean:
    111           return Math.Ceiling(EuclideanDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]));
    112         default:
    113           throw new InvalidOperationException("Distance measure is not known.");
    114       }
    115     }
    116 
    117     private double AttDistance(double x1, double y1, double x2, double y2) {
    118       return Math.Ceiling(Math.Sqrt(((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) / 10.0));
    119     }
    120 
    121     private double EuclideanDistance(double x1, double y1, double x2, double y2) {
    122       return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    123     }
    124 
    125     private const double PI = 3.141592;
    126     private const double RADIUS = 6378.388;
    127     private double GeoDistance(double x1, double y1, double x2, double y2) {
    128       double latitude1, longitude1, latitude2, longitude2;
    129       double q1, q2, q3;
    130       double length;
    131 
    132       latitude1 = ConvertToRadian(x1);
    133       longitude1 = ConvertToRadian(y1);
    134       latitude2 = ConvertToRadian(x2);
    135       longitude2 = ConvertToRadian(y2);
    136 
    137       q1 = Math.Cos(longitude1 - longitude2);
    138       q2 = Math.Cos(latitude1 - latitude2);
    139       q3 = Math.Cos(latitude1 + latitude2);
    140 
    141       length = (int)(RADIUS * Math.Acos(0.5 * ((1.0 + q1) * q2 - (1.0 - q1) * q3)) + 1.0);
    142       return (length);
    143     }
    144 
    145     private double ConvertToRadian(double x) {
    146       return PI * (Math.Truncate(x) + 5.0 * (x - Math.Truncate(x)) / 3.0) / 180.0;
    147     }
    148 
    149     private double ManhattanDistance(double x1, double y1, double x2, double y2) {
    150       return Math.Round(Math.Abs(x1 - x2) + Math.Abs(y1 - y2), MidpointRounding.AwayFromZero);
    151     }
    152 
    153     private double MaximumDistance(double x1, double y1, double x2, double y2) {
    154       return Math.Max(Math.Round(Math.Abs(x1 - x2), MidpointRounding.AwayFromZero), Math.Round(Math.Abs(y1 - y2), MidpointRounding.AwayFromZero));
    155     }
    156     #endregion
    15783  }
    15884}
  • trunk/sources/HeuristicLab.Problems.Instances/3.3/Types/VRP/CVRPData.cs

    r7870 r7872  
    2222
    2323namespace HeuristicLab.Problems.Instances {
    24   public enum CVRPDistanceMeasure { Direct, Euclidean, RoundedEuclidean, UpperEuclidean, Geo, Manhattan, Maximum, Att };
    25 
    2624  /// <summary>
    2725  /// Describes instances of the Capacitated Vehicle Routing Problem (CVRP).
    2826  /// </summary>
    29   public class CVRPData {
     27  public class CVRPData: IVRPData {
    3028    /// <summary>
    3129    /// The name of the instance
     
    4543    ///the coordinates if no <see cref="Distances"/> is given.
    4644    /// </summary>
    47     public CVRPDistanceMeasure DistanceMeasure { get; set; }
     45    public DistanceMeasure DistanceMeasure { get; set; }
    4846    /// <summary>
    4947    /// Optional! The maximum number of vehicles that can be used.
     
    9088    /// </summary>
    9189    public double? BestKnownQuality { get; set; }
     90
     91    /// <summary>
     92    /// If only the coordinates are given, can calculate the distance matrix.
     93    /// </summary>
     94    /// <returns>A full distance matrix between all cities.</returns>
     95    public double[,] GetDistanceMatrix() {
     96      return DistanceHelper.GetDistanceMatrix(DistanceMeasure, Coordinates, Distances, Dimension);
     97    }
    9298  }
    9399}
Note: See TracChangeset for help on using the changeset viewer.