//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; }
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; } } }
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; } }
// 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); } }
//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; }
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 }
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; } }