У меня есть пакет (https://github.com/skjolber/3d-bin-container-packing/), который будет упаковывать элементы в контейнер для меня. Однако, если предметов слишком много, например, 1000 рубашек, и только 500 помещаются в самый большой контейнер, который у нас есть, он не будет пытаться упаковать оставшиеся 500, результат просто возвращает нуль и не пытается объединить контейнеры. доступный.
Решаю проблему с упаковкой. Обратите внимание, что это не обязательно должно быть точное решение, поскольку мы всего лишь собираем калькулятор стоимости перевозки. Я наткнулся на пакет, который решает большую часть проблемы. В основном у меня есть 5 контейнеров, которые можно использовать. API получает запрос с продуктами, я собираю размеры и упаковываю их. Моя первоначальная мысль состояла в том, чтобы проверить, был ли пакет успешным, и если да, то добавить его в объект ListpackagingResults, чтобы у меня был список. Но то, как устроен этот пакет, подозреваю, что без потери целостности продуктов он работать не будет.
Вот конструктор службы
public PackingService(List<Product> products)
{
containers = SetContainers();
this.packer = new LargestAreaFitFirstPackager(containers);
this.products = products;
PrepareProductsToPack(products);
}
фактический метод упаковки
public List<Container> PackItems()
{
packedResultContainers = new ArrayList<Container>();
Container results = packer.pack(productsToPack);
return this.packedResultContainers;
}
и, наконец, вот я беру свой список сущностей Product и подготавливаю их к алгоритму упаковки.
productsToPack = new ArrayList<BoxItem>();
for(Product product : products)
{
for(int i = 1; i < product.getQuantity(); i++)
{
productsToPack.add(new BoxItem(new Box(product.getSku(),
product.getProductDimensions().getRoundedWidth(),
product.getProductDimensions().getRoundedDepth(),
product.getProductDimensions().getRoundedHeight(),
product.getProductDimensions().getRoundedWeight())));
}
}
Причина, по которой я запутался, заключается в том, что если первоначальный запрос не упаковывается, мне нужно будет разбить свой список на, 2,3,4 в зависимости от того, сколько элементов есть, и у меня не было бы возможности узнать, сколько списки, которые мне нужно иметь.
Может ли кто-нибудь дать некоторое представление о том, как я могу настроить свой алгоритм, чтобы справиться с этим?
Я также должен заявить, что причина, по которой я делаю это таким образом, заключается в том, что, как только у меня есть список результатов, я делаю запрос API UPS, чтобы собрать способы доставки и их тарифы.
Я обновляю свой ответ для будущих пользователей, вот как я решил проблему с упаковкой мусорного ведра.
public ArrayList<Container> PackItems()
{
this.packingResults = new ArrayList<Container>();
productSetsToPack = chopped(productsToPack, getInitBoxCount(productsToPack));
int hashMapId = 0;
for(int i = productSetsToPack.size()-1; i >= 0; i--)
{
ArrayList<BoxItem> itemsToPack = productSetsToPack.get(i);
productSetsMap.put(hashMapId, itemsToPack);
pack(itemsToPack, hashMapId, 5); //pack largest sized boxs
++hashMapId;
};
for (Map.Entry<Integer, Container> entry : packedContainerMap.entrySet()) {
int containerKey = entry.getKey();
Container packedContainer = entry.getValue();
int smallestBoxSize = getSmallestBox(productSetsMap.get(containerKey), Integer.parseInt(packedContainer.getName()));
packingResults.add(pack(productSetsMap.get(containerKey), smallestBoxSize));
// ...
}
return packingResults;
}