Exemple #1
0
        //check both scale and capacity
        public static bool checkScale(Route route, Customer customer, List<VehicleType> vehicleTypes)
        {
            int index = vehicleTypes.IndexOf(route.get_VehicleType());
            if (!customer.isSuitableForType(index))
            {
                return false;
            }
            if (route.get_totalWeight() + customer.get_totalWeight() > route.get_VehicleType().get_capacity())
            {
                return false;
            }
            int arraySize = customer.scales[index].Count;
            double[] scale_sum = new double[arraySize];
            for (int i = 0; i < scale_sum.Length; i++)
            {
                scale_sum[i] = 0;
                for (IEnumerator iterator = route.get_customerSequence().GetEnumerator(); ;)
                {
                    if (!iterator.MoveNext())
                        break;
                    Customer customer2 = (Customer)iterator.Current;
                    scale_sum[i] += (double)customer2.scales[index][i];

                }
                scale_sum[i] += (double)customer.scales[index][i];
                if (scale_sum[i] > 1)
                {
                    return false;
                }
            }
            return true;
        }
Exemple #2
0
        public static void routeTrySendInvitationProcess(Route route, List<Customer> customers, List<VehicleType> vehicleTypes, Customer depot)
        {
            if (route.Flag == true)
            {
                List<CustomerDelta> deltaList = new List<CustomerDelta>();
                // layer-D loop
                for (IEnumerator iterator = customers.GetEnumerator(); ;)
                {
                    if (!iterator.MoveNext())
                        break;
                    Customer customer = (Customer)iterator.Current;
                    if (Functions.checkScale(route, customer, vehicleTypes))
                    {
                        double delta1 = Functions.calculateDelta(route, customer, depot);
                        CustomerDelta customerDelta = new CustomerDelta(customer, delta1);
                        deltaList.Add(customerDelta);
                    }

                }
                deltaList.Sort(CustomerDelta.sortByDelta);
                bool hasChosenCustomer = false;
                Customer chosenCustomer = null;
                double delta = 0;
                for (int j = 0; j < deltaList.Count; j++)
                {
                    chosenCustomer = deltaList[j].Customer;
                    delta = deltaList[j].Delta;
                    if (Functions.pass_packingHeauristic(route, chosenCustomer))
                    {
                        hasChosenCustomer = true;
                        break;
                    }
                }
                if (hasChosenCustomer)
                {
                    Functions.sendInvitation(new Invitation(route, delta), chosenCustomer);
                }
                else
                {
                    route.Flag = false;

                }

            }
        }
Exemple #3
0
 public static double calculateDelta(Route route, Customer customer, Customer depot)
 {
     if (route.get_customerSequence().Count == 1)
     {
         Customer customer_inRoute = route.get_customerSequence()[0];
         double distance = depot.distance(customer_inRoute) + customer_inRoute.distance(customer) + customer.distance(depot);
         double delta = distance - route.get_totalDistance();
         return delta;
     }
     else
     {
         int numNodes = route.get_customerSequence().Count + 2;
         write_linkernInputFile(route, customer, depot);
         double[] result = linkernTour(numNodes);
         double totalDistance = 0;
         for (int i = 0; i < result.Length; i++)
         {
             totalDistance += result[i];
         }
         // route need to update total distance
         double delta = totalDistance - route.get_totalDistance();
         return delta;
     }
 }
Exemple #4
0
        // only called when route contain >=3 customers
        // called in final step to reset routes
        public static void write_linkernInputFile_2(Route route, Customer depot)
        {
            StreamWriter writer;
            try
            {
                writer = new StreamWriter("linkern_input");
                writer.WriteLine("NAME : 2L-HFVRP");
                writer.WriteLine("COMMENT : 2L-HFVRP");
                writer.WriteLine("COMMENT : 2L-HFVRP");
                writer.WriteLine("TYPE : TSP");
                // existing customers+depot+new customer
                int numNodes = route.get_customerSequence().Count + 1;
                writer.WriteLine("DIMENSION : " + numNodes);
                writer.WriteLine("EDGE_WEIGHT_TYPE : EUC_2D");
                writer.WriteLine("NODE_COORD_SECTION");

                writer.WriteLine("1 " + depot.get_x() + " " + depot.get_y());

                for (int i = 2; i <= numNodes; i++)
                {
                    Customer currentCus = route.get_customerSequence()[i - 2];
                    writer.WriteLine(i + " " + currentCus.get_x() + " " + currentCus.get_y());
                }

                writer.Close();
            }
            catch (FileNotFoundException e)
            {
                Console.WriteLine(e.ToString());
                Console.Write(e.StackTrace);
            }
        }
Exemple #5
0
        //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
        //ORIGINAL LINE: public static void resetRoute(objects.Route route, objects.Customer depot) throws java.io.FileNotFoundException
        public static void resetRoute(Route route, Customer depot)
        {
            int numNodes = route.get_customerSequence().Count + 1;

            write_linkernInputFile_2(route, depot);
            linkernTour(numNodes);
            StreamReader scanner = new StreamReader("linkern_output");
            List<Customer> newSequence = new List<Customer>();
            int length = route.get_customerSequence().Count;
            // skip 2 lines
            scanner.ReadLine();
            scanner.ReadLine();
            for (int i = 0; i < length; i++)
            {
                string line = scanner.ReadLine();
                String[] lineScanner = line.Split(null);
                int index = Convert.ToInt32(lineScanner[0]) - 1;
                Customer tempCustomer = route.get_customerSequence()[index];
                newSequence.Add(tempCustomer);
            }
            route.CustomerSequence = newSequence;
        }
Exemple #6
0
        public static bool pass_packingHeauristic(Route route, Customer customer)
        {
            List<Item> test = new List<Item>();
            List<Item> placed = new List<Item>();
            int length = route.get_customerSequence().Count;
            for (int i = 0; i < length; i++)
            {
                test.AddRange(route.get_customerSequence()[i].get_items());
            }
            test.AddRange(customer.get_items());
            if (PackingInGivenBin.placeItems(route.get_VehicleType().get_length(), route.get_VehicleType().get_width(), placed, test))
            {
                // for (Item i : placed) System.out.println(i.toString());
                if (PackingInGivenBin.checkForPackingFeasibility(route.get_VehicleType().get_length(), route.get_VehicleType().get_width(), placed))
                {
                    return true;
                }
            }
            return false;

            // checkForPackingFeasibility checks placed items for overlapping
        }
Exemple #7
0
        public static bool initiaRoutes(List<Route> routes, int[] initialVehicleSet, List<Customer> customers, List<VehicleType> vehicleTypes, Customer depot)
        {
            int newRouteGenerated = 0;
            for (int i = initialVehicleSet.Length - 1; i >= 0; i--)
            {
                int customer_index = customers.Count - 1;

                for (int j = 0; j < initialVehicleSet[i]; j++)
                {
                    while (customer_index >= 0)
                    {
                        if (customers[customer_index].isSuitableForType(i))
                        {
                            Route route = new Route();
                            route.VehicleType = vehicleTypes[i];
                            double fixedCost = vehicleTypes[i].get_fixedCost();
                            double variableCost = vehicleTypes[i].get_variableCost();
                            Customer customer = customers[customer_index];
                            customers.RemoveAt(customer_index);
                            route.addCustomer(customer);
                            double distance = customer.distance(depot);
                            double cost = fixedCost + variableCost * distance * 2;
                            route.set_totalDistance(distance * 2);
                            route.set_totalCost(cost);

                            routes.Add(route);
                            newRouteGenerated++;
                            break;
                        }
                        customer_index--;
                    }
                    if (customer_index < 0)
                    {
                        break;
                    }

                    customer_index--;
                    if (customer_index < 0)
                    {
                        break;
                    }

                }

            }
            if (newRouteGenerated == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }