Otrzymałem zadanie zbudowania prognozy wysyłki, która sugeruje najlepsze zakwaterowanie towarów na jak najmniejszej liczbie pudełek:
Istnieje skończony zestaw znanych rozmiarów prostokątnych pudełek
Istnieje wiele dowolnych prostokątnych przedmiotów, które należy zapakować w pudełka
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.
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)
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 °.
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:
Posortuj elementy w malejącej kolejności objętości (najpierw większe) na liście „elementów do spakowania”
Dla każdego elementu na tej liście:
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ę)
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ł”.
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.
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:
Sprawdź, czy pozostała objętość pudełka pasuje do objętości przedmiotu. Jeśli nie, zwróć false.
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.
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.
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ąć.)
Jeśli element nie został obrócony wszystkimi możliwymi sposobami powrotu do pierwotnej orientacji, spróbuj ponownie od kroku 3.
Jeśli wszystkie obroty były sprawdzone i nie znaleziono dopasowania, rozważ bieżącą współrzędną jako niedostępną przestrzeń.
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?
packing
powiązanego znacznika;algorithms
wystarczy :)