// Get all orders on route private static List <PalletizeOrder> getOrders(int routeID, SqlConnection connection) { connection.Open(); List <int> orderNums = new List <int>(); List <int> stopNums = new List <int>(); SqlCommand getRoute = new SqlCommand("select * from route_info where route_id = " + routeID + ";", connection); using (SqlDataReader routesReader = getRoute.ExecuteReader()) { for (int i = 0; routesReader.Read(); i++) { orderNums.Add(routesReader.GetInt32(routesReader.GetOrdinal("order_num"))); stopNums.Add(routesReader.GetInt32(routesReader.GetOrdinal("stop_num"))); } routesReader.Close(); } List <PalletizeOrder> orders = new List <PalletizeOrder>(); for (int i = 0; i < orderNums.Count; i++) { PalletizeOrder order = new PalletizeOrder(orderNums[i], stopNums[i]); SqlCommand getProduct = new SqlCommand("select order_item.prod_id as prod_id, volume, proirity as priority, quantity from order_full, order_item, product where product.prod_id = order_item.prod_id and order_full.order_num = order_item.order_num and order_full.order_num = " + orderNums[i] + ";", connection); using (SqlDataReader productsReader = getProduct.ExecuteReader()) { while (productsReader.Read()) { PalletizeProduct product = new PalletizeProduct(); product.prodID = productsReader.GetInt32(productsReader.GetOrdinal("prod_id")); product.volume = productsReader.GetFloat(productsReader.GetOrdinal("volume")); product.priority = productsReader.GetInt32(productsReader.GetOrdinal("priority")); product.quantity = productsReader.GetInt32(productsReader.GetOrdinal("quantity")); order.products.Add(product); } productsReader.Close(); } orders.Add(order); } connection.Close(); return(orders); }
// Palletize: Split any order or bulk of products to fill up pallets as much as possible before selecting a new one private static List <PalletizePallet> StrictPalletize(List <PalletizeOrder> orders) { List <PalletizePallet> pallets = new List <PalletizePallet>(); int palletID = 0; pallets.Add(new PalletizePallet(0)); foreach (PalletizeOrder order in orders) { float totalVolume = 0f; foreach (PalletizeProduct product in order.products) { totalVolume += product.volume * product.quantity; } if (totalVolume <= pallets[palletID].volumeRemaining) // Add entire order if it fits { pallets[palletID].orders.Add(order); pallets[palletID].volumeRemaining -= totalVolume; } else // Otherwise split it { PalletizeOrder splitOrder = new PalletizeOrder(order.orderNum, order.stopNum); foreach (PalletizeProduct product in order.products) { if (product.volume * product.quantity <= pallets[palletID].volumeRemaining) // Add all of product quantity if it fits { splitOrder.products.Add(product); pallets[palletID].volumeRemaining -= product.volume * product.quantity; } else // Otherwise split quantity { PalletizeProduct splitProduct = new PalletizeProduct(); splitProduct.prodID = product.prodID; splitProduct.volume = product.volume; splitProduct.priority = product.priority; splitProduct.quantity = 0; for (int i = 0; i < product.quantity; i++) { if (product.volume > pallets[palletID].volumeRemaining) // Next pallet if no more room { if (splitProduct.quantity > 0) { splitOrder.products.Add(splitProduct); } if (splitOrder.products.Count > 0) { pallets[palletID].orders.Add(splitOrder); } pallets.Add(new PalletizePallet(++palletID)); splitOrder = new PalletizeOrder(order.orderNum, order.stopNum); splitProduct = new PalletizeProduct(); splitProduct.prodID = product.prodID; splitProduct.volume = product.volume; splitProduct.priority = product.priority; splitProduct.quantity = 0; } splitProduct.quantity++; // Add a unit of product to pallet pallets[palletID].volumeRemaining -= product.volume; } if (splitProduct.quantity > 0) { splitOrder.products.Add(splitProduct); } } } if (splitOrder.products.Count > 0) { pallets[palletID].orders.Add(splitOrder); } } } return(pallets); }
// Palletize: Only split orders that cannot fit on a single pallet. The bulk of products of these orders can also be split. private static List <PalletizePallet> ModeratePalletize(List <PalletizeOrder> orders) { List <PalletizePallet> pallets = new List <PalletizePallet>(); int palletID = 0; pallets.Add(new PalletizePallet(0)); foreach (PalletizeOrder order in orders) { float totalVolume = 0f; foreach (PalletizeProduct product in order.products) { totalVolume += product.volume * product.quantity; } if (totalVolume > PalletizePallet.MAX_PALLET_VOLUME) // Split order since larger than any pallet { PalletizeOrder splitOrder = new PalletizeOrder(order.orderNum, order.stopNum); foreach (PalletizeProduct product in order.products) { if (product.volume * product.quantity <= pallets[palletID].volumeRemaining) // Add all of product quantity if it fits { splitOrder.products.Add(product); pallets[palletID].volumeRemaining -= product.volume * product.quantity; } else // Otherwise split quantity { PalletizeProduct splitProduct = new PalletizeProduct(); splitProduct.prodID = product.prodID; splitProduct.volume = product.volume; splitProduct.priority = product.priority; splitProduct.quantity = 0; for (int i = 0; i < product.quantity; i++) { if (product.volume > pallets[palletID].volumeRemaining) // Next pallet if no more room { if (splitProduct.quantity > 0) { splitOrder.products.Add(splitProduct); } if (splitOrder.products.Count > 0) { pallets[palletID].orders.Add(splitOrder); } pallets.Add(new PalletizePallet(++palletID)); splitOrder = new PalletizeOrder(order.orderNum, order.stopNum); splitProduct = new PalletizeProduct(); splitProduct.prodID = product.prodID; splitProduct.volume = product.volume; splitProduct.priority = product.priority; splitProduct.quantity = 0; } splitProduct.quantity++; // Add a unit of product to pallet pallets[palletID].volumeRemaining -= product.volume; } if (splitProduct.quantity > 0) { splitOrder.products.Add(splitProduct); } } } if (splitOrder.products.Count > 0) { pallets[palletID].orders.Add(splitOrder); } } else { if (totalVolume > pallets[palletID].volumeRemaining) // Select next pallet since full { pallets.Add(new PalletizePallet(++palletID)); } pallets[palletID].orders.Add(order); // Add order to current pallet pallets[palletID].volumeRemaining -= totalVolume; } } return(pallets); }