- Timestamp:
- 06/20/11 13:36:49 (14 years ago)
- Location:
- trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinCrossover.cs
r5445 r6449 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 { … … 47 48 protected abstract PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2); 48 49 49 protected bool FindInsertionPlace(PotvinEncoding individual, int city, out int route, out int place) { 50 protected static bool FindInsertionPlace(PotvinEncoding individual, int city, 51 DoubleArray dueTime, DoubleArray serviceTime, DoubleArray readyTime, DoubleArray demand, 52 DoubleValue capacity, DistanceMatrix distMatrix, 53 out int route, out int place) { 50 54 return individual.FindInsertionPlace( 51 DueTimeParameter.ActualValue, ServiceTimeParameter.ActualValue, ReadyTimeParameter.ActualValue, 52 DemandParameter.ActualValue, CapacityParameter.ActualValue, CoordinatesParameter.ActualValue, 53 DistanceMatrixParameter, UseDistanceMatrixParameter.ActualValue, 55 dueTime, serviceTime, readyTime, 56 demand, capacity, distMatrix, 54 57 city, -1, out route, out place); 55 58 } … … 68 71 } 69 72 70 protected bool Repair(IRandom random, PotvinEncoding solution, Tour newTour) { 73 protected static bool RouteUnrouted(PotvinEncoding solution, DistanceMatrix distMatrix, 74 DoubleArray dueTime, DoubleArray readyTime, DoubleArray serviceTime, DoubleArray demand, DoubleValue capacity) { 75 bool success = true; 76 int index = 0; 77 while (index < solution.Unrouted.Count && success) { 78 int unrouted = solution.Unrouted[index]; 79 80 int route, place; 81 if (FindInsertionPlace(solution, unrouted, 82 dueTime, serviceTime, readyTime, demand, capacity, 83 distMatrix, 84 out route, out place)) { 85 solution.Tours[route].Cities.Insert(place, unrouted); 86 } else { 87 success = false; 88 } 89 90 index++; 91 } 92 93 for (int i = 0; i < index; i++) 94 solution.Unrouted.RemoveAt(0); 95 96 return success; 97 } 98 99 protected static bool Repair(IRandom random, PotvinEncoding solution, Tour newTour, DistanceMatrix distmatrix, 100 DoubleArray dueTime, DoubleArray readyTime, DoubleArray serviceTime, DoubleArray demand, DoubleValue capacity) { 71 101 bool success = true; 72 102 … … 84 114 while (newTour.Cities.Contains(0)) 85 115 newTour.Cities.Remove(0); 116 117 if (!newTour.Feasible( 118 dueTime, serviceTime, readyTime, demand, capacity, distmatrix)) 119 return false; 86 120 87 121 //remove duplicates from old tours … … 105 139 106 140 //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); 141 success = RouteUnrouted(solution, distmatrix, dueTime, readyTime, serviceTime, demand, capacity); 123 142 124 143 return success; -
trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs
r5445 r6449 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 42 52 PotvinEncoding child = parent2.Clone() as PotvinEncoding; 43 53 … … 55 65 child.Unrouted.Add(city); 56 66 57 if (Repair(random, child, replacing ))67 if (Repair(random, child, replacing, distMatrix, dueTime, readyTime, serviceTime, demand, capacity)) 58 68 return child; 59 69 else { … … 61 71 return parent1.Clone() as PotvinEncoding; 62 72 else 63 return parent2.Clone() as PotvinEncoding; 73 return parent2.Clone() as PotvinEncoding; 64 74 } 65 75 } -
trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Crossovers/PotvinSequenceBasedCrossover.cs
r5445 r6449 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 43 53 PotvinEncoding child = parent1.Clone() as PotvinEncoding; 44 54 Tour newTour = new Tour(); … … 69 79 child.Unrouted.Add(city); 70 80 71 if (Feasible(newTour) && 72 Repair(random, child, newTour)) { 81 if (Repair(random, child, newTour, distMatrix, dueTime, readyTime, serviceTime, demand, capacity)) { 73 82 return child; 74 83 } else { 75 if (random.NextDouble() < 0.5)84 if (random.NextDouble() < 0.5) 76 85 return parent1.Clone() as PotvinEncoding; 77 86 else 78 return parent2.Clone() as PotvinEncoding; 87 return parent2.Clone() as PotvinEncoding; 79 88 } 80 89 } -
trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinLocalSearchManipulator.cs
r5445 r6449 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; -
trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinManipulator.cs
r5445 r6449 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 { … … 45 46 protected abstract void Manipulate(IRandom random, PotvinEncoding individual); 46 47 47 protected int SelectRandomTourBiasedByLength(IRandom random, PotvinEncoding individual) {48 protected static int SelectRandomTourBiasedByLength(IRandom random, PotvinEncoding individual) { 48 49 int tourIndex = -1; 49 50 … … 51 52 double[] probabilities = new double[individual.Tours.Count]; 52 53 for (int i = 0; i < individual.Tours.Count; i++) { 53 probabilities[i] = 1.0 / ((double)individual.Tours[i].Cities.Count / (double) Cities);54 probabilities[i] = 1.0 / ((double)individual.Tours[i].Cities.Count / (double)individual.Cities); 54 55 sum += probabilities[i]; 55 56 } … … 72 73 } 73 74 74 protected bool FindInsertionPlace(PotvinEncoding individual, int city, int routeToAvoid, out int route, out int place) { 75 protected static bool FindInsertionPlace(PotvinEncoding individual, int city, int routeToAvoid, 76 DoubleArray dueTime, DoubleArray serviceTime, DoubleArray readyTime, DoubleArray demand, 77 DoubleValue capacity, DistanceMatrix distMatrix, 78 out int route, out int place) { 75 79 return individual.FindInsertionPlace( 76 DueTimeParameter.ActualValue, ServiceTimeParameter.ActualValue, ReadyTimeParameter.ActualValue, 77 DemandParameter.ActualValue, CapacityParameter.ActualValue, CoordinatesParameter.ActualValue, 78 DistanceMatrixParameter, UseDistanceMatrixParameter.ActualValue, 80 dueTime, serviceTime, readyTime, 81 demand, capacity, distMatrix, 79 82 city, routeToAvoid, out route, out place); 80 83 } 84 81 85 82 86 public override IOperation Apply() { -
trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinOneLevelExchangeManipulator.cs
r5445 r6449 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) { 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, 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 Apply(random, individual, dueTime, readyTime, serviceTime, demand, capacity, distMatrix); 85 } 67 86 } 68 87 } -
trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/Manipulators/PotvinTwoLevelExchangeManipulator.cs
r5445 r6449 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) { 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, 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 Apply(random, individual, dueTime, readyTime, serviceTime, demand, capacity, distMatrix); 103 } 85 104 } 86 105 } -
trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/PotvinEncoding.cs
r5445 r6449 69 69 DoubleArray dueTimeArray, 70 70 DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, DoubleValue capacity, 71 D oubleMatrix coordinates, ILookupParameter<DoubleMatrix> distanceMatrix, BoolValue useDistanceMatrix,71 DistanceMatrix distMatrix, 72 72 int city, int routeToAvoid, out int route, out int place) { 73 73 route = -1; 74 74 place = -1; 75 bool bestFeasible = false; 75 76 double minDetour = 0; 76 77 … … 78 79 if (tour != routeToAvoid) { 79 80 for (int i = 0; i <= Tours[tour].Cities.Count; i++) { 80 double length = Tours[tour].GetLength( coordinates, distanceMatrix, useDistanceMatrix);81 double length = Tours[tour].GetLength(distMatrix); 81 82 82 83 Tours[tour].Cities.Insert(i, city); 83 84 84 if (Tours[tour].Feasible(dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, 85 capacity, coordinates, distanceMatrix, useDistanceMatrix)) { 86 double newLength = Tours[tour].GetLength(coordinates, distanceMatrix, useDistanceMatrix); 85 bool feasible = Tours[tour].Feasible(dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, 86 capacity, distMatrix); 87 87 88 if (!bestFeasible || feasible) { 89 double newLength = Tours[tour].GetLength(distMatrix); 88 90 double detour = newLength - length; 89 91 90 if (route <= 0 || detour < minDetour ) {92 if (route <= 0 || detour < minDetour || (!(bestFeasible && !feasible)) && detour < minDetour || (feasible && !bestFeasible)) { 91 93 route = tour; 92 94 place = i; 93 95 minDetour = detour; 96 97 if (feasible) 98 bestFeasible = true; 94 99 } 95 100 }
Note: See TracChangeset
for help on using the changeset viewer.