Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/PTSPData.cs @ 17253

Last change on this file since 17253 was 17253, checked in by abeham, 5 years ago

#2521: worked on refactoring PTSP

File size: 15.7 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using HEAL.Attic;
24using HeuristicLab.Common;
25using HeuristicLab.Core;
26using HeuristicLab.Data;
27using HeuristicLab.Problems.Instances;
28using HeuristicLab.Problems.TravelingSalesman;
29
30namespace HeuristicLab.Problems.PTSP {
31  [StorableType("dd2d0ecc-372e-46f1-846f-fb4ca2afa124")]
32  public interface IProbabilisticTSPData : ITSPData {
33    double GetProbability(int city);
34    new PTSPData Export();
35  }
36
37  [Item("Matrix-based p-TSP Data", "p-TSP that is representd by a distance matrix.")]
38  [StorableType("30ebade1-d28c-4e45-b195-c7fa32a15df5")]
39  public class MatrixProbabilisticTSPData : MatrixTSPData, IProbabilisticTSPData {
40    [Storable] public PercentArray Probabilities { get; protected set; }
41
42    [StorableConstructor]
43    protected MatrixProbabilisticTSPData(StorableConstructorFlag _) : base(_) { }
44    protected MatrixProbabilisticTSPData(MatrixProbabilisticTSPData original, Cloner cloner) : base(original, cloner) {
45      Probabilities = original.Probabilities;
46    }
47    public MatrixProbabilisticTSPData() {
48      Name = PTSPDefaultInstance.Name;
49      Matrix = PTSPDefaultInstance.Distances;
50      Probabilities = PTSPDefaultInstance.Probabilities;
51      DisplayCoordinates = PTSPDefaultInstance.Coordinates;
52    }
53    public MatrixProbabilisticTSPData(string name, double[,] matrix, double[] probabilities, double[,] coordinates = null)
54      : base(name, matrix, coordinates) {
55      Probabilities = new PercentArray(probabilities, @readonly: true);
56    }
57    public MatrixProbabilisticTSPData(string name, DoubleMatrix matrix, PercentArray probabilities, DoubleMatrix coordinates = null)
58      : base(name, matrix, coordinates) {
59      Probabilities = probabilities.AsReadOnly();
60    }
61
62    public override IDeepCloneable Clone(Cloner cloner) {
63      return new MatrixProbabilisticTSPData(this, cloner);
64    }
65
66    public double GetProbability(int city) => Probabilities[city];
67
68    public new PTSPData Export() {
69      return new PTSPData() {
70        Name = name,
71        Description = description,
72        Coordinates = DisplayCoordinates?.CloneAsMatrix(),
73        Dimension = Matrix.Rows,
74        DistanceMeasure = DistanceMeasure.Direct,
75        Distances = Matrix.CloneAsMatrix(),
76        Probabilities = Probabilities.CloneAsArray()
77      };
78    }
79  }
80
81  [Item("Euclidean p-TSP Data", "p-TSP that is represented by coordinates in an Euclidean plane.")]
82  [StorableType("8d4cf257-9013-4746-bc6c-37615954c3fb")]
83  public class EuclideanPTSPData : EuclideanTSPData, IProbabilisticTSPData {
84    [Storable] public PercentArray Probabilities { get; protected set; }
85
86    [StorableConstructor]
87    protected EuclideanPTSPData(StorableConstructorFlag _) : base(_) { }
88    protected EuclideanPTSPData(EuclideanPTSPData original, Cloner cloner) : base(original, cloner) {
89      Probabilities = original.Probabilities;
90    }
91    public EuclideanPTSPData() : base() {
92      Name = PTSPDefaultInstance.Name;
93      Coordinates = PTSPDefaultInstance.Coordinates;
94      Probabilities = PTSPDefaultInstance.Probabilities;
95      Rounding = DistanceRounding.Midpoint;
96    }
97    public EuclideanPTSPData(string name, double[,] coordinates, double[] probabilities, DistanceRounding rounding = DistanceRounding.None)
98      : base(name, coordinates) {
99      if (coordinates.GetLength(0) != probabilities.Length) throw new InvalidOperationException("Number of cities is ambiguous between " + nameof(coordinates) + " and " + nameof(probabilities) + ".");
100      Probabilities = new PercentArray(probabilities, @readonly: true);
101    }
102    public EuclideanPTSPData(string name, DoubleMatrix coordinates, PercentArray probabilities, DistanceRounding rounding = DistanceRounding.None)
103      : base(name, coordinates, rounding) {
104      if (coordinates.Rows != probabilities.Length) throw new InvalidOperationException("Number of cities is ambiguous between " + nameof(coordinates) + " and " + nameof(probabilities) + ".");
105      Probabilities = probabilities.AsReadOnly();
106    }
107
108    public override IDeepCloneable Clone(Cloner cloner) {
109      return new EuclideanPTSPData(this, cloner);
110    }
111
112    public double GetProbability(int city) => Probabilities[city];
113
114    public new PTSPData Export() {
115      var data = new PTSPData() {
116        Name = name,
117        Description = description,
118        Coordinates = Coordinates.CloneAsMatrix(),
119        Probabilities = Probabilities.CloneAsArray(),
120        Dimension = Coordinates.Rows,
121      };
122      switch (Rounding) {
123        case DistanceRounding.None: data.DistanceMeasure = DistanceMeasure.Euclidean; break;
124        case DistanceRounding.Midpoint: data.DistanceMeasure = DistanceMeasure.RoundedEuclidean; break;
125        case DistanceRounding.Ceiling: data.DistanceMeasure = DistanceMeasure.UpperEuclidean; break;
126      }
127      return data;
128    }
129  }
130
131  [Item("Geo p-TSP Data", "p-TSP that is represented by geo coordinates.")]
132  [StorableType("b175e0be-5706-4c44-b3f0-dcb948d5c47a")]
133  public class GeoPTSPData : GeoTSPData, IProbabilisticTSPData {
134    [Storable] public PercentArray Probabilities { get; protected set; }
135
136    [StorableConstructor]
137    protected GeoPTSPData(StorableConstructorFlag _) : base(_) { }
138    protected GeoPTSPData(GeoPTSPData original, Cloner cloner)
139      : base(original, cloner) {
140      Probabilities = original.Probabilities;
141    }
142    public GeoPTSPData() : base() {
143      Name = PTSPDefaultInstance.Name;
144      Coordinates = PTSPDefaultInstance.Coordinates;
145      Probabilities = PTSPDefaultInstance.Probabilities;
146    }
147    public GeoPTSPData(string name, double[,] coordinates, double[] probabilities)
148      : base(name, coordinates) {
149      if (coordinates.GetLength(0) != probabilities.Length) throw new InvalidOperationException("Number of cities is ambiguous between " + nameof(coordinates) + " and " + nameof(probabilities) + ".");
150      Probabilities = new PercentArray(probabilities, @readonly: true);
151    }
152    public GeoPTSPData(string name, DoubleMatrix coordinates, PercentArray probabilities)
153      : base(name, coordinates) {
154      if (coordinates.Rows != probabilities.Length) throw new InvalidOperationException("Number of cities is ambiguous between " + nameof(coordinates) + " and " + nameof(probabilities) + ".");
155      Probabilities = probabilities.AsReadOnly();
156    }
157
158    public override IDeepCloneable Clone(Cloner cloner) {
159      return new GeoPTSPData(this, cloner);
160    }
161
162    public double GetProbability(int city) => Probabilities[city];
163
164    public new PTSPData Export() {
165      return new PTSPData() {
166        Name = name,
167        Description = description,
168        Coordinates = Coordinates.CloneAsMatrix(),
169        Probabilities = Probabilities.CloneAsArray(),
170        Dimension = Coordinates.Rows,
171        DistanceMeasure = DistanceMeasure.Geo,
172      };
173    }
174  }
175
176  [Item("ATT p-TSP Data", "p-TSP that is represented by ATT distance.")]
177  [StorableType("7a2aa605-58d2-4533-a763-3d474e185460")]
178  public class AttPTSPData : AttTSPData, IProbabilisticTSPData {
179    [Storable] public PercentArray Probabilities { get; protected set; }
180
181    [StorableConstructor]
182    protected AttPTSPData(StorableConstructorFlag _) : base(_) { }
183    protected AttPTSPData(AttPTSPData original, Cloner cloner)
184      : base(original, cloner) {
185      Probabilities = original.Probabilities;
186    }
187    public AttPTSPData() : base() {
188      Name = PTSPDefaultInstance.Name;
189      Coordinates = PTSPDefaultInstance.Coordinates;
190      Probabilities = PTSPDefaultInstance.Probabilities;
191    }
192    public AttPTSPData(string name, double[,] coordinates, double[] probabilities)
193      : base(name, coordinates) {
194      if (coordinates.GetLength(0) != probabilities.Length) throw new InvalidOperationException("Number of cities is ambiguous between " + nameof(coordinates) + " and " + nameof(probabilities) + ".");
195      Probabilities = new PercentArray(probabilities, @readonly: true);
196    }
197    public AttPTSPData(string name, DoubleMatrix coordinates, PercentArray probabilities)
198      : base(name, coordinates) {
199      if (coordinates.Rows != probabilities.Length) throw new InvalidOperationException("Number of cities is ambiguous between " + nameof(coordinates) + " and " + nameof(probabilities) + ".");
200      Probabilities = probabilities.AsReadOnly();
201    }
202
203    public override IDeepCloneable Clone(Cloner cloner) {
204      return new AttPTSPData(this, cloner);
205    }
206
207    public double GetProbability(int city) => Probabilities[city];
208
209    public new PTSPData Export() {
210      return new PTSPData() {
211        Name = name,
212        Description = description,
213        Coordinates = Coordinates.CloneAsMatrix(),
214        Probabilities = Probabilities.CloneAsArray(),
215        Dimension = Coordinates.Rows,
216        DistanceMeasure = DistanceMeasure.Att,
217      };
218    }
219  }
220
221  [Item("Manhattan p-TSP Data", "p-TSP that is represented by Manhattan distance.")]
222  [StorableType("cc43d1db-3da9-4d6e-becb-6b475b42fc59")]
223  public class ManhattanPTSPData : ManhattanTSPData, IProbabilisticTSPData {
224    [Storable] public PercentArray Probabilities { get; protected set; }
225
226    [StorableConstructor]
227    protected ManhattanPTSPData(StorableConstructorFlag _) : base(_) { }
228    protected ManhattanPTSPData(ManhattanPTSPData original, Cloner cloner)
229      : base(original, cloner) {
230      Probabilities = original.Probabilities;
231    }
232    public ManhattanPTSPData() : base() {
233      Name = PTSPDefaultInstance.Name;
234      Coordinates = PTSPDefaultInstance.Coordinates;
235      Probabilities = PTSPDefaultInstance.Probabilities;
236    }
237    public ManhattanPTSPData(string name, double[,] coordinates, double[] probabilities)
238      : base(name, coordinates) {
239      if (coordinates.GetLength(0) != probabilities.Length) throw new InvalidOperationException("Number of cities is ambiguous between " + nameof(coordinates) + " and " + nameof(probabilities) + ".");
240      Probabilities = new PercentArray(probabilities, @readonly: true);
241    }
242    public ManhattanPTSPData(string name, DoubleMatrix coordinates, PercentArray probabilities)
243      : base(name, coordinates) {
244      if (coordinates.Rows != probabilities.Length) throw new InvalidOperationException("Number of cities is ambiguous between " + nameof(coordinates) + " and " + nameof(probabilities) + ".");
245      Probabilities = probabilities.AsReadOnly();
246    }
247
248    public override IDeepCloneable Clone(Cloner cloner) {
249      return new ManhattanPTSPData(this, cloner);
250    }
251
252    public double GetProbability(int city) => Probabilities[city];
253
254    public new PTSPData Export() {
255      return new PTSPData() {
256        Name = name,
257        Description = description,
258        Coordinates = Coordinates.CloneAsMatrix(),
259        Probabilities = Probabilities.CloneAsArray(),
260        Dimension = Coordinates.Rows,
261        DistanceMeasure = DistanceMeasure.Manhattan,
262      };
263    }
264  }
265
266  [Item("Maximum p-TSP Data", "p-TSP that is represented by maximum absolute distance in either the x or y coordinates.")]
267  [StorableType("82e9cde2-a942-403a-80ff-8deae4fa8214")]
268  public class MaximumPTSPData : MaximumTSPData, IProbabilisticTSPData {
269    [Storable] public PercentArray Probabilities { get; protected set; }
270
271    [StorableConstructor]
272    protected MaximumPTSPData(StorableConstructorFlag _) : base(_) { }
273    protected MaximumPTSPData(MaximumPTSPData original, Cloner cloner)
274      : base(original, cloner) {
275      Probabilities = original.Probabilities;
276    }
277    public MaximumPTSPData() : base() {
278      Name = PTSPDefaultInstance.Name;
279      Coordinates = PTSPDefaultInstance.Coordinates;
280      Probabilities = PTSPDefaultInstance.Probabilities;
281    }
282    public MaximumPTSPData(string name, double[,] coordinates, double[] probabilities)
283      : base(name, coordinates) {
284      if (coordinates.GetLength(0) != probabilities.Length) throw new InvalidOperationException("Number of cities is ambiguous between " + nameof(coordinates) + " and " + nameof(probabilities) + ".");
285      Probabilities = new PercentArray(probabilities, @readonly: true);
286    }
287    public MaximumPTSPData(string name, DoubleMatrix coordinates, PercentArray probabilities)
288      : base(name, coordinates) {
289      if (coordinates.Rows != probabilities.Length) throw new InvalidOperationException("Number of cities is ambiguous between " + nameof(coordinates) + " and " + nameof(probabilities) + ".");
290      Probabilities = probabilities.AsReadOnly();
291    }
292
293    public override IDeepCloneable Clone(Cloner cloner) {
294      return new MaximumPTSPData(this, cloner);
295    }
296
297    public double GetProbability(int city) => Probabilities[city];
298
299    public new PTSPData Export() {
300      return new PTSPData() {
301        Name = name,
302        Description = description,
303        Coordinates = Coordinates.CloneAsMatrix(),
304        Probabilities = Probabilities.CloneAsArray(),
305        Dimension = Coordinates.Rows,
306        DistanceMeasure = DistanceMeasure.Maximum,
307      };
308    }
309  }
310
311  internal static class PTSPDefaultInstance {
312    internal static readonly DoubleMatrix Distances = new DoubleMatrix(new double[,] {
313{ 0, 100, 200, 300, 100, 141, 224, 316, 200, 224, 283, 361, 300, 316, 361, 424 },
314{ 100, 0, 100, 200, 141, 100, 141, 224, 224, 200, 224, 283, 316, 300, 316, 361 },
315{ 200, 100, 0, 100, 224, 141, 100, 141, 283, 224, 200, 224, 361, 316, 300, 316 },
316{ 300, 200, 100, 0, 316, 224, 141, 100, 361, 283, 224, 200, 424, 361, 316, 300 },
317{ 100, 141, 224, 316, 0, 100, 200, 300, 100, 141, 224, 316, 200, 224, 283, 361 },
318{ 141, 100, 141, 224, 100, 0, 100, 200, 141, 100, 141, 224, 224, 200, 224, 283 },
319{ 224, 141, 100, 141, 200, 100, 0, 100, 224, 141, 100, 141, 283, 224, 200, 224 },
320{ 316, 224, 141, 100, 300, 200, 100, 0, 316, 224, 141, 100, 361, 283, 224, 200 },
321{ 200, 224, 283, 361, 100, 141, 224, 316, 0, 100, 200, 300, 100, 141, 224, 316 },
322{ 224, 200, 224, 283, 141, 100, 141, 224, 100, 0, 100, 200, 141, 100, 141, 224 },
323{ 283, 224, 200, 224, 224, 141, 100, 141, 200, 100, 0, 100, 224, 141, 100, 141 },
324{ 361, 283, 224, 200, 316, 224, 141, 100, 300, 200, 100, 0, 316, 224, 141, 100 },
325{ 300, 316, 361, 424, 200, 224, 283, 361, 100, 141, 224, 316, 0, 100, 200, 300 },
326{ 316, 300, 316, 361, 224, 200, 224, 283, 141, 100, 141, 224, 100, 0, 100, 200 },
327{ 361, 316, 300, 316, 283, 224, 200, 224, 224, 141, 100, 141, 200, 100, 0, 100 },
328{ 424, 361, 316, 300, 361, 283, 224, 200, 316, 224, 141, 100, 300, 200, 100, 0 },
329}, @readonly: true);
330    internal static readonly DoubleMatrix Coordinates = new DoubleMatrix(new double[,] {
331{ 100, 100 }, { 100, 200 }, { 100, 300 }, { 100, 400 },
332{ 200, 100 }, { 200, 200 }, { 200, 300 }, { 200, 400 },
333{ 300, 100 }, { 300, 200 }, { 300, 300 }, { 300, 400 },
334{ 400, 100 }, { 400, 200 }, { 400, 300 }, { 400, 400 }
335}, @readonly: true);
336    internal static readonly PercentArray Probabilities = new PercentArray(new double[] {
3370.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.3, 0.4, 0.5
338}, @readonly: true);
339    internal static readonly string Name = "HL PTSP Default";
340  }
341}
Note: See TracBrowser for help on using the repository browser.