Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/17/19 21:40:30 (5 years ago)
Author:
abeham
Message:

#2521: Refactored pTSP to use compositional pattern

Location:
branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3
Files:
3 edited

Legend:

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

    r17320 r17335  
    143143      Description = data.Description;
    144144
    145       if (data.Dimension <= DistanceMatrixSizeLimit) {
    146         TSPData = new MatrixTSPData(data.Name, data.GetDistanceMatrix(), data.Coordinates) { Description = data.Description };
    147       } else if (data.DistanceMeasure == DistanceMeasure.Direct && data.Distances != null) {
    148         TSPData = new MatrixTSPData(data.Name, data.Distances, data.Coordinates) { Description = data.Description };
    149       } else {
    150         switch (data.DistanceMeasure) {
    151           case DistanceMeasure.Att:
    152             TSPData = new AttTSPData(data.Name, data.Coordinates) { Description = data.Description };
    153             break;
    154           case DistanceMeasure.Euclidean:
    155             TSPData = new EuclideanTSPData(data.Name, data.Coordinates, EuclideanTSPData.DistanceRounding.None) { Description = data.Description };
    156             break;
    157           case DistanceMeasure.RoundedEuclidean:
    158             TSPData = new EuclideanTSPData(data.Name, data.Coordinates, EuclideanTSPData.DistanceRounding.Midpoint) { Description = data.Description };
    159             break;
    160           case DistanceMeasure.UpperEuclidean:
    161             TSPData = new EuclideanTSPData(data.Name, data.Coordinates, EuclideanTSPData.DistanceRounding.Ceiling) { Description = data.Description };
    162             break;
    163           case DistanceMeasure.Geo:
    164             TSPData = new GeoTSPData(data.Name, data.Coordinates) { Description = data.Description };
    165             break;
    166           case DistanceMeasure.Manhattan:
    167             TSPData = new ManhattanTSPData(data.Name, data.Coordinates) { Description = data.Description };
    168             break;
    169           case DistanceMeasure.Maximum:
    170             TSPData = new MaximumTSPData(data.Name, data.Coordinates) { Description = data.Description };
    171             break;
    172           default:
    173             throw new System.IO.InvalidDataException("An unknown distance measure is given in the instance!");
    174         }
    175       }
     145      TSPData = GetDataFromInstance(data);
    176146      BestKnownSolution = null;
    177147      BestKnownQuality = double.NaN;
     
    181151          var tour = new Permutation(PermutationTypes.RelativeUndirected, data.BestKnownTour);
    182152          var tourLength = Evaluate(tour);
    183           BestKnownSolution = new TSPSolution(data.Coordinates != null ? new DoubleMatrix(data.Coordinates) : null, tour, new DoubleValue(tourLength));
     153          BestKnownSolution = new TSPSolution(TSPData, tour, new DoubleValue(tourLength));
    184154          BestKnownQuality = tourLength;
    185155        } catch (InvalidOperationException) {
     
    191161      }
    192162      OnReset();
     163    }
     164
     165    public static ITSPData GetDataFromInstance(TSPData input) {
     166      ITSPData tspData = null;
     167      if (input.Dimension <= DistanceMatrixSizeLimit) {
     168        tspData = new MatrixTSPData(input.Name, input.GetDistanceMatrix(), input.Coordinates) { Description = input.Description };
     169      } else if (input.DistanceMeasure == DistanceMeasure.Direct && input.Distances != null) {
     170        tspData = new MatrixTSPData(input.Name, input.Distances, input.Coordinates) { Description = input.Description };
     171      } else {
     172        switch (input.DistanceMeasure) {
     173          case DistanceMeasure.Att:
     174            tspData = new AttTSPData(input.Name, input.Coordinates) { Description = input.Description };
     175            break;
     176          case DistanceMeasure.Euclidean:
     177            tspData = new EuclideanTSPData(input.Name, input.Coordinates, EuclideanTSPData.DistanceRounding.None) { Description = input.Description };
     178            break;
     179          case DistanceMeasure.RoundedEuclidean:
     180            tspData = new EuclideanTSPData(input.Name, input.Coordinates, EuclideanTSPData.DistanceRounding.Midpoint) { Description = input.Description };
     181            break;
     182          case DistanceMeasure.UpperEuclidean:
     183            tspData = new EuclideanTSPData(input.Name, input.Coordinates, EuclideanTSPData.DistanceRounding.Ceiling) { Description = input.Description };
     184            break;
     185          case DistanceMeasure.Geo:
     186            tspData = new GeoTSPData(input.Name, input.Coordinates) { Description = input.Description };
     187            break;
     188          case DistanceMeasure.Manhattan:
     189            tspData = new ManhattanTSPData(input.Name, input.Coordinates) { Description = input.Description };
     190            break;
     191          case DistanceMeasure.Maximum:
     192            tspData = new MaximumTSPData(input.Name, input.Coordinates) { Description = input.Description };
     193            break;
     194          default:
     195            throw new System.IO.InvalidDataException("An unknown distance measure is given in the instance!");
     196        }
     197      }
     198      return tspData;
    193199    }
    194200
  • branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPData.cs

    r17254 r17335  
    4040  [Item("Matrix-based TSP Data", "TSP that is representd by a distance matrix.")]
    4141  [StorableType("4df58a35-679d-4414-b815-9450ae100823")]
    42   public class MatrixTSPData : NamedItem, ITSPData {
    43     [Storable] public DoubleMatrix Matrix { get; protected set; }
    44     [Storable] public DoubleMatrix DisplayCoordinates { get; protected set; }
     42  public sealed class MatrixTSPData : NamedItem, ITSPData {
     43    [Storable] public DoubleMatrix Matrix { get; private set; }
     44    [Storable] public DoubleMatrix DisplayCoordinates { get; private set; }
    4545
    4646    public int Cities => Matrix.Rows;
    4747
    4848    [StorableConstructor]
    49     protected  MatrixTSPData(StorableConstructorFlag _) : base(_) { }
    50     protected MatrixTSPData(MatrixTSPData original, Cloner cloner) : base(original, cloner) {
     49    private  MatrixTSPData(StorableConstructorFlag _) : base(_) { }
     50    private MatrixTSPData(MatrixTSPData original, Cloner cloner) : base(original, cloner) {
    5151      Matrix = original.Matrix;
    5252      DisplayCoordinates = original.DisplayCoordinates;
     
    7676    }
    7777
    78     public virtual ITSPSolution GetSolution(Permutation tour, double tourLength) {
    79       return new TSPSolution(DisplayCoordinates, tour, new DoubleValue(tourLength));
     78    public ITSPSolution GetSolution(Permutation tour, double tourLength) {
     79      return new TSPSolution(this, tour, new DoubleValue(tourLength));
    8080    }
    8181
     
    135135
    136136    public virtual ITSPSolution GetSolution(Permutation tour, double tourLength) {
    137       return new TSPSolution(Coordinates, tour, new DoubleValue(tourLength));
     137      return new TSPSolution(this, tour, new DoubleValue(tourLength));
    138138    }
    139139
     
    143143  [Item("Euclidean TSP Data", "TSP that is represented by coordinates in an Euclidean plane.")]
    144144  [StorableType("4bf58348-cd98-46c5-a4c0-55f486ca88b4")]
    145   public class EuclideanTSPData : CoordinatesTSPData {
     145  public sealed class EuclideanTSPData : CoordinatesTSPData {
    146146    public enum DistanceRounding { None, Midpoint, Ceiling }
    147147
    148148    [Storable]
    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) {
     149    public DistanceRounding Rounding { get; private set; }
     150
     151    [StorableConstructor]
     152    private EuclideanTSPData(StorableConstructorFlag _) : base(_) { }
     153    private EuclideanTSPData(EuclideanTSPData original, Cloner cloner) : base(original, cloner) {
    154154      Rounding = original.Rounding;
    155155    }
     
    199199  [Item("Geo TSP Data", "TSP that is represented by geo coordinates.")]
    200200  [StorableType("dc859a89-e6c2-4af3-a3b6-9aa3041b14a9")]
    201   public class GeoTSPData : CoordinatesTSPData {
    202     [StorableConstructor]
    203     protected GeoTSPData(StorableConstructorFlag _) : base(_) { }
    204     protected GeoTSPData(GeoTSPData original, Cloner cloner) : base(original, cloner) { }
     201  public sealed class GeoTSPData : CoordinatesTSPData {
     202    [StorableConstructor]
     203    private GeoTSPData(StorableConstructorFlag _) : base(_) { }
     204    private GeoTSPData(GeoTSPData original, Cloner cloner) : base(original, cloner) { }
    205205    public GeoTSPData() : base() { }
    206206    public GeoTSPData(string name, double[,] coordinates) : base(name, coordinates) { }
     
    228228  [Item("ATT TSP Data", "TSP that is represented by ATT coordinates.")]
    229229  [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) { }
     230  public sealed class AttTSPData : CoordinatesTSPData {
     231    [StorableConstructor]
     232    private AttTSPData(StorableConstructorFlag _) : base(_) { }
     233    private AttTSPData(AttTSPData original, Cloner cloner) : base(original, cloner) { }
    234234    public AttTSPData() : base() { }
    235235    public AttTSPData(string name, double[,] coordinates) : base(name, coordinates) { }
     
    257257  [Item("Manhattan TSP Data", "TSP that is represented by Manhattan coordinates.")]
    258258  [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) { }
     259  public sealed class ManhattanTSPData : CoordinatesTSPData {
     260    [StorableConstructor]
     261    private ManhattanTSPData(StorableConstructorFlag _) : base(_) { }
     262    private ManhattanTSPData(ManhattanTSPData original, Cloner cloner) : base(original, cloner) { }
    263263    public ManhattanTSPData() : base() { }
    264264    public ManhattanTSPData(string name, double[,] coordinates) : base(name, coordinates) { }
     
    286286  [Item("Manhattan TSP Data", "TSP that is represented by the maximum absolute distance in either x or y coordinates.")]
    287287  [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) { }
     288  public sealed class MaximumTSPData : CoordinatesTSPData {
     289    [StorableConstructor]
     290    private MaximumTSPData(StorableConstructorFlag _) : base(_) { }
     291    private MaximumTSPData(MaximumTSPData original, Cloner cloner) : base(original, cloner) { }
    292292    public MaximumTSPData() : base() { }
    293293    public MaximumTSPData(string name, double[,] coordinates) : base(name, coordinates) { }
  • branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPSolution.cs

    r17260 r17335  
    3131  [StorableType("f08a63d9-0b83-4944-9251-42925baeb872")]
    3232  public interface ITSPSolution : IItem, INotifyPropertyChanged {
    33     DoubleMatrix Coordinates { get; }
     33    ITSPData TSPData { get; }
    3434    Permutation Tour { get; }
    3535    DoubleValue TourLength { get; }
     
    4141  [Item("TSP Solution", "Represents a tour of a Traveling Salesman Problem given in path representation which can be visualized in the GUI.")]
    4242  [StorableType("38d1aac3-3047-40d9-bcf9-4b3ca0b9f95c")]
    43   public class TSPSolution : Item, ITSPSolution {
     43  public sealed class TSPSolution : Item, ITSPSolution {
    4444    public static new Image StaticItemImage {
    4545      get { return HeuristicLab.Common.Resources.VSImageLibrary.Image; }
     
    4747
    4848    [Storable]
    49     private DoubleMatrix coordinates;
    50     public DoubleMatrix Coordinates {
    51       get { return coordinates; }
     49    private ITSPData tspData;
     50    public ITSPData TSPData {
     51      get { return tspData; }
    5252      set {
    53         if (coordinates == value) return;
    54         coordinates = value;
    55         OnPropertyChanged(nameof(Coordinates));
     53        if (tspData == value) return;
     54        tspData = value;
     55        OnPropertyChanged(nameof(TSPData));
    5656      }
    5757    }
     
    7979
    8080    [StorableConstructor]
    81     protected TSPSolution(StorableConstructorFlag _) : base(_) { }
    82     protected TSPSolution(TSPSolution original, Cloner cloner)
     81    private TSPSolution(StorableConstructorFlag _) : base(_) { }
     82    private TSPSolution(TSPSolution original, Cloner cloner)
    8383      : base(original, cloner) {
    84       this.coordinates = cloner.Clone(original.coordinates);
     84      this.tspData = cloner.Clone(original.tspData);
    8585      this.tour = cloner.Clone(original.tour);
    8686      this.tourLength = cloner.Clone(original.tourLength);
    8787    }
    8888    public TSPSolution() : base() { }
    89     public TSPSolution(DoubleMatrix coordinates)
     89    public TSPSolution(ITSPData data)
    9090      : base() {
    91       this.coordinates = coordinates;
     91      this.tspData = data;
    9292    }
    93     public TSPSolution(DoubleMatrix coordinates, Permutation permutation)
     93    public TSPSolution(ITSPData data, Permutation permutation)
    9494      : base() {
    95       this.coordinates = coordinates;
     95      this.tspData = data;
    9696      this.tour = permutation;
    9797    }
    98     public TSPSolution(DoubleMatrix coordinates, Permutation permutation, DoubleValue quality)
     98    public TSPSolution(ITSPData data, Permutation permutation, DoubleValue quality)
    9999      : base() {
    100       this.coordinates = coordinates;
     100      this.tspData = data;
    101101      this.tour = permutation;
    102102      this.tourLength = quality;
     
    108108
    109109    public event PropertyChangedEventHandler PropertyChanged;
    110     protected void OnPropertyChanged(string property) {
     110    private void OnPropertyChanged(string property) {
    111111      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
    112112    }
Note: See TracChangeset for help on using the changeset viewer.