У меня есть пакет (https://github.com/skjolber/3d-bin-container-packing/), который будет упаковывать вещи в контейнер для меня. Однако, если есть слишком много предметов, например, 1000 рубашек, и только 500 помещаются в самый большой контейнер, который у нас есть), он не будет пытаться упаковать оставшиеся 500, результат просто возвращает ноль и не пытается объединить доступные контейнеры.
Я решаю проблему с упаковкой в мусорное ведро. Обратите внимание, что это не нужнобыть точным решением, поскольку мы просто собираем калькулятор затрат на перевозку. Я наткнулся на пакет, который решает большую часть проблемы. В основном у меня есть 5 контейнеров, которые можно использовать. API получает запрос с продуктами, и я собираю размеры иЯ хотел сначала проверить, был ли пакет успешным, а затем добавить его в объект List packageResults, чтобы у меня был список. Но как этот пакет настроен, я подозреваю, что он не будет работать без потерицелостность продуктов.
Вот конструктор службы
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;
}