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); } } }
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 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 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 PotvinEncoding CreateSolution(IVRPProblemInstance problemInstance, IRandom random, double alphaValue = 0.7, double betaValue = 0.1, double gammaValue = 0.2, double alphaVariance = 0.5, double betaVariance = 0.07, double gammaVariance = 0.14) { PotvinEncoding result = new PotvinEncoding(problemInstance); IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance; IMultiDepotProblemInstance mdp = problemInstance as IMultiDepotProblemInstance; double alpha, beta, gamma; alpha = N(alphaValue, Math.Sqrt(alphaVariance), random); beta = N(betaValue, Math.Sqrt(betaVariance), random); gamma = N(gammaValue, Math.Sqrt(gammaVariance), random); List<int> unroutedCustomers = new List<int>(); for (int i = 1; i <= problemInstance.Cities.Value; i++) { if (pdp == null || (problemInstance.GetDemand(i) >= 0)) unroutedCustomers.Add(i); } List<int> depots = new List<int>(); if (mdp != null) { for (int i = 0; i < mdp.Depots.Value; i++) { depots.Add(i); } } else { depots.Add(0); } Dictionary<int, List<int>> vehicles = new Dictionary<int, List<int>>(); foreach (int depot in depots) { vehicles[depot] = new List<int>(); int vehicleCount = problemInstance.Vehicles.Value; if (mdp != null) { for (int vehicle = 0; vehicle < mdp.VehicleDepotAssignment.Length; vehicle++) { if (mdp.VehicleDepotAssignment[vehicle] == depot) { vehicles[depot].Add(vehicle); } } } else { for (int vehicle = 0; vehicle < vehicleCount; vehicle++) { vehicles[depot].Add(vehicle); } } } RemoveUnusedDepots(depots, vehicles); Dictionary<int, int> depotAssignment = new Dictionary<int, int>(); unroutedCustomers = SortCustomers( problemInstance, unroutedCustomers, depots, depotAssignment, alpha, beta, gamma); ///////// Tour tour = new Tour(); result.Tours.Add(tour); int currentCustomer = unroutedCustomers[0]; unroutedCustomers.RemoveAt(0); int currentDepot = depotAssignment[currentCustomer]; int currentVehicle = vehicles[currentDepot][0]; vehicles[currentDepot].RemoveAt(0); if (RemoveUnusedDepots(depots, vehicles)) { unroutedCustomers = SortCustomers( problemInstance, unroutedCustomers, depots, depotAssignment, alpha, beta, gamma); } result.VehicleAssignment[result.Tours.Count - 1] = currentVehicle; tour.Stops.Add(currentCustomer); if (pdp != null) { tour.Stops.Add(pdp.GetPickupDeliveryLocation(currentCustomer)); } //////// while (unroutedCustomers.Count > 0) { double minimumCost = double.MaxValue; int customer = -1; int indexOfMinimumCost = -1; int indexOfMinimumCost2 = -1; foreach (int unrouted in unroutedCustomers) { VRPEvaluation eval = problemInstance.EvaluateTour(tour, result); double originalCosts = eval.Quality; for (int i = 0; i <= tour.Stops.Count; i++) { tour.Stops.Insert(i, unrouted); eval = problemInstance.EvaluateTour(tour, result); double tourCost = eval.Quality - originalCosts; if (pdp != null) { for (int j = i + 1; j <= tour.Stops.Count; j++) { bool feasible; double cost = tourCost + problemInstance.GetInsertionCosts(eval, result, pdp.GetPickupDeliveryLocation(unrouted), 0, j, out feasible); if (cost < minimumCost && feasible) { customer = unrouted; minimumCost = cost; indexOfMinimumCost = i; indexOfMinimumCost2 = j; } } } else { double cost = tourCost; bool feasible = problemInstance.Feasible(eval); if (cost < minimumCost && feasible) { customer = unrouted; minimumCost = cost; indexOfMinimumCost = i; } } tour.Stops.RemoveAt(i); } } if (indexOfMinimumCost == -1 && vehicles.Count == 0) { indexOfMinimumCost = tour.Stops.Count; indexOfMinimumCost2 = tour.Stops.Count + 1; customer = unroutedCustomers[0]; } // insert customer if found if (indexOfMinimumCost != -1) { tour.Stops.Insert(indexOfMinimumCost, customer); if (pdp != null) { tour.Stops.Insert(indexOfMinimumCost2, pdp.GetPickupDeliveryLocation(customer)); } unroutedCustomers.Remove(customer); } else { // no feasible customer found tour = new Tour(); result.Tours.Add(tour); currentCustomer = unroutedCustomers[0]; unroutedCustomers.RemoveAt(0); currentDepot = depotAssignment[currentCustomer]; currentVehicle = vehicles[currentDepot][0]; vehicles[currentDepot].RemoveAt(0); if (RemoveUnusedDepots(depots, vehicles)) { unroutedCustomers = SortCustomers( problemInstance, unroutedCustomers, depots, depotAssignment, alpha, beta, gamma); } result.VehicleAssignment[result.Tours.Count - 1] = currentVehicle; tour.Stops.Add(currentCustomer); if (pdp != null) { tour.Stops.Add(pdp.GetPickupDeliveryLocation(currentCustomer)); } } } if (mdp != null) { List<int> availableVehicles = new List<int>(); for (int i = 0; i < mdp.Vehicles.Value; i++) availableVehicles.Add(i); for (int i = 0; i < result.VehicleAssignment.Length; i++) { if (result.VehicleAssignment[i] != -1) availableVehicles.Remove(result.VehicleAssignment[i]); } for (int i = 0; i < result.VehicleAssignment.Length; i++) { if (result.VehicleAssignment[i] == -1) { result.VehicleAssignment[i] = availableVehicles[0]; availableVehicles.RemoveAt(0); } } } return result; }
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()); }
private static PotvinEncoding ReplacePair(PotvinEncoding individual, IVRPProblemInstance instance, int replaced, int replacing, bool allowInfeasible) { individual = individual.Clone() as PotvinEncoding; IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance; int replacedDest = pdp.GetPickupDeliveryLocation(replaced); int replacedSource, replacedTarget; if (pdp.GetDemand(replaced) >= 0) { replacedSource = replaced; replacedTarget = replacedDest; } else { replacedSource = replacedDest; replacedTarget = replaced; } Tour replacedSourceTour = individual.Tours.Find(t => t.Stops.Contains(replacedSource)); Tour replacedTargetTour = individual.Tours.Find(t => t.Stops.Contains(replacedTarget)); int replacingDest = pdp.GetPickupDeliveryLocation(replacing); int replacingSource, replacingTarget; if (pdp.GetDemand(replacing) >= 0) { replacingSource = replacing; replacingTarget = replacingDest; } else { replacingSource = replacingDest; replacingTarget = replacing; } Tour replacingSourceTour = individual.Tours.Find(t => t.Stops.Contains(replacingSource)); Tour replacingTargetTour = individual.Tours.Find(t => t.Stops.Contains(replacingTarget)); replacingSourceTour.Stops.Remove(replacingSource); replacingTargetTour.Stops.Remove(replacingTarget); replacedSourceTour.Stops[replacedSourceTour.Stops.IndexOf(replacedSource)] = replacingSource; if (!allowInfeasible && !instance.TourFeasible(replacedSourceTour, individual)) { return(null); } replacedTargetTour.Stops[replacedTargetTour.Stops.IndexOf(replacedTarget)] = replacingTarget; if (!allowInfeasible && !instance.TourFeasible(replacedTargetTour, individual)) { return(null); } double bestQuality = double.MaxValue; int bestTour = -1; int bestPositionSource = -1; int bestPositionTarget = -1; int routeToAvoid = individual.Tours.IndexOf(replacingSourceTour); 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, replacedSource, replacedTarget, 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(replacedSource); bestPositionTarget = tour.Stops.IndexOf(replacedTarget); } tour.Stops.Remove(replacedSource); tour.Stops.Remove(replacedTarget); } } if (bestTour != -1) { if (bestPositionTarget < bestPositionSource) { individual.Tours[bestTour].Stops.Insert(bestPositionTarget, replacedTarget); individual.Tours[bestTour].Stops.Insert(bestPositionSource, replacedSource); } else { individual.Tours[bestTour].Stops.Insert(bestPositionSource, replacedSource); individual.Tours[bestTour].Stops.Insert(bestPositionTarget, replacedTarget); } return(individual); } else { return(null); } }
public static PotvinEncoding CreateSolution(IVRPProblemInstance problemInstance, IRandom random, double alphaValue = 0.7, double betaValue = 0.1, double gammaValue = 0.2, double alphaVariance = 0.5, double betaVariance = 0.07, double gammaVariance = 0.14) { PotvinEncoding result = new PotvinEncoding(problemInstance); IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance; IMultiDepotProblemInstance mdp = problemInstance as IMultiDepotProblemInstance; double alpha, beta, gamma; alpha = N(alphaValue, Math.Sqrt(alphaVariance), random); beta = N(betaValue, Math.Sqrt(betaVariance), random); gamma = N(gammaValue, Math.Sqrt(gammaVariance), random); List <int> unroutedCustomers = new List <int>(); for (int i = 1; i <= problemInstance.Cities.Value; i++) { if (pdp == null || (problemInstance.GetDemand(i) >= 0)) { unroutedCustomers.Add(i); } } List <int> depots = new List <int>(); if (mdp != null) { for (int i = 0; i < mdp.Depots.Value; i++) { depots.Add(i); } } else { depots.Add(0); } Dictionary <int, List <int> > vehicles = new Dictionary <int, List <int> >(); foreach (int depot in depots) { vehicles[depot] = new List <int>(); int vehicleCount = problemInstance.Vehicles.Value; if (mdp != null) { for (int vehicle = 0; vehicle < mdp.VehicleDepotAssignment.Length; vehicle++) { if (mdp.VehicleDepotAssignment[vehicle] == depot) { vehicles[depot].Add(vehicle); } } } else { for (int vehicle = 0; vehicle < vehicleCount; vehicle++) { vehicles[depot].Add(vehicle); } } } RemoveUnusedDepots(depots, vehicles); Dictionary <int, int> depotAssignment = new Dictionary <int, int>(); unroutedCustomers = SortCustomers( problemInstance, unroutedCustomers, depots, depotAssignment, alpha, beta, gamma); ///////// Tour tour = new Tour(); result.Tours.Add(tour); int currentCustomer = unroutedCustomers[0]; unroutedCustomers.RemoveAt(0); int currentDepot = depotAssignment[currentCustomer]; int currentVehicle = vehicles[currentDepot][0]; vehicles[currentDepot].RemoveAt(0); if (RemoveUnusedDepots(depots, vehicles)) { unroutedCustomers = SortCustomers( problemInstance, unroutedCustomers, depots, depotAssignment, alpha, beta, gamma); } result.VehicleAssignment[result.Tours.Count - 1] = currentVehicle; tour.Stops.Add(currentCustomer); if (pdp != null) { tour.Stops.Add(pdp.GetPickupDeliveryLocation(currentCustomer)); } //////// while (unroutedCustomers.Count > 0) { double minimumCost = double.MaxValue; int customer = -1; int indexOfMinimumCost = -1; int indexOfMinimumCost2 = -1; foreach (int unrouted in unroutedCustomers) { VRPEvaluation eval = problemInstance.EvaluateTour(tour, result); double originalCosts = eval.Quality; for (int i = 0; i <= tour.Stops.Count; i++) { tour.Stops.Insert(i, unrouted); eval = problemInstance.EvaluateTour(tour, result); double tourCost = eval.Quality - originalCosts; if (pdp != null) { for (int j = i + 1; j <= tour.Stops.Count; j++) { bool feasible; double cost = tourCost + problemInstance.GetInsertionCosts(eval, result, pdp.GetPickupDeliveryLocation(unrouted), 0, j, out feasible); if (cost < minimumCost && feasible) { customer = unrouted; minimumCost = cost; indexOfMinimumCost = i; indexOfMinimumCost2 = j; } } } else { double cost = tourCost; bool feasible = problemInstance.Feasible(eval); if (cost < minimumCost && feasible) { customer = unrouted; minimumCost = cost; indexOfMinimumCost = i; } } tour.Stops.RemoveAt(i); } } if (indexOfMinimumCost == -1 && vehicles.Count == 0) { indexOfMinimumCost = tour.Stops.Count; indexOfMinimumCost2 = tour.Stops.Count + 1; customer = unroutedCustomers[0]; } // insert customer if found if (indexOfMinimumCost != -1) { tour.Stops.Insert(indexOfMinimumCost, customer); if (pdp != null) { tour.Stops.Insert(indexOfMinimumCost2, pdp.GetPickupDeliveryLocation(customer)); } unroutedCustomers.Remove(customer); } else // no feasible customer found { tour = new Tour(); result.Tours.Add(tour); currentCustomer = unroutedCustomers[0]; unroutedCustomers.RemoveAt(0); currentDepot = depotAssignment[currentCustomer]; currentVehicle = vehicles[currentDepot][0]; vehicles[currentDepot].RemoveAt(0); if (RemoveUnusedDepots(depots, vehicles)) { unroutedCustomers = SortCustomers( problemInstance, unroutedCustomers, depots, depotAssignment, alpha, beta, gamma); } result.VehicleAssignment[result.Tours.Count - 1] = currentVehicle; tour.Stops.Add(currentCustomer); if (pdp != null) { tour.Stops.Add(pdp.GetPickupDeliveryLocation(currentCustomer)); } } } if (mdp != null) { List <int> availableVehicles = new List <int>(); for (int i = 0; i < mdp.Vehicles.Value; i++) { availableVehicles.Add(i); } for (int i = 0; i < result.VehicleAssignment.Length; i++) { if (result.VehicleAssignment[i] != -1) { availableVehicles.Remove(result.VehicleAssignment[i]); } } for (int i = 0; i < result.VehicleAssignment.Length; i++) { if (result.VehicleAssignment[i] == -1) { result.VehicleAssignment[i] = availableVehicles[0]; availableVehicles.RemoveAt(0); } } } return(result); }
private static PotvinEncoding ReplacePair(PotvinEncoding individual, IVRPProblemInstance instance, int replaced, int replacing, bool allowInfeasible) { individual = individual.Clone() as PotvinEncoding; IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance; int replacedDest = pdp.GetPickupDeliveryLocation(replaced); int replacedSource, replacedTarget; if (pdp.GetDemand(replaced) >= 0) { replacedSource = replaced; replacedTarget = replacedDest; } else { replacedSource = replacedDest; replacedTarget = replaced; } Tour replacedSourceTour = individual.Tours.Find(t => t.Stops.Contains(replacedSource)); Tour replacedTargetTour = individual.Tours.Find(t => t.Stops.Contains(replacedTarget)); int replacingDest = pdp.GetPickupDeliveryLocation(replacing); int replacingSource, replacingTarget; if (pdp.GetDemand(replacing) >= 0) { replacingSource = replacing; replacingTarget = replacingDest; } else { replacingSource = replacingDest; replacingTarget = replacing; } Tour replacingSourceTour = individual.Tours.Find(t => t.Stops.Contains(replacingSource)); Tour replacingTargetTour = individual.Tours.Find(t => t.Stops.Contains(replacingTarget)); replacingSourceTour.Stops.Remove(replacingSource); replacingTargetTour.Stops.Remove(replacingTarget); replacedSourceTour.Stops[replacedSourceTour.Stops.IndexOf(replacedSource)] = replacingSource; if (!allowInfeasible && !instance.TourFeasible(replacedSourceTour, individual)) return null; replacedTargetTour.Stops[replacedTargetTour.Stops.IndexOf(replacedTarget)] = replacingTarget; if (!allowInfeasible && !instance.TourFeasible(replacedTargetTour, individual)) return null; double bestQuality = double.MaxValue; int bestTour = -1; int bestPositionSource = -1; int bestPositionTarget = -1; int routeToAvoid = individual.Tours.IndexOf(replacingSourceTour); 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, replacedSource, replacedTarget, 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(replacedSource); bestPositionTarget = tour.Stops.IndexOf(replacedTarget); } tour.Stops.Remove(replacedSource); tour.Stops.Remove(replacedTarget); } } if (bestTour != -1) { if (bestPositionTarget < bestPositionSource) { individual.Tours[bestTour].Stops.Insert(bestPositionTarget, replacedTarget); individual.Tours[bestTour].Stops.Insert(bestPositionSource, replacedSource); } else { individual.Tours[bestTour].Stops.Insert(bestPositionSource, replacedSource); individual.Tours[bestTour].Stops.Insert(bestPositionTarget, replacedTarget); } return individual; } else { return null; } }
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); } } }
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; }