Changeset 17253 for branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPData.cs
- Timestamp:
- 09/16/19 16:12:21 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPData.cs
r17251 r17253 31 31 [StorableType("1a9bf60c-b6a6-4c95-8e99-5a2dec0ee892")] 32 32 public interface ITSPData : INamedItem { 33 int Cities { get; } 34 33 35 double GetDistance(int fromCity, int toCity); 34 36 ITSPSolution GetSolution(Permutation tspTour, double tourLength); … … 38 40 [Item("Matrix-based TSP Data", "TSP that is representd by a distance matrix.")] 39 41 [StorableType("4df58a35-679d-4414-b815-9450ae100823")] 40 public sealed class MatrixTSPData : NamedItem, ITSPData { 41 [Storable] public DoubleMatrix Matrix { get; private set; } 42 [Storable] public DoubleMatrix DisplayCoordinates { get; private set; } 43 44 [StorableConstructor] 45 private MatrixTSPData(StorableConstructorFlag _) : base(_) { } 46 private MatrixTSPData(MatrixTSPData original, Cloner cloner) : base(original, cloner) { 42 public class MatrixTSPData : NamedItem, ITSPData { 43 [Storable] public DoubleMatrix Matrix { get; protected set; } 44 [Storable] public DoubleMatrix DisplayCoordinates { get; protected set; } 45 46 public int Cities => Matrix.Rows; 47 48 [StorableConstructor] 49 protected MatrixTSPData(StorableConstructorFlag _) : base(_) { } 50 protected MatrixTSPData(MatrixTSPData original, Cloner cloner) : base(original, cloner) { 47 51 Matrix = original.Matrix; 48 52 DisplayCoordinates = original.DisplayCoordinates; … … 68 72 throw new ArgumentException("Unequal number of rows in " + nameof(matrix) + " and " + nameof(coordinates) + "."); 69 73 Name = name; 70 Matrix = (DoubleMatrix)matrix.AsReadOnly();71 DisplayCoordinates = (DoubleMatrix)coordinates?.AsReadOnly();72 } 73 74 public ITSPSolution GetSolution(Permutation tour, double tourLength) {74 Matrix = matrix.AsReadOnly(); 75 DisplayCoordinates = coordinates?.AsReadOnly(); 76 } 77 78 public virtual ITSPSolution GetSolution(Permutation tour, double tourLength) { 75 79 return new TSPSolution(DisplayCoordinates, tour, new DoubleValue(tourLength)); 76 80 } … … 97 101 [StorableType("3955d07a-d43c-4a01-9505-d2effb1ea865")] 98 102 public abstract class CoordinatesTSPData : NamedItem, ITSPData { 99 [Storable] public DoubleMatrix Coordinates { get; private set; } 103 [Storable] public DoubleMatrix Coordinates { get; protected set; } 104 105 public int Cities => Coordinates.Rows; 100 106 101 107 [StorableConstructor] … … 118 124 if (coordinates.Columns != 2) throw new ArgumentException("Argument must have exactly two columns.", nameof(coordinates)); 119 125 Name = name; 120 Coordinates = (DoubleMatrix)coordinates.AsReadOnly();126 Coordinates = coordinates.AsReadOnly(); 121 127 } 122 128 … … 128 134 public abstract double GetDistance(double fromX, double fromY, double toX, double toY); 129 135 130 public ITSPSolution GetSolution(Permutation tour, double tourLength) {136 public virtual ITSPSolution GetSolution(Permutation tour, double tourLength) { 131 137 return new TSPSolution(Coordinates, tour, new DoubleValue(tourLength)); 132 138 } … … 137 143 [Item("Euclidean TSP Data", "TSP that is represented by coordinates in an Euclidean plane.")] 138 144 [StorableType("4bf58348-cd98-46c5-a4c0-55f486ca88b4")] 139 public sealedclass EuclideanTSPData : CoordinatesTSPData {145 public class EuclideanTSPData : CoordinatesTSPData { 140 146 public enum DistanceRounding { None, Midpoint, Ceiling } 141 147 142 148 [Storable] 143 public DistanceRounding Rounding { get; pr ivateset; }144 145 [StorableConstructor] 146 pr ivateEuclideanTSPData(StorableConstructorFlag _) : base(_) { }147 pr ivateEuclideanTSPData(EuclideanTSPData original, Cloner cloner) : base(original, cloner) {149 public DistanceRounding Rounding { get; protected set; } 150 151 [StorableConstructor] 152 protected EuclideanTSPData(StorableConstructorFlag _) : base(_) { } 153 protected EuclideanTSPData(EuclideanTSPData original, Cloner cloner) : base(original, cloner) { 148 154 Rounding = original.Rounding; 149 155 } … … 166 172 167 173 public override double GetDistance(double fromX, double fromY, double toX, double toY) { 168 var dist = Math.Sqrt((fromX - toX) * (fromX - toX) + (fromY - toY) * (fromY - toY));174 var dist = DistanceHelper.EuclideanDistance(fromX, fromY, toX, toY); 169 175 switch (Rounding) { 170 176 case DistanceRounding.None: return dist; … … 193 199 [Item("Geo TSP Data", "TSP that is represented by geo coordinates.")] 194 200 [StorableType("4bf58348-cd98-46c5-a4c0-55f486ca88b4")] 195 public sealed class GeoTSPData : CoordinatesTSPData { 196 public const double PI = 3.141592; 197 public const double RADIUS = 6378.388; 198 199 [StorableConstructor] 200 private GeoTSPData(StorableConstructorFlag _) : base(_) { } 201 private GeoTSPData(GeoTSPData original, Cloner cloner) : base(original, cloner) { } 201 public class GeoTSPData : CoordinatesTSPData { 202 [StorableConstructor] 203 protected GeoTSPData(StorableConstructorFlag _) : base(_) { } 204 protected GeoTSPData(GeoTSPData original, Cloner cloner) : base(original, cloner) { } 202 205 public GeoTSPData() : base() { } 203 206 public GeoTSPData(string name, double[,] coordinates) : base(name, coordinates) { } … … 209 212 210 213 public override double GetDistance(double fromX, double fromY, double toX, double toY) { 211 double latitude1, longitude1, latitude2, longitude2; 212 double q1, q2, q3; 213 double length; 214 215 latitude1 = ConvertToRadian(fromX); 216 longitude1 = ConvertToRadian(fromY); 217 latitude2 = ConvertToRadian(toX); 218 longitude2 = ConvertToRadian(toY); 219 220 q1 = Math.Cos(longitude1 - longitude2); 221 q2 = Math.Cos(latitude1 - latitude2); 222 q3 = Math.Cos(latitude1 + latitude2); 223 224 length = (int)(RADIUS * Math.Acos(0.5 * ((1.0 + q1) * q2 - (1.0 - q1) * q3)) + 1.0); 225 return (length); 226 } 227 228 private double ConvertToRadian(double x) { 229 return PI * (Math.Truncate(x) + 5.0 * (x - Math.Truncate(x)) / 3.0) / 180.0; 214 return DistanceHelper.GeoDistance(fromX, fromY, toX, toY); 230 215 } 231 216 … … 237 222 Dimension = Coordinates.Rows, 238 223 DistanceMeasure = DistanceMeasure.Geo 224 }; 225 } 226 } 227 228 [Item("ATT TSP Data", "TSP that is represented by ATT coordinates.")] 229 [StorableType("d7a0add3-6ec1-42e0-b1d7-b6454694d485")] 230 public class AttTSPData : CoordinatesTSPData { 231 [StorableConstructor] 232 protected AttTSPData(StorableConstructorFlag _) : base(_) { } 233 protected AttTSPData(AttTSPData original, Cloner cloner) : base(original, cloner) { } 234 public AttTSPData() : base() { } 235 public AttTSPData(string name, double[,] coordinates) : base(name, coordinates) { } 236 public AttTSPData(string name, DoubleMatrix coordinates) : base(name, coordinates) { } 237 238 public override IDeepCloneable Clone(Cloner cloner) { 239 return new AttTSPData(this, cloner); 240 } 241 242 public override double GetDistance(double fromX, double fromY, double toX, double toY) { 243 return DistanceHelper.AttDistance(fromX, fromY, toX, toY); 244 } 245 246 public override TSPData Export() { 247 return new TSPData() { 248 Name = name, 249 Description = description, 250 Coordinates = Coordinates.CloneAsMatrix(), 251 Dimension = Coordinates.Rows, 252 DistanceMeasure = DistanceMeasure.Att 253 }; 254 } 255 } 256 257 [Item("Manhattan TSP Data", "TSP that is represented by Manhattan coordinates.")] 258 [StorableType("5f1ef9e2-cbd1-400e-8f87-6855f091fc9e")] 259 public class ManhattanTSPData : CoordinatesTSPData { 260 [StorableConstructor] 261 protected ManhattanTSPData(StorableConstructorFlag _) : base(_) { } 262 protected ManhattanTSPData(ManhattanTSPData original, Cloner cloner) : base(original, cloner) { } 263 public ManhattanTSPData() : base() { } 264 public ManhattanTSPData(string name, double[,] coordinates) : base(name, coordinates) { } 265 public ManhattanTSPData(string name, DoubleMatrix coordinates) : base(name, coordinates) { } 266 267 public override IDeepCloneable Clone(Cloner cloner) { 268 return new ManhattanTSPData(this, cloner); 269 } 270 271 public override double GetDistance(double fromX, double fromY, double toX, double toY) { 272 return DistanceHelper.ManhattanDistance(fromX, fromY, toX, toY); 273 } 274 275 public override TSPData Export() { 276 return new TSPData() { 277 Name = name, 278 Description = description, 279 Coordinates = Coordinates.CloneAsMatrix(), 280 Dimension = Coordinates.Rows, 281 DistanceMeasure = DistanceMeasure.Manhattan 282 }; 283 } 284 } 285 286 [Item("Manhattan TSP Data", "TSP that is represented by the maximum absolute distance in either x or y coordinates.")] 287 [StorableType("c6294a6c-fe62-4906-9765-4bc306d3e4a8")] 288 public class MaximumTSPData : CoordinatesTSPData { 289 [StorableConstructor] 290 protected MaximumTSPData(StorableConstructorFlag _) : base(_) { } 291 protected MaximumTSPData(MaximumTSPData original, Cloner cloner) : base(original, cloner) { } 292 public MaximumTSPData() : base() { } 293 public MaximumTSPData(string name, double[,] coordinates) : base(name, coordinates) { } 294 public MaximumTSPData(string name, DoubleMatrix coordinates) : base(name, coordinates) { } 295 296 public override IDeepCloneable Clone(Cloner cloner) { 297 return new MaximumTSPData(this, cloner); 298 } 299 300 public override double GetDistance(double fromX, double fromY, double toX, double toY) { 301 return DistanceHelper.MaximumDistance(fromX, fromY, toX, toY); 302 } 303 304 public override TSPData Export() { 305 return new TSPData() { 306 Name = name, 307 Description = description, 308 Coordinates = Coordinates.CloneAsMatrix(), 309 Dimension = Coordinates.Rows, 310 DistanceMeasure = DistanceMeasure.Maximum 239 311 }; 240 312 }
Note: See TracChangeset
for help on using the changeset viewer.