3D алгоритм упаковки для доставки товару


24

Я отримав завдання створити кошторис доставки, який пропонує найкраще розміщення товарів на якомога менше коробках:

  1. Існує кінцевий набір відомих розмірів прямокутної коробки

  2. Всередині коробки є багато довільних прямокутних предметів

  3. Чим менше ящиків слід використовувати найкраще. Оскільки доставка двох коробок 1x1x1 набагато дорожча, ніж одна коробка 1x2x1. Тут має бути пріоритет.

  4. Слід також оптимізувати використання якомога менших коробок як пріоритету другого рівня. (наприклад: якщо вам пропонується вибір між одним більшим і двом малим, він повинен вибрати більший ящик)

  5. Елементи можна обертати, щоб підходити до коробки, але обертання повинно бути обмежене мінімум на 45 ° (у моїх дослідженнях здається, що деякі конфігурації дозволяють обертати на 45 градусів, щоб краще розмістити прямокутні коробки всередині більшої прямокутної коробки) , обертання на 90 ° - стандарт, який слід прийняти.

  6. Коробки мають обмеження ваги, а предмети мають довільну вагу (наприклад: предмет розміром 1х1х1 може бути важчим за інші предмети 2х2х2)

Я трохи дослідив і знайшов кілька абстрагованих алгоритмів упаковки бінів і проблеми з рюкзаком і прийшов із наступною дещо різкою варіацією, схожою на алгоритм найкращого підходу:

  1. Сортуйте елементи в порядку зменшення обсягу (спочатку більший) у списку «предмети для упаковки»

  2. Для кожного елемента в цьому списку:

    1. Оберіть менший ящик, який міститься у списку "використані коробки" і має достатню обмеженість обсягу та ваги, щоб підходити до предмета (я буду використовувати підходящий тут для позначення розмірів та ваги)

    2. Якщо такого вікна немає, створіть нове поле з набору знань можливих розмірів коробки, який є найменшим розміром, який може відповідати розмірам і вазі предмета, і додайте його до списку "використаних коробок".

    3. Якщо коробка поміщає предмет (за допомогою функції підгонки нижче), додайте його до списку "предметів цього поля" та вийміть його зі списку "елементи, що підходять", позначивши його відносне 3d положення всередині поля.

    4. Повторюйте з 2.1, поки в списку "предметів для упаковки" немає жодного предмета.

Функція перевірки придатності, що використовується на кроці 2 вище:

  1. Перевірте, чи відповідає об'єм коробки об'єму об'єму. Якщо ні, поверніть помилкове.

  2. Перевірте, чи сума ваги "предметів коробки" плюс поточна вага предмета менша або дорівнює межі ваги коробки. Якщо ні, поверніть помилкове.

  3. Поставте прапорець "Елементи коробки", щоб вибрати першу координату поля, яка має найменший компонент Y і має достатньо місця для ширини, глибини та висоти елемента, вважаючи інші елементи, розміщені як недоступні місця.

  4. Якщо елемент не відповідає його поточній орієнтації, поверніть його на одне з 6 можливих обертів, не передбачаючи поворотів на 45 ° для простоти. (Обертання, що призводять до розмірів, які можна перевірити, коли вже перевірені. Наприклад: обертання коробки на 180 ° дає ті ж розміри, що і вихідне положення, тому що всі коробки та предмети мають однаковий розмір для протилежних граней, тому їх можна пропустити.)

  5. Якщо елемент не повертався всіма можливими способами назад до його початкової орієнтації, спробуйте ще раз з кроку 3.

  6. Якщо всі обертання, де було випробувано, а відповідність не були знайдені, розгляньте поточну координату як недоступний простір.

  7. Якщо місця для перевірки немає, поверніть помилкове. Ще, спробуйте ще раз з кроку 3.

Я хочу знати, чи може бути найкраще рішення моєї проблеми, враховуючи представлені обмеження.

Це, здається, працює на теорії, але я не пробував це на коді. Мені хочеться знати, чи я рухаюся в правильному напрямку чи є кращі, ефективні способи цього зробити.

Посилання були б чудовими.

Редагувати:

Я знайшов цікавий сторонній API, який робить те, що я хочу, але це доведеться відключити, тому я не матиму до них доступу.

Деякі приклади:

Редагувати 2:

Справжнім світовим прикладом проблеми, яку потрібно вирішити:

  • У мене 4 розміри коробки WxHxD: 10x12x18, 12x16x24, 16x20x30, 24x32x40
  • У мене замовлення з 4 предметів, розміром 1 розмір 6x8x10, 2x 22x14x30 та 1x 22x4x20

Як я можу помістити ці предмети в будь-яку кількість коробок одного або декількох розмірів, використовуючи якомога менше коробок, використовуючи найменші можливі скриньки і залишаючи менше вільного місця?


4
Немає необхідності у packingпов’язаному тезі; algorithmsдостатньо :)
Chris Cirefice

Мені цікаво, чи справді упаковку виконають роботи або люди? Якщо це останнє, чи буде коштувати оптимізація простору часу, необхідного для з'ясування того, як обертати кожну коробку, щоб її вмістити?
foraidt

Гарне питання. Фактична упаковка буде зроблена людьми, але програмне забезпечення запропонує порядок упаковки та положення кожної коробки. Для розробки упаковки не знадобиться досвід розглянути наданий макет та розмістити товари всередині коробки. Спочатку деякий час буде витрачено на те, щоб звикнути, але це не потребуватиме роздумів про найкращий спосіб.
Рікардо Соуза

1
Я думаю, що все, що говорить @msw, полягає в тому, що цей тип проблеми навряд чи добре підходить для «ідеального» рішення, а краще підходить для прийнятного рішення, знайденого в розумний проміжок часу з евристикою, виходячи з правил, які ви за умови. З математичної точки зору, це часто означає, що ви підходите до нього за допомогою іншого набору алгоритмів та інструментів, тому я думаю, що він просто рекомендує це. Наприклад, генетичні алгоритми, імітований відпал та інші методи слідування кривої градієнта спуску, що наближається до простору рішення щодо вашої евристики, можуть принести тут переваги.
J Trana

1
Я розміщую тут лише ідею. Якщо ви не вважаєте, що це буде ефективно, ви можете проігнорувати це. Це рішення (воно більше схоже на оптимізацію) насправді залежить від того, наскільки подібним буде вхід вашого алгоритму. Отже, використовуючи той факт, що ваш внесок з часом матиме деякі подібності. Ви можете зберігати / кешувати обчислені результати (які мають дорогу складність обчислення), а потім порівнювати їх з вашими вхідними даними, і якщо у вас є повне чи часткове збіг, вам потрібно буде зробити лише кілька обчислень, щоб упорядкувати деякі об'єкти другого розміру. Звичайно, це спричиняє нові проблеми.
JAAAY

Відповіді:


4

Упаковка контейнерів є дуже складно обчислювальною. Подумайте над половиною проблеми: ви хочете упакувати продукт у коробки для перевезення, не маючи марну. Оптимальне рішення для цього зажадає пройти всі можливі підмножини та всі можливі 3Д компонування продукту, який потрібно поставити в одному вантажівці. Я дам вам оптимальне рішення для цього, тому що у мене є друг, який робить перед сніданком шість неможливих речей.

Тепер вам просто потрібно дістати всі коробки на вантажівку без марно. Мій друг робить свою другу неможливу справу і дає тобі рішення. На жаль, при вибраних вище розмірах ящиків у вантажівці є порожнє місце, яке можна зменшити, якби ви вибрали різні (чи більші, чи менші) коробки в першому завданні. Якщо ви зміните розмір однієї коробки, в кращому випадку вам доведеться перефасувати вантажівку; в гіршому випадку, можливо, доведеться перепакувати всі коробки, що так само важко, як і проблема, з якою ми почали. І, як і на першому етапі, вам доведеться спробувати всі можливі 3D-композиції.

Я знайшов Посібник з розробки алгоритмів Скієни як корисний для роздумів про те, який клас алгоритмів підходить для яких завдань, але я здебільшого дізнався, що хороші рішення навіть для щоденних проблем вибухнуть у вас із труднощами в обчисленні. Більшість з того, що вам потрібно, вписуються в клас проблем із упаковкою у сміттєві кошики, і ця стаття є гарним стрибком. Варто зазначити, що одні з найкращих алгоритмів для цього є комерційними продуктами, оскільки це завдання з'являється скрізь у логістиці (яка найменша кількість вагонів поїздів, які я можу отримати у свої товари? Тощо). Можна заробити чималі гроші, якщо правильна евристика може заощадити виробника 100 поїздів на місяць.

На жаль, література з оптимізації евристики не настільки велика, як для алгоритмів. Якщо ви спробуєте пройти це поодинці, я гарантую, що ви мрієте про переміщення прямокутних призм вже до другого місяця. У мене виникла проблема з запасом, що, якщо мені доведеться це зробити ще раз, я, мабуть, звертаюся до експертів (або їх програмного забезпечення).

Дякую @JTrana за прекрасне розширення мого коментаря.


Спасибі за ваш відгук. Як я вже говорив на запитання, я вже досліджував цю тему і зіткнувся з кількома алгоритмами, щоб запропонувати цей вище. Мене хвилює лише сама упаковка. Усі ці скриньки будуть відправлені через послуги поштового відправлення. На щастя, мені не доведеться мати справу з завантаженням вантажних автомобілів.
Рікардо Соуза

Це було гарною частиною мого пояснення. Ви не можете "витягнути" алгоритм у фірм, які хочуть, щоб ви заплатили за їх послугу. У двох перерахованих вами фірм є API, але упаковка проводиться на їх серверах, і ви не маєте доступу до коду реалізації, крім крадіжок. І добре, що вам не доведеться упаковувати вантажні автомобілі, тепер ваша проблема лише наполовину складна, тому фірми хочуть продати вам рішення, і люди готові придбати послугу.
msw

1
Я думаю, що у нас тут є непогане спілкування. Я, можливо, не висловив мене добре (як ви могли помітити, англійська мова не є моєю домашньою мовою). Я не прошу вкрасти алгоритми. Я прийшов сюди для роз’яснення з цього приводу. Я провів декілька досліджень і приклав це до прикладу для аналізу. Можливо, є хтось, хто стикався з тими ж проблемами, який може дати мені кращі вказівки. Якщо моє рішення не застосовується, що я можу зробити, щоб досягти кращих результатів? Це моє справжнє запитання. Я сподіваюся, що я зробила це ясніше.
Рікардо Соуза

Ваша англійська добре; Я думаю, що проблема полягає в тому, що ми говоримо про різні шари завдання. Ви думаєте про реалізацію, і я думаю про комбінаторний вибух. Я думаю, що вирішення вашої редакції 2 допоможе вам краще зрозуміти проблему з того, як я на це дивлюся. Чи можете ви вирішити це, як зазначено? Без даремно, з мінімальною кількістю коробок мінімального розміру? Це проблема мультіоптимізації, яку я згадав, перед якою я сказав, що це неможливо зробити: вам доведеться пожертвувати хоча б одним із цих факторів, щоб оптимізувати інший.
msw

Дякую. Я думаю, я зараз це отримав. Я не намагався це кодувати. Я думав не витрачати час на кодування, перш ніж конкретніше рішення або хоча б позитивний відгук щодо моєї пропозиції, оскільки це, спочатку, цитата. Я все ще досліджую, але боюся, що мені доведеться отримати один із цих API і побачити, чи можуть пристрої (збирачі даних під управлінням Win CE 6.0) працювати підключені до Інтернету. Перша інформація, яку я отримала від клієнта, заявила, що вони не матимуть доступу до Інтернету на робочому місці.
Рікардо Соуза

1

Коли я створюю нові алгоритми, і нещодавно я робив сам алгоритм упаковки (я знаю, він все ще має певний потенціал оптимізації), я завжди виконую найпростіший підхід:

Як би я, як людина, це робив, і спробую тро перекласти це в алгоритм: З мого вчителя (робототехніки) AI Рольфа Пфайфера я все-таки маю на увазі, що очевидний інтелект іноді може бути створений за допомогою дуже простих правил, тому замість перенавчання Я намагаюсь знеструмити

  1. Визначте занадто великі предмети (предмети, які не вміщуються в жодному полі)
  2. Спробуйте знайти найкраще можливе поле (шляхом поперечного порівняння загального обсягу та розмірів предмета)
  3. Замовляйте предмети від великого до малого та коробки (пробіли) від малого до великого
  4. Встановіть найбільший предмет на найменший простір
  5. Якщо найбільший предмет не знаходить стрибок через нього, спробуйте наступний, поки нічого більше не підійде
  6. Для решти елементів знайдіть найкраще поле. ...

    X. завжди думайте про виняткові події (негабаритні предмети, дивні форми, якщо в коробці є лише 1 предмет, чи не було б краще відправити товар без коробки? Тощо), але ви можете зробити евристику також у формі рішення дерево.

Звичайно, що далі ви отримуєте попередження, я просто даю ці ідеї як вихідну точку. Звідти можливе безліч способів. Однією з альтернатив було б розділити ящик на маленькі кубики (наприклад, 5 смx5 см x 5 см) і відстежити їх як зайняті / вільні, інший підхід можна назвати 3d тетрісом тощо.

При такому підході вам не обов’язково турбуватися про комбінаційний вибух. З іншого боку, комбінаційний вибух може статися, якщо ми говоримо про потяги товарів, але знову ж таки: чи ти справді думаєш, що компанія перевірятиме позицію упаковки за пунктом? Ні, вони не підходитимуть до рішення "ділити" і перемагають: розділіть складність, використовуючи стандартизовані томи (наприклад, палітри або коробочки фіксованого розміру). Тож навіть для практичної діяльності врахуйте, що не лише тренується, а часом і час працівника - це гроші. поїзд може завантажувати x палітри, кожна палітра має фіксований об'єм, тому пакуйте елементи в палітру, але потім знову, можливо, палітра складається з декількох порядків, тому використовуйте фіксовані поля для елементів, які потім завантажуються в палітри, які потім завантажуються в потяги.

Принаймні, так я, як людина, вирішував би це завдання, отримував найкращу коробку, а потім розміщував найбільший предмет один за одним у найменшому доступному просторі (і додав трохи попереднього перегляду).

Як і в моєму алгоритмі, зрештою, ви, мабуть, не матимете найкращого рішення, але надзвичайно хорошого евристичного характеру, яке потім зможете вдосконалити.

Іноді простіше почати з першого кроку і вияснити проблеми на своєму шляху, добре перебіг курсу, в ідеалі - це не якийсь крок через крайній крок, а трохи розумний ... іноді тебе можуть змусити вивчити альтернативи та вибрати найкращий або здійснити "крок назад".

Але, як я дізнався від мого вчителя AI (Рольфа Пфайфера, вибачте, що це знову турбує): Іноді ви можете створити очевидну розумну поведінку за допомогою дуже простих і нечисленних наборів правил> поведінка, що виникає, у згаданому прикладі вони запрограмували маленькі віддалені машини, щоб повернути ліворуч, якщо вони виявляють перешкоду з правого боку, повертають праворуч, якщо є перешкода на лівій стороні, і йдуть прямо, якщо немає перешкоди або якщо перешкода стоїть попереду. 3 або 4 роботи, розміщені на площі 3 м х 3 м з великою кількістю кульок для пінг-понгу, призводять до дивовижного факту, що роботи, здавалося, прибирають, висуваючи кульки для пінг-понгу в кути, навіть незважаючи на те, що роботи програмується лише для уникнення перешкод.

П.Д .: Єдине відхилення в реальному світі, яке я виявив від цього підходу, - це коли я працював неповний робочий день як естрада для великих концертів, як «металіка», «залізна діва», «Брітні Спірс», «Пол МкКартні», імено це ... Вантажівки, що працюють над міжнародні тури мають точні списки упаковки за пунктом. Розрахунки виконуються один раз (я не знаю людей чи машин), а потім повторюються. Іноді, коли вони упаковують вперше, вони навіть роблять пошарові картинки і вклеюють їх у вантажівку, щоб місцеві екіпажі точно знали, яку коробку потрібно заряджати, коли і де. Але це також особлива потреба в упаковці, оскільки для однієї екскурсії вони завжди працюють з тими ж ящиками та вантажівками.


1

Евристика, яку ви згадуєте у своєму дописі, здається цікавою.

Я б запропонував кілька модифікацій, щоб покращити остаточне рішення.

Давши рішення з усіма предметами, упакованими в одне поле, спробуйте об'єднати вміст двох невеликих коробок в один більший ящик (це повинно допомогти покращити критерії використання якомога менше коробок).

Крім того, кожен раз, коли ви запускаєте нове поле, замість того, щоб використовувати найменший ящик, який може вмістити поточний елемент, ви можете вибрати найбільшу скриньку, яка вмістить його, і як тільки кожен елемент буде призначений до коробки, спробуйте призначити всі елементи коробку до меншої коробки.

Крім того, у своїй функції підгонки замість того, щоб вважати положення інших ящиків зафіксованим, ви можете уявити зміну послідовності завантаження. Це дозволить вам знайти кращі рішення за рахунок більш тривалого часу.


Це здається цікавим вдосконаленням. Я давно не торкався цієї проблеми. Можливо, я повинен спробувати це в цей день. Спасибі.
Рікардо Соуза,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.