Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
09/16/19 16:12:21 (5 years ago)
Author:
abeham
Message:

#2521: worked on refactoring PTSP

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPData.cs

    r17251 r17253  
    3131  [StorableType("1a9bf60c-b6a6-4c95-8e99-5a2dec0ee892")]
    3232  public interface ITSPData : INamedItem {
     33    int Cities { get; }
     34
    3335    double GetDistance(int fromCity, int toCity);
    3436    ITSPSolution GetSolution(Permutation tspTour, double tourLength);
     
    3840  [Item("Matrix-based TSP Data", "TSP that is representd by a distance matrix.")]
    3941  [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) {
    4751      Matrix = original.Matrix;
    4852      DisplayCoordinates = original.DisplayCoordinates;
     
    6872        throw new ArgumentException("Unequal number of rows in " + nameof(matrix) + " and " + nameof(coordinates) + ".");
    6973      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) {
    7579      return new TSPSolution(DisplayCoordinates, tour, new DoubleValue(tourLength));
    7680    }
     
    97101  [StorableType("3955d07a-d43c-4a01-9505-d2effb1ea865")]
    98102  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;
    100106
    101107    [StorableConstructor]
     
    118124      if (coordinates.Columns != 2) throw new ArgumentException("Argument must have exactly two columns.", nameof(coordinates));
    119125      Name = name;
    120       Coordinates = (DoubleMatrix)coordinates.AsReadOnly();
     126      Coordinates = coordinates.AsReadOnly();
    121127    }
    122128
     
    128134    public abstract double GetDistance(double fromX, double fromY, double toX, double toY);
    129135
    130     public ITSPSolution GetSolution(Permutation tour, double tourLength) {
     136    public virtual ITSPSolution GetSolution(Permutation tour, double tourLength) {
    131137      return new TSPSolution(Coordinates, tour, new DoubleValue(tourLength));
    132138    }
     
    137143  [Item("Euclidean TSP Data", "TSP that is represented by coordinates in an Euclidean plane.")]
    138144  [StorableType("4bf58348-cd98-46c5-a4c0-55f486ca88b4")]
    139   public sealed class EuclideanTSPData : CoordinatesTSPData {
     145  public class EuclideanTSPData : CoordinatesTSPData {
    140146    public enum DistanceRounding { None, Midpoint, Ceiling }
    141147
    142148    [Storable]
    143     public DistanceRounding Rounding { get; private set; }
    144 
    145     [StorableConstructor]
    146     private EuclideanTSPData(StorableConstructorFlag _) : base(_) { }
    147     private EuclideanTSPData(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) {
    148154      Rounding = original.Rounding;
    149155    }
     
    166172
    167173    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);
    169175      switch (Rounding) {
    170176        case DistanceRounding.None: return dist;
     
    193199  [Item("Geo TSP Data", "TSP that is represented by geo coordinates.")]
    194200  [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) { }
    202205    public GeoTSPData() : base() { }
    203206    public GeoTSPData(string name, double[,] coordinates) : base(name, coordinates) { }
     
    209212
    210213    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);
    230215    }
    231216
     
    237222        Dimension = Coordinates.Rows,
    238223        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
    239311      };
    240312    }
Note: See TracChangeset for help on using the changeset viewer.