Я получил задание построить оценочную стоимость доставки, которая предлагает наилучшее размещение товаров на минимально возможном количестве коробок:
Существует конечный набор известных размеров прямоугольных коробок.
Внутри коробок должно быть много произвольных прямоугольных предметов
Меньше коробок следует использовать лучше всего. Потому что доставка двух коробок 1x1x1 намного дороже, чем одна коробка 1x2x1. Это должно быть приоритетом здесь.
Также следует оптимизировать использование меньших полей, насколько это возможно, в качестве приоритета второго уровня. (например: если представлен выбор между одной большой коробкой и двумя маленькой, следует выбрать большую коробку)
Элементы можно поворачивать, чтобы они соответствовали размеру коробки, но поворот должен быть ограничен с шагом не менее 45 ° (в моих исследованиях кажется, что в некоторых конфигурациях допускается поворот на 45 градусов для лучшего размещения прямоугольных прямоугольников внутри большего прямоугольного прямоугольника) при поворотах на 90 ° принятый стандарт
Коробки имеют ограничение по весу, а предметы имеют произвольный вес (например: предмет размером 1x1x1 может быть более тяжелым, чем другой предмет 2x2x2)
Я немного исследовал и нашел несколько абстрактных алгоритмов для упаковки бина и проблемы с рюкзаком и пришел со следующим несколько грубым изменением, похожим на алгоритм наилучшего соответствия:
Сортировка предметов в порядке убывания объема (сначала больше) в списке «товары для упаковки»
Для каждого элемента в этом списке:
Выберите меньший ящик, который находится в списке «использованных ящиков» и имеет достаточный предел объема и веса, чтобы соответствовать предмету (я буду использовать здесь, чтобы означать подгонку размеров и веса)
Если такого блока нет, создайте новый блок из известного набора возможных размеров блоков, который является наименьшим размером, который может соответствовать размерам и весу элемента, и добавьте его в список «используемых блоков».
Если блок соответствует элементу (с помощью функции подгонки ниже), добавьте его в список «элементов этого блока» и удалите его из списка «элементов для подгонки», отметив его относительное 3d-положение внутри блока.
Повторяйте от 2.1 до тех пор, пока в списке «товары для упаковки» не будет предмета для размещения
Функция проверки соответствия, использованная на шаге 2 выше:
Проверьте, соответствует ли оставшийся объем коробки объему предмета. Если нет, верните false.
Проверьте, является ли сумма веса «предметов в ящике» плюс вес текущего предмета меньше или равна пределу веса ящика. Если нет, верните false.
Проверьте список «элементов блока», чтобы выбрать первую координату блока, которая имеет наименьший компонент Y и в которой достаточно места для ширины, глубины и высоты элемента, учитывая, что другие элементы размещены как недоступное пространство.
Если элемент не соответствует текущей ориентации, поверните его на одно из 6 возможных поворотов, не предполагая поворота на 45 ° для простоты. (Вращения, приводящие к размерам, которые уже были проверены, могут быть пропущены. Например: поворот рамки на 180 ° дает те же размеры, что и исходное положение, поскольку все коробки и элементы имеют одинаковый размер для противоположных граней и поэтому могут быть пропущены.)
Если элемент не был повернут всеми возможными способами обратно в исходную ориентацию, попробуйте еще раз, начиная с шага 3.
Если все повороты были выполнены, и подгонка не найдена, считайте текущую координату недоступным пространством.
Если для проверки нет свободного места, верните false. В противном случае попробуйте еще раз с шага 3.
Я хочу знать, может ли быть лучшее решение моей проблемы, учитывая представленные ограничения.
Кажется, это работает на теории, но я не пробовал на коде. Я хотел бы знать, иду ли я в правильном направлении или есть лучшие, эффективные способы сделать это.
Ссылки были бы отличными.
Редактировать:
Я нашел интересный сторонний API, который делает то, что я хочу, но это нужно будет отключить, поэтому у меня не будет доступа к ним.
Вот некоторые примеры:
Изменить 2:
Реальный пример проблемы, которую нужно решить:
- У меня есть 4 размера коробки WxHxD: 10x12x18, 12x16x24, 16x20x30, 24x32x40
- У меня порядка 4 предметов: 1 размером 6x8x10, 2x 22x14x30 и 1x 22x4x20
Как мне разместить эти предметы в любом количестве ящиков одного или нескольких размеров, используя как можно меньше ящиков, используя как можно меньше ящиков и оставляя как можно меньше свободного места?
packing
связанном теге;algorithms
хватит :)