- Timestamp:
- 10/17/19 21:40:30 (5 years ago)
- 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 143 143 Description = data.Description; 144 144 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); 176 146 BestKnownSolution = null; 177 147 BestKnownQuality = double.NaN; … … 181 151 var tour = new Permutation(PermutationTypes.RelativeUndirected, data.BestKnownTour); 182 152 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)); 184 154 BestKnownQuality = tourLength; 185 155 } catch (InvalidOperationException) { … … 191 161 } 192 162 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; 193 199 } 194 200 -
branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPData.cs
r17254 r17335 40 40 [Item("Matrix-based TSP Data", "TSP that is representd by a distance matrix.")] 41 41 [StorableType("4df58a35-679d-4414-b815-9450ae100823")] 42 public class MatrixTSPData : NamedItem, ITSPData {43 [Storable] public DoubleMatrix Matrix { get; pr otectedset; }44 [Storable] public DoubleMatrix DisplayCoordinates { get; pr otectedset; }42 public sealed class MatrixTSPData : NamedItem, ITSPData { 43 [Storable] public DoubleMatrix Matrix { get; private set; } 44 [Storable] public DoubleMatrix DisplayCoordinates { get; private set; } 45 45 46 46 public int Cities => Matrix.Rows; 47 47 48 48 [StorableConstructor] 49 pr otectedMatrixTSPData(StorableConstructorFlag _) : base(_) { }50 pr otectedMatrixTSPData(MatrixTSPData original, Cloner cloner) : base(original, cloner) {49 private MatrixTSPData(StorableConstructorFlag _) : base(_) { } 50 private MatrixTSPData(MatrixTSPData original, Cloner cloner) : base(original, cloner) { 51 51 Matrix = original.Matrix; 52 52 DisplayCoordinates = original.DisplayCoordinates; … … 76 76 } 77 77 78 public virtualITSPSolution 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)); 80 80 } 81 81 … … 135 135 136 136 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)); 138 138 } 139 139 … … 143 143 [Item("Euclidean TSP Data", "TSP that is represented by coordinates in an Euclidean plane.")] 144 144 [StorableType("4bf58348-cd98-46c5-a4c0-55f486ca88b4")] 145 public class EuclideanTSPData : CoordinatesTSPData {145 public sealed class EuclideanTSPData : CoordinatesTSPData { 146 146 public enum DistanceRounding { None, Midpoint, Ceiling } 147 147 148 148 [Storable] 149 public DistanceRounding Rounding { get; pr otectedset; }150 151 [StorableConstructor] 152 pr otectedEuclideanTSPData(StorableConstructorFlag _) : base(_) { }153 pr otectedEuclideanTSPData(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) { 154 154 Rounding = original.Rounding; 155 155 } … … 199 199 [Item("Geo TSP Data", "TSP that is represented by geo coordinates.")] 200 200 [StorableType("dc859a89-e6c2-4af3-a3b6-9aa3041b14a9")] 201 public class GeoTSPData : CoordinatesTSPData {202 [StorableConstructor] 203 pr otectedGeoTSPData(StorableConstructorFlag _) : base(_) { }204 pr otectedGeoTSPData(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) { } 205 205 public GeoTSPData() : base() { } 206 206 public GeoTSPData(string name, double[,] coordinates) : base(name, coordinates) { } … … 228 228 [Item("ATT TSP Data", "TSP that is represented by ATT coordinates.")] 229 229 [StorableType("d7a0add3-6ec1-42e0-b1d7-b6454694d485")] 230 public class AttTSPData : CoordinatesTSPData {231 [StorableConstructor] 232 pr otectedAttTSPData(StorableConstructorFlag _) : base(_) { }233 pr otectedAttTSPData(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) { } 234 234 public AttTSPData() : base() { } 235 235 public AttTSPData(string name, double[,] coordinates) : base(name, coordinates) { } … … 257 257 [Item("Manhattan TSP Data", "TSP that is represented by Manhattan coordinates.")] 258 258 [StorableType("5f1ef9e2-cbd1-400e-8f87-6855f091fc9e")] 259 public class ManhattanTSPData : CoordinatesTSPData {260 [StorableConstructor] 261 pr otectedManhattanTSPData(StorableConstructorFlag _) : base(_) { }262 pr otectedManhattanTSPData(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) { } 263 263 public ManhattanTSPData() : base() { } 264 264 public ManhattanTSPData(string name, double[,] coordinates) : base(name, coordinates) { } … … 286 286 [Item("Manhattan TSP Data", "TSP that is represented by the maximum absolute distance in either x or y coordinates.")] 287 287 [StorableType("c6294a6c-fe62-4906-9765-4bc306d3e4a8")] 288 public class MaximumTSPData : CoordinatesTSPData {289 [StorableConstructor] 290 pr otectedMaximumTSPData(StorableConstructorFlag _) : base(_) { }291 pr otectedMaximumTSPData(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) { } 292 292 public MaximumTSPData() : base() { } 293 293 public MaximumTSPData(string name, double[,] coordinates) : base(name, coordinates) { } -
branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPSolution.cs
r17260 r17335 31 31 [StorableType("f08a63d9-0b83-4944-9251-42925baeb872")] 32 32 public interface ITSPSolution : IItem, INotifyPropertyChanged { 33 DoubleMatrix Coordinates{ get; }33 ITSPData TSPData { get; } 34 34 Permutation Tour { get; } 35 35 DoubleValue TourLength { get; } … … 41 41 [Item("TSP Solution", "Represents a tour of a Traveling Salesman Problem given in path representation which can be visualized in the GUI.")] 42 42 [StorableType("38d1aac3-3047-40d9-bcf9-4b3ca0b9f95c")] 43 public class TSPSolution : Item, ITSPSolution {43 public sealed class TSPSolution : Item, ITSPSolution { 44 44 public static new Image StaticItemImage { 45 45 get { return HeuristicLab.Common.Resources.VSImageLibrary.Image; } … … 47 47 48 48 [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; } 52 52 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)); 56 56 } 57 57 } … … 79 79 80 80 [StorableConstructor] 81 pr otectedTSPSolution(StorableConstructorFlag _) : base(_) { }82 pr otectedTSPSolution(TSPSolution original, Cloner cloner)81 private TSPSolution(StorableConstructorFlag _) : base(_) { } 82 private TSPSolution(TSPSolution original, Cloner cloner) 83 83 : base(original, cloner) { 84 this. coordinates = cloner.Clone(original.coordinates);84 this.tspData = cloner.Clone(original.tspData); 85 85 this.tour = cloner.Clone(original.tour); 86 86 this.tourLength = cloner.Clone(original.tourLength); 87 87 } 88 88 public TSPSolution() : base() { } 89 public TSPSolution( DoubleMatrix coordinates)89 public TSPSolution(ITSPData data) 90 90 : base() { 91 this. coordinates = coordinates;91 this.tspData = data; 92 92 } 93 public TSPSolution( DoubleMatrix coordinates, Permutation permutation)93 public TSPSolution(ITSPData data, Permutation permutation) 94 94 : base() { 95 this. coordinates = coordinates;95 this.tspData = data; 96 96 this.tour = permutation; 97 97 } 98 public TSPSolution( DoubleMatrix coordinates, Permutation permutation, DoubleValue quality)98 public TSPSolution(ITSPData data, Permutation permutation, DoubleValue quality) 99 99 : base() { 100 this. coordinates = coordinates;100 this.tspData = data; 101 101 this.tour = permutation; 102 102 this.tourLength = quality; … … 108 108 109 109 public event PropertyChangedEventHandler PropertyChanged; 110 pr otectedvoid OnPropertyChanged(string property) {110 private void OnPropertyChanged(string property) { 111 111 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); 112 112 }
Note: See TracChangeset
for help on using the changeset viewer.