Algorytm pakowania 3d dla wysyłki przedmiotu

24

Otrzymałem zadanie zbudowania prognozy wysyłki, która sugeruje najlepsze zakwaterowanie towarów na jak najmniejszej liczbie pudełek:

  1. Istnieje skończony zestaw znanych rozmiarów prostokątnych pudełek

  2. Istnieje wiele dowolnych prostokątnych przedmiotów, które należy zapakować w pudełka

  3. Im mniej pól, tym lepiej. Ponieważ wysyłka dwóch pudeł 1x1x1 jest znacznie droższa niż jedno pudełko 1x2x1. To powinno być tutaj priorytetem.

  4. Należy również zoptymalizować korzystanie z mniejszych skrzynek, jak to możliwe, jako priorytet drugiego poziomu. (np .: jeśli jest oferowany wybór między jednym większym pudełkiem a dwoma małymi, powinien wybrać większe pudełko)

  5. Elementy można obracać, aby pasowały do ​​pudełka, ale obrót musi być ograniczony do przyrostów co najmniej 45 ° (w moich badaniach wydaje się, że niektóre konfiguracje pozwalają na obrót o 45 stopni, aby lepiej dopasować prostokątne pudełka do większego prostokątnego pudełka) , a mianowicie obrót o 90 °.

  6. Pudełka mają limit wagi, a przedmioty mają dowolną wagę (np .: przedmiot o rozmiarze 1x1x1 może być cięższy niż inny przedmiot 2x2x2)

Trochę przestudiowałem i znalazłem kilka abstrakcyjnych algorytmów dotyczących pakowania bin i problemu z plecakiem, i otrzymałem następującą nieco brutalną siłę, podobną do algorytmu najlepszego dopasowania:

  1. Posortuj elementy w malejącej kolejności objętości (najpierw większe) na liście „elementów do spakowania”

  2. Dla każdego elementu na tej liście:

    1. Wybierz mniejsze pudełko, które znajduje się na liście „używane pudełka” i ma wystarczającą ilość pozostałego limitu objętości i wagi, aby zmieścić przedmiot (użyję dopasowania tutaj, aby dopasować wymiary i wagę)

    2. Jeśli nie ma takiego pudełka, utwórz nowe pudełko ze znanego zestawu możliwych rozmiarów pudeł, który jest najmniejszym rozmiarem, który może pasować do wymiarów i wagi przedmiotu i dodaj go do listy „używanych pudeł”.

    3. Jeśli pudełko pasuje do elementu (używając funkcji dopasowania poniżej), dodaj go do listy „elementów tego pudełka” i usuń go z listy „elementów do dopasowania”, zaznaczając jego względną pozycję 3d wewnątrz pudełka.

    4. Powtarzaj od 2.1, aż na liście „elementów do spakowania” nie będzie żadnego elementu do zamontowania.

Funkcja kontroli dopasowania używana w kroku 2 powyżej:

  1. Sprawdź, czy pozostała objętość pudełka pasuje do objętości przedmiotu. Jeśli nie, zwróć false.

  2. Sprawdź, czy suma masy „elementów pudełka” plus bieżąca waga przedmiotu jest mniejsza lub równa limitowi wagi pudełka. Jeśli nie, zwróć false.

  3. Sprawdź listę „elementów pudełka”, aby wybrać pierwszą współrzędną pudełka, która ma najmniejszy komponent Y i która ma wystarczająco dużo miejsca na szerokość, głębokość i wysokość elementu, biorąc pod uwagę inne elementy umieszczone jako niedostępne miejsce.

  4. Jeśli element nie pasuje w bieżącej orientacji, obróć go o jeden z 6 możliwych obrotów, nie przyjmując dla uproszczenia obrotu o 45 °. (Obroty, których wynikiem są rozmiary, które już przetestowane można pominąć. Np .: obrócenie pudełka o 180 ° daje takie same wymiary jak pozycja pierwotna, ponieważ wszystkie pudełka i przedmioty mają ten sam rozmiar dla przeciwległych ścian i dlatego można je pominąć.)

  5. Jeśli element nie został obrócony wszystkimi możliwymi sposobami powrotu do pierwotnej orientacji, spróbuj ponownie od kroku 3.

  6. Jeśli wszystkie obroty były sprawdzone i nie znaleziono dopasowania, rozważ bieżącą współrzędną jako niedostępną przestrzeń.

  7. Jeśli nie ma dostępnego miejsca do sprawdzenia, zwróć false. W przeciwnym razie spróbuj ponownie od kroku 3.

Chcę wiedzieć, czy istnieje najlepsze rozwiązanie mojego problemu, biorąc pod uwagę przedstawione ograniczenia.

To wydaje się działać na teorii, ale nie próbowałem tego na kodzie. Chciałbym wiedzieć, czy idę w dobrym kierunku, czy są lepsze, wydajniejsze sposoby na zrobienie tego.

Referencje byłyby świetne.

Edytować:

Znalazłem interesujący interfejs API innej firmy, który robi to, co chcę, ale będzie musiał zostać odłączony, aby nie mieć do nich dostępu.

Oto niektóre przykłady:

Edycja 2:

Przykładem rzeczywistego problemu do rozwiązania byłoby:

  • Posiadam 4 rozmiary pudeł WxHxD: 10x12x18, 12x16x24, 16x20x30, 24x32x40
  • Mam zamówienie na 4 przedmioty, czyli 1 o rozmiarze 6x8x10, 2x 22x14x30 i 1x 22x4x20

Jak dopasować te elementy do dowolnej liczby pudeł o jednym lub większej liczbie rozmiarów, używając jak najmniejszej liczby pudełek, używając możliwie najmniejszych pudeł i pozostawiając możliwie najmniej wolnego miejsca?

Ricardo Souza
źródło
4
Nie ma potrzeby używania packingpowiązanego znacznika; algorithmswystarczy :)
Chris Cirefice
Ciekawe, czy faktyczne pakowanie będą wykonywane przez roboty czy ludzi? Jeśli to drugie, czy optymalizacja przestrzeni będzie warta czasu potrzebnego na zastanowienie się, jak obrócić każde pudełko, aby je dopasować?
foraidt
Dobre pytanie. Rzeczywiste pakowanie zostanie wykonane przez ludzi, ale oprogramowanie zasugeruje kolejność pakowania i pozycję każdego pudełka. Spojrzenie na dostarczony układ i umieszczenie towaru w pudełku nie będzie wymagało doświadczenia w pakowaniu. Na początku trochę czasu poświęcisz na przyzwyczajenie się, ale nie będzie to wymagało myślenia o najlepszym usposobieniu.
Ricardo Souza
1
Myślę, że wszystko @msw mówi, że ten typ problemu raczej nie jest dobrym rozwiązaniem dla „idealnego” rozwiązania, ale raczej lepiej pasuje do akceptowalnego rozwiązania znalezionego w rozsądnym czasie z heurystyką opartą na regułach, które masz opatrzony. Z matematycznego punktu widzenia często oznacza to, że podchodzisz do niego z innym zestawem algorytmów i narzędzi, więc myślę, że po prostu to zaleca. Na przykład algorytmy genetyczne, symulowane wyżarzanie i inne metody podążania za krzywą opadania gradientu przybliżającą przestrzeń rozwiązania względem heurystyki mogą przynieść tutaj korzyści.
J Trana,
1
Zamieszczam tutaj tylko pomysł. Jeśli nie uważasz, że będzie skuteczny, możesz go zignorować. To rozwiązanie (bardziej przypomina optymalizację) naprawdę zależy od tego, jak podobne będzie wejście twojego algorytmu. Wykorzystując fakt, że twój wkład będzie z czasem miał pewne podobieństwa. Możesz przechowywać / buforować obliczone wyniki (które mają kosztowną złożoność obliczeniową), a następnie porównać je z danymi wejściowymi, a jeśli masz pełne dopasowanie lub częściowe dopasowanie, wystarczy wykonać kilka obliczeń, aby zmienić kolejność niewielkich obiektów. Oczywiście powoduje to powstanie nowych problemów.
JAAAY,

Odpowiedzi:

4

Pakowanie pojemników jest bardzo trudne obliczeniowo. Pomyśl o połowie problemu: chcesz zapakować produkt w pudła transportowe bez marnowania w pudełku. Optymalne rozwiązanie tego wymagałoby przejścia przez wszystkie możliwe podzestawy i wszystkie możliwe układy 3D produktu, który musi być wysyłany w jednej ciężarówce. Dam ci optymalne rozwiązanie, ponieważ mam przyjaciela, który robi sześć niemożliwych rzeczy przed śniadaniem.

Teraz musisz tylko zabrać wszystkie pudła do ciężarówki bez marnotrawstwa. Mój przyjaciel robi swoją drugą niemożliwą rzecz i daje ci rozwiązanie. Niestety przy wybranych powyżej rozmiarach skrzynek w ciężarówce jest pusta przestrzeń, którą można by zmniejszyć, gdybyś wybrał inne (większe lub mniejsze) pudła w pierwszym zadaniu. Jeśli zmienisz rozmiar jednego pudełka, w najlepszym razie będziesz musiał ponownie zapakować ciężarówkę; w najgorszym wypadku może być konieczne przepakowanie wszystkich pudełek, co jest równie trudne, jak problem, z którym zaczęliśmy. I podobnie jak w przypadku pierwszego etapu, musisz wypróbować wszystkie możliwe aranżacje 3D.

Uważam, że Podręcznik projektowania algorytmów Skieny był pomocny przy zastanawianiu się, jaka klasa algorytmów pasuje do danego rodzaju problemów, ale przede wszystkim dowiedziałam się, że dobre rozwiązania nawet przyziemnych problemów pojawiają się w obliczu trudności obliczeniowych. Większość tego, czego potrzebujesz, mieści się w klasie problemów związanych z pakowaniem pojemników, a ten artykuł jest dobrym punktem wyjścia. Warto zauważyć, że jednymi z najlepszych algorytmów do tego są produkty komercyjne, ponieważ zadanie to pojawia się wszędzie w logistyce (do jakiej najmniejszej liczby wagonów kolejowych mogę dostać moje towary? I tak dalej). Jeśli właściwa heurystyka może zaoszczędzić producentowi 100 wagonów miesięcznie, trzeba zarobić znaczne pieniądze.

Niestety literatura na temat optymalizacji heurystyki nie jest tak duża jak na algorytmy. Jeśli spróbujesz to zrobić sam, gwarantuję, że do drugiego miesiąca będziesz śnić o przesuwaniu prostokątnych pryzmatów. Miałem problem z nowymi rozwiązaniami, który gdybym musiał to zrobić ponownie, prawdopodobnie zwróciłbym się do ekspertów (lub ich oprogramowania).

Dzięki @JTrana za doskonałe rozwinięcie mojego komentarza.

msw
źródło
Dziękujemy za twoją opinię. Jak powiedziałem na pytanie, już badałem ten temat i natrafiłem na kombinację kilku algorytmów, aby zaproponować jeden z powyższych. Martwię się tylko o samo opakowanie. Wszystkie te skrzynki zostaną wysłane za pośrednictwem usług pocztowych. Na szczęście nie będę musiał zajmować się załadunkiem ciężarówek.
Ricardo Souza,
To była dobra część mojego wyjaśnienia. Nie można „wyodrębnić” algorytmu z firm, które chcą, abyś płacił za ich usługę. Dwie wymienione firmy mają interfejs API, ale pakowanie odbywa się na ich serwerach i nie masz dostępu do kodu implementacyjnego poza kradzieżą. I dobrze, że nie musisz pakować ciężarówek, teraz twój problem jest o połowę trudniejszy, dlatego firmy chcą sprzedać ci rozwiązanie, a ludzie chętnie kupią tę usługę.
msw
1
Myślę, że mamy tutaj nieporozumienie. Być może nie wyraziłem się dobrze (jak zauważyłeś, angielski nie jest moim językiem ojczystym). Nie proszę o kradzież algorytmów. Przybyłem tutaj, aby wyjaśnić ten temat. Zrobiłem trochę badań i umieściłem je na powyższym przykładzie do analizy. Może jest ktoś, kto napotkał te same problemy, które mogą dać mi lepsze wskazówki. Jeśli moje rozwiązanie nie ma zastosowania, co mogę zrobić, aby uzyskać lepsze wyniki? Oto moje prawdziwe pytanie. Mam nadzieję, że wyjaśniłem to teraz.
Ricardo Souza,
Twój angielski jest dobry; Myślę, że problem polega na tym, że mówimy o różnych warstwach zadania. Myślisz o wdrożeniu, a ja myślę o wybuchu kombinatorycznym. Myślę, że rozwiązanie edycji 2 pomoże ci lepiej zrozumieć problem z mojego punktu widzenia. Czy możesz to rozwiązać, jak stwierdzono? Bez strat, przy minimalnej liczbie pudełek o minimalnym rozmiarze? To jest problem wielokrotnej optymalizacji, o którym wspominałem, o którym mówiłem, że jest niemożliwy do zrobienia: będziesz musiał poświęcić przynajmniej jeden z tych czynników, aby zoptymalizować inny.
msw
Dziękuję Ci. Chyba już to mam. Nie próbowałem tego kodować. Myślałem, żeby nie marnować czasu na kodowanie, zanim pojawią się bardziej konkretne rozwiązania lub przynajmniej pozytywne opinie zwrotne na temat mojej propozycji, ponieważ jest to na początku cytat. Nadal szukam, ale obawiam się, że będę musiał uzyskać jeden z tych interfejsów API i sprawdzić, czy urządzenia (kolektory danych z Win CE 6.0) mogą działać podłączone do Internetu. Pierwsze informacje, które otrzymałem od klienta, mówiły, że nie będą miały dostępu do Internetu w miejscu pracy.
Ricardo Souza,
1

Tworząc nowe algorytmy, a ostatnio zrobiłem sam algorytm pakujący (wiem, że wciąż ma on pewien potencjał optymalizacji), zawsze stosuję najprostsze podejście:

Jak miałbym to zrobić jako człowiek i spróbować przetłumaczyć go na algorytm: od mojego nauczyciela (robotyki) AI Rolfa Pfeifer Nadal pamiętam, że pozorna inteligencja może być czasami tworzona na podstawie bardzo prostych reguł, więc zamiast nadinżynierii Staram się unerengineer

  1. Zidentyfikuj zbyt duże przedmioty (przedmioty, które nie mieszczą się w danym polu)
  2. Spróbuj znaleźć najlepsze możliwe pudełko (porównując całkowitą objętość i wymiary przedmiotu)
  3. Zamawiaj przedmioty od dużych do małych oraz pudełka (spacje) od małych do dużych
  4. Dopasuj największy przedmiot do możliwie najmniejszej przestrzeni
  5. Jeśli największy przedmiot nie znajdzie, przeskocz nad nim i spróbuj następnego, aż nic więcej się nie zmieści
  6. Dla pozostałych elementów wyszukaj nowe najlepsze pole. ...

    X. zawsze myśl o wyjątkowych zdarzeniach (przedmioty o dużych rozmiarach, dziwne formy, jeśli pudełko zawiera tylko 1 przedmiot, czy nie byłoby lepiej wysłać przedmiot bez pudełka? Itp.), Ale możesz zrobić heurystykę również w formie decyzji drzewo.

Oczywiście są jeszcze inne zastrzeżenia, im dalej dostaniesz, podaję te pomysły jako punkt wyjścia. Stamtąd istnieje wiele sposobów. Jedną z możliwości byłoby podzielenie pudełka na małe kostki (np. 5 cm x 5 cm x 5 cm) i śledzenie ich jako zajęte / wolne, inne podejście można nazwać 3d tetris itp.

Dzięki takiemu podejściu niekoniecznie musisz się martwić o wybuch kombinacyjny. Z drugiej strony eksplozja kombinacyjna może się zdarzyć, jeśli mówimy o mnóstwie przedmiotów, ale z drugiej strony: czy naprawdę sądzisz, że firma sprawdzi listę pakowania pozycji po pozycji? Nie, podchodzą do rozwiązania typu dziel i zwyciężaj: Podziel złożoność, używając standardowych woluminów (np. Palet lub pudeł o stałej wielkości). Więc nawet ze względów praktycznych, weź pod uwagę, że nie tylko pociągi, czasem czas pracownika to także pieniądze. pociąg może załadować x palet, każda paleta ma ustaloną objętość, więc pakuj elementy do palety, ale z drugiej strony być może paleta składa się z kilku rzędów, więc używaj stałych pól dla przedmiotów, które następnie są ładowane do palet, a następnie ładowane do pociągów.

Przynajmniej tak ja jako człowiek poradziłbym sobie z tym zadaniem, otrzymałem najlepsze pudełko, a następnie dopasowałem jeden po drugim największy przedmiot na najmniejszej dostępnej przestrzeni (i dodałem trochę podglądu).

Tak jak w moim algorytmie, ostatecznie prawdopodobnie nie będziesz miał najlepszego rozwiązania, ale zdecydowanie dobrą heurystykę, którą następnie możesz dopracować.

Czasami łatwiej jest zacząć od pierwszego kroku i usunąć problemy na swojej drodze, oczywiście oczywiście nie jest to krok ponad krawędź, ale trochę sprytny ... czasami możesz zostać zmuszony do poszukiwania alternatyw i wyboru najlepszy lub zaimplementuj „krok wstecz”.

Ale jak dowiedziałem się od mojego nauczyciela AI (Rolf Pfeifer, przepraszam, że zawracam sobie tym głowę): Czasami możesz stworzyć pozorne inteligentne zachowanie z kilkoma bardzo prostymi i kilkoma zestawami reguł> zachowaniem wschodzącym w podanym przykładzie, zaprogramowali małe odległe samochody, aby skręcały w lewo, jeśli wykrywają przeszkodę po prawej stronie, skręcają w prawo, jeśli jest przeszkoda po lewej stronie, i jeżdżą prosto, jeśli nie ma przeszkody lub przeszkoda jest z przodu. 3 lub 4 roboty umieszczone w kwadracie o wymiarach 3 x 3 m z dużą ilością piłek do ping-ponga prowadzą do niesamowitego faktu, że roboty sprzątają, pchając piłki do ping-ponga do rogów, nawet jeśli roboty są zaprogramowane tylko w celu uniknięcia przeszkód.

PD: Jedynym odchyleniem w świecie rzeczywistym, które znalazłem w tym podejściu, było to, że pracowałem w niepełnym wymiarze godzin jako pomocnik podczas dużych koncertów, takich jak Metallica, Iron Maiden, Britney Spears, Paul McCartney, U, to nazwa ... Kierowcy ciężarówek pracujący na międzynarodowe wycieczki mają dokładne listy pakowania pozycja po pozycji. Obliczenia są wykonywane raz (nie wiem przez ludzi lub maszyny), a następnie powielane. Czasami, gdy pakują się po raz pierwszy, robią nawet zdjęcia warstwa po warstwie i umieszczają je w ciężarówce, aby lokalne załogi dokładnie wiedziały, które pudełko należy naładować, kiedy i gdzie. Ale jest to również specyficzna potrzeba pakowania, ponieważ podczas jednej wycieczki zawsze pracują z tymi samymi skrzyniami i ciężarówkami.

Canelo Digital
źródło
1

Heurystyka, o której wspomniałeś w swoim poście, wydaje się interesująca.

Sugerowałbym kilka modyfikacji w celu ulepszenia ostatecznego rozwiązania.

Biorąc pod uwagę rozwiązanie, w którym wszystkie przedmioty są zapakowane w jednym pudełku, spróbuj połączyć zawartość dwóch małych pudełek w jednym większym pudełku (powinno to pomóc w poprawieniu kryteriów korzystania z jak najmniejszej liczby pudełek).

Alternatywnie, za każdym razem, gdy uruchamiasz nowe pudełko, zamiast używać najmniejszego pudełka, które może pomieścić bieżący element, możesz wybrać największe pudełko, które może go pomieścić, a po przypisaniu każdego elementu do pudełka spróbuj przypisać wszystkie elementy pudełko do mniejszego pudełka.

Ponadto, w funkcji dopasowania, zamiast uważać położenie innych skrzynek za ustalone, można wyobrazić sobie zmianę sekwencji ładowania. To powinno pozwolić Ci znaleźć lepsze rozwiązania kosztem dłuższego czasu pracy.

Renaud M.
źródło
To wydaje się interesujące ulepszenia. Długo nie dotykałem tego problemu. Może powinienem spróbować tego dnia. Dzięki.
Ricardo Souza,