Попытка самообучения Python и столкновение с проблемой. Может кто-нибудь подтвердить, что это будет проблема с рюкзаком?

Пример: у меня есть два предмета, один 3 "x 3" x 3 ", другой 1" x 3 "x 9". У меня есть список из 12 различных размеров коробок, упорядоченных по стоимости от самых дешевых до самых высоких.

Могу ли я использовать рюкзак, чтобы определить, в какую из 12 коробок эти два предмета поместятся вместе, и вернуть самый дешевый вариант? Или что-то еще, например, генетический алгоритм, было бы лучше, чтобы вычислить минимальный размер 9 "x 4" x 3 "и вернуть соответствующий квадрат?

Все, что я видел до сих пор, основано на одном весе (объеме), и в этом случае элементы 1 и 2 нельзя рассматривать как одно и то же.

Примеры размеров коробки:

A - 2 x 6 x 6, $ .52

B - 12 x 10 x 4, $ 54

С - 14 х 12 х 5, $ 0,71

Выводом будет поле B, поскольку элементы поместятся в B & C, но B является самым дешевым.

Любая помощь будет очень признательна.

Редактировать для разъяснения

Я создал базовый файл Excel, чтобы справиться с этим, используя SORT, COUNTIFS и т. Д., Но он не может обработать ничего сложного, например, восемь из 3 x 3 x 3 элементов, помещающихся в коробке 6 x 6 x 6.

1
user3230413 2 Янв 2020 в 22:22
Вы можете просмотреть детерминированную Java-реализацию этой проблемы, которая учитывает ортогональное вращение и вес, по адресу github.com/mohitesh07/3d-bin-packing/blob/master/…, но он минимизирует количество коробок, а не суммарный результат подсчета-цены коробок.
 – 
LegendofPedro
3 Янв 2020 в 02:47
Вы также можете посмотреть cs.stackexchange, вот связанный с этим вопрос
 – 
Ryan Haining
3 Янв 2020 в 03:10

1 ответ

Да, это можно рассматривать как задачу с множественными ограничениями и множественными ранцами или, в более общем смысле, как проблему упаковки бункера. Точный подход будет зависеть от языка и того, как вы хотите найти компромисс между эффективностью процессора, временем разработки, универсальностью и т. Д. (Дешево, быстро, хорошо: выберите два)

Вот как я бы сформулировал описание проблемы: минимизируйте совокупную стоимость целого количества рюкзака (ов), необходимого с достаточной емкостью по осям X, Y и Z для хранения требуемых предметов . Формулировать это «математически» было бы для меня сложнее, чем просто реализовать, учитывая, что это явно NP-сложно.

Самый оптимальный алгоритм зависит от целей / компромиссов. Я бы предложил рабочее решение и несколько комплексных тестовых примеров для тестирования других подходов. Я бы подумал об этих подходах:

  1. (предварительная) сортировка ящиков по возрастанию стоимости
  2. сортировать элементы по объему по убыванию
  3. сначала упаковать элементы в коробки (когда любая сумма размеров элемента превышает размер коробки, создайте экземпляр первой коробки, которая имеет достаточно большую длину)

Или же

  1. сортировать ящики по (стоимость / объем) по возрастанию
  2. сортировать товары по убыванию
  3. перемещать элементы, помещать элементы первыми в свободное пространство в текущих частично заполненных ячейках или выделять первую ячейку, которая достаточно велика
  4. повторить обход, пока все элементы не будут упакованы

Больше мыслей:

  • можем ли мы перемешивать списки или выбирать коробки случайным образом?
  • как мы узнаем, что целью является минимум? Это локальный или глобальный минимум?
  • как мы узнаем, достаточно ли в частично заполненной коробке места для определенного предмета? 1
  • мы должны просто случайным образом упаковать, пока процессорное время или память не будут исчерпаны, а затем использовать самое дешевое решение?
  • можем ли мы быть умными и использовать теорию графов?
  • это действительно проблема с расписанием?
  • существует конечная комбинация ящиков, которая удовлетворяет задаче, и можно использовать только целые количества ящиков, поэтому, возможно, сгенерировать (все?) возможные комбинации, а затем решить с помощью симплексного алгоритма?

Вы также можете потребовать некоторого количества люфта. Возможно, вы захотите (позже) ограничить вес коробки. Возможны крайние случаи, например, когда стоимость ящиков будет больше, чем стоимость поддона, контейнера ISO и т. Д., Поэтому, возможно, проблема может быть ограничена.


1 2

2


Изменить :

pip install py3dbp предоставляет реализацию алгоритма трехмерной упаковки контейнеров, который может помочь в начальной загрузке вашего решения для минимизации Стоимость. Документ, на который он ссылается, может быть вам полезен.

1
LegendofPedro 3 Янв 2020 в 03:06
Только что понял, что вы указали, но не пометили [python], поэтому я не знаю, как лучше всего подойти к проблеме оптимизации не в C / Matlab. Вероятно, в scipy есть много полезного.
 – 
LegendofPedro
3 Янв 2020 в 02:26
1
Возможно, когда-то это было полезно для Джеффа ... теперь они настолько одержимы однодневной доставкой, что не думают об оптимизации такого рода. Спасибо за фору ... Мои выходные теперь, вероятно, сняты с работы над этим.
 – 
user3230413
3 Янв 2020 в 22:47