Changeset 7872 for trunk/sources/HeuristicLab.Problems.Instances
- Timestamp:
- 05/22/12 17:38:36 (12 years ago)
- 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 117 117 <Compile Include="Types\CTAPData.cs" /> 118 118 <Compile Include="IDataDescriptor.cs" /> 119 <Compile Include="Types\CVRPData.cs" /> 119 <Compile Include="Types\DistanceHelper.cs" /> 120 <Compile Include="Types\VRP\CVRPData.cs" /> 120 121 <Compile Include="Types\GQAPData.cs" /> 122 <Compile Include="Types\VRP\IVRPData.cs" /> 121 123 <Compile Include="Types\QAPData.cs" /> 122 124 <Compile Include="Types\TSPData.cs" /> -
trunk/sources/HeuristicLab.Problems.Instances/3.3/Types/TSPData.cs
r7548 r7872 23 23 24 24 namespace HeuristicLab.Problems.Instances { 25 public enum TSPDistanceMeasure { Direct, Euclidean, RoundedEuclidean, UpperEuclidean, Geo, Manhattan, Maximum, Att };26 27 25 /// <summary> 28 26 /// Describes instances of the Traveling Salesman Problem (TSP). … … 45 43 /// Specifies the distance measure that is to be used. 46 44 /// </summary> 47 public TSPDistanceMeasure DistanceMeasure { get; set; }45 public DistanceMeasure DistanceMeasure { get; set; } 48 46 /// <summary> 49 47 /// Optional! The distances are given in form of a distance matrix. … … 81 79 /// <returns>A full distance matrix between all cities.</returns> 82 80 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); 91 82 } 92 93 #region Private Helpers94 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 #endregion157 83 } 158 84 } -
trunk/sources/HeuristicLab.Problems.Instances/3.3/Types/VRP/CVRPData.cs
r7870 r7872 22 22 23 23 namespace HeuristicLab.Problems.Instances { 24 public enum CVRPDistanceMeasure { Direct, Euclidean, RoundedEuclidean, UpperEuclidean, Geo, Manhattan, Maximum, Att };25 26 24 /// <summary> 27 25 /// Describes instances of the Capacitated Vehicle Routing Problem (CVRP). 28 26 /// </summary> 29 public class CVRPData {27 public class CVRPData: IVRPData { 30 28 /// <summary> 31 29 /// The name of the instance … … 45 43 ///the coordinates if no <see cref="Distances"/> is given. 46 44 /// </summary> 47 public CVRPDistanceMeasure DistanceMeasure { get; set; }45 public DistanceMeasure DistanceMeasure { get; set; } 48 46 /// <summary> 49 47 /// Optional! The maximum number of vehicles that can be used. … … 90 88 /// </summary> 91 89 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 } 92 98 } 93 99 }
Note: See TracChangeset
for help on using the changeset viewer.