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); }
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); }
public LargestAreaFirstFitAlgorithm(Carton carton) { _carton = carton; }