Exemple #1
0
        private PackerResponse PackCartoonsRecursively(PackerResponse response = null)
        {
            response = response ?? new PackerResponse();

            //Product productToPack = _productsToPack.First();

            Carton bestFitCarton = _cartonList.Pack(_productsToPack);

            if (bestFitCarton != null)
            {
                foreach (Product product in bestFitCarton.ProductsInCarton)
                {
                    _productsToPack.RemoveAll(p => p.ProductId == product.ProductId);
                }

                response.Cartons.Add(bestFitCarton);
            }
            //else
            //{
            //    response.OversizeProducts.Add(productToPack);

            //    _productsToPack.RemoveAll(p => p.ProductId == productToPack.ProductId);

            //}

            if (_productsToPack.Count > 0)
            {
                return(PackCartoonsRecursively(response));
            }

            return(response);
        }
Exemple #2
0
        private PackerResponse PackRecursively(List <Product> productsToPack)
        {
            // filter cartons.
            IEnumerable <Carton> potentialCartons = FilterCartons(productsToPack);

            // sort the cartons by volume so that packer packs the carton with minimum volume first.
            potentialCartons = potentialCartons.OrderBy(c => c.Space.Volume).ToList();

            if (potentialCartons.Count() == 0)
            {
                return(null);
            }

            Carton potentialCarton = null;

            foreach (Carton carton in potentialCartons)
            {
                //TODO: build factory to return the algorithm.
                LargestAreaFirstFitAlgorithm algorithm = new LargestAreaFirstFitAlgorithm(carton);

                productsToPack = productsToPack.Select(p => new Product(p.ProductId, p.Height, p.Length, p.Width)).ToList();

                algorithm.Pack(productsToPack);

                if (productsToPack.Except(carton.ProductsInCarton).Count() == 0)
                {
                    potentialCarton = carton;

                    break;
                }
            }

            potentialCarton = potentialCarton ?? potentialCartons.OrderByDescending(c => c.ProductsInCarton.Count).FirstOrDefault();

            _packerResponse.Cartons.Add(potentialCarton);

            List <Product> remainingProducts = productsToPack.Except(potentialCarton.ProductsInCarton).ToList();

            if (remainingProducts.Count > 0)
            {
                PackRecursively(remainingProducts);
            }

            return(_packerResponse);
        }
Exemple #3
0
 public LargestAreaFirstFitAlgorithm(Carton carton)
 {
     _carton = carton;
 }