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