예제 #1
0
        private ClientSet <PickupDeliveryClient> GetDivisiblePDClientSet(int clientInterval)
        {
            int lastID = Clients.Count + 1;
            ClientSet <PickupDeliveryClient> extSet = new ClientSet <PickupDeliveryClient>();

            foreach (var spd in Clients)
            {
                if (spd.ID % clientInterval == 0)
                {
                    extSet.Add(new PickupDeliveryClient(spd.ID, spd.Delivery, 0));
                }
                else
                {
                    extSet.Add(spd);
                }
            }
            foreach (var dc in Clients)
            {
                if (dc.ID % clientInterval == 0)
                {
                    extSet.Add(new PickupDeliveryClient(lastID, 0, dc.Pickup));
                    lastID++;
                }
            }
            return(extSet);
        }
예제 #2
0
        private ClientSet <PickupDeliveryClient> GetDivisiblePDClientSet()
        {
            int lastID = Clients.Count;
            ClientSet <PickupDeliveryClient> extSet = new ClientSet <PickupDeliveryClient>();

            foreach (var delivery in Clients)
            {
                extSet.Add(new PickupDeliveryClient(delivery.ID, delivery.Delivery, 0));
            }
            foreach (var pickup in Clients)
            {
                extSet.Add(new PickupDeliveryClient(pickup.ID + lastID, 0, pickup.Pickup));
            }
            return(extSet);
        }
        private static Tuple <ClientSet <PickupDeliveryClient>, TravelData> LoadTaillardClients(StreamReader reader)
        {
            int           clients                    = int.Parse(reader.ReadLine().Trim());
            List <double> deliveryDemand             = new List <double>();
            List <Tuple <double, double> > locations = new List <Tuple <double, double> >();
            Regex clientsexp = new Regex(@"(?<id>\d+)\s+(?<x>\d+)\s+(?<y>\d+)\s+(?<dem>\d+)");

            for (int i = 0; i < clients + 1; i++)
            {
                string line = reader.ReadLine().Trim();
                Match  m    = clientsexp.Match(line);
                deliveryDemand.Add(double.Parse(m.Groups["dem"].Value));
                locations.Add(new Tuple <double, double>(double.Parse(m.Groups["x"].Value), double.Parse(m.Groups["y"].Value)));
            }

            ClientSet <PickupDeliveryClient> clientSet = new ClientSet <PickupDeliveryClient>();

            for (int i = 1; i < clients + 1; i++)
            {
                PickupDeliveryClient c = new PickupDeliveryClient(i, deliveryDemand[i], 0);
                clientSet.Add(c);
            }

            TravelData matrix = LoadTaillarTravelMatrix(locations);

            return(new Tuple <ClientSet <PickupDeliveryClient>, TravelData>(clientSet, matrix));
        }
예제 #4
0
        private static ClientSet <PickupDeliveryClient> BuildSalhiMixedClientSet(List <Tuple <double, double, double> > clientInfo, int clientInterval)
        {
            ClientSet <PickupDeliveryClient> mixedSet = new ClientSet <PickupDeliveryClient>();

            for (int i = 1; i < clientInfo.Count; i++)
            {
                if (i % clientInterval == 0)
                {
                    mixedSet.Add(new PickupDeliveryClient(i, 0, clientInfo[i].Item3));
                }
                else
                {
                    mixedSet.Add(new PickupDeliveryClient(i, clientInfo[i].Item3, 0));
                }
            }
            return(mixedSet);
        }
예제 #5
0
        private ClientSet <PickupDeliveryClient> GetMixedPCClienteSet(int clientInterval)
        {
            ClientSet <PickupDeliveryClient> extSet = new ClientSet <PickupDeliveryClient>();

            foreach (var item in Clients)
            {
                if (item.ID % clientInterval == 0)
                {
                    extSet.Add(new PickupDeliveryClient(item.ID, 0, item.Delivery));
                }
                else
                {
                    extSet.Add(new PickupDeliveryClient(item.ID, item.Delivery, 0));
                }
            }
            return(extSet);
        }
        private static ClientSet <PickupDeliveryClient> BuildClientSet(List <Tuple <double, double, double> > clientsInfo, bool serieX)
        {
            ClientSet <PickupDeliveryClient> clients = new ClientSet <PickupDeliveryClient>();

            for (int i = 1; i < clientsInfo.Count; i++)
            {
                double rate    = Math.Min(clientsInfo[i].Item1 / clientsInfo[i].Item2, clientsInfo[i].Item2 / clientsInfo[i].Item1);
                double demand1 = Math.Round(rate * clientsInfo[i].Item3, 8);
                double demand2 = Math.Round((1 - rate) * clientsInfo[i].Item3, 8);
                if (serieX)
                {
                    clients.Add(new PickupDeliveryClient(i, demand1, demand2));
                }
                else
                {
                    clients.Add(new PickupDeliveryClient(i, demand2, demand1));
                }
            }
            return(clients);
        }
        private static ClientSet <PickupDeliveryClient> ParseClientInfo(StreamReader reader, int clientAmount)
        {
            ClientSet <PickupDeliveryClient> clients = new ClientSet <PickupDeliveryClient>();

            for (int i = 0; i < clientAmount; i++)
            {
                double delivery = double.Parse(reader.ReadLine());
                double pickup   = double.Parse(reader.ReadLine());
                clients.Add(new PickupDeliveryClient(i + 1, delivery, pickup));
            }
            return(clients);
        }
        public static VRPSimultaneousPickupDelivery Combine(VRPSimultaneousPickupDelivery problem1, VRPSimultaneousPickupDelivery problem2)
        {
            ClientSet <PickupDeliveryClient> clientSet = new ClientSet <PickupDeliveryClient>();

            foreach (var item in problem1.Clients)
            {
                clientSet.Add(item);
            }
            for (int i = 0; i < problem2.Clients.Count; i++)
            {
                PickupDeliveryClient newClient = (PickupDeliveryClient)problem2.Clients[i + 1].Clone();
                newClient.ID = clientSet.Count + 1;
                clientSet.Add(newClient);
            }
            Fleet fleet = new Fleet();

            foreach (var item in problem1.Vehicles)
            {
                fleet.Add(item);
            }
            foreach (var item in problem2.Vehicles)
            {
                fleet.Add(item);
            }

            double[,] travel = new double[clientSet.Count + 1, clientSet.Count + 1];
            double maxCost = int.MaxValue / 10;

            for (int i = 0; i < travel.GetLength(0); i++)
            {
                for (int j = i + 1; j < travel.GetLength(1); j++)
                {
                    travel[i, j] = travel[j, i] = maxCost;
                }
            }
            for (int i = 0; i < problem1.Clients.Count + 1; i++)
            {
                for (int j = 0; j < problem1.Clients.Count + 1; j++)
                {
                    travel[i, j] = problem1.TravelDistance[i, j];
                }
            }
            for (int i = 0; i < problem2.Clients.Count + 1; i++)
            {
                for (int j = 0; j < problem2.Clients.Count + 1; j++)
                {
                    if (i == 0 && j != 0)
                    {
                        travel[0, problem1.Clients.Count + j] = problem2.TravelDistance[0, j];
                    }
                    else if (j == 0 && i != 0)
                    {
                        travel[problem1.Clients.Count + i, 0] = problem2.TravelDistance[i, 0];
                    }
                    else if (i != 0 && j != 0)
                    {
                        travel[problem1.Clients.Count + i, problem1.Clients.Count + j] = problem2.TravelDistance[i, j];
                    }
                }
            }
            return(new VRPSimultaneousPickupDelivery(clientSet, fleet, new TravelData(travel)));
        }