Changeset 13470 for branches/PTSP/HeuristicLab.Problems.PTSP/3.3/Moves/TwoOpt/PTSPEstimatedInversionMoveEvaluator.cs
- Timestamp:
- 12/15/15 16:38:08 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PTSP/HeuristicLab.Problems.PTSP/3.3/Moves/TwoOpt/PTSPEstimatedInversionMoveEvaluator.cs
r13412 r13470 29 29 30 30 namespace HeuristicLab.Problems.PTSP { 31 [Item("PTSP EstimatedInversionMoveEvaluator", "Evaluates an inversion move (2-opt) over several realizations of tours by summing up the length of all added edges and subtracting the length of all deleted edges.")]31 [Item("PTSP Estimated Inversion Move Evaluator", "Evaluates an inversion move (2-opt) over several realizations of tours by summing up the length of all added edges and subtracting the length of all deleted edges.")] 32 32 [StorableClass] 33 33 public class PTSPEstimatedInversionMoveEvaluator : EstimatedPTSPMoveEvaluator, IPermutationInversionMoveOperator { … … 49 49 } 50 50 51 public static double Evaluate ByCoordinates(Permutation permutation, InversionMove move, DoubleMatrix coordinates, DistanceCalculator distanceCalculator, ItemList<BoolArray> realizations) {51 public static double EvaluateMove(Permutation tour, InversionMove move, Func<int, int, double> distance, ItemList<BoolArray> realizations) { 52 52 double moveQuality = 0; 53 53 var edges = new int[4]; 54 54 var indices = new int[4]; 55 edges[0] = permutation.GetCircular(move.Index1 - 1);55 edges[0] = tour.GetCircular(move.Index1 - 1); 56 56 indices[0] = move.Index1 - 1; 57 if (indices[0] == -1) indices[0] = permutation.Length - 1;58 edges[1] = permutation[move.Index1];57 if (indices[0] == -1) indices[0] = tour.Length - 1; 58 edges[1] = tour[move.Index1]; 59 59 indices[1] = move.Index1; 60 edges[2] = permutation[move.Index2];60 edges[2] = tour[move.Index2]; 61 61 indices[2] = move.Index2; 62 edges[3] = permutation.GetCircular(move.Index2 + 1);62 edges[3] = tour.GetCircular(move.Index2 + 1); 63 63 indices[3] = move.Index2 + 1; 64 if (indices[3] == permutation.Length + 1) indices[3] = 0;64 if (indices[3] == tour.Length + 1) indices[3] = 0; 65 65 var aPosteriori = new int[4]; 66 66 foreach (var realization in realizations) { … … 72 72 if (i % 2 == 0) { 73 73 // find nearest predecessor in realization if source edge 74 while (!realization[ permutation.GetCircular(indices[i] - j)]) {74 while (!realization[tour.GetCircular(indices[i] - j)]) { 75 75 j++; 76 76 } 77 aPosteriori[i] = permutation.GetCircular(indices[i] - j);77 aPosteriori[i] = tour.GetCircular(indices[i] - j); 78 78 } else { 79 79 // find nearest successor in realization if target edge 80 while (!realization[ permutation.GetCircular(indices[i] + j)]) {80 while (!realization[tour.GetCircular(indices[i] + j)]) { 81 81 j++; 82 82 } 83 aPosteriori[i] = permutation.GetCircular(indices[i] + j);83 aPosteriori[i] = tour.GetCircular(indices[i] + j); 84 84 } 85 85 } … … 87 87 // compute cost difference between the two a posteriori solutions 88 88 if (!(aPosteriori[0] == aPosteriori[2] && aPosteriori[1] == aPosteriori[3])) { 89 moveQuality = moveQuality 90 + distanceCalculator.Calculate(0, 2, coordinates) 91 + distanceCalculator.Calculate(1, 3, coordinates) 92 - distanceCalculator.Calculate(0, 1, coordinates) 93 - distanceCalculator.Calculate(2, 3, coordinates); 89 moveQuality = moveQuality + distance(aPosteriori[0], aPosteriori[2]) + distance(aPosteriori[1], aPosteriori[3]) 90 - distance(aPosteriori[0], aPosteriori[1]) - distance(aPosteriori[2], aPosteriori[3]); 94 91 } 95 92 Array.Clear(aPosteriori, 0, aPosteriori.Length); … … 99 96 } 100 97 101 public static double EvaluateByDistanceMatrix(Permutation permutation, InversionMove move, DistanceMatrix distanceMatrix, ItemList<BoolArray> realizations) { 102 double moveQuality = 0; 103 var edges = new int[4]; 104 var indices = new int[4]; 105 edges[0] = permutation.GetCircular(move.Index1 - 1); 106 indices[0] = move.Index1 - 1; 107 if (indices[0] == -1) indices[0] = permutation.Length - 1; 108 edges[1] = permutation[move.Index1]; 109 indices[1] = move.Index1; 110 edges[2] = permutation[move.Index2]; 111 indices[2] = move.Index2; 112 edges[3] = permutation.GetCircular(move.Index2 + 1); 113 indices[3] = move.Index2 + 1; 114 if (indices[3] == permutation.Length + 1) indices[3] = 0; 115 var aPosteriori = new int[4]; 116 foreach (var realization in realizations) { 117 for (var i = 0; i < edges.Length; i++) { 118 if (realization[edges[i]]) { 119 aPosteriori[i] = edges[i]; 120 } else { 121 var j = 1; 122 if (i % 2 == 0) { 123 // find nearest predecessor in realization if source edge 124 while (!realization[permutation.GetCircular(indices[i] - j)]) { 125 j++; 126 } 127 aPosteriori[i] = permutation.GetCircular(indices[i] - j); 128 } else { 129 // find nearest successor in realization if target edge 130 while (!realization[permutation.GetCircular(indices[i] + j)]) { 131 j++; 132 } 133 aPosteriori[i] = permutation.GetCircular(indices[i] + j); 134 } 135 } 136 } 137 // compute cost difference between the two a posteriori solutions 138 if (!(aPosteriori[0] == aPosteriori[2] && aPosteriori[1] == aPosteriori[3])) { 139 moveQuality = moveQuality + distanceMatrix[aPosteriori[0], aPosteriori[2]] + distanceMatrix[aPosteriori[1], aPosteriori[3]] - distanceMatrix[aPosteriori[0], aPosteriori[1]] - distanceMatrix[aPosteriori[2], aPosteriori[3]]; 140 } 141 Array.Clear(aPosteriori, 0, aPosteriori.Length); 142 } 143 // return average of cost differences 144 return moveQuality / realizations.Count; 145 } 146 147 protected override double EvaluateByCoordinates(Permutation permutation, DoubleMatrix coordinates, DistanceCalculator distanceCalculator) { 148 return EvaluateByCoordinates(permutation, InversionMoveParameter.ActualValue, coordinates, distanceCalculator, RealizationsParameter.ActualValue); 149 } 150 151 protected override double EvaluateByDistanceMatrix(Permutation permutation, DistanceMatrix distanceMatrix) { 152 return EvaluateByDistanceMatrix(permutation, InversionMoveParameter.ActualValue, distanceMatrix, RealizationsParameter.ActualValue); 98 protected override double EvaluateMove(Permutation tour, Func<int, int, double> distance, ItemList<BoolArray> realizations) { 99 return EvaluateMove(tour, InversionMoveParameter.ActualValue, distance, realizations); 153 100 } 154 101 }
Note: See TracChangeset
for help on using the changeset viewer.