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++;
        }
      }
    }
        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;
    }
Beispiel #4
0
        protected static bool Repair(IRandom random, PotvinEncoding solution, Tour newTour, IVRPProblemInstance instance, bool allowInfeasible)
        {
            bool success = true;

            //remove duplicates from new tour
            for (int i = 0; i < newTour.Stops.Count; i++)
            {
                for (int j = 0; j < newTour.Stops.Count; j++)
                {
                    if (newTour.Stops[i] == newTour.Stops[j] && i != j)
                    {
                        if (random.NextDouble() < 0.5)
                        {
                            newTour.Stops[i] = 0;
                        }
                        else
                        {
                            newTour.Stops[j] = 0;
                        }
                    }
                }
            }
            while (newTour.Stops.Contains(0))
            {
                newTour.Stops.Remove(0);
            }

            //remove duplicates from old tours
            for (int i = 0; i < newTour.Stops.Count; i++)
            {
                foreach (Tour tour in solution.Tours)
                {
                    if (tour != newTour && tour.Stops.Contains(newTour.Stops[i]))
                    {
                        tour.Stops.Remove(newTour.Stops[i]);
                    }
                }
            }

            //remove empty tours
            List <Tour> toBeDeleted = new List <Tour>();

            foreach (Tour tour in solution.Tours)
            {
                if (tour.Stops.Count == 0)
                {
                    toBeDeleted.Add(tour);
                }
            }
            foreach (Tour tour in toBeDeleted)
            {
                solution.Tours.Remove(tour);
            }

            if (newTour.Stops.Count > 0 && !allowInfeasible && !instance.TourFeasible(newTour, solution))
            {
                return(false);
            }

            //route unrouted vehicles
            success = RouteUnrouted(solution, allowInfeasible);

            return(success);
        }
    protected static bool Repair(IRandom random, PotvinEncoding solution, Tour newTour, IVRPProblemInstance instance, bool allowInfeasible) {
      bool success = true;

      //remove duplicates from new tour      
      for (int i = 0; i < newTour.Stops.Count; i++) {
        for (int j = 0; j < newTour.Stops.Count; j++) {
          if (newTour.Stops[i] == newTour.Stops[j] && i != j) {
            if (random.NextDouble() < 0.5)
              newTour.Stops[i] = 0;
            else
              newTour.Stops[j] = 0;
          }
        }
      }
      while (newTour.Stops.Contains(0))
        newTour.Stops.Remove(0);

      //remove duplicates from old tours
      for (int i = 0; i < newTour.Stops.Count; i++) {
        foreach (Tour tour in solution.Tours) {
          if (tour != newTour && tour.Stops.Contains(newTour.Stops[i])) {
            tour.Stops.Remove(newTour.Stops[i]);
          }
        }
      }

      //remove empty tours
      List<Tour> toBeDeleted = new List<Tour>();
      foreach (Tour tour in solution.Tours) {
        if (tour.Stops.Count == 0)
          toBeDeleted.Add(tour);
      }
      foreach (Tour tour in toBeDeleted) {
        solution.Tours.Remove(tour);
      }

      if (newTour.Stops.Count > 0 && !allowInfeasible && !instance.TourFeasible(newTour, solution))
        return false;

      //route unrouted vehicles
      success = RouteUnrouted(solution, allowInfeasible);

      return success;
    }
Beispiel #6
0
        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);
            }
        }
    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;
      }
    }
Beispiel #8
0
        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++;
                    }
                }
            }
        }