public static void Apply(PotvinEncoding solution, PotvinVehicleAssignmentMove move, IVRPProblemInstance problemInstance) { int vehicle1 = solution.VehicleAssignment[move.Tour1]; int vehicle2 = solution.VehicleAssignment[move.Tour2]; solution.VehicleAssignment[move.Tour1] = vehicle2; solution.VehicleAssignment[move.Tour2] = vehicle1; }
protected override PotvinPDShiftMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List<PotvinPDShiftMove> result = new List<PotvinPDShiftMove>(); IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance; int max = individual.Tours.Count; if (individual.Tours.Count >= problemInstance.Vehicles.Value) max = max - 1; for (int i = 0; i < individual.Tours.Count; i++) { for (int j = 0; j < individual.Tours[i].Stops.Count; j++) { for (int k = 0; k <= max; k++) { if (k != i) { int city = individual.Tours[i].Stops[j]; if (pdp == null || pdp.GetDemand(city) >= 0) { PotvinPDShiftMove move = new PotvinPDShiftMove( city, i, k, individual); result.Add(move); } } } } } return result.ToArray(); }
protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) { TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour))); eval.InsertionInfo.AddTourInsertionInfo(tourInfo); double distance = 0.0; double quality = 0.0; //simulate a tour, start and end at depot for (int i = 0; i <= tour.Stops.Count; i++) { int start = 0; if (i > 0) start = tour.Stops[i - 1]; int end = 0; if (i < tour.Stops.Count) end = tour.Stops[i]; //drive there double currentDistace = instance.GetDistance(start, end, solution); distance += currentDistace; StopInsertionInfo stopInfo = new StopInsertionInfo(start, end); tourInfo.AddStopInsertionInfo(stopInfo); } //Fleet usage quality += instance.FleetUsageFactor.Value; //Distance quality += instance.DistanceFactor.Value * distance; eval.Distance += distance; eval.VehicleUtilization += 1; tourInfo.Quality = quality; eval.Quality += quality; }
public static void Apply(PotvinEncoding solution, PotvinPDExchangeMove move, IVRPProblemInstance problemInstance) { if (move.Tour >= solution.Tours.Count) solution.Tours.Add(new Tour()); Tour tour = solution.Tours[move.Tour]; Tour oldTour = solution.Tours.Find(t => t.Stops.Contains(move.City)); oldTour.Stops.Remove(move.City); if (problemInstance is IPickupAndDeliveryProblemInstance) { IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance; int location = pdp.GetPickupDeliveryLocation(move.City); Tour oldTour2 = solution.Tours.Find(t => t.Stops.Contains(location)); oldTour2.Stops.Remove(location); location = pdp.GetPickupDeliveryLocation(move.Replaced); oldTour2 = solution.Tours.Find(t => t.Stops.Contains(location)); oldTour2.Stops.Remove(location); tour.Stops.Remove(move.Replaced); solution.InsertPair(tour, move.City, pdp.GetPickupDeliveryLocation(move.City), problemInstance); solution.InsertPair(oldTour, move.Replaced, pdp.GetPickupDeliveryLocation(move.Replaced), problemInstance); } else { tour.Stops.Remove(move.Replaced); int place = solution.FindBestInsertionPlace(tour, move.City); tour.Stops.Insert(place, move.City); place = solution.FindBestInsertionPlace(oldTour, move.Replaced); oldTour.Stops.Insert(place, move.Replaced); } solution.Repair(); }
protected override AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance) { List<AlbaIntraRouteInversionMove> moves = new List<AlbaIntraRouteInversionMove>(); int currentTourStart = 0; int currentTourEnd = 0; while (currentTourEnd != individual.Length) { currentTourEnd = currentTourStart; while (individual[currentTourEnd] < problemInstance.Cities.Value && currentTourEnd < individual.Length) { currentTourEnd++; } int tourLength = currentTourEnd - currentTourStart; if (tourLength >= 4) { for (int i = 0; i <= tourLength - 4; i++) { for (int j = i + 2; j <= tourLength - 2; j++) { AlbaIntraRouteInversionMove move = new AlbaIntraRouteInversionMove( currentTourStart + i, currentTourStart + j, individual); moves.Add(move); } } } currentTourStart = currentTourEnd; } return moves.ToArray(); }
public static void ApplyManipulation(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance, bool allowInfeasible) { int selectedIndex = SelectRandomTourBiasedByLength(random, individual, instance); if (selectedIndex >= 0) { Tour route1 = individual.Tours[selectedIndex]; int count = route1.Stops.Count; int i = 0; while (i < count) { int insertedRoute, insertedPlace; int city = route1.Stops[i]; route1.Stops.Remove(city); if (FindInsertionPlace(individual, city, selectedIndex, allowInfeasible, out insertedRoute, out insertedPlace)) { individual.Tours[insertedRoute].Stops.Insert(insertedPlace, city); } else { route1.Stops.Insert(i, city); i++; } count = route1.Stops.Count; } } }
public static PotvinPDShiftMove Apply(PotvinEncoding individual, IVRPProblemInstance problemInstance, IRandom rand) { List<int> cities = new List<int>(); IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance; for (int i = 1; i <= individual.Cities; i++) { if (pdp == null || pdp.GetDemand(i) >= 0) cities.Add(i); } if (cities.Count >= 1) { int city = cities[rand.Next(cities.Count)]; Tour oldTour = individual.Tours.Find(t => t.Stops.Contains(city)); int oldTourIndex = individual.Tours.IndexOf(oldTour); int max = individual.Tours.Count; if (individual.Tours.Count >= problemInstance.Vehicles.Value) max = max - 1; int newTourIndex = rand.Next(max); if (newTourIndex >= oldTourIndex) newTourIndex++; return new PotvinPDShiftMove(city, oldTourIndex, newTourIndex, individual); } else { return null; } }
protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda) { List<AlbaLambdaInterchangeMove> moves = new List<AlbaLambdaInterchangeMove>(); List<Tour> tours = individual.GetTours(); for (int tour1Index = 0; tour1Index < tours.Count; tour1Index++) { Tour tour1 = tours[tour1Index]; for (int tour2Index = tour1Index + 1; tour2Index < tours.Count; tour2Index++) { Tour tour2 = tours[tour2Index]; for (int length1 = 0; length1 <= Math.Min(lambda, tour1.Stops.Count); length1++) { for (int length2 = 0; length2 <= Math.Min(lambda, tour2.Stops.Count); length2++) { if (length1 != 0 || length2 != 0) { for (int index1 = 0; index1 < tour1.Stops.Count - length1 + 1; index1++) { for (int index2 = 0; index2 < tour2.Stops.Count - length2 + 1; index2++) { moves.Add(new AlbaLambdaInterchangeMove(tour1Index, index1, length1, tour2Index, index2, length2, individual)); } } } } } } } return moves.ToArray(); }
public static void Apply(PotvinEncoding solution, PotvinPDShiftMove move, IVRPProblemInstance problemInstance) { bool newTour = false; if (move.Tour >= solution.Tours.Count) { solution.Tours.Add(new Tour()); newTour = true; } Tour tour = solution.Tours[move.Tour]; Tour oldTour = solution.Tours.Find(t => t.Stops.Contains(move.City)); oldTour.Stops.Remove(move.City); if (problemInstance is IPickupAndDeliveryProblemInstance) { IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance; int location = pdp.GetPickupDeliveryLocation(move.City); Tour oldTour2 = solution.Tours.Find(t => t.Stops.Contains(location)); oldTour2.Stops.Remove(location); solution.InsertPair(tour, move.City, location, problemInstance); } else { int place = solution.FindBestInsertionPlace(tour, move.City); tour.Stops.Insert(place, move.City); } if (newTour) { List<int> vehicles = new List<int>(); for (int i = move.Tour; i < problemInstance.Vehicles.Value; i++) { vehicles.Add(solution.GetVehicleAssignment(i)); } double bestQuality = double.MaxValue; int bestVehicle = -1; int originalVehicle = solution.GetVehicleAssignment(move.Tour); foreach (int vehicle in vehicles) { solution.VehicleAssignment[move.Tour] = vehicle; double quality = problemInstance.EvaluateTour(tour, solution).Quality; if (quality < bestQuality) { bestQuality = quality; bestVehicle = vehicle; } } solution.VehicleAssignment[move.Tour] = originalVehicle; int index = -1; for (int i = move.Tour; i < solution.VehicleAssignment.Length; i++) { if (solution.VehicleAssignment[i] == bestVehicle) { index = i; break; } } solution.VehicleAssignment[index] = originalVehicle; solution.VehicleAssignment[move.Tour] = bestVehicle; } solution.Repair(); }
protected static int SelectRandomTourBiasedByLength(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance) { int tourIndex = -1; double sum = 0.0; double[] probabilities = new double[individual.Tours.Count]; for (int i = 0; i < individual.Tours.Count; i++) { probabilities[i] = 1.0 / ((double)individual.Tours[i].Stops.Count / (double)instance.Cities.Value); sum += probabilities[i]; } for (int i = 0; i < probabilities.Length; i++) probabilities[i] = probabilities[i] / sum; double rand = random.NextDouble(); double cumulatedProbabilities = 0.0; int index = 0; while (tourIndex == -1 && index < probabilities.Length) { if (cumulatedProbabilities <= rand && rand <= cumulatedProbabilities + probabilities[index]) tourIndex = index; cumulatedProbabilities += probabilities[index]; index++; } return tourIndex; }
public VRPSolution(IVRPProblemInstance problemInstance, IVRPEncoding solution, DoubleValue quality) : base() { this.problemInstance = problemInstance; this.solution = solution; this.quality = quality; Initialize(); }
public PermutationEncoding(Permutation permutation, IVRPProblemInstance problemInstance) : base(PermutationTypes.RelativeUndirected) { this.array = new int[permutation.Length]; for (int i = 0; i < array.Length; i++) this.array[i] = permutation[i]; this.ProblemInstance = problemInstance; }
public static PotvinEncoding CreateSolution(IVRPProblemInstance instance, IRandom random, bool adhereTimeWindows) { PotvinEncoding result = new PotvinEncoding(instance); IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance; List<int> customers = new List<int>(); for (int i = 1; i <= instance.Cities.Value; i++) if (pdp == null || pdp.GetDemand(i) >= 0) customers.Add(i); customers.Sort((city1, city2) => { double angle1 = CalculateAngleToDepot(instance, city1); double angle2 = CalculateAngleToDepot(instance, city2); return angle1.CompareTo(angle2); }); Tour currentTour = new Tour(); result.Tours.Add(currentTour); int j = random.Next(customers.Count); for (int i = 0; i < customers.Count; i++) { int index = (i + j) % customers.Count; int stopIdx = 0; if (currentTour.Stops.Count > 0) stopIdx = result.FindBestInsertionPlace(currentTour, customers[index]); currentTour.Stops.Insert(stopIdx, customers[index]); if (pdp != null) { stopIdx = result.FindBestInsertionPlace(currentTour, pdp.GetPickupDeliveryLocation(customers[index])); currentTour.Stops.Insert(stopIdx, pdp.GetPickupDeliveryLocation(customers[index])); } CVRPEvaluation evaluation = instance.EvaluateTour(currentTour, result) as CVRPEvaluation; if (result.Tours.Count < instance.Vehicles.Value && ((adhereTimeWindows && !instance.Feasible(evaluation)) || ((!adhereTimeWindows) && evaluation.Overload > double.Epsilon))) { currentTour.Stops.Remove(customers[index]); if (pdp != null) currentTour.Stops.Remove(pdp.GetPickupDeliveryLocation(customers[index])); if (currentTour.Stops.Count == 0) result.Tours.Remove(currentTour); currentTour = new Tour(); result.Tours.Add(currentTour); currentTour.Stops.Add(customers[index]); if (pdp != null) { currentTour.Stops.Add(pdp.GetPickupDeliveryLocation(customers[index])); } } } if (currentTour.Stops.Count == 0) result.Tours.Remove(currentTour); return result; }
public static AlbaLambdaInterchangeMove[] GenerateAllMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda, int sampleSize, IRandom rand) { AlbaLambdaInterchangeMove[] moves = new AlbaLambdaInterchangeMove[sampleSize]; for (int i = 0; i < sampleSize; i++) { moves[i] = AlbaStochasticLambdaInterchangeSingleMoveGenerator.Apply( individual, problemInstance.Cities.Value, lambda, rand); } return moves; }
protected PermutationEncoding(PermutationEncoding original, Cloner cloner) : base(original, cloner) { this.readOnly = original.readOnly; if (original.ProblemInstance != null && cloner.ClonedObjectRegistered(original.ProblemInstance)) this.ProblemInstance = (IVRPProblemInstance)cloner.Clone(original.ProblemInstance); else this.ProblemInstance = original.ProblemInstance; }
protected override PotvinPDShiftMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List<PotvinPDShiftMove> result = new List<PotvinPDShiftMove>(); PotvinPDShiftMove move = Apply(individual, ProblemInstance, RandomParameter.ActualValue); if (move != null) result.Add(move); return result.ToArray(); }
protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) { TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour))); ; eval.InsertionInfo.AddTourInsertionInfo(tourInfo); double originalQuality = eval.Quality; IHomogenousCapacitatedProblemInstance cvrpInstance = instance as IHomogenousCapacitatedProblemInstance; DoubleArray demand = instance.Demand; double delivered = 0.0; double overweight = 0.0; double distance = 0.0; double capacity = cvrpInstance.Capacity.Value; for (int i = 0; i <= tour.Stops.Count; i++) { int end = 0; if (i < tour.Stops.Count) end = tour.Stops[i]; delivered += demand[end]; } double spareCapacity = capacity - delivered; //simulate a tour, start and end at depot for (int i = 0; i <= tour.Stops.Count; i++) { int start = 0; if (i > 0) start = tour.Stops[i - 1]; int end = 0; if (i < tour.Stops.Count) end = tour.Stops[i]; //drive there double currentDistace = instance.GetDistance(start, end, solution); distance += currentDistace; CVRPInsertionInfo stopInfo = new CVRPInsertionInfo(start, end, spareCapacity); tourInfo.AddStopInsertionInfo(stopInfo); } eval.Quality += instance.FleetUsageFactor.Value; eval.Quality += instance.DistanceFactor.Value * distance; eval.Distance += distance; eval.VehicleUtilization += 1; if (delivered > capacity) { overweight = delivered - capacity; } (eval as CVRPEvaluation).Overload += overweight; double penalty = overweight * cvrpInstance.OverloadPenalty.Value; eval.Penalty += penalty; eval.Quality += penalty; tourInfo.Penalty = penalty; tourInfo.Quality = eval.Quality - originalQuality; }
protected override PotvinCustomerRelocationMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List<PotvinCustomerRelocationMove> result = new List<PotvinCustomerRelocationMove>(); for (int i = 0; i < SampleSizeParameter.ActualValue.Value; i++) { result.Add(PotvinCustomerRelocationSingleMoveGenerator.Apply(individual, ProblemInstance, RandomParameter.ActualValue)); } return result.ToArray(); }
protected override AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance) { int sampleSize = SampleSizeParameter.ActualValue.Value; AlbaIntraRouteInversionMove[] moves = new AlbaIntraRouteInversionMove[sampleSize]; for (int i = 0; i < sampleSize; i++) { moves[i] = AlbaStochasticIntraRouteInversionSingleMoveGenerator.Apply( individual, problemInstance.Cities.Value, RandomParameter.ActualValue); } return moves; }
protected override PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List<PotvinVehicleAssignmentMove> result = new List<PotvinVehicleAssignmentMove>(); for (int i = 0; i < SampleSizeParameter.ActualValue.Value; i++) { var move = PotvinVehicleAssignmentSingleMoveGenerator.Apply(individual, ProblemInstance, RandomParameter.ActualValue); if (move != null) result.Add(move); } return result.ToArray(); }
protected override PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List<PotvinVehicleAssignmentMove> result = new List<PotvinVehicleAssignmentMove>(); for (int i = 0; i < individual.Tours.Count; i++) { for (int j = i + 1; j < problemInstance.Vehicles.Value; j++) { result.Add(new PotvinVehicleAssignmentMove(i, j, individual)); } } return result.ToArray(); }
protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer, out bool feasible) { StopInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index); double costs = 0; feasible = true; double startDistance, endDistance; costs += instance.GetInsertionDistance(insertionInfo.Start, customer, insertionInfo.End, solution, out startDistance, out endDistance); return costs; }
public static PotvinVehicleAssignmentMove Apply(PotvinEncoding individual, IVRPProblemInstance problemInstance, IRandom rand) { if (individual.Tours.Count > 1) { int tour1 = rand.Next(individual.Tours.Count); int tour2 = rand.Next(problemInstance.Vehicles.Value); while (tour2 == tour1) tour2 = rand.Next(problemInstance.Vehicles.Value); return new PotvinVehicleAssignmentMove(tour1, tour2, individual); } else { return null; } }
protected override PotvinPDRearrangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List<PotvinPDRearrangeMove> result = new List<PotvinPDRearrangeMove>(); IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance; for (int i = 1; i <= problemInstance.Cities.Value; i++) { if (pdp == null || pdp.GetDemand(i) >= 0) { int tour = individual.Tours.FindIndex(t => t.Stops.Contains(i)); result.Add(new PotvinPDRearrangeMove(i, tour, individual)); } } return result.ToArray(); }
public static PotvinTwoOptStarMove Apply(PotvinEncoding individual, IVRPProblemInstance problemInstance, IRandom rand) { int route1Idx = rand.Next(individual.Tours.Count); int route2Idx = rand.Next(individual.Tours.Count - 1); if (route2Idx >= route1Idx) route2Idx++; Tour route1 = individual.Tours[route1Idx]; Tour route2 = individual.Tours[route2Idx]; int x1 = rand.Next(route1.Stops.Count + 1); int x2 = rand.Next(route2.Stops.Count + 1); return new PotvinTwoOptStarMove(route1Idx, x1, route2Idx, x2, individual); }
public static void ApplyManipulation(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance, bool allowInfeasible) { int selectedIndex = SelectRandomTourBiasedByLength(random, individual, instance); if (selectedIndex >= 0) { Tour route1 = individual.Tours[selectedIndex]; bool performed = false; int customer1Position = 0; while (customer1Position < route1.Stops.Count) { performed = false; foreach (Tour tour in individual.Tours) { if (tour != route1) { for (int customer2Position = 0; customer2Position < tour.Stops.Count; customer2Position++) { int customer1 = route1.Stops[customer1Position]; int customer2 = tour.Stops[customer2Position]; //customer1 can be feasibly inserted at the location of customer2 tour.Stops[customer2Position] = customer1; route1.Stops.RemoveAt(customer1Position); if (instance.TourFeasible(tour, individual)) { int routeIdx, place; if (FindInsertionPlace(individual, customer2, selectedIndex, allowInfeasible, out routeIdx, out place)) { individual.Tours[routeIdx].Stops.Insert(place, customer2); //two-level exchange has been performed performed = true; break; } else { tour.Stops[customer2Position] = customer2; route1.Stops.Insert(customer1Position, customer1); } } else { tour.Stops[customer2Position] = customer2; route1.Stops.Insert(customer1Position, customer1); } } } if (performed) break; } if (!performed) customer1Position++; } } }
public static void Apply(PotvinEncoding solution, PotvinCustomerRelocationMove move, IVRPProblemInstance problemInstance) { if (move.Tour >= solution.Tours.Count) solution.Tours.Add(new Tour()); Tour tour = solution.Tours[move.Tour]; Tour oldTour = solution.Tours.Find(t => t.Stops.Contains(move.City)); oldTour.Stops.Remove(move.City); /*if (oldTour.Stops.Count == 0) solution.Tours.Remove(oldTour);*/ int place = solution.FindBestInsertionPlace(tour, move.City); tour.Stops.Insert(place, move.City); solution.Repair(); }
public static PotvinCustomerRelocationMove Apply(PotvinEncoding individual, IVRPProblemInstance problemInstance, IRandom rand) { int city = 1 + rand.Next(individual.Cities); Tour oldTour = individual.Tours.Find(t => t.Stops.Contains(city)); int oldTourIndex = individual.Tours.IndexOf(oldTour); int max = individual.Tours.Count; if (individual.Tours.Count < problemInstance.Vehicles.Value) max = max - 1; int newTourIndex = rand.Next(max); if (newTourIndex >= oldTourIndex) newTourIndex++; return new PotvinCustomerRelocationMove(city, oldTourIndex, newTourIndex, individual); }
public static void Apply(PotvinEncoding solution, PotvinTwoOptStarMove move, IVRPProblemInstance problemInstance) { List<int> segmentX1; List<int> segmentX2; GetSegments(move, out segmentX1, out segmentX2); Tour route1 = solution.Tours[move.Tour1]; Tour route2 = solution.Tours[move.Tour2]; foreach (int stop in segmentX1) route1.Stops.Remove(stop); route1.Stops.AddRange(segmentX2); foreach (int stop in segmentX2) route2.Stops.Remove(stop); route2.Stops.AddRange(segmentX1); }
protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer, out bool feasible) { StopInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index); double costs = 0; feasible = true; double distance = instance.GetDistance(insertionInfo.Start, insertionInfo.End, solution); double newDistance = instance.GetDistance(insertionInfo.Start, customer, solution) + instance.GetDistance(customer, insertionInfo.End, solution); costs += instance.DistanceFactor.Value * (newDistance - distance); return costs; }
private VRPSimilarityCalculator(VRPSimilarityCalculator original, Cloner cloner) : base(original, cloner) { this.ProblemInstance = cloner.Clone(original.ProblemInstance); }
public static AlbaLambdaInterchangeMove[] GenerateAllMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda, int sampleSize, IRandom rand) { AlbaLambdaInterchangeMove[] moves = new AlbaLambdaInterchangeMove[sampleSize]; for (int i = 0; i < sampleSize; i++) { moves[i] = AlbaStochasticLambdaInterchangeSingleMoveGenerator.Apply( individual, problemInstance.Cities.Value, lambda, rand); } return(moves); }
protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda) { List <AlbaLambdaInterchangeMove> moves = new List <AlbaLambdaInterchangeMove>(); AlbaLambdaInterchangeMove move = Apply(individual, problemInstance.Cities.Value, lambda, RandomParameter.ActualValue); if (move != null) { moves.Add(move); } return(moves.ToArray()); }
protected override PotvinCustomerRelocationMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List <PotvinCustomerRelocationMove> result = new List <PotvinCustomerRelocationMove>(); int max = individual.Tours.Count; if (individual.Tours.Count >= problemInstance.Vehicles.Value) { max = max - 1; } for (int i = 0; i < individual.Tours.Count; i++) { for (int j = 0; j < individual.Tours[i].Stops.Count; j++) { for (int k = 0; k <= max; k++) { if (k != i) { PotvinCustomerRelocationMove move = new PotvinCustomerRelocationMove( individual.Tours[i].Stops[j], i, k, individual); result.Add(move); } } } } return(result.ToArray()); }
protected abstract PotvinTwoOptStarMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
protected override PotvinPDExchangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List <PotvinPDExchangeMove> result = new List <PotvinPDExchangeMove>(); IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance; int max = individual.Tours.Count; if (individual.Tours.Count < problemInstance.Vehicles.Value) { max = max - 1; } for (int i = 0; i < individual.Tours.Count; i++) { for (int j = 0; j < individual.Tours[i].Stops.Count; j++) { for (int k = 0; k <= max; k++) { if (k != i) { int city1 = individual.Tours[i].Stops[j]; if (pdp == null || pdp.GetDemand(city1) >= 0) { for (int l = 0; l < individual.Tours[k].Stops.Count; l++) { int city2 = individual.Tours[k].Stops[l]; if (pdp == null || pdp.GetDemand(city2) >= 0) { bool valid = pdp == null || (pdp.GetPickupDeliveryLocation(city2) != pdp.GetPickupDeliveryLocation(city1) && pdp.GetPickupDeliveryLocation(city2) != city1 && pdp.GetPickupDeliveryLocation(city1) != city2); if (valid) { PotvinPDExchangeMove move = new PotvinPDExchangeMove( city1, i, k, city2, individual); result.Add(move); } } } } } } } } return(result.ToArray()); }
protected abstract AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda);
protected override PotvinPDShiftMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List <PotvinPDShiftMove> result = new List <PotvinPDShiftMove>(); for (int i = 0; i < SampleSizeParameter.ActualValue.Value; i++) { var move = PotvinPDShiftSingleMoveGenerator.Apply(individual, ProblemInstance, RandomParameter.ActualValue); if (move != null) { result.Add(move); } } return(result.ToArray()); }
public override IOperation Apply() { IVRPProblemInstance problemInstance = ProblemInstanceParameter.ActualValue; ItemArray <IVRPEncoding> solutions = VRPToursParameter.ActualValue; ResultCollection results = ResultsParameter.ActualValue; ItemArray <DoubleValue> qualities = QualityParameter.ActualValue; ItemArray <DoubleValue> distances = DistanceParameter.ActualValue; ItemArray <DoubleValue> vehiclesUtilizations = VehiclesUtilizedParameter.ActualValue; int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index; IVRPEncoding best = solutions[i].Clone() as IVRPEncoding; VRPSolution solution = BestSolutionParameter.ActualValue; if (solution == null) { solution = new VRPSolution(problemInstance, best.Clone() as IVRPEncoding, new DoubleValue(qualities[i].Value)); BestSolutionParameter.ActualValue = solution; results.Add(new Result("Best VRP Solution", solution)); results.Add(new Result("Best VRP Solution Distance", new DoubleValue(distances[i].Value))); results.Add(new Result("Best VRP Solution VehicleUtilization", new DoubleValue(vehiclesUtilizations[i].Value))); } else { VRPEvaluation eval = problemInstance.Evaluate(solution.Solution); if (qualities[i].Value <= eval.Quality) { solution.ProblemInstance = problemInstance; solution.Solution = best.Clone() as IVRPEncoding; solution.Quality.Value = qualities[i].Value; (results["Best VRP Solution Distance"].Value as DoubleValue).Value = distances[i].Value; (results["Best VRP Solution VehicleUtilization"].Value as DoubleValue).Value = vehiclesUtilizations[i].Value; } } var idx = qualities.Select((x, index) => new { index, x.Value }).Where(index => problemInstance.Feasible(solutions[index.index])).OrderBy(x => x.Value).FirstOrDefault(); if (idx != null) { int j = idx.index; IVRPEncoding bestFeasible = solutions[j].Clone() as IVRPEncoding; VRPSolution validSolution = BestValidSolutionParameter.ActualValue; if (validSolution == null) { validSolution = new VRPSolution(problemInstance, best.Clone() as IVRPEncoding, new DoubleValue(qualities[j].Value)); BestValidSolutionParameter.ActualValue = validSolution; if (results.ContainsKey("Best valid VRP Solution")) { results["Best valid VRP Solution"].Value = validSolution; } else { results.Add(new Result("Best valid VRP Solution", validSolution)); } results.Add(new Result("Best valid VRP Solution Distance", new DoubleValue(distances[j].Value))); results.Add(new Result("Best valid VRP Solution VehicleUtilization", new DoubleValue(vehiclesUtilizations[j].Value))); } else { if (qualities[j].Value <= validSolution.Quality.Value) { if (ProblemInstanceParameter.ActualValue.Feasible(best)) { validSolution.ProblemInstance = problemInstance; validSolution.Solution = best.Clone() as IVRPEncoding; validSolution.Quality.Value = qualities[j].Value; (results["Best valid VRP Solution Distance"].Value as DoubleValue).Value = distances[j].Value; (results["Best valid VRP Solution VehicleUtilization"].Value as DoubleValue).Value = vehiclesUtilizations[j].Value; } } } DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue; if (bestKnownQuality == null || qualities[j].Value < bestKnownQuality.Value) { BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[j].Value); BestKnownSolutionParameter.ActualValue = (VRPSolution)validSolution.Clone(); } } return(base.Apply()); }
protected override AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance) { int sampleSize = SampleSizeParameter.ActualValue.Value; AlbaIntraRouteInversionMove[] moves = new AlbaIntraRouteInversionMove[sampleSize]; for (int i = 0; i < sampleSize; i++) { moves[i] = AlbaStochasticIntraRouteInversionSingleMoveGenerator.Apply( individual, problemInstance.Cities.Value, RandomParameter.ActualValue); } return(moves); }
protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer, out bool feasible) { CVRPTWInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index) as CVRPTWInsertionInfo; double costs = 0; feasible = tourInsertionInfo.Penalty < double.Epsilon; ICapacitatedProblemInstance cvrp = instance as ICapacitatedProblemInstance; double overloadPenalty = cvrp.OverloadPenalty.Value; ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance; DoubleArray dueTime = vrptw.DueTime; DoubleArray readyTime = vrptw.ReadyTime; DoubleArray serviceTimes = vrptw.ServiceTime; double tardinessPenalty = vrptw.TardinessPenalty.Value; double distance = instance.GetDistance(insertionInfo.Start, insertionInfo.End, solution); double newDistance = instance.GetDistance(insertionInfo.Start, customer, solution) + instance.GetDistance(customer, insertionInfo.End, solution); costs += instance.DistanceFactor.Value * (newDistance - distance); double demand = instance.Demand[customer]; if (demand > insertionInfo.SpareCapacity) { feasible = false; if (insertionInfo.SpareCapacity >= 0) { costs += (demand - insertionInfo.SpareCapacity) * overloadPenalty; } else { costs += demand * overloadPenalty; } } double time = 0; double tardiness = 0; if (index > 0) { time = (tourInsertionInfo.GetStopInsertionInfo(index - 1) as CVRPTWInsertionInfo).LeaveTime; } else { time = insertionInfo.TourStartTime; } time += instance.GetDistance(insertionInfo.Start, customer, solution); if (time > dueTime[customer]) { tardiness += time - dueTime[customer]; } if (time < readyTime[customer]) { time += readyTime[customer] - time; } time += serviceTimes[customer]; time += instance.GetDistance(customer, insertionInfo.End, solution); double additionalTime = time - (tourInsertionInfo.GetStopInsertionInfo(index) as CVRPTWInsertionInfo).ArrivalTime; for (int i = index; i < tourInsertionInfo.GetStopCount(); i++) { CVRPTWInsertionInfo nextStop = tourInsertionInfo.GetStopInsertionInfo(i) as CVRPTWInsertionInfo; if (additionalTime < 0) { //arrive earlier than before //wait probably if (nextStop.WaitingTime < 0) { double wait = nextStop.WaitingTime - additionalTime; if (wait > 0) { additionalTime += wait; } } else { additionalTime = 0; } //check due date, decrease tardiness if (nextStop.SpareTime < 0) { costs += Math.Max(nextStop.SpareTime, additionalTime) * tardinessPenalty; } } else { //arrive later than before, probably don't have to wait if (nextStop.WaitingTime > 0) { additionalTime -= Math.Min(additionalTime, nextStop.WaitingTime); } //check due date if (nextStop.SpareTime > 0) { double spare = nextStop.SpareTime - additionalTime; if (spare < 0) { tardiness += -spare; } } else { tardiness += additionalTime; } } } costs += additionalTime * vrptw.TimeFactor.Value; if (tardiness > 0) { feasible = false; } costs += tardiness * tardinessPenalty; return(costs); }
protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) { TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour))); eval.InsertionInfo.AddTourInsertionInfo(tourInfo); double originalQuality = eval.Quality; IHeterogenousCapacitatedProblemInstance cvrpInstance = instance as IHeterogenousCapacitatedProblemInstance; DoubleArray demand = instance.Demand; ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance; DoubleArray dueTime = vrptw.DueTime; DoubleArray readyTime = vrptw.ReadyTime; DoubleArray serviceTimes = vrptw.ServiceTime; IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance; IntArray pickupDeliveryLocation = pdp.PickupDeliveryLocation; IMultiDepotProblemInstance mdp = instance as IMultiDepotProblemInstance; IntArray vehicleAssignment = mdp.VehicleDepotAssignment; int depots = mdp.Depots.Value; double time = 0.0; double waitingTime = 0.0; double serviceTime = 0.0; double tardiness = 0.0; double overweight = 0.0; double distance = 0.0; int tourIndex = solution.GetTourIndex(tour); int vehicle = solution.GetVehicleAssignment(tourIndex); int depot = vehicleAssignment[vehicle]; double capacity = cvrpInstance.Capacity[vehicle]; double currentLoad = 0.0; Dictionary <int, bool> stops = new Dictionary <int, bool>(); int pickupViolations = 0; double tourStartTime = readyTime[0]; time = tourStartTime; //simulate a tour, start and end at depot for (int i = 0; i <= tour.Stops.Count; i++) { int start = 0; if (i > 0) { start = tour.Stops[i - 1]; } int end = 0; if (i < tour.Stops.Count) { end = tour.Stops[i]; } //drive there double currentDistace = vrptw.GetDistance(start, end, solution); time += currentDistace; distance += currentDistace; double arrivalTime = time; int endIndex; if (end == 0) { endIndex = depot; } else { endIndex = end + depots - 1; } //check if it was serviced on time if (time > dueTime[endIndex]) { tardiness += time - dueTime[endIndex]; } //wait double currentWaitingTime = 0.0; if (time < readyTime[endIndex]) { currentWaitingTime = readyTime[endIndex] - time; } double waitTime = readyTime[endIndex] - time; waitingTime += currentWaitingTime; time += currentWaitingTime; double spareTime = dueTime[endIndex] - time; double arrivalSpareCapacity = capacity - currentLoad; if (end > 0) { //service double currentServiceTime = serviceTimes[end - 1]; serviceTime += currentServiceTime; time += currentServiceTime; //Pickup / deliver bool validPickupDelivery = validPickupDelivery = ((demand[end - 1] >= 0) || (stops.ContainsKey(pickupDeliveryLocation[end - 1]))); if (validPickupDelivery) { currentLoad += demand[end - 1]; } else { pickupViolations++; } if (currentLoad > capacity) { overweight += currentLoad - capacity; } } double spareCapacity = capacity - currentLoad; CVRPPDTWInsertionInfo stopInfo = new CVRPPDTWInsertionInfo(start, end, spareCapacity, tourStartTime, arrivalTime, time, spareTime, waitTime, new List <int>(stops.Keys), arrivalSpareCapacity); tourInfo.AddStopInsertionInfo(stopInfo); stops.Add(end, true); } eval.Quality += instance.FleetUsageFactor.Value; eval.Quality += instance.DistanceFactor.Value * distance; eval.Distance += distance; eval.VehicleUtilization += 1; (eval as CVRPEvaluation).Overload += overweight; double tourPenalty = 0; double penalty = overweight * cvrpInstance.OverloadPenalty.Value; eval.Penalty += penalty; eval.Quality += penalty; tourPenalty += penalty; (eval as CVRPTWEvaluation).Tardiness += tardiness; (eval as CVRPTWEvaluation).TravelTime += time; penalty = tardiness * vrptw.TardinessPenalty.Value; eval.Penalty += penalty; eval.Quality += penalty; tourPenalty += penalty; (eval as CVRPPDTWEvaluation).PickupViolations += pickupViolations; penalty = pickupViolations * pdp.PickupViolationPenalty.Value; eval.Penalty += penalty; tourPenalty += penalty; eval.Quality += penalty; eval.Quality += time * vrptw.TimeFactor.Value; tourInfo.Penalty = tourPenalty; tourInfo.Quality = eval.Quality - originalQuality; }
public static bool PairwiseMove(PotvinEncoding individual, IVRPProblemInstance instance, int city, bool allowInfeasible) { bool success; IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance; if (pdp != null) { Tour route1 = individual.Tours.Find(t => t.Stops.Contains(city)); int i = route1.Stops.IndexOf(city); int dest = pdp.GetPickupDeliveryLocation(city); Tour destRoute = individual.Tours.Find(t => t.Stops.Contains(dest)); int j = destRoute.Stops.IndexOf(dest); route1.Stops.Remove(city); destRoute.Stops.Remove(dest); int routeToAvoid = -1; if (route1 == destRoute) { routeToAvoid = individual.Tours.IndexOf(route1); } int source, target; if (instance.GetDemand(city) >= 0) { source = city; target = dest; } else { source = dest; target = city; } double bestQuality = double.MaxValue; int bestTour = -1; int bestPositionSource = -1; int bestPositionTarget = -1; for (int tourIdx = 0; tourIdx < individual.Tours.Count; tourIdx++) { if (tourIdx != routeToAvoid) { Tour tour = individual.Tours[tourIdx]; VRPEvaluation eval = instance.EvaluateTour(tour, individual); individual.InsertPair(tour, source, target, instance); VRPEvaluation evalNew = instance.EvaluateTour(tour, individual); double delta = evalNew.Quality - eval.Quality; if (delta < bestQuality && (instance.Feasible(evalNew) || allowInfeasible)) { bestQuality = delta; bestTour = tourIdx; bestPositionSource = tour.Stops.IndexOf(source); bestPositionTarget = tour.Stops.IndexOf(target); } tour.Stops.Remove(source); tour.Stops.Remove(target); } } if (bestTour >= 0) { if (bestPositionTarget < bestPositionSource) { individual.Tours[bestTour].Stops.Insert(bestPositionTarget, target); individual.Tours[bestTour].Stops.Insert(bestPositionSource, source); } else { individual.Tours[bestTour].Stops.Insert(bestPositionSource, source); individual.Tours[bestTour].Stops.Insert(bestPositionTarget, target); } success = true; } else { if (j < i) { destRoute.Stops.Insert(j, dest); route1.Stops.Insert(i, city); } else { route1.Stops.Insert(i, city); destRoute.Stops.Insert(j, dest); } success = false; } } else { success = false; } return(success); }
public static void Apply(PotvinEncoding solution, PotvinCustomerRelocationMove move, IVRPProblemInstance problemInstance) { if (move.Tour >= solution.Tours.Count) { solution.Tours.Add(new Tour()); } Tour tour = solution.Tours[move.Tour]; Tour oldTour = solution.Tours.Find(t => t.Stops.Contains(move.City)); oldTour.Stops.Remove(move.City); /*if (oldTour.Stops.Count == 0) * solution.Tours.Remove(oldTour);*/ int place = solution.FindBestInsertionPlace(tour, move.City); tour.Stops.Insert(place, move.City); solution.Repair(); }
protected abstract AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance);
protected abstract PotvinPDExchangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
public static void ApplyManipulation(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance, int maxIterations) { //only apply to feasible individuals if (instance.Feasible(individual)) { bool insertionFound; int iterations = 0; do { insertionFound = false; int length = 3; while (length > 0 && !insertionFound) { int tour = 0; while (tour < individual.Tours.Count && !insertionFound) { int city = 0; while (city <= individual.Tours[tour].Stops.Count - length && !insertionFound) { int insertionTour, insertionPlace; if (FindBetterInsertionPlace(individual, instance, tour, city, length, out insertionTour, out insertionPlace)) { insertionFound = true; List <int> toBeInserted = individual.Tours[tour].Stops.GetRange(city, length); individual.Tours[tour].Stops.RemoveRange(city, length); individual.Tours[insertionTour].Stops.InsertRange( insertionPlace, toBeInserted); } city++; } tour++; } length--; } iterations++; } while (insertionFound && iterations < maxIterations); IList <Tour> toBeRemoved = new List <Tour>(); foreach (Tour tour in individual.Tours) { if (tour.Stops.Count == 0) { toBeRemoved.Add(tour); } } foreach (Tour tour in toBeRemoved) { individual.Tours.Remove(tour); } } }
protected override PotvinCustomerRelocationMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List <PotvinCustomerRelocationMove> result = new List <PotvinCustomerRelocationMove>(); for (int i = 0; i < SampleSizeParameter.ActualValue.Value; i++) { result.Add(PotvinCustomerRelocationSingleMoveGenerator.Apply(individual, ProblemInstance, RandomParameter.ActualValue)); } return(result.ToArray()); }
public override IOperation Apply() { ItemList <IItem> tabuList = TabuListParameter.ActualValue; double moveQuality = MoveQualityParameter.ActualValue.Value; bool useAspiration = UseAspirationCriterion.Value; bool isTabu = false; PotvinPDExchangeMove move = PDExchangeMoveParameter.ActualValue; foreach (IItem tabuMove in tabuList) { PotvinPDRelocateMoveAttribute attribute = tabuMove as PotvinPDRelocateMoveAttribute; if (attribute != null) { double distance = 0; if (MoveDistanceParameter.ActualValue != null) { distance = MoveDistanceParameter.ActualValue.Value; } double overload = 0; if (MoveOverloadParameter.ActualValue != null) { overload = MoveOverloadParameter.ActualValue.Value; } double tardiness = 0; if (MoveTardinessParameter.ActualValue != null) { tardiness = MoveTardinessParameter.ActualValue.Value; } IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue; double quality = attribute.Distance * instance.DistanceFactor.Value; IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance; if (cvrp != null) { quality += attribute.Overload * cvrp.OverloadPenalty.Value; } ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance; if (vrptw != null) { quality += attribute.Tardiness * vrptw.TardinessPenalty.Value; } IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance; if (pdp != null) { quality += attribute.PickupViolations * pdp.PickupViolationPenalty.Value; } if (!useAspiration || moveQuality >= quality) { if ((attribute.City == move.City && attribute.Tour == move.Tour) || (attribute.City == move.Replaced && attribute.Tour == move.OldTour)) { isTabu = true; break; } if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) { isTabu = true; break; } } } } MoveTabuParameter.ActualValue = new BoolValue(isTabu); return(base.Apply()); }
protected abstract PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
public static void Apply(PotvinEncoding solution, PotvinPDRearrangeMove move, IVRPProblemInstance problemInstance) { Tour tour = solution.Tours[move.Tour]; int position = tour.Stops.IndexOf(move.City); IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance; if (pdp != null) { int location = pdp.GetPickupDeliveryLocation(move.City); Tour tour2 = solution.Tours.Find(t => t.Stops.Contains(location)); int position2 = tour2.Stops.IndexOf(location); tour.Stops.Remove(move.City); tour2.Stops.Remove(location); solution.InsertPair(tour, move.City, location, problemInstance, position, position2); } else { tour.Stops.Remove(move.City); int place = solution.FindBestInsertionPlace(tour, move.City, position); tour.Stops.Insert(place, move.City); } solution.Repair(); }
protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda) { List <AlbaLambdaInterchangeMove> moves = new List <AlbaLambdaInterchangeMove>(); List <Tour> tours = individual.GetTours(); for (int tour1Index = 0; tour1Index < tours.Count; tour1Index++) { Tour tour1 = tours[tour1Index]; for (int tour2Index = tour1Index + 1; tour2Index < tours.Count; tour2Index++) { Tour tour2 = tours[tour2Index]; for (int length1 = 0; length1 <= Math.Min(lambda, tour1.Stops.Count); length1++) { for (int length2 = 0; length2 <= Math.Min(lambda, tour2.Stops.Count); length2++) { if (length1 != 0 || length2 != 0) { for (int index1 = 0; index1 < tour1.Stops.Count - length1 + 1; index1++) { for (int index2 = 0; index2 < tour2.Stops.Count - length2 + 1; index2++) { moves.Add(new AlbaLambdaInterchangeMove(tour1Index, index1, length1, tour2Index, index2, length2, individual)); } } } } } } } return(moves.ToArray()); }
protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda) { return(GenerateAllMoves(individual, problemInstance, lambda, SampleSizeParameter.ActualValue.Value, RandomParameter.ActualValue)); }
protected override PotvinPDShiftMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List <PotvinPDShiftMove> result = new List <PotvinPDShiftMove>(); PotvinPDShiftMove move = Apply(individual, ProblemInstance, RandomParameter.ActualValue); if (move != null) { result.Add(move); } return(result.ToArray()); }
protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) { TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour))); eval.InsertionInfo.AddTourInsertionInfo(tourInfo); double originalQuality = eval.Quality; IHeterogenousCapacitatedProblemInstance cvrpInstance = instance as IHeterogenousCapacitatedProblemInstance; DoubleArray demand = instance.Demand; ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance; DoubleArray dueTime = vrptw.DueTime; DoubleArray readyTime = vrptw.ReadyTime; DoubleArray serviceTimes = vrptw.ServiceTime; IMultiDepotProblemInstance mdp = instance as IMultiDepotProblemInstance; IntArray vehicleAssignment = mdp.VehicleDepotAssignment; int depots = mdp.Depots.Value; double time = 0.0; double waitingTime = 0.0; double serviceTime = 0.0; double tardiness = 0.0; double delivered = 0.0; double overweight = 0.0; double distance = 0.0; int tourIndex = solution.GetTourIndex(tour); int vehicle = solution.GetVehicleAssignment(tourIndex); int depot = vehicleAssignment[vehicle]; double capacity = cvrpInstance.Capacity[vehicle]; for (int i = 0; i < tour.Stops.Count; i++) { delivered += instance.GetDemand(tour.Stops[i]); } double spareCapacity = capacity - delivered; double tourStartTime = vrptw.ReadyTime[depot]; time = tourStartTime; //simulate a tour, start and end at depot for (int i = 0; i <= tour.Stops.Count; i++) { int start = 0; if (i > 0) { start = tour.Stops[i - 1]; } int end = 0; if (i < tour.Stops.Count) { end = tour.Stops[i]; } //drive there double currentDistace = vrptw.GetDistance(start, end, solution); time += currentDistace; distance += currentDistace; double arrivalTime = time; int endIndex; if (end == 0) { endIndex = depot; } else { endIndex = end + depots - 1; } //check if it was serviced on time if (time > dueTime[endIndex]) { tardiness += time - dueTime[endIndex]; } //wait double currentWaitingTime = 0.0; if (time < readyTime[endIndex]) { currentWaitingTime = readyTime[endIndex] - time; } double waitTime = readyTime[endIndex] - time; waitingTime += currentWaitingTime; time += currentWaitingTime; double spareTime = dueTime[endIndex] - time; //service double currentServiceTime = 0; if (end > 0) { currentServiceTime = serviceTimes[end - 1]; } serviceTime += currentServiceTime; time += currentServiceTime; CVRPTWInsertionInfo stopInfo = new CVRPTWInsertionInfo(start, end, spareCapacity, tourStartTime, arrivalTime, time, spareTime, waitTime); tourInfo.AddStopInsertionInfo(stopInfo); } eval.Quality += instance.FleetUsageFactor.Value; eval.Quality += instance.DistanceFactor.Value * distance; eval.Distance += distance; eval.VehicleUtilization += 1; if (delivered > capacity) { overweight = delivered - capacity; } (eval as CVRPEvaluation).Overload += overweight; double tourPenalty = 0; double penalty = overweight * cvrpInstance.OverloadPenalty.Value; eval.Penalty += penalty; eval.Quality += penalty; tourPenalty += penalty; (eval as CVRPTWEvaluation).Tardiness += tardiness; (eval as CVRPTWEvaluation).TravelTime += time; penalty = tardiness * vrptw.TardinessPenalty.Value; eval.Penalty += penalty; eval.Quality += penalty; tourPenalty += penalty; eval.Quality += time * vrptw.TimeFactor.Value; tourInfo.Penalty = tourPenalty; tourInfo.Quality = eval.Quality - originalQuality; }
protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer, out bool feasible) { CVRPPDTWInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index) as CVRPPDTWInsertionInfo; double costs = 0; feasible = tourInsertionInfo.Penalty < double.Epsilon; bool tourFeasible = true; ICapacitatedProblemInstance cvrp = instance as ICapacitatedProblemInstance; double overloadPenalty = cvrp.OverloadPenalty.Value; ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance; DoubleArray dueTime = vrptw.DueTime; DoubleArray readyTime = vrptw.ReadyTime; DoubleArray serviceTimes = vrptw.ServiceTime; double tardinessPenalty = vrptw.TardinessPenalty.Value; IMultiDepotProblemInstance mdp = instance as IMultiDepotProblemInstance; int depots = mdp.Depots.Value; IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance; IntArray pickupDeliveryLocation = pdp.PickupDeliveryLocation; double pickupPenalty = pdp.PickupViolationPenalty.Value; double startDistance, endDistance; costs += instance.GetInsertionDistance(insertionInfo.Start, customer, insertionInfo.End, solution, out startDistance, out endDistance); double demand = instance.GetDemand(customer); if (demand > insertionInfo.ArrivalSpareCapacity) { tourFeasible = feasible = false; if (insertionInfo.ArrivalSpareCapacity >= 0) { costs += (demand - insertionInfo.ArrivalSpareCapacity) * overloadPenalty; } else { costs += demand * overloadPenalty; } } int destination = pickupDeliveryLocation[customer - 1]; bool validPickup = true; if (demand < 0 && !insertionInfo.Visited.Contains(destination)) { tourFeasible = feasible = false; validPickup = false; costs += pickupPenalty; } double time = 0; double tardiness = 0; if (index > 0) { time = (tourInsertionInfo.GetStopInsertionInfo(index - 1) as CVRPTWInsertionInfo).LeaveTime; } else { time = insertionInfo.TourStartTime; } time += startDistance; int customerIndex = customer + depots - 1; if (time > dueTime[customerIndex]) { tardiness += time - dueTime[customerIndex]; } if (time < readyTime[customerIndex]) { time += readyTime[customerIndex] - time; } time += serviceTimes[customer - 1]; time += endDistance; double additionalTime = time - (tourInsertionInfo.GetStopInsertionInfo(index) as CVRPTWInsertionInfo).ArrivalTime; for (int i = index; i < tourInsertionInfo.GetStopCount(); i++) { CVRPTWInsertionInfo nextStop = tourInsertionInfo.GetStopInsertionInfo(i) as CVRPTWInsertionInfo; if (demand >= 0) { if (nextStop.End == destination) { demand = 0; costs -= pickupPenalty; if (tourInsertionInfo.Penalty == pickupPenalty && tourFeasible) { feasible = true; } } else if (nextStop.SpareCapacity < 0) { costs += demand * overloadPenalty; } else if (nextStop.SpareCapacity < demand) { tourFeasible = feasible = false; costs += (demand - nextStop.SpareCapacity) * overloadPenalty; } } else if (validPickup) { if (nextStop.SpareCapacity < 0) { costs += Math.Max(demand, nextStop.SpareCapacity) * overloadPenalty; } } if (additionalTime < 0) { //arrive earlier than before //wait probably if (nextStop.WaitingTime < 0) { double wait = nextStop.WaitingTime - additionalTime; if (wait > 0) { additionalTime += wait; } } else { additionalTime = 0; } //check due date, decrease tardiness if (nextStop.SpareTime < 0) { costs += Math.Max(nextStop.SpareTime, additionalTime) * tardinessPenalty; } } else { //arrive later than before, probably don't have to wait if (nextStop.WaitingTime > 0) { additionalTime -= Math.Min(additionalTime, nextStop.WaitingTime); } //check due date if (nextStop.SpareTime > 0) { double spare = nextStop.SpareTime - additionalTime; if (spare < 0) { tardiness += -spare; } } else { tardiness += additionalTime; } } } costs += additionalTime * vrptw.TimeFactor.Value; if (tardiness > 0) { tourFeasible = feasible = false; } costs += tardiness * tardinessPenalty; return(costs); }
protected override PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List <PotvinVehicleAssignmentMove> result = new List <PotvinVehicleAssignmentMove>(); for (int i = 0; i < individual.Tours.Count; i++) { for (int j = i + 1; j < problemInstance.Vehicles.Value; j++) { result.Add(new PotvinVehicleAssignmentMove(i, j, individual)); } } return(result.ToArray()); }
public PrinsEncoding(Permutation permutation, IVRPProblemInstance problemInstance) : base(permutation, problemInstance) { }
protected override AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance) { List <AlbaIntraRouteInversionMove> moves = new List <AlbaIntraRouteInversionMove>(); AlbaIntraRouteInversionMove move = Apply(individual, problemInstance.Cities.Value, RandomParameter.ActualValue); if (move != null) { moves.Add(move); } return(moves.ToArray()); }
public static void ApplyManipulation(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance, bool allowInfeasible) { int selectedIndex = SelectRandomTourBiasedByLength(random, individual, instance); if (selectedIndex >= 0) { Tour route1 = individual.Tours[selectedIndex]; int count = route1.Stops.Count; int i = 0; while (i < count) { int insertedRoute, insertedPlace; int city = route1.Stops[i]; route1.Stops.Remove(city); if (FindInsertionPlace(individual, city, selectedIndex, allowInfeasible, out insertedRoute, out insertedPlace)) { individual.Tours[insertedRoute].Stops.Insert(insertedPlace, city); } else { route1.Stops.Insert(i, city); i++; } count = route1.Stops.Count; } } }