public static PotvinEncoding Apply(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2, IVRPProblemInstance problemInstance, bool allowInfeasible)
        {
            PotvinEncoding child = parent2.Clone() as PotvinEncoding;

            if (parent1.Tours.Count > 0 && child.Tours.Count > 0)
            {
                int  tourParent1 = random.Next(parent1.Tours.Count);
                Tour replacing   = parent1.Tours[tourParent1].Clone() as Tour;

                int  tourParent2 = random.Next(child.Tours.Count);
                Tour replaced    = child.Tours[tourParent2];

                child.Tours.Remove(replaced);
                child.Tours.Insert(tourParent2, replacing);

                Permutation vehicleAssignment = child.VehicleAssignment;

                int vehicle  = vehicleAssignment[tourParent2];
                int vehicle2 = parent1.VehicleAssignment[tourParent1];
                vehicleAssignment[tourParent2] = vehicle2;

                for (int i = 0; i < vehicleAssignment.Length; i++)
                {
                    if (vehicleAssignment[i] == vehicle2 && i != tourParent2)
                    {
                        vehicleAssignment[i] = vehicle;
                        break;
                    }
                }

                foreach (int city in replaced.Stops)
                {
                    if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
                    {
                        child.Unrouted.Add(city);
                    }
                }

                if (Repair(random, child, replacing, problemInstance, allowInfeasible) || allowInfeasible)
                {
                    return(child);
                }
                else
                {
                    if (random.NextDouble() < 0.5)
                    {
                        return(parent1.Clone() as PotvinEncoding);
                    }
                    else
                    {
                        return(parent2.Clone() as PotvinEncoding);
                    }
                }
            }
            else
            {
                return(child);
            }
        }
示例#2
0
    public PotvinPDShiftMove(int city, int oldTour, int tour, PotvinEncoding individual) {
      City = city;
      OldTour = oldTour;
      Tour = tour;

      this.Individual = individual.Clone() as PotvinEncoding;
    }
示例#3
0
        public PotvinVehicleAssignmentMove(int tour1, int tour2, PotvinEncoding individual)
        {
            Tour1 = tour1;
            Tour2 = tour2;

            this.Individual = individual.Clone() as PotvinEncoding;
        }
        public PotvinPDRearrangeMove(int city, int tour, PotvinEncoding individual)
        {
            City = city;
            Tour = tour;

            this.Individual = individual.Clone() as PotvinEncoding;
        }
    public PotvinCustomerRelocationMove(int city, int oldTour, int tour, PotvinEncoding individual) {
      City = city;
      OldTour = oldTour;
      Tour = tour;

      this.Individual = individual.Clone() as PotvinEncoding;
    }
示例#6
0
        public PotvinPDShiftMove(int city, int oldTour, int tour, PotvinEncoding individual)
        {
            City    = city;
            OldTour = oldTour;
            Tour    = tour;

            this.Individual = individual.Clone() as PotvinEncoding;
        }
    public PotvinTwoOptStarMove(int tour1, int x1, int tour2, int x2, PotvinEncoding individual) {
      Tour1 = tour1;
      X1 = x1;
      Tour2 = tour2;
      X2 = x2;

      this.Individual = individual.Clone() as PotvinEncoding;
    }
        public PotvinCustomerRelocationMove(int city, int oldTour, int tour, PotvinEncoding individual)
        {
            City    = city;
            OldTour = oldTour;
            Tour    = tour;

            this.Individual = individual.Clone() as PotvinEncoding;
        }
    public PotvinPDExchangeMove(int city, int oldTour, int tour, int replaced, PotvinEncoding individual) {
      City = city;
      OldTour = oldTour;
      Tour = tour;
      Replaced = replaced;

      this.Individual = individual.Clone() as PotvinEncoding;
    }
    public static PotvinEncoding Apply(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2, IVRPProblemInstance problemInstance, bool allowInfeasible) {
      PotvinEncoding child = parent1.Clone() as PotvinEncoding;
      Tour newTour = new Tour();

      int cities = problemInstance.Cities.Value;

      if (cities > 0) {
        int breakPoint1 = random.Next(1, cities + 1);
        Tour tour1 = FindRoute(child, breakPoint1);
        breakPoint1 = tour1.Stops.IndexOf(breakPoint1);

        for (int i = 0; i < breakPoint1; i++)
          newTour.Stops.Add(tour1.Stops[i]);

        int breakPoint2 = random.Next(1, cities + 1);
        Tour tour2 = FindRoute(parent2, breakPoint2);
        breakPoint2 = tour2.Stops.IndexOf(breakPoint2);

        for (int i = breakPoint2; i < tour2.Stops.Count; i++)
          newTour.Stops.Add(tour2.Stops[i]);

        int tour1Index = child.Tours.IndexOf(tour1);
        child.Tours.Remove(tour1);
        child.Tours.Insert(tour1Index, newTour);

        foreach (int city in tour1.Stops)
          if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
            child.Unrouted.Add(city);

        foreach (int city in tour2.Stops)
          if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
            child.Unrouted.Add(city);

        if (Repair(random, child, newTour, problemInstance, allowInfeasible) || allowInfeasible) {
          return child;
        } else {
          if (random.NextDouble() < 0.5)
            return parent1.Clone() as PotvinEncoding;
          else
            return parent2.Clone() as PotvinEncoding;
        }
      } else {
        return child;
      }
    }
示例#11
0
        public PotvinTwoOptStarMove(int tour1, int x1, int tour2, int x2, PotvinEncoding individual)
        {
            Tour1 = tour1;
            X1    = x1;
            Tour2 = tour2;
            X2    = x2;

            this.Individual = individual.Clone() as PotvinEncoding;
        }
示例#12
0
        public PotvinPDExchangeMove(int city, int oldTour, int tour, int replaced, PotvinEncoding individual)
        {
            City     = city;
            OldTour  = oldTour;
            Tour     = tour;
            Replaced = replaced;

            this.Individual = individual.Clone() as PotvinEncoding;
        }
    public static PotvinEncoding Apply(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2, IVRPProblemInstance problemInstance, bool allowInfeasible) {
      PotvinEncoding child = parent2.Clone() as PotvinEncoding;

      if (parent1.Tours.Count > 0 && child.Tours.Count > 0) {
        int tourParent1 = random.Next(parent1.Tours.Count);
        Tour replacing = parent1.Tours[tourParent1].Clone() as Tour;

        int tourParent2 = random.Next(child.Tours.Count);
        Tour replaced = child.Tours[tourParent2];

        child.Tours.Remove(replaced);
        child.Tours.Insert(tourParent2, replacing);

        Permutation vehicleAssignment = child.VehicleAssignment;

        int vehicle = vehicleAssignment[tourParent2];
        int vehicle2 = parent1.VehicleAssignment[tourParent1];
        vehicleAssignment[tourParent2] = vehicle2;

        for (int i = 0; i < vehicleAssignment.Length; i++) {
          if (vehicleAssignment[i] == vehicle2 && i != tourParent2) {
            vehicleAssignment[i] = vehicle;
            break;
          }
        }

        foreach (int city in replaced.Stops)
          if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
            child.Unrouted.Add(city);

        if (Repair(random, child, replacing, problemInstance, allowInfeasible) || allowInfeasible)
          return child;
        else {
          if (random.NextDouble() < 0.5)
            return parent1.Clone() as PotvinEncoding;
          else
            return parent2.Clone() as PotvinEncoding;
        }
      } else {
        return child;
      }
    }
    public PotvinPDRearrangeMove(int city, int tour, PotvinEncoding individual) {
      City = city;
      Tour = tour;

      this.Individual = individual.Clone() as PotvinEncoding;
    }
    protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) {
      PotvinEncoding child = parent1.Clone() as PotvinEncoding;
      child.Tours.Clear();

      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;

      List<Tour> R1 = new List<Tour>();
      PotvinEncoding p1Clone = parent1.Clone() as PotvinEncoding;

      int length = Math.Min(Length.Value.Value, parent1.Tours.Count) + 1;
      int k = 1;
      if(length > 1)
        k = random.Next(1, length);
      for (int i = 0; i < k; i++) {
        int index = SelectRandomTourBiasedByLength(random, p1Clone);
        R1.Add(p1Clone.Tours[index]);
        p1Clone.Tours.RemoveAt(index);
      }

      foreach (Tour r1 in R1) {
        List<int> R2 = new List<int>();

        double r = CalculateMeanCentroidDistance(r1, parent2.Tours, ProblemInstance);
        foreach (Tour tour in parent2.Tours) {
          if (CalculateCentroidDistance(r1, tour, ProblemInstance) <= r) {
            R2.AddRange(tour.Stops);
          }
        }

        Tour childTour = new Tour();
        child.Tours.Add(childTour);
        childTour.Stops.AddRange(r1.Stops);

        //DESTROY - remove cities from r1
        int removed = 1;
        if(r1.Stops.Count > 1)
          removed = random.Next(1, r1.Stops.Count + 1);
        for (int i = 0; i < removed; i++) {
          childTour.Stops.RemoveAt(SelectCityBiasedByNeighborDistance(random, childTour, child));
        }

        //REPAIR - add cities from R2
        int maxCount = 1;
        if(R2.Count > 1)
          maxCount = random.Next(1, Math.Min(5, R2.Count));
        int count = 0;

        while (count < maxCount && R2.Count != 0) {
          int index = random.Next(R2.Count);
          int city = R2[index];
          R2.RemoveAt(index);

          int place = -1;
          bool found = FindRouteInsertionPlace(child, childTour, city, allowInfeasible, out place); 
          if (found) {
            childTour.Stops.Insert(place, city);

            if (!Repair(random, child, childTour, ProblemInstance, allowInfeasible)) {
              childTour.Stops.RemoveAt(place);
            } else {
              count++;
            }
          }
        }

        Repair(random, child, childTour, ProblemInstance, allowInfeasible);
      }

      for (int i = 0; i < p1Clone.Tours.Count; i++) {
        Tour childTour = p1Clone.Tours[i].Clone() as Tour;
        child.Tours.Add(childTour);
        Repair(random, child, childTour, ProblemInstance, allowInfeasible);
      }

      //route unrouted customers
      child.Unrouted.AddRange(GetUnrouted(child, ProblemInstance.Cities.Value));
      bool success = RouteUnrouted(child, allowInfeasible);

      if (success || allowInfeasible)
        return child;
      else {
        if (random.NextDouble() < 0.5)
          return parent1.Clone() as PotvinEncoding;
        else
          return parent2.Clone() as PotvinEncoding;
      }
    }
示例#16
0
        public static PotvinEncoding Apply(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2, IVRPProblemInstance problemInstance, bool allowInfeasible)
        {
            PotvinEncoding child   = parent1.Clone() as PotvinEncoding;
            Tour           newTour = new Tour();

            int cities = problemInstance.Cities.Value;

            if (cities > 0)
            {
                int  breakPoint1 = random.Next(1, cities + 1);
                Tour tour1       = FindRoute(child, breakPoint1);
                breakPoint1 = tour1.Stops.IndexOf(breakPoint1);

                for (int i = 0; i < breakPoint1; i++)
                {
                    newTour.Stops.Add(tour1.Stops[i]);
                }

                int  breakPoint2 = random.Next(1, cities + 1);
                Tour tour2       = FindRoute(parent2, breakPoint2);
                breakPoint2 = tour2.Stops.IndexOf(breakPoint2);

                for (int i = breakPoint2; i < tour2.Stops.Count; i++)
                {
                    newTour.Stops.Add(tour2.Stops[i]);
                }

                int tour1Index = child.Tours.IndexOf(tour1);
                child.Tours.Remove(tour1);
                child.Tours.Insert(tour1Index, newTour);

                foreach (int city in tour1.Stops)
                {
                    if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
                    {
                        child.Unrouted.Add(city);
                    }
                }

                foreach (int city in tour2.Stops)
                {
                    if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
                    {
                        child.Unrouted.Add(city);
                    }
                }

                if (Repair(random, child, newTour, problemInstance, allowInfeasible) || allowInfeasible)
                {
                    return(child);
                }
                else
                {
                    if (random.NextDouble() < 0.5)
                    {
                        return(parent1.Clone() as PotvinEncoding);
                    }
                    else
                    {
                        return(parent2.Clone() as PotvinEncoding);
                    }
                }
            }
            else
            {
                return(child);
            }
        }
    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;
      }
    }
        protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2)
        {
            PotvinEncoding child = parent1.Clone() as PotvinEncoding;

            child.Tours.Clear();

            bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;

            List <Tour>    R1      = new List <Tour>();
            PotvinEncoding p1Clone = parent1.Clone() as PotvinEncoding;

            int length = Math.Min(Length.Value.Value, parent1.Tours.Count) + 1;
            int k      = 1;

            if (length > 1)
            {
                k = random.Next(1, length);
            }
            for (int i = 0; i < k; i++)
            {
                int index = SelectRandomTourBiasedByLength(random, p1Clone);
                R1.Add(p1Clone.Tours[index]);
                p1Clone.Tours.RemoveAt(index);
            }

            foreach (Tour r1 in R1)
            {
                List <int> R2 = new List <int>();

                double r = CalculateMeanCentroidDistance(r1, parent2.Tours, ProblemInstance);
                foreach (Tour tour in parent2.Tours)
                {
                    if (CalculateCentroidDistance(r1, tour, ProblemInstance) <= r)
                    {
                        R2.AddRange(tour.Stops);
                    }
                }

                Tour childTour = new Tour();
                child.Tours.Add(childTour);
                childTour.Stops.AddRange(r1.Stops);

                //DESTROY - remove cities from r1
                int removed = 1;
                if (r1.Stops.Count > 1)
                {
                    removed = random.Next(1, r1.Stops.Count + 1);
                }
                for (int i = 0; i < removed; i++)
                {
                    childTour.Stops.RemoveAt(SelectCityBiasedByNeighborDistance(random, childTour, child));
                }

                //REPAIR - add cities from R2
                int maxCount = 1;
                if (R2.Count > 1)
                {
                    maxCount = random.Next(1, Math.Min(5, R2.Count));
                }
                int count = 0;

                while (count < maxCount && R2.Count != 0)
                {
                    int index = random.Next(R2.Count);
                    int city  = R2[index];
                    R2.RemoveAt(index);

                    int  place = -1;
                    bool found = FindRouteInsertionPlace(child, childTour, city, allowInfeasible, out place);
                    if (found)
                    {
                        childTour.Stops.Insert(place, city);

                        if (!Repair(random, child, childTour, ProblemInstance, allowInfeasible))
                        {
                            childTour.Stops.RemoveAt(place);
                        }
                        else
                        {
                            count++;
                        }
                    }
                }

                Repair(random, child, childTour, ProblemInstance, allowInfeasible);
            }

            for (int i = 0; i < p1Clone.Tours.Count; i++)
            {
                Tour childTour = p1Clone.Tours[i].Clone() as Tour;
                child.Tours.Add(childTour);
                Repair(random, child, childTour, ProblemInstance, allowInfeasible);
            }

            //route unrouted customers
            child.Unrouted.AddRange(GetUnrouted(child, ProblemInstance.Cities.Value));
            bool success = RouteUnrouted(child, allowInfeasible);

            if (success || allowInfeasible)
            {
                return(child);
            }
            else
            {
                if (random.NextDouble() < 0.5)
                {
                    return(parent1.Clone() as PotvinEncoding);
                }
                else
                {
                    return(parent2.Clone() as PotvinEncoding);
                }
            }
        }
示例#19
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);
            }
        }
    public PotvinVehicleAssignmentMove(int tour1, int tour2, PotvinEncoding individual) {
      Tour1 = tour1;
      Tour2 = tour2;

      this.Individual = individual.Clone() as PotvinEncoding;
    }