コード例 #1
0
        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);
        }
コード例 #2
0
    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;
    }