- Timestamp:
- 07/28/11 14:16:21 (13 years ago)
- Location:
- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs
r5127 r6607 83 83 private static PotvinEncoding CreateSolution(IVRPProblemInstance instance, IRandom random, bool adhereTimeWindows) { 84 84 PotvinEncoding result = new PotvinEncoding(instance); 85 IVRPEvaluator eval = instance.EvaluatorParameter.Value;86 85 87 86 List<int> customers = new List<int>(); … … 105 104 currentTour.Stops.Insert(stopIdx, customers[index]); 106 105 107 CVRPEvaluation evaluation = eval.Evaluate(instance,currentTour) as CVRPEvaluation;106 CVRPEvaluation evaluation = instance.Evaluate(currentTour) as CVRPEvaluation; 108 107 if (result.Tours.Count < instance.Vehicles.Value && 109 ((adhereTimeWindows && ! eval.Feasible(evaluation)) || ((!adhereTimeWindows) && evaluation.Overload > double.Epsilon))) {108 ((adhereTimeWindows && !instance.Feasible(evaluation)) || ((!adhereTimeWindows) && evaluation.Overload > double.Epsilon))) { 110 109 currentTour.Stops.RemoveAt(stopIdx); 111 110 -
branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinCrossover.cs
r4752 r6607 39 39 } 40 40 41 public IValueParameter<BoolValue> AllowInfeasibleSolutions { 42 get { return (IValueParameter<BoolValue>)Parameters["AllowInfeasibleSolutions"]; } 43 } 44 41 45 [StorableConstructor] 42 46 protected PotvinCrossover(bool deserializing) : base(deserializing) { } … … 44 48 public PotvinCrossover() { 45 49 Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators.")); 50 Parameters.Add(new ValueParameter<BoolValue>("AllowInfeasibleSolutions", "Indicates if infeasible solutions should be allowed.", new BoolValue(false))); 46 51 } 47 52 … … 52 57 protected abstract PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2); 53 58 54 protected bool FindInsertionPlace(PotvinEncoding individual, int city, out int route, out int place) { 59 protected static bool FindInsertionPlace(PotvinEncoding individual, int city, bool allowInfeasible, 60 out int route, out int place) { 55 61 return individual.FindInsertionPlace( 56 city, -1, out route, out place); 62 city, -1, allowInfeasible, 63 out route, out place); 57 64 } 58 65 … … 70 77 } 71 78 72 protected bool Repair(IRandom random, PotvinEncoding solution, Tour newTour) {79 protected static bool RouteUnrouted(PotvinEncoding solution, bool allowInfeasible) { 73 80 bool success = true; 74 81 int index = 0; 82 while (index < solution.Unrouted.Count && success) { 83 int unrouted = solution.Unrouted[index]; 84 85 int route, place; 86 if (FindInsertionPlace(solution, unrouted, allowInfeasible, 87 out route, out place)) { 88 solution.Tours[route].Stops.Insert(place, unrouted); 89 } else { 90 success = false; 91 } 92 93 index++; 94 } 95 96 for (int i = 0; i < index; i++) 97 solution.Unrouted.RemoveAt(0); 98 99 return success; 100 } 101 102 protected static bool Repair(IRandom random, PotvinEncoding solution, Tour newTour, IVRPProblemInstance instance, bool allowInfeasible) { 103 bool success = true; 104 75 105 //remove duplicates from new tour 76 106 for (int i = 0; i < newTour.Stops.Count; i++) { … … 106 136 } 107 137 138 if (!allowInfeasible && !instance.Feasible(newTour)) 139 return false; 140 108 141 //route unrouted vehicles 109 int index = 0; 110 while (index < solution.Unrouted.Count && success) { 111 int unrouted = solution.Unrouted[index]; 112 113 int route, place; 114 if(FindInsertionPlace(solution, unrouted, out route, out place)) { 115 solution.Tours[route].Stops.Insert(place, unrouted); 116 } else { 117 success = false; 118 } 119 120 index++; 121 } 122 123 for (int i = 0; i < index; i++) 124 solution.Unrouted.RemoveAt(0); 142 success = RouteUnrouted(solution, allowInfeasible); 125 143 126 144 return success; -
branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs
r4752 r6607 46 46 47 47 protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) { 48 bool allowInfeasible = AllowInfeasibleSolutions.Value.Value; 49 48 50 PotvinEncoding child = parent2.Clone() as PotvinEncoding; 49 51 … … 61 63 child.Unrouted.Add(city); 62 64 63 if (Repair(random, child, replacing ))65 if (Repair(random, child, replacing, ProblemInstance, allowInfeasible) || allowInfeasible) 64 66 return child; 65 67 else { -
branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinSequenceBasedCrossover.cs
r4752 r6607 46 46 47 47 protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) { 48 bool allowInfeasible = AllowInfeasibleSolutions.Value.Value; 49 48 50 PotvinEncoding child = parent1.Clone() as PotvinEncoding; 49 51 Tour newTour = new Tour(); … … 76 78 child.Unrouted.Add(city); 77 79 78 if (ProblemInstance.Feasible(newTour) && 79 Repair(random, child, newTour)) { 80 if (Repair(random, child, newTour, ProblemInstance, allowInfeasible) || allowInfeasible) { 80 81 return child; 81 82 } else { -
branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinManipulator.cs
r4752 r6607 38 38 } 39 39 40 public IValueParameter<BoolValue> AllowInfeasibleSolutions { 41 get { return (IValueParameter<BoolValue>)Parameters["AllowInfeasibleSolutions"]; } 42 } 43 40 44 [StorableConstructor] 41 45 protected PotvinManipulator(bool deserializing) : base(deserializing) { } … … 43 47 public PotvinManipulator() { 44 48 Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators.")); 49 Parameters.Add(new ValueParameter<BoolValue>("AllowInfeasibleSolutions", "Indicates if infeasible solutions should be allowed.", new BoolValue(false))); 45 50 } 46 51 … … 78 83 } 79 84 80 protected bool FindInsertionPlace(PotvinEncoding individual, int city, int routeToAvoid, out int route, out int place) {85 protected bool FindInsertionPlace(PotvinEncoding individual, int city, int routeToAvoid, bool allowInfeasible, out int route, out int place) { 81 86 return individual.FindInsertionPlace( 82 city, routeToAvoid, out route, out place);87 city, routeToAvoid, allowInfeasible, out route, out place); 83 88 } 84 89 -
branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinOneLevelExchangeManipulator.cs
r4752 r6607 46 46 47 47 protected override void Manipulate(IRandom random, PotvinEncoding individual) { 48 bool allowInfeasible = AllowInfeasibleSolutions.Value.Value; 49 48 50 int selectedIndex = SelectRandomTourBiasedByLength(random, individual); 49 51 Tour route1 = … … 54 56 int insertedRoute, insertedPlace; 55 57 56 if (FindInsertionPlace(individual, route1.Stops[i], selectedIndex, out insertedRoute, out insertedPlace)) {58 if (FindInsertionPlace(individual, route1.Stops[i], selectedIndex, allowInfeasible, out insertedRoute, out insertedPlace)) { 57 59 individual.Tours[insertedRoute].Stops.Insert(insertedPlace, route1.Stops[i]); 58 60 replaced.Add(route1.Stops[i]); -
branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinTwoLevelExchangeManipulator.cs
r5867 r6607 46 46 47 47 protected override void Manipulate(IRandom random, PotvinEncoding individual) { 48 bool allowInfeasible = AllowInfeasibleSolutions.Value.Value; 49 48 50 int selectedIndex = SelectRandomTourBiasedByLength(random, individual); 49 51 Tour route1 = individual.Tours[selectedIndex]; … … 65 67 int routeIdx, place; 66 68 if (FindInsertionPlace(individual, 67 customer2, selectedIndex, out routeIdx, out place)) {69 customer2, selectedIndex, allowInfeasible, out routeIdx, out place)) { 68 70 individual.Tours[routeIdx].Stops.Insert(place, customer2); 69 71 route1.Stops.RemoveAt(customer1Position); -
branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveMaker.cs
r5867 r6607 106 106 107 107 //reset move quality 108 VRPEvaluation eval = ProblemInstance.Evaluat orParameter.Value.Evaluate(ProblemInstance,newSolution);108 VRPEvaluation eval = ProblemInstance.Evaluate(newSolution); 109 109 MoveQualityParameter.ActualValue.Value = eval.Quality; 110 110 111 111 //update penalty factor 112 112 double sigma = SigmaParameter.Value.Value; 113 if (ProblemInstance. EvaluatorParameter.Value.Feasible(eval)) {113 if (ProblemInstance.Feasible(eval)) { 114 114 newSolution.PenaltyFactor /= (1 + sigma); 115 115 if (newSolution.PenaltyFactor < MinPenaltyFactorParameter.Value.Value) -
branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/PotvinEncoding.cs
r5202 r6607 80 80 81 81 public double GetTourLength(Tour tour) { 82 double length = 0; 83 84 if (tour.Stops.Count > 0) { 85 List<int> cities = new List<int>(); 86 cities.Add(0); 87 foreach (int city in tour.Stops) { 88 cities.Add(city); 89 } 90 cities.Add(0); 91 92 for (int i = 1; i < cities.Count; i++) { 93 length += ProblemInstance.GetDistance(cities[i - 1], cities[i]); 94 } 95 } 96 97 return length; 82 return tour.GetTourLength(ProblemInstance); 98 83 } 99 84 … … 105 90 tour.Stops.Insert(i, city); 106 91 107 VRPEvaluation eval = ProblemInstance.Evaluat orParameter.Value.Evaluate(ProblemInstance,tour);92 VRPEvaluation eval = ProblemInstance.Evaluate(tour); 108 93 double quality = eval.Quality + eval.Penalty * (PenaltyFactor - 1.0); 109 94 … … 122 107 } 123 108 124 public bool FindInsertionPlace(int city, int routeToAvoid, out int route, out int place) {109 public bool FindInsertionPlace(int city, int routeToAvoid, bool allowInfeasible, out int route, out int place) { 125 110 route = -1; 126 111 place = -1; 127 double minDetour = 0; 112 bool bestFeasible = false; 113 double minDetour = double.MaxValue; 128 114 129 115 for (int tour = 0; tour < Tours.Count; tour++) { 130 116 if (tour != routeToAvoid) { 131 double length = GetTourLength(Tours[tour]); 117 for (int i = 0; i <= Tours[tour].Stops.Count; i++) { 118 double length = GetTourLength(Tours[tour]); 132 119 133 for (int i = 0; i <= Tours[tour].Stops.Count; i++) {134 120 Tours[tour].Stops.Insert(i, city); 135 121 136 VRPEvaluation eval = ProblemInstance.EvaluatorParameter.Value.Evaluate( 137 ProblemInstance, Tours[tour]); 138 if (ProblemInstance.EvaluatorParameter.Value.Feasible(eval)) { 139 double newLength = eval.Distance; 122 bool feasible = ProblemInstance.Feasible(Tours[tour]); 140 123 124 if (feasible || allowInfeasible && !bestFeasible) { 125 double newLength = GetTourLength(Tours[tour]); 141 126 double detour = newLength - length; 142 127 143 if (route < = 0 || detour < minDetour) {128 if (route < 0 || detour < minDetour || feasible && !bestFeasible) { 144 129 route = tour; 145 130 place = i; 146 131 minDetour = detour; 132 133 if (feasible) 134 bestFeasible = true; 147 135 } 148 136 }
Note: See TracChangeset
for help on using the changeset viewer.