コード例 #1
0
        // Palletize: Only split orders that cannot fit on a single pallet. Don't split a bulk of products in the same order.
        private static List <PalletizePallet> LenientPalletize(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 > PalletizePallet.MAX_PALLET_VOLUME)
                        {
                            return(null);
                        }
                        if (product.volume * product.quantity > pallets[palletID].volumeRemaining)      // Select next pallet since full
                        {
                            if (splitOrder.products.Count > 0)
                            {
                                pallets[palletID].orders.Add(splitOrder);
                            }
                            pallets.Add(new PalletizePallet(++palletID));
                            splitOrder = new PalletizeOrder(order.orderNum, order.stopNum);
                        }
                        splitOrder.products.Add(product);                                               // Add products to current pallet
                        pallets[palletID].volumeRemaining -= product.volume * product.quantity;
                    }
                    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);
        }
コード例 #2
0
        // 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);
        }
コード例 #3
0
        // 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);
        }
コード例 #4
0
        // 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);
        }