Changeset 14454 for branches/MemPRAlgorithm/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TSPPathMoveEvaluator.cs
- Timestamp:
- 12/05/16 16:06:18 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/MemPRAlgorithm/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TSPPathMoveEvaluator.cs
r14185 r14454 47 47 get { return (ILookupParameter<BoolValue>)Parameters["UseDistanceMatrix"]; } 48 48 } 49 public ILookupParameter<EnumValue<TSPDistanceFunction>> DistanceFunctionParameter { 50 get { return (ILookupParameter<EnumValue<TSPDistanceFunction>>)Parameters["DistanceFunction"]; } 51 } 49 52 50 53 [StorableConstructor] … … 57 60 Parameters.Add(new LookupParameter<DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities.")); 58 61 Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated (if it does not exist already) and used for evaluation, otherwise false.")); 59 } 60 61 [StorableHook(HookType.AfterDeserialization)] 62 private void AfterDeserialization() { 63 // BackwardsCompatibility3.3 64 #region Backwards compatible code (remove with 3.4) 65 LookupParameter<DoubleMatrix> oldDistanceMatrixParameter = Parameters["DistanceMatrix"] as LookupParameter<DoubleMatrix>; 66 if (oldDistanceMatrixParameter != null) { 67 Parameters.Remove(oldDistanceMatrixParameter); 68 Parameters.Add(new LookupParameter<DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities.")); 69 DistanceMatrixParameter.ActualName = oldDistanceMatrixParameter.ActualName; 70 } 71 #endregion 62 Parameters.Add(new LookupParameter<EnumValue<TSPDistanceFunction>>("DistanceFunction", "The distance function to use when the distance matrix is not being used.")); 72 63 } 73 64 74 65 public override IOperation Apply() { 75 Permutation permutation = PermutationParameter.ActualValue; 76 DoubleMatrix coordinates = CoordinatesParameter.ActualValue; 66 var permutation = PermutationParameter.ActualValue; 67 var coordinates = CoordinatesParameter.ActualValue; 68 var distanceFunction = DistanceFunctionParameter.ActualValue.Value; 77 69 double relativeQualityDifference = 0; 78 70 if (UseDistanceMatrixParameter.ActualValue.Value) { 79 71 DistanceMatrix distanceMatrix = DistanceMatrixParameter.ActualValue; 80 72 if (distanceMatrix == null) { 81 if (coordinates == null) throw new InvalidOperationException("Neither a distance matrix nor coordinates were given."); 82 distanceMatrix = CalculateDistanceMatrix(coordinates); 83 DistanceMatrixParameter.ActualValue = distanceMatrix; 73 throw new InvalidOperationException("Distance matrix is not given."); 84 74 } 85 75 relativeQualityDifference = EvaluateByDistanceMatrix(permutation, distanceMatrix); 86 76 } else { 87 77 if (coordinates == null) throw new InvalidOperationException("No coordinates were given."); 88 relativeQualityDifference = EvaluateByCoordinates(permutation, coordinates );78 relativeQualityDifference = EvaluateByCoordinates(permutation, coordinates, distanceFunction); 89 79 } 90 80 DoubleValue moveQuality = MoveQualityParameter.ActualValue; … … 93 83 return base.Apply(); 94 84 } 95 96 protected abstract double CalculateDistance(double x1, double y1, double x2, double y2);97 85 protected abstract double EvaluateByDistanceMatrix(Permutation permutation, DistanceMatrix distanceMatrix); 98 protected abstract double EvaluateByCoordinates(Permutation permutation, DoubleMatrix coordinates); 99 100 private DistanceMatrix CalculateDistanceMatrix(DoubleMatrix c) { 101 DistanceMatrix distanceMatrix = new DistanceMatrix(c.Rows, c.Rows); 102 for (int i = 0; i < distanceMatrix.Rows; i++) { 103 for (int j = 0; j < distanceMatrix.Columns; j++) 104 distanceMatrix[i, j] = CalculateDistance(c[i, 0], c[i, 1], c[j, 0], c[j, 1]); 105 } 106 return (DistanceMatrix)distanceMatrix.AsReadOnly(); 107 } 86 protected abstract double EvaluateByCoordinates(Permutation permutation, DoubleMatrix coordinates, TSPDistanceFunction distanceFunction); 108 87 } 109 88 }
Note: See TracChangeset
for help on using the changeset viewer.