private static bool FindBetterInsertionPlace( PotvinEncoding individual, IVRPProblemInstance instance, int tour, int city, int length, out int insertionTour, out int insertionPlace) { bool insertionFound = false; insertionTour = -1; insertionPlace = 1; List <int> toBeDeleted = individual.Tours[tour].Stops.GetRange(city, length); double distance = individual.GetTourLength(individual.Tours[tour]); individual.Tours[tour].Stops.RemoveRange(city, length); double removalBenefit = distance - individual.GetTourLength(individual.Tours[tour]); int currentTour = 0; while (currentTour < individual.Tours.Count && !insertionFound) { int currentCity = 0; while (currentCity <= individual.Tours[currentTour].Stops.Count && !insertionFound) { distance = individual.GetTourLength(individual.Tours[currentTour]); individual.Tours[currentTour].Stops.InsertRange(currentCity, toBeDeleted); if (instance.TourFeasible(individual.Tours[currentTour], individual)) { double lengthIncrease = individual.GetTourLength(individual.Tours[currentTour]) - distance; if (removalBenefit > lengthIncrease) { insertionTour = currentTour; insertionPlace = currentCity; insertionFound = true; } } individual.Tours[currentTour].Stops.RemoveRange(currentCity, length); currentCity++; } currentTour++; } individual.Tours[tour].Stops.InsertRange(city, toBeDeleted); return(insertionFound); }
private static bool FindBetterInsertionPlace( PotvinEncoding individual, IVRPProblemInstance instance, int tour, int city, int length, out int insertionTour, out int insertionPlace) { bool insertionFound = false; insertionTour = -1; insertionPlace = 1; List<int> toBeDeleted = individual.Tours[tour].Stops.GetRange(city, length); double distance = individual.GetTourLength(individual.Tours[tour]); individual.Tours[tour].Stops.RemoveRange(city, length); double removalBenefit = distance - individual.GetTourLength(individual.Tours[tour]); int currentTour = 0; while (currentTour < individual.Tours.Count && !insertionFound) { int currentCity = 0; while (currentCity <= individual.Tours[currentTour].Stops.Count && !insertionFound) { distance = individual.GetTourLength(individual.Tours[currentTour]); individual.Tours[currentTour].Stops.InsertRange(currentCity, toBeDeleted); if (instance.TourFeasible(individual.Tours[currentTour], individual)) { double lengthIncrease = individual.GetTourLength(individual.Tours[currentTour]) - distance; if (removalBenefit > lengthIncrease) { insertionTour = currentTour; insertionPlace = currentCity; insertionFound = true; } } individual.Tours[currentTour].Stops.RemoveRange(currentCity, length); currentCity++; } currentTour++; } individual.Tours[tour].Stops.InsertRange(city, toBeDeleted); return insertionFound; }