Changeset 13412 for branches/PTSP/HeuristicLab.Problems.PTSP/3.3/PTSP.cs
- Timestamp:
- 11/28/15 23:38:51 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PTSP/HeuristicLab.Problems.PTSP/3.3/PTSP.cs
r13202 r13412 20 20 #endregion 21 21 22 using System; 22 23 using HeuristicLab.Common; 23 24 using HeuristicLab.Core; … … 30 31 31 32 namespace HeuristicLab.Problems.PTSP { 32 [Item("Probabilistic Traveling Salesman Problem ", "Represents a Probabilistic Traveling Salesman Problem.")]33 [Item("Probabilistic Traveling Salesman Problem (PTSP)", "Represents a Probabilistic Traveling Salesman Problem.")] 33 34 [StorableClass] 34 public abstract class ProbabilisticTravelingSalesmanProblem : SingleObjectiveBasicProblem<PermutationEncoding>, IStorableContent,35 public abstract class ProbabilisticTravelingSalesmanProblem : SingleObjectiveBasicProblem<PermutationEncoding>, 35 36 IProblemInstanceConsumer<PTSPData> { 36 37 private static readonly int DistanceMatrixSizeLimit = 1000; … … 40 41 get { return (OptionalValueParameter<DoubleMatrix>)Parameters["Coordinates"]; } 41 42 } 43 public OptionalValueParameter<DistanceCalculator> DistanceCalculatorParameter { 44 get { return (OptionalValueParameter<DistanceCalculator>)Parameters["DistanceCalculator"]; } 45 } 42 46 public OptionalValueParameter<DistanceMatrix> DistanceMatrixParameter { 43 47 get { return (OptionalValueParameter<DistanceMatrix>)Parameters["DistanceMatrix"]; } 44 48 } 45 public ValueParameter<BoolValue> UseDistanceMatrixParameter {46 get { return ( ValueParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }49 public IFixedValueParameter<BoolValue> UseDistanceMatrixParameter { 50 get { return (IFixedValueParameter<BoolValue>)Parameters["UseDistanceMatrix"]; } 47 51 } 48 52 public OptionalValueParameter<Permutation> BestKnownSolutionParameter { 49 53 get { return (OptionalValueParameter<Permutation>)Parameters["BestKnownSolution"]; } 50 54 } 51 public ValueParameter<DoubleArray> ProbabilityMatrixParameter {52 get { return ( ValueParameter<DoubleArray>)Parameters["ProbabilityMatrix"]; }55 public IValueParameter<DoubleArray> ProbabilitiesParameter { 56 get { return (IValueParameter<DoubleArray>)Parameters["Probabilities"]; } 53 57 } 54 55 56 58 #endregion 57 59 … … 61 63 set { CoordinatesParameter.Value = value; } 62 64 } 65 public DistanceCalculator DistanceCalculator { 66 get { return DistanceCalculatorParameter.Value; } 67 set { DistanceCalculatorParameter.Value = value; } 68 } 63 69 public DistanceMatrix DistanceMatrix { 64 70 get { return DistanceMatrixParameter.Value; } 65 71 set { DistanceMatrixParameter.Value = value; } 66 72 } 67 public BoolValueUseDistanceMatrix {68 get { return UseDistanceMatrixParameter.Value ; }69 set { UseDistanceMatrixParameter.Value = value; }73 public bool UseDistanceMatrix { 74 get { return UseDistanceMatrixParameter.Value.Value; } 75 set { UseDistanceMatrixParameter.Value.Value = value; } 70 76 } 71 77 public Permutation BestKnownSolution { … … 73 79 set { BestKnownSolutionParameter.Value = value; } 74 80 } 75 public DoubleArray Probabilit yMatrix{76 get { return Probabilit yMatrixParameter.Value; }77 set { Probabilit yMatrixParameter.Value = value; }81 public DoubleArray Probabilities { 82 get { return ProbabilitiesParameter.Value; } 83 set { ProbabilitiesParameter.Value = value; } 78 84 } 79 85 80 86 #endregion 81 82 87 83 88 public override bool Maximization { … … 87 92 [StorableConstructor] 88 93 protected ProbabilisticTravelingSalesmanProblem(bool deserializing) : base(deserializing) { } 89 protected ProbabilisticTravelingSalesmanProblem(ProbabilisticTravelingSalesmanProblem original, Cloner cloner) 90 : base(original, cloner) { 91 } 92 93 public ProbabilisticTravelingSalesmanProblem() { 94 protected ProbabilisticTravelingSalesmanProblem(ProbabilisticTravelingSalesmanProblem original, Cloner cloner) : base(original, cloner) { } 95 protected ProbabilisticTravelingSalesmanProblem() { 94 96 Parameters.Add(new OptionalValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities.")); 97 Parameters.Add(new OptionalValueParameter<DistanceCalculator>("DistanceCalculator", "Calculates the distance between two rows in the coordinates matrix.")); 95 98 Parameters.Add(new OptionalValueParameter<DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities.")); 96 Parameters.Add(new ValueParameter<BoolValue>("UseDistanceMatrix", "True if the coordinates based evaluators should calculate the distance matrix from the coordinates and use it for evaluation similar to the distance matrix evaluator, otherwise false.", new BoolValue(true)));99 Parameters.Add(new FixedValueParameter<BoolValue>("UseDistanceMatrix", "True if the coordinates based evaluators should calculate the distance matrix from the coordinates and use it for evaluation similar to the distance matrix evaluator, otherwise false.", new BoolValue(true))); 97 100 Parameters.Add(new OptionalValueParameter<Permutation>("BestKnownSolution", "The best known solution of this TSP instance.")); 98 Parameters.Add(new ValueParameter<DoubleArray>("Probabilit yMatrix", "The matrix which contains the probabilities of each of the cities."));101 Parameters.Add(new ValueParameter<DoubleArray>("Probabilities", "This list describes for each city the probability of appearing in a realized instance.")); 99 102 100 103 Coordinates = new DoubleMatrix(new double[,] { … … 105 108 }); 106 109 107 ProbabilityMatrix = new DoubleArray(new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }); 110 Probabilities = new DoubleArray(new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }); 111 } 108 112 113 public override double Evaluate(Individual individual, IRandom random) { 114 return Evaluate(individual.Permutation(), random); 109 115 } 116 117 public abstract double Evaluate(Permutation tour, IRandom random); 110 118 111 119 public virtual void Load(PTSPData data) { 112 120 if (data.Coordinates == null && data.Distances == null) 113 121 throw new System.IO.InvalidDataException("The given instance specifies neither coordinates nor distances!"); 114 if (data.Dimension > DistanceMatrixSizeLimit && (data.DistanceMeasure == DistanceMeasure.Att 115 || data.DistanceMeasure == DistanceMeasure.Manhattan 116 || data.DistanceMeasure == DistanceMeasure.Maximum)) 117 throw new System.IO.InvalidDataException("The given instance uses an unsupported distance measure and is too large for using a distance matrix."); 118 if (data.Coordinates != null && data.Coordinates.GetLength(1) != 2) 119 throw new System.IO.InvalidDataException("The coordinates of the given instance are not in the right format, there need to be one row for each customer and two columns for the x and y coordinates."); 122 if (data.Dimension > DistanceMatrixSizeLimit && (data.Coordinates == null || data.Coordinates.GetLength(0) != data.Dimension || data.Coordinates.GetLength(1) != 2)) 123 throw new System.IO.InvalidDataException("The given instance is too large for using a distance matrix and there is a problem with the coordinates."); 124 if (data.Coordinates != null && (data.Coordinates.GetLength(0) != data.Dimension || data.Coordinates.GetLength(1) != 2)) 125 throw new System.IO.InvalidDataException("The coordinates of the given instance are not in the right format, there need to be one row for each customer and two columns for the x and y coordinates respectively."); 126 127 switch (data.DistanceMeasure) { 128 case DistanceMeasure.Direct: 129 DistanceCalculator = null; 130 if (data.Dimension > DistanceMatrixSizeLimit && Coordinates != null) { 131 DistanceCalculator = new EuclideanDistance(); 132 UseDistanceMatrix = false; 133 } else UseDistanceMatrix = true; 134 break; 135 case DistanceMeasure.Att: DistanceCalculator = new AttDistance(); break; 136 case DistanceMeasure.Euclidean: DistanceCalculator = new EuclideanDistance(); break; 137 case DistanceMeasure.Geo: DistanceCalculator = new GeoDistance(); break; 138 case DistanceMeasure.Manhattan: DistanceCalculator = new ManhattanDistance(); break; 139 case DistanceMeasure.Maximum: DistanceCalculator = new MaximumDistance(); break; 140 case DistanceMeasure.RoundedEuclidean: DistanceCalculator = new RoundedEuclideanDistance(); break; 141 case DistanceMeasure.UpperEuclidean: DistanceCalculator = new UpperEuclideanDistance(); break; 142 default: throw new ArgumentException("Distance measure is unknown"); 143 } 120 144 121 145 Name = data.Name; 122 146 Description = data.Description; 123 147 124 ProbabilityMatrix = new DoubleArray(data.Probabilities); 125 126 if (data.BestKnownTour != null) { 127 BestKnownSolution = new Permutation(PermutationTypes.RelativeUndirected, data.BestKnownTour); 128 } 129 148 Probabilities = new DoubleArray(data.Probabilities); 149 BestKnownSolution = data.BestKnownTour != null ? new Permutation(PermutationTypes.RelativeUndirected, data.BestKnownTour) : null; 130 150 Coordinates = data.Coordinates != null && data.Coordinates.GetLength(0) > 0 ? new DoubleMatrix(data.Coordinates) : null; 131 151 DistanceMatrix = new DistanceMatrix(data.GetDistanceMatrix());
Note: See TracChangeset
for help on using the changeset viewer.