- Timestamp:
- 08/01/11 17:48:53 (13 years ago)
- Location:
- branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings
- Files:
-
- 1 added
- 17 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs
r5445 r6618 48 48 49 49 protected override AlbaEncoding Crossover(IRandom random, AlbaEncoding parent1, AlbaEncoding parent2) { 50 //note - the inner crossover is called here and the resultis converted to an alba representation50 //note - the inner crossover is called here and the solution is converted to an alba representation 51 51 //some refactoring should be done here in the future - the crossover operation should be called directly 52 52 53 InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName; 54 IAtomicOperation op = this.ExecutionContext.CreateOperation( 55 InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope); 56 op.Operator.Execute((IExecutionContext)op, CancellationToken); 53 if (parent1.Length == parent2.Length) { 54 InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName; 55 IAtomicOperation op = this.ExecutionContext.CreateOperation( 56 InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope); 57 op.Operator.Execute((IExecutionContext)op, CancellationToken); 57 58 58 string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;59 if (ExecutionContext.Scope.Variables.ContainsKey(childName)) {60 Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation;61 ExecutionContext.Scope.Variables.Remove(childName);59 string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName; 60 if (ExecutionContext.Scope.Variables.ContainsKey(childName)) { 61 Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation; 62 ExecutionContext.Scope.Variables.Remove(childName); 62 63 63 return new AlbaEncoding(permutation, Cities); 64 } else 65 return null; 64 return new AlbaEncoding(permutation, Cities); 65 } else 66 return null; 67 } else { 68 return parent1.Clone() as AlbaEncoding; 69 } 66 70 } 67 71 } -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaExhaustiveLambdaInterchangeMoveGenerator.cs
r5445 r6618 39 39 } 40 40 41 p rotected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda) {41 public static AlbaLambdaInterchangeMove[] GenerateAllMoves(AlbaEncoding individual, int lambda) { 42 42 List<AlbaLambdaInterchangeMove> moves = new List<AlbaLambdaInterchangeMove>(); 43 43 … … 66 66 return moves.ToArray(); 67 67 } 68 69 protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda) { 70 return GenerateAllMoves(individual, lambda); 71 } 68 72 } 69 73 } -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeMutliMoveGenerator.cs
r5445 r6618 50 50 return new AlbaStochasticLambdaInterchangeMultiMoveGenerator(this, cloner); 51 51 } 52 protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda) {53 int sampleSize = SampleSizeParameter.ActualValue.Value;54 52 53 public static AlbaLambdaInterchangeMove[] GenerateAllMoves(AlbaEncoding individual, int lambda, int sampleSize, IRandom random) { 55 54 AlbaLambdaInterchangeMove[] moves = new AlbaLambdaInterchangeMove[sampleSize]; 56 55 for (int i = 0; i < sampleSize; i++) { 57 56 moves[i] = AlbaStochasticLambdaInterchangeSingleMoveGenerator.Apply( 58 individual, Cities, lambda, RandomParameter.ActualValue);57 individual, individual.Cities, lambda, random); 59 58 } 60 59 61 60 return moves; 62 61 } 62 63 protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda) { 64 int sampleSize = SampleSizeParameter.ActualValue.Value; 65 66 return GenerateAllMoves(individual, lambda, sampleSize, RandomParameter.ActualValue); 67 } 63 68 } 64 69 } -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/PushForwardInsertionCreator.cs
r5445 r6618 91 91 } 92 92 93 private double CalculateDistance(int start, int end ) {93 private double CalculateDistance(int start, int end, DoubleMatrix coordinates) { 94 94 double distance = 0.0; 95 DoubleMatrix coordinates = CoordinatesParameter.ActualValue;96 95 97 96 distance = … … 103 102 } 104 103 105 private DoubleMatrix CreateDistanceMatrix() { 106 DoubleMatrix coordinates = CoordinatesParameter.ActualValue; 104 private DoubleMatrix CreateDistanceMatrix(DoubleMatrix coordinates) { 107 105 DoubleMatrix distanceMatrix = new DoubleMatrix(coordinates.Rows, coordinates.Rows); 108 106 109 107 for (int i = 0; i < distanceMatrix.Rows; i++) { 110 108 for (int j = i; j < distanceMatrix.Columns; j++) { 111 double distance = CalculateDistance(i, j );109 double distance = CalculateDistance(i, j, coordinates); 112 110 113 111 distanceMatrix[i, j] = distance; … … 119 117 } 120 118 121 private double Distance(int start, int end ) {119 private double Distance(int start, int end, DoubleMatrix coordinates, bool useDistanceMatrix) { 122 120 double distance = 0.0; 123 121 124 if (UseDistanceMatrixParameter.ActualValue.Value) { 125 if (DistanceMatrixParameter.ActualValue == null) { 126 DistanceMatrixParameter.ActualValue = CreateDistanceMatrix(); 127 } 128 129 distance = DistanceMatrixParameter.ActualValue[start, end]; 130 } else { 131 distance = CalculateDistance(start, end); 122 if (useDistanceMatrix) { 123 distance = coordinates[start, end]; 124 } else { 125 distance = CalculateDistance(start, end, coordinates); 132 126 } 133 127 … … 135 129 } 136 130 137 private double TravelDistance(List<int> route, int begin ) {131 private double TravelDistance(List<int> route, int begin, DoubleMatrix coordinates, bool useDistanceMatrix) { 138 132 double distance = 0; 139 133 for (int i = begin; i < route.Count - 1 && (i == begin || route[i] != 0); i++) { 140 distance += Distance(route[i], route[i + 1] );134 distance += Distance(route[i], route[i + 1], coordinates, useDistanceMatrix); 141 135 } 142 136 return distance; 143 137 } 144 138 145 private bool SubrouteConstraintsOK(List<int> route, int begin) { 139 private bool SubrouteConstraintsOK(List<int> route, int begin, DoubleMatrix coordinates, bool useDistanceMatrix, 140 DoubleArray dueTime, DoubleArray readyTime, DoubleArray serviceTime, DoubleArray demand, DoubleValue capacity) { 146 141 double t = 0.0, o = 0.0; 147 142 for (int i = begin + 1; i < route.Count; i++) { 148 t += Distance(route[i - 1], route[i] );143 t += Distance(route[i - 1], route[i], coordinates, useDistanceMatrix); 149 144 if (route[i] == 0) return (t < DueTimeParameter.ActualValue[0]); // violation on capacity constraint is handled below 150 145 else { 151 if (t > DueTimeParameter.ActualValue[route[i]]) return false;152 t = Math.Max( ReadyTimeParameter.ActualValue[route[i]], t);153 t += ServiceTimeParameter.ActualValue[route[i]];154 o += DemandParameter.ActualValue[route[i]];155 if (o > CapacityParameter.ActualValue.Value) return false; // premature exit on capacity constraint violation146 if (t > dueTime[route[i]]) return false; 147 t = Math.Max(readyTime[route[i]], t); 148 t += serviceTime[route[i]]; 149 o += demand[route[i]]; 150 if (o > capacity.Value) return false; // premature exit on capacity constraint violation 156 151 } 157 152 } … … 159 154 } 160 155 161 private bool SubrouteTardinessOK(List<int> route, int begin) { 156 private bool SubrouteTardinessOK(List<int> route, int begin, DoubleMatrix coordinates, bool useDistanceMatrix, 157 DoubleArray dueTime, DoubleArray readyTime, DoubleArray serviceTime) { 162 158 double t = 0.0; 163 159 for (int i = begin + 1; i < route.Count; i++) { 164 t += Distance(route[i - 1], route[i] );160 t += Distance(route[i - 1], route[i], coordinates, useDistanceMatrix); 165 161 if (route[i] == 0) { 166 if (t < DueTimeParameter.ActualValue[0]) return true;162 if (t < dueTime[0]) return true; 167 163 else return false; 168 164 } else { 169 if (t > DueTimeParameter.ActualValue[route[i]]) return false;170 t = Math.Max( ReadyTimeParameter.ActualValue[route[i]], t);171 t += ServiceTimeParameter.ActualValue[route[i]];165 if (t > dueTime[route[i]]) return false; 166 t = Math.Max(readyTime[route[i]], t); 167 t += serviceTime[route[i]]; 172 168 } 173 169 } … … 175 171 } 176 172 177 private bool SubrouteLoadOK(List<int> route, int begin ) {173 private bool SubrouteLoadOK(List<int> route, int begin, DoubleValue capacity, DoubleArray demand) { 178 174 double o = 0.0; 179 175 for (int i = begin + 1; i < route.Count; i++) { 180 if (route[i] == 0) return (o < CapacityParameter.ActualValue.Value);176 if (route[i] == 0) return (o < capacity.Value); 181 177 else { 182 o += DemandParameter.ActualValue[route[i]];183 } 184 } 185 return (o < CapacityParameter.ActualValue.Value);178 o += demand[route[i]]; 179 } 180 } 181 return (o < capacity.Value); 186 182 } 187 183 188 184 protected override List<int> CreateSolution() { 189 double alpha, beta, gamma;190 alpha = N(Alpha.Value.Value, Math.Sqrt(AlphaVariance.Value.Value), RandomParameter.ActualValue);191 beta = N(Beta.Value.Value, Math.Sqrt(BetaVariance.Value.Value), RandomParameter.ActualValue);192 gamma = N(Gamma.Value.Value, Math.Sqrt(GammaVariance.Value.Value), RandomParameter.ActualValue);185 //double alpha, beta, gamma; 186 double alpha = N(Alpha.Value.Value, Math.Sqrt(AlphaVariance.Value.Value), RandomParameter.ActualValue); 187 double beta = N(Beta.Value.Value, Math.Sqrt(BetaVariance.Value.Value), RandomParameter.ActualValue); 188 double gamma = N(Gamma.Value.Value, Math.Sqrt(GammaVariance.Value.Value), RandomParameter.ActualValue); 193 189 194 190 double x0 = CoordinatesParameter.ActualValue[0, 0]; … … 203 199 int indexOfCustomer = -1; 204 200 201 int vehicles = VehiclesParameter.ActualValue.Value; 202 DoubleMatrix coordinates = CoordinatesParameter.ActualValue; 203 DoubleArray dueTime = DueTimeParameter.ActualValue; 204 DoubleArray serviceTime = ServiceTimeParameter.ActualValue; 205 DoubleArray readyTime = ReadyTimeParameter.ActualValue; 206 DoubleArray demand = DemandParameter.ActualValue; 207 DoubleValue capacity = CapacityParameter.ActualValue; 208 209 bool useDistanceMatrix = UseDistanceMatrixParameter.ActualValue.Value; 210 if (useDistanceMatrix) { 211 if (DistanceMatrixParameter.ActualValue == null) { 212 DistanceMatrixParameter.ActualValue = CreateDistanceMatrix(coordinates); 213 } 214 215 coordinates = DistanceMatrixParameter.ActualValue; 216 } 217 205 218 /*----------------------------------------------------------------------------- 206 219 * generate cost list … … 208 221 */ 209 222 for (int i = 1; i <= Cities; i++) { 210 distance = Distance(i, 0 );211 if ( CoordinatesParameter.ActualValue[i, 0] < x0) distance = -distance;223 distance = Distance(i, 0, coordinates, useDistanceMatrix); 224 if (coordinates[i, 0] < x0) distance = -distance; 212 225 cost = -alpha * distance + // distance 0 <-> City[i] 213 226 beta * (DueTimeParameter.ActualValue[i]) + // latest arrival time 214 gamma * (Math.Asin(( CoordinatesParameter.ActualValue[i, 1] - y0) / distance) / 360 * distance); // polar angle227 gamma * (Math.Asin((coordinates[i, 1] - y0) / distance) / 360 * distance); // polar angle 215 228 216 229 index = 0; … … 229 242 int customer = -1; 230 243 int subTourCount = 1; 231 List<int> route = new List<int>(Cities + VehiclesParameter.ActualValue.Value - 1); 244 245 List<int> route = new List<int>(Cities + vehicles - 1); 232 246 minimumCost = double.MaxValue; 233 247 indexOfMinimumCost = -1; … … 244 258 route.Insert(i, (int)unroutedList[c]); 245 259 if (route[currentRoute] != 0) { throw new Exception("currentRoute not depot"); } 246 cost = TravelDistance(route, currentRoute );247 if (cost < minimumCost && SubrouteConstraintsOK(route, currentRoute )) {260 cost = TravelDistance(route, currentRoute, coordinates, useDistanceMatrix); 261 if (cost < minimumCost && SubrouteConstraintsOK(route, currentRoute, coordinates, useDistanceMatrix, dueTime, readyTime, serviceTime, demand, capacity)) { 248 262 minimumCost = cost; 249 263 indexOfMinimumCost = i; … … 275 289 customer = -1; 276 290 } while (unroutedList.Count > 0); 277 while (route.Count < Cities + VehiclesParameter.ActualValue.Value - 1)291 while (route.Count < Cities + vehicles) 278 292 route.Add(0); 279 293 -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinCrossover.cs
r5445 r6618 26 26 using HeuristicLab.Parameters; 27 27 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 28 using HeuristicLab.Data; 28 29 29 30 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin { … … 33 34 public ILookupParameter<IRandom> RandomParameter { 34 35 get { return (LookupParameter<IRandom>)Parameters["Random"]; } 36 } 37 38 public IValueParameter<BoolValue> AllowInfeasibleSolutions { 39 get { return (IValueParameter<BoolValue>)Parameters["AllowInfeasibleSolutions"]; } 40 } 41 42 [StorableHook(HookType.AfterDeserialization)] 43 private void AfterDeserialization() { 44 // BackwardsCompatibility3.3 45 #region Backwards compatible code (remove with 3.4) 46 if (!Parameters.ContainsKey("AllowInfeasibleSolutions")) { 47 Parameters.Add(new ValueParameter<BoolValue>("AllowInfeasibleSolutions", "Indicates if infeasible solutions should be allowed.", new BoolValue(false))); 48 } 49 #endregion 35 50 } 36 51 … … 43 58 public PotvinCrossover() { 44 59 Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators.")); 60 Parameters.Add(new ValueParameter<BoolValue>("AllowInfeasibleSolutions", "Indicates if infeasible solutions should be allowed.", new BoolValue(false))); 45 61 } 46 62 47 63 protected abstract PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2); 48 64 49 protected bool FindInsertionPlace(PotvinEncoding individual, int city, out int route, out int place) { 65 protected static bool FindInsertionPlace(PotvinEncoding individual, int city, 66 DoubleArray dueTime, DoubleArray serviceTime, DoubleArray readyTime, DoubleArray demand, 67 DoubleValue capacity, DistanceMatrix distMatrix, bool allowInfeasible, 68 out int route, out int place) { 50 69 return individual.FindInsertionPlace( 51 DueTimeParameter.ActualValue, ServiceTimeParameter.ActualValue, ReadyTimeParameter.ActualValue,52 DemandParameter.ActualValue, CapacityParameter.ActualValue, CoordinatesParameter.ActualValue,53 DistanceMatrixParameter, UseDistanceMatrixParameter.ActualValue,54 city, -1,out route, out place);70 dueTime, serviceTime, readyTime, 71 demand, capacity, distMatrix, 72 city, -1, allowInfeasible, 73 out route, out place); 55 74 } 56 75 … … 68 87 } 69 88 70 protected bool Repair(IRandom random, PotvinEncoding solution, Tour newTour) { 89 protected static bool RouteUnrouted(PotvinEncoding solution, DistanceMatrix distMatrix, 90 DoubleArray dueTime, DoubleArray readyTime, DoubleArray serviceTime, DoubleArray demand, DoubleValue capacity, bool allowInfeasible) { 91 bool success = true; 92 int index = 0; 93 while (index < solution.Unrouted.Count && success) { 94 int unrouted = solution.Unrouted[index]; 95 96 int route, place; 97 if (FindInsertionPlace(solution, unrouted, 98 dueTime, serviceTime, readyTime, demand, capacity, 99 distMatrix, allowInfeasible, 100 out route, out place)) { 101 solution.Tours[route].Cities.Insert(place, unrouted); 102 } else { 103 success = false; 104 } 105 106 index++; 107 } 108 109 for (int i = 0; i < index; i++) 110 solution.Unrouted.RemoveAt(0); 111 112 return success; 113 } 114 115 protected static bool Repair(IRandom random, PotvinEncoding solution, Tour newTour, DistanceMatrix distmatrix, 116 DoubleArray dueTime, DoubleArray readyTime, DoubleArray serviceTime, DoubleArray demand, DoubleValue capacity, 117 bool allowInfeasible) { 71 118 bool success = true; 72 119 … … 104 151 } 105 152 153 if (!allowInfeasible && !newTour.Feasible( 154 dueTime, serviceTime, readyTime, demand, capacity, distmatrix)) 155 return false; 156 106 157 //route unrouted vehicles 107 int index = 0; 108 while (index < solution.Unrouted.Count && success) { 109 int unrouted = solution.Unrouted[index]; 110 111 int route, place; 112 if (FindInsertionPlace(solution, unrouted, out route, out place)) { 113 solution.Tours[route].Cities.Insert(place, unrouted); 114 } else { 115 success = false; 116 } 117 118 index++; 119 } 120 121 for (int i = 0; i < index; i++) 122 solution.Unrouted.RemoveAt(0); 158 success = RouteUnrouted(solution, distmatrix, dueTime, readyTime, serviceTime, demand, capacity, allowInfeasible); 123 159 124 160 return success; -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs
r5445 r6618 23 23 using HeuristicLab.Core; 24 24 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 25 using HeuristicLab.Data; 25 26 26 27 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin { … … 40 41 41 42 protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) { 43 BoolValue useDistanceMatrix = UseDistanceMatrixParameter.ActualValue; 44 DoubleMatrix coordinates = CoordinatesParameter.ActualValue; 45 DistanceMatrix distMatrix = VRPUtilities.GetDistanceMatrix(coordinates, DistanceMatrixParameter, useDistanceMatrix); 46 DoubleArray dueTime = DueTimeParameter.ActualValue; 47 DoubleArray readyTime = ReadyTimeParameter.ActualValue; 48 DoubleArray serviceTime = ServiceTimeParameter.ActualValue; 49 DoubleArray demand = DemandParameter.ActualValue; 50 DoubleValue capacity = CapacityParameter.ActualValue; 51 52 bool allowInfeasible = AllowInfeasibleSolutions.Value.Value; 53 42 54 PotvinEncoding child = parent2.Clone() as PotvinEncoding; 43 55 … … 55 67 child.Unrouted.Add(city); 56 68 57 if (Repair(random, child, replacing ))69 if (Repair(random, child, replacing, distMatrix, dueTime, readyTime, serviceTime, demand, capacity, allowInfeasible) || allowInfeasible) 58 70 return child; 59 71 else { … … 61 73 return parent1.Clone() as PotvinEncoding; 62 74 else 63 return parent2.Clone() as PotvinEncoding; 75 return parent2.Clone() as PotvinEncoding; 64 76 } 65 77 } -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinSequenceBasedCrossover.cs
r5445 r6618 23 23 using HeuristicLab.Core; 24 24 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 25 using HeuristicLab.Data; 25 26 26 27 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin { … … 41 42 42 43 protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) { 44 BoolValue useDistanceMatrix = UseDistanceMatrixParameter.ActualValue; 45 DoubleMatrix coordinates = CoordinatesParameter.ActualValue; 46 DistanceMatrix distMatrix = VRPUtilities.GetDistanceMatrix(coordinates, DistanceMatrixParameter, useDistanceMatrix); 47 DoubleArray dueTime = DueTimeParameter.ActualValue; 48 DoubleArray readyTime = ReadyTimeParameter.ActualValue; 49 DoubleArray serviceTime = ServiceTimeParameter.ActualValue; 50 DoubleArray demand = DemandParameter.ActualValue; 51 DoubleValue capacity = CapacityParameter.ActualValue; 52 53 bool allowInfeasible = AllowInfeasibleSolutions.Value.Value; 54 43 55 PotvinEncoding child = parent1.Clone() as PotvinEncoding; 44 56 Tour newTour = new Tour(); … … 69 81 child.Unrouted.Add(city); 70 82 71 if (Feasible(newTour) && 72 Repair(random, child, newTour)) { 83 if (Repair(random, child, newTour, distMatrix, dueTime, readyTime, serviceTime, demand, capacity, allowInfeasible) || allowInfeasible) { 73 84 return child; 74 85 } else { 75 if (random.NextDouble() < 0.5)86 if (random.NextDouble() < 0.5) 76 87 return parent1.Clone() as PotvinEncoding; 77 88 else 78 return parent2.Clone() as PotvinEncoding; 89 return parent2.Clone() as PotvinEncoding; 79 90 } 80 91 } -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinLocalSearchManipulator.cs
r5445 r6618 49 49 50 50 private bool FindBetterInsertionPlace( 51 PotvinEncoding individual, int tour, int city, int length, 51 PotvinEncoding individual, 52 DoubleArray dueTime, DoubleArray readyTime, DoubleArray serviceTime, DoubleArray demand, 53 DoubleValue capacity, DistanceMatrix distMatrix, 54 int tour, int city, int length, 52 55 out int insertionTour, out int insertionPlace) { 53 56 bool insertionFound = false; … … 56 59 57 60 List<int> toBeDeleted = individual.Tours[tour].Cities.GetRange(city, length); 58 double distance = GetLength(individual.Tours[tour]);61 double distance = individual.Tours[tour].GetLength(distMatrix); 59 62 individual.Tours[tour].Cities.RemoveRange(city, length); 60 double removalBenefit = distance - GetLength(individual.Tours[tour]);63 double removalBenefit = distance - individual.Tours[tour].GetLength(distMatrix); 61 64 62 65 int currentTour = 0; … … 64 67 int currentCity = 0; 65 68 while (currentCity <= individual.Tours[currentTour].Cities.Count && !insertionFound) { 66 distance = GetLength(individual.Tours[currentTour]);69 distance = individual.Tours[currentTour].GetLength(distMatrix); 67 70 individual.Tours[currentTour].Cities.InsertRange(currentCity, toBeDeleted); 68 if ( Feasible(individual.Tours[currentTour])) {71 if (individual.Tours[currentTour].Feasible(dueTime, serviceTime, readyTime, demand, capacity, distMatrix)) { 69 72 double lengthIncrease = 70 GetLength(individual.Tours[currentTour]) - distance;73 individual.Tours[currentTour].GetLength(distMatrix) - distance; 71 74 if (removalBenefit > lengthIncrease) { 72 75 insertionTour = currentTour; … … 83 86 } 84 87 85 individual.Tours[tour].Cities.InsertRange(city, toBeDeleted); 88 individual.Tours[tour].Cities.InsertRange(city, toBeDeleted); 86 89 87 90 return insertionFound; … … 89 92 90 93 protected override void Manipulate(IRandom random, PotvinEncoding individual) { 94 BoolValue useDistanceMatrix = UseDistanceMatrixParameter.ActualValue; 95 DoubleMatrix coordinates = CoordinatesParameter.ActualValue; 96 DistanceMatrix distMatrix = VRPUtilities.GetDistanceMatrix(coordinates, DistanceMatrixParameter, useDistanceMatrix); 97 DoubleArray dueTime = DueTimeParameter.ActualValue; 98 DoubleArray readyTime = ReadyTimeParameter.ActualValue; 99 DoubleArray serviceTime = ServiceTimeParameter.ActualValue; 100 DoubleArray demand = DemandParameter.ActualValue; 101 DoubleValue capacity = CapacityParameter.ActualValue; 102 91 103 //only apply to feasible individuals 92 if (Feasible(individual)) { 104 bool feasible = true; 105 106 foreach (Tour tour in individual.Tours) { 107 if (!tour.Feasible(dueTime, serviceTime, readyTime, demand, capacity, distMatrix)) { 108 feasible = false; 109 break; 110 } 111 } 112 113 if (feasible) { 93 114 bool insertionFound; 94 115 int iterations = 0; … … 103 124 while (city <= individual.Tours[tour].Cities.Count - length && !insertionFound) { 104 125 int insertionTour, insertionPlace; 105 if (FindBetterInsertionPlace(individual, tour, city, length, 126 if (FindBetterInsertionPlace(individual, dueTime, readyTime, serviceTime, demand, capacity, distMatrix, 127 tour, city, length, 106 128 out insertionTour, out insertionPlace)) { 107 129 insertionFound = true; -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinManipulator.cs
r5445 r6618 25 25 using HeuristicLab.Parameters; 26 26 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 27 using HeuristicLab.Data; 27 28 28 29 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin { … … 34 35 } 35 36 37 public IValueParameter<BoolValue> AllowInfeasibleSolutions { 38 get { return (IValueParameter<BoolValue>)Parameters["AllowInfeasibleSolutions"]; } 39 } 40 41 [StorableHook(HookType.AfterDeserialization)] 42 private void AfterDeserialization() { 43 // BackwardsCompatibility3.3 44 #region Backwards compatible code (remove with 3.4) 45 if (!Parameters.ContainsKey("AllowInfeasibleSolutions")) { 46 Parameters.Add(new ValueParameter<BoolValue>("AllowInfeasibleSolutions", "Indicates if infeasible solutions should be allowed.", new BoolValue(false))); 47 } 48 #endregion 49 } 50 36 51 [StorableConstructor] 37 52 protected PotvinManipulator(bool deserializing) : base(deserializing) { } … … 41 56 public PotvinManipulator() { 42 57 Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators.")); 58 Parameters.Add(new ValueParameter<BoolValue>("AllowInfeasibleSolutions", "Indicates if infeasible solutions should be allowed.", new BoolValue(false))); 43 59 } 44 60 45 61 protected abstract void Manipulate(IRandom random, PotvinEncoding individual); 46 62 47 protected int SelectRandomTourBiasedByLength(IRandom random, PotvinEncoding individual) {63 protected static int SelectRandomTourBiasedByLength(IRandom random, PotvinEncoding individual) { 48 64 int tourIndex = -1; 49 65 … … 51 67 double[] probabilities = new double[individual.Tours.Count]; 52 68 for (int i = 0; i < individual.Tours.Count; i++) { 53 probabilities[i] = 1.0 / ((double)individual.Tours[i].Cities.Count / (double) Cities);69 probabilities[i] = 1.0 / ((double)individual.Tours[i].Cities.Count / (double)individual.Cities); 54 70 sum += probabilities[i]; 55 71 } … … 72 88 } 73 89 74 protected bool FindInsertionPlace(PotvinEncoding individual, int city, int routeToAvoid, out int route, out int place) { 90 protected static bool FindInsertionPlace(PotvinEncoding individual, int city, int routeToAvoid, 91 DoubleArray dueTime, DoubleArray serviceTime, DoubleArray readyTime, DoubleArray demand, 92 DoubleValue capacity, DistanceMatrix distMatrix, bool allowInfeasible, 93 out int route, out int place) { 75 94 return individual.FindInsertionPlace( 76 DueTimeParameter.ActualValue, ServiceTimeParameter.ActualValue, ReadyTimeParameter.ActualValue,77 DemandParameter.ActualValue, CapacityParameter.ActualValue, CoordinatesParameter.ActualValue,78 DistanceMatrixParameter, UseDistanceMatrixParameter.ActualValue,79 city, routeToAvoid,out route, out place);95 dueTime, serviceTime, readyTime, 96 demand, capacity, distMatrix, 97 city, routeToAvoid, allowInfeasible, 98 out route, out place); 80 99 } 100 81 101 82 102 public override IOperation Apply() { -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinOneLevelExchangeManipulator.cs
r5445 r6618 24 24 using HeuristicLab.Core; 25 25 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 26 using HeuristicLab.Data; 26 27 27 28 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin { … … 39 40 public PotvinOneLevelExchangeMainpulator() : base() { } 40 41 41 protected override void Manipulate(IRandom random, PotvinEncoding individual) { 42 public static void Apply(IRandom random, PotvinEncoding individual, 43 DoubleArray dueTime, DoubleArray readyTime, DoubleArray serviceTime, DoubleArray demand, 44 DoubleValue capacity, DistanceMatrix distMatrix, bool allowInfeasible) { 42 45 int selectedIndex = SelectRandomTourBiasedByLength(random, individual); 43 46 Tour route1 = … … 48 51 int insertedRoute, insertedPlace; 49 52 50 if (FindInsertionPlace(individual, route1.Cities[i], selectedIndex, out insertedRoute, out insertedPlace)) { 53 if (FindInsertionPlace(individual, route1.Cities[i], selectedIndex, 54 dueTime, serviceTime, readyTime, demand, capacity, 55 distMatrix, allowInfeasible, 56 out insertedRoute, out insertedPlace)) { 51 57 individual.Tours[insertedRoute].Cities.Insert(insertedPlace, route1.Cities[i]); 52 58 replaced.Add(route1.Cities[i]); … … 65 71 individual.Tours.Remove(route1); 66 72 } 73 74 protected override void Manipulate(IRandom random, PotvinEncoding individual) { 75 BoolValue useDistanceMatrix = UseDistanceMatrixParameter.ActualValue; 76 DoubleMatrix coordinates = CoordinatesParameter.ActualValue; 77 DistanceMatrix distMatrix = VRPUtilities.GetDistanceMatrix(coordinates, DistanceMatrixParameter, useDistanceMatrix); 78 DoubleArray dueTime = DueTimeParameter.ActualValue; 79 DoubleArray readyTime = ReadyTimeParameter.ActualValue; 80 DoubleArray serviceTime = ServiceTimeParameter.ActualValue; 81 DoubleArray demand = DemandParameter.ActualValue; 82 DoubleValue capacity = CapacityParameter.ActualValue; 83 84 bool allowInfeasible = AllowInfeasibleSolutions.Value.Value; 85 86 Apply(random, individual, dueTime, readyTime, serviceTime, demand, capacity, distMatrix, allowInfeasible); 87 } 67 88 } 68 89 } -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinTwoLevelExchangeManipulator.cs
r5445 r6618 23 23 using HeuristicLab.Core; 24 24 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 25 using HeuristicLab.Data; 25 26 26 27 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin { … … 36 37 public PotvinTwoLevelExchangeManipulator() : base() { } 37 38 38 protected override void Manipulate(IRandom random, PotvinEncoding individual) { 39 public static void Apply(IRandom random, PotvinEncoding individual, 40 DoubleArray dueTime, DoubleArray readyTime, DoubleArray serviceTime, DoubleArray demand, 41 DoubleValue capacity, DistanceMatrix distMatrix, bool allowInfeasible) { 39 42 int selectedIndex = SelectRandomTourBiasedByLength(random, individual); 40 Tour route1 = individual.Tours[selectedIndex]; 43 Tour route1 = individual.Tours[selectedIndex]; 41 44 42 45 bool performed = false; … … 53 56 //customer1 can be feasibly inserted at the location of customer2 54 57 tour.Cities[customer2Position] = customer1; 55 if ( Feasible(tour)) {58 if (tour.Feasible(dueTime, serviceTime, readyTime, demand, capacity, distMatrix)) { 56 59 int routeIdx, place; 57 60 if (FindInsertionPlace(individual, 58 customer2, selectedIndex, out routeIdx, out place)) { 59 individual.Tours[routeIdx].Cities.Insert(place, customer2); 60 route1.Cities.RemoveAt(customer1Position); 61 customer2, selectedIndex, 62 dueTime, serviceTime, readyTime, demand, capacity, 63 distMatrix, allowInfeasible, 64 out routeIdx, out place)) { 65 individual.Tours[routeIdx].Cities.Insert(place, customer2); 66 route1.Cities.RemoveAt(customer1Position); 61 67 62 68 if (route1.Cities.Count == 0) 63 69 individual.Tours.Remove(route1); 64 70 … … 83 89 } 84 90 } 91 92 protected override void Manipulate(IRandom random, PotvinEncoding individual) { 93 BoolValue useDistanceMatrix = UseDistanceMatrixParameter.ActualValue; 94 DoubleMatrix coordinates = CoordinatesParameter.ActualValue; 95 DistanceMatrix distMatrix = VRPUtilities.GetDistanceMatrix(coordinates, DistanceMatrixParameter, useDistanceMatrix); 96 DoubleArray dueTime = DueTimeParameter.ActualValue; 97 DoubleArray readyTime = ReadyTimeParameter.ActualValue; 98 DoubleArray serviceTime = ServiceTimeParameter.ActualValue; 99 DoubleArray demand = DemandParameter.ActualValue; 100 DoubleValue capacity = CapacityParameter.ActualValue; 101 102 bool allowInfeasible = AllowInfeasibleSolutions.Value.Value; 103 104 Apply(random, individual, dueTime, readyTime, serviceTime, demand, capacity, distMatrix, allowInfeasible); 105 } 85 106 } 86 107 } -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/PotvinEncoding.cs
r5445 r6618 69 69 DoubleArray dueTimeArray, 70 70 DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, DoubleValue capacity, 71 DoubleMatrix coordinates, ILookupParameter<DoubleMatrix> distanceMatrix, BoolValue useDistanceMatrix, 72 int city, int routeToAvoid, out int route, out int place) { 71 DistanceMatrix distMatrix, 72 int city, int routeToAvoid, bool allowInfeasible, 73 out int route, out int place) { 73 74 route = -1; 74 75 place = -1; 75 double minDetour = 0; 76 bool bestFeasible = false; 77 double minDetour = double.MaxValue; 76 78 77 79 for (int tour = 0; tour < Tours.Count; tour++) { 78 80 if (tour != routeToAvoid) { 79 81 for (int i = 0; i <= Tours[tour].Cities.Count; i++) { 80 double length = Tours[tour].GetLength( coordinates, distanceMatrix, useDistanceMatrix);82 double length = Tours[tour].GetLength(distMatrix); 81 83 82 84 Tours[tour].Cities.Insert(i, city); 83 85 84 if (Tours[tour].Feasible(dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, 85 capacity, coordinates, distanceMatrix, useDistanceMatrix)) { 86 double newLength = Tours[tour].GetLength(coordinates, distanceMatrix, useDistanceMatrix); 86 bool feasible = Tours[tour].Feasible(dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, 87 capacity, distMatrix); 87 88 89 if (feasible || allowInfeasible && !bestFeasible) { 90 double newLength = Tours[tour].GetLength(distMatrix); 88 91 double detour = newLength - length; 89 92 90 if (route < = 0 || detour < minDetour) {93 if (route < 0 || detour < minDetour || feasible && !bestFeasible) { 91 94 route = tour; 92 95 place = i; 93 96 minDetour = detour; 97 98 if (feasible) 99 bestFeasible = true; 94 100 } 95 101 } -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Crossovers/PrinsPermutationCrossover.cs
r5445 r6618 46 46 47 47 protected override PrinsEncoding Crossover(IRandom random, PrinsEncoding parent1, PrinsEncoding parent2) { 48 //note - the inner crossover is called here and the resultis converted to a prins representation48 //note - the inner crossover is called here and the solution is converted to a prins representation 49 49 //some refactoring should be done here in the future - the crossover operation should be called directly 50 50 51 InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName; 52 IAtomicOperation op = this.ExecutionContext.CreateOperation( 53 InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope); 54 op.Operator.Execute((IExecutionContext)op, CancellationToken); 51 if (parent1.Length == parent2.Length) { 52 InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName; 53 IAtomicOperation op = this.ExecutionContext.CreateOperation( 54 InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope); 55 op.Operator.Execute((IExecutionContext)op, CancellationToken); 55 56 56 string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;57 if (ExecutionContext.Scope.Variables.ContainsKey(childName)) {58 Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation;59 ExecutionContext.Scope.Variables.Remove(childName);57 string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName; 58 if (ExecutionContext.Scope.Variables.ContainsKey(childName)) { 59 Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation; 60 ExecutionContext.Scope.Variables.Remove(childName); 60 61 61 return new PrinsEncoding(permutation, Cities, 62 DueTimeParameter.ActualValue, 63 ServiceTimeParameter.ActualValue, 64 ReadyTimeParameter.ActualValue, 65 DemandParameter.ActualValue, 66 CapacityParameter.ActualValue, 67 FleetUsageFactor.ActualValue, 68 TimeFactor.ActualValue, 69 DistanceFactor.ActualValue, 70 OverloadPenalty.ActualValue, 71 TardinessPenalty.ActualValue, 72 CoordinatesParameter.ActualValue, 73 UseDistanceMatrixParameter.ActualValue); 74 } else 75 return null; 62 return new PrinsEncoding(permutation, Cities, 63 DueTimeParameter.ActualValue, 64 ServiceTimeParameter.ActualValue, 65 ReadyTimeParameter.ActualValue, 66 DemandParameter.ActualValue, 67 CapacityParameter.ActualValue, 68 FleetUsageFactor.ActualValue, 69 TimeFactor.ActualValue, 70 DistanceFactor.ActualValue, 71 OverloadPenalty.ActualValue, 72 TardinessPenalty.ActualValue, 73 CoordinatesParameter.ActualValue, 74 UseDistanceMatrixParameter.ActualValue); 75 } else 76 return null; 77 } else { 78 return parent1.Clone() as PrinsEncoding; 79 } 76 80 } 77 81 } -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/PrinsEncoding.cs
r5445 r6618 75 75 public override List<Tour> GetTours(ILookupParameter<DoubleMatrix> distanceMatrix, int maxVehicles = int.MaxValue) { 76 76 List<Tour> result = new List<Tour>(); 77 78 DistanceMatrix distMatrix = VRPUtilities.GetDistanceMatrix(coordinates, distanceMatrix, useDistanceMatrix); 77 79 78 80 //Split permutation into vector P … … 106 108 overloadPenalty, 107 109 tardinessPenalty, 108 coordinates, 109 distanceMatrix, 110 useDistanceMatrix); 110 distMatrix); 111 111 112 112 double cost = eval.Quality; -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Tour.cs
r5445 r6618 48 48 public bool Feasible(DoubleArray dueTimeArray, 49 49 DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, DoubleValue capacity, 50 D oubleMatrix coordinates, ILookupParameter<DoubleMatrix> distanceMatrix, BoolValue useDistanceMatrix) {50 DistanceMatrix distMatrix) { 51 51 TourEvaluation eval = VRPEvaluator.EvaluateTour(this, 52 52 dueTimeArray, … … 60 60 new DoubleValue(1), 61 61 new DoubleValue(1), 62 coordinates, 63 distanceMatrix, 64 useDistanceMatrix); 62 distMatrix); 65 63 66 64 return eval.Overload < double.Epsilon && eval.Tardiness < double.Epsilon; 67 65 } 68 66 69 public double GetLength(DoubleMatrix coordinates, 70 ILookupParameter<DoubleMatrix> distanceMatrix, 71 BoolValue useDistanceMatrix) { 67 public double GetLength(DistanceMatrix distMatrix) { 72 68 double length = 0; 73 69 … … 82 78 for (int i = 1; i < cities.Count; i++) { 83 79 length += VRPUtilities.GetDistance( 84 cities[i - 1], cities[i], coordinates, distanceMatrix, useDistanceMatrix);80 cities[i - 1], cities[i], distMatrix); 85 81 } 86 82 } -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs
r5445 r6618 48 48 49 49 protected override ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2) { 50 //note - the inner crossover is called here and the resultis converted to a prins representation50 //note - the inner crossover is called here and the solution is converted to a prins representation 51 51 //some refactoring should be done here in the future - the crossover operation should be called directly 52 52 53 InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName; 54 IAtomicOperation op = this.ExecutionContext.CreateOperation( 55 InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope); 56 op.Operator.Execute((IExecutionContext)op, CancellationToken); 53 if (parent1.Length == parent2.Length) { 54 InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName; 55 IAtomicOperation op = this.ExecutionContext.CreateOperation( 56 InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope); 57 op.Operator.Execute((IExecutionContext)op, CancellationToken); 57 58 58 string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;59 if (ExecutionContext.Scope.Variables.ContainsKey(childName)) {60 Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation;61 ExecutionContext.Scope.Variables.Remove(childName);59 string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName; 60 if (ExecutionContext.Scope.Variables.ContainsKey(childName)) { 61 Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation; 62 ExecutionContext.Scope.Variables.Remove(childName); 62 63 63 return new ZhuEncoding(permutation, Cities, 64 DueTimeParameter.ActualValue, 65 ServiceTimeParameter.ActualValue, 66 ReadyTimeParameter.ActualValue, 67 DemandParameter.ActualValue, 68 CapacityParameter.ActualValue, 69 CoordinatesParameter.ActualValue, 70 UseDistanceMatrixParameter.ActualValue); 71 } else 72 return null; 64 return new ZhuEncoding(permutation, Cities, 65 DueTimeParameter.ActualValue, 66 ServiceTimeParameter.ActualValue, 67 ReadyTimeParameter.ActualValue, 68 DemandParameter.ActualValue, 69 CapacityParameter.ActualValue, 70 CoordinatesParameter.ActualValue, 71 UseDistanceMatrixParameter.ActualValue); 72 } else 73 return null; 74 } else { 75 return parent1.Clone() as ZhuEncoding; 76 } 73 77 } 74 78 } -
branches/GP.Grammar.Editor/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/ZhuEncoding.cs
r5445 r6618 63 63 Tour newTour = new Tour(); 64 64 65 DistanceMatrix distMatrix = VRPUtilities.GetDistanceMatrix(coordinates, distanceMatrix, useDistanceMatrix); 66 65 67 for (int i = 0; i < this.Length; i++) { 66 68 int city = this[i] + 1; … … 72 74 demandArray, 73 75 capacity, 74 coordinates, 75 distanceMatrix, 76 useDistanceMatrix)) { 76 distMatrix)) { 77 77 newTour.Cities.Remove(city); 78 78 if (newTour.Cities.Count > 0)
Note: See TracChangeset
for help on using the changeset viewer.