Algorytmy pakowania bin Karmarkara-Karpa
Karmarkara -Karpa (KK) to kilka powiązanych algorytmów aproksymacji problemu pakowania w pojemniki . Problem pakowania w pojemniki polega na pakowaniu przedmiotów o różnych rozmiarach do pojemników o identycznej pojemności, tak aby całkowita liczba pojemników była jak najmniejsza. Znalezienie optymalnego rozwiązania jest trudne obliczeniowo . Karmarkar i Karp opracowali algorytm, który działa w czasie wielomianowym i znajduje rozwiązanie z co najwyżej pojemniki, gdzie OPT to liczba pojemników w optymalnym rozwiązanie. Opracowali także kilka innych algorytmów z nieco innymi gwarancjami aproksymacji i ograniczeniami czasu wykonywania.
Algorytmy KK uznano za przełom w badaniu pakowania pojemników: znane wcześniej algorytmy znalazły przybliżenie multiplikatywne, w którym liczba pojemników wynosiła co najwyżej r ⋅ O P T + s {\ dla niektórych stałych lub co najwyżej . Algorytmy KK jako pierwsze uzyskały przybliżenie addytywne.
Wejście
Dane wejściowe do problemu pakowania do pojemników to zestaw przedmiotów o różnych rozmiarach, a 1 ,... a n . Stosowana jest następująca notacja:
- n - liczba elementów.
-
m - liczba różnych rozmiarów przedmiotów. Dla każdego i w 1,..., m :
- s i to i -ty rozmiar;
- n i to liczba elementów o rozmiarze s i .
- B - rozmiar pojemnika.
Biorąc pod uwagę instancję I , oznaczamy:
- OPT(I) = optymalne rozwiązanie instancji I .
- FOPT( I ) = ( a 1 +...+ a n )/ B = teoretycznie optymalna liczba pojemników, gdy wszystkie pojemniki są całkowicie wypełnione przedmiotami lub ułamkami przedmiotów.
Oczywiście FOPT( I ) ≤OPT(I).
Schemat na wysokim poziomie
Algorytmy KK zasadniczo rozwiązują konfiguracyjny program liniowy :
.
Tutaj A jest macierzą o m wierszach. Każda kolumna A reprezentuje wykonalną konfigurację - multizbiór rozmiarów pozycji, taki, że suma wszystkich tych rozmiarów wynosi co najwyżej B . Zbiór konfiguracji to C . x jest wektorem o rozmiarze C. Każdy element x c z x reprezentuje liczbę przypadków użycia konfiguracji c .
- Przykład : załóżmy, że rozmiary przedmiotów to 3,3,3,3,3,4,4,4,4,4, a B = 12. Wtedy jest C = 10 możliwych konfiguracji: 3333; 333; 33, 334; 3, 34, 344; 4, 44, 444. Macierz A ma dwa wiersze: [4,3,2,2,1,1,1,0,0,0] dla s=3 i [0,0,0,1,0, 1,2,1,2,3] dla s=4. Wektor n to [5,5], ponieważ istnieje 5 elementów każdego rozmiaru. Możliwym optymalnym rozwiązaniem jest x = [1,0,0,0,0,0,1,0,0,1], co odpowiada użyciu trzech pojemników o konfiguracjach 3333, 344, 444.
Istnieją dwie główne trudności w rozwiązaniu tego problemu. Po pierwsze, jest to program liniowy liczb całkowitych , który jest trudny obliczeniowo do rozwiązania. Po drugie, liczba zmiennych to C – liczba konfiguracji, która może być ogromna. Algorytmy KK radzą sobie z tymi trudnościami za pomocą kilku technik, z których część została już wprowadzona przez de-la-Vegę i Luekera. Oto ogólny opis algorytmu (gdzie jest oryginalną instancją):
- 1-a. Niech instancją zbudowaną .
- 2-a. Niech instancją zbudowaną z grupowania elementów i rozmiaru elementów w każdej grupie do najwyższego elementu w
- 3-a. Skonstruuj program liniowy dla , bez ograniczeń integralności
- 4. Oblicz (ułamkowe) rozwiązanie x dla odprężonego programu liniowego.
- 3-b. Zaokrąglij x do rozwiązania całkowego dla .
- 3-a. Skonstruuj program liniowy dla , bez ograniczeń integralności
- 2-b. „Rozgrupuj” elementy, aby uzyskać rozwiązanie dla .
- 2-a. Niech instancją zbudowaną z grupowania elementów i rozmiaru elementów w każdej grupie do najwyższego elementu w
- 1b. Dodaj małe elementy, aby uzyskać rozwiązanie dla .
Poniżej opisujemy po kolei każdy z tych kroków.
Krok 1. Usuwanie i dodawanie małych elementów
Motywacją do usuwania małych przedmiotów jest to, że gdy wszystkie przedmioty są duże, liczba przedmiotów w każdym pojemniku musi być mała, więc liczba możliwych konfiguracji jest (względnie) mała. Wybieramy pewną z pierwotnej instancji mniejsze niż . Niech będzie instancją Zauważ, że w może zawierać . Pakujemy opakowanie z
Teraz dodajemy małe przedmioty do istniejących pojemników w dowolnej kolejności, o ile jest miejsce. Kiedy w istniejących pojemnikach nie ma już miejsca, otwieramy nowy pojemnik (jak w pakowaniu pojemników z następnym dopasowaniem ). Niech będzie liczbą pojemników w końcowym opakowaniu. Następnie:
.
dowód . Jeśli żadne nowe pojemniki nie zostaną otwarte, liczba pojemników pozostaje . całkowity rozmiar co najmniej więc całkowity rozmiar instancji wynosi co najmniej . Dlatego , więc optymalne rozwiązanie potrzebuje co najmniej pojemniki. Więc . W szczególności, przyjmując g =1/ n , otrzymujemy:
,
ponieważ . Dlatego często przyjmuje się, że wszystkie pozycje są większe niż 1/ n .
Krok 2. Grupowanie i rozgrupowywanie elementów
Motywacją do grupowania elementów jest zmniejszenie liczby różnych rozmiarów elementów, zmniejszenie liczby ograniczeń w konfiguracji LP. Ogólny proces grupowania to:
- Uporządkuj produkty według malejącego rozmiaru.
- Podziel elementy na grupy.
- Dla każdej grupy zmodyfikuj rozmiar wszystkich elementów w grupie do największego rozmiaru w grupie.
Istnieje kilka różnych metod grupowania.
Grupowanie liniowe
Niech będzie parametrem całkowitym. największe w grupie 1; kolejne w grupie 2; i tak dalej (ostatnia grupa może mieć mniej niż . Niech będzie pierwotną Niech będzie pierwszą grupą (grupą największych elementów) i instancja pierwszej grupy . Następnie:
- W wszystkie elementy mają ten sam rozmiar. W liczba różnych rozmiarów wynosi .
- ponieważ grupa 1 dominuje w grupie 2 wszystkie k pozycji w grupie 1 jest większych niż k pozycji w grupie 2); podobnie grupa 2 w grupą 3 itd
- możliwe jest spakowanie każdego elementu w jednym pojemniku.
Dlatego . Rzeczywiście, biorąc pod uwagę rozwiązanie { pojemnikami z najwyżej
Grupowanie geometryczne
Niech będzie parametrem całkowitym. Grupowanie geometryczne przebiega w dwóch krokach:
- Podziel instancję na kilka instancji tak, aby w każdym przypadku , wszystkie rozmiary mieszczą się w przedziale . Zauważ, że jeśli wszystkie elementy w co najmniej wtedy liczba wystąpień wynosi co najwyżej .
- W każdym przypadku wykonaj zaokrąglenie liniowe z parametrem . Niech będą wynikowymi przypadkami. Niech i .
Następnie liczba różnych rozmiarów jest ograniczona w następujący sposób:
- dla wszystkich r , i . elementy w większe niż , mamy , więc . Sumowanie wszystkich r daje .
Liczba pojemników jest ograniczona w następujący sposób:
- dla wszystkich r , - ponieważ ma a wszystkie są mniejsze niż , więc można je zapakować co najwyżej pojemniki.
- Dlatego .
- Dlatego .
Alternatywne grupowanie geometryczne
Niech będzie parametrem całkowitym. Uporządkuj produkty według malejącego rozmiaru. Podziel je na grupy w taki sposób, aby całkowity rozmiar w każdej grupie wynosił co najmniej . Ponieważ rozmiar każdego elementu jest mniejszy niż B , liczba elementów w każdej grupie wynosi co najmniej . Liczba pozycji w każdej grupie nieznacznie rośnie. Jeśli wszystkie elementy są większe niż , to liczba elementów w każdej grupie wynosi najwyżej . W każdej grupie tylko większe elementy są zaokrąglane w górę. Można to zrobić tak, że:
- .
- .
Krok 3. Konstruowanie LP i zaokrąglanie rozwiązania
Rozważamy konfiguracyjny program liniowy bez ograniczeń integralności:
.
Tutaj możemy użyć ułamkowej liczby każdej konfiguracji.
- Przykład : załóżmy, że jest 31 elementów o rozmiarze 3 i 7 elementów o rozmiarze 4, a rozmiar pojemnika to 10. Konfiguracje to: 4, 44, 34, 334, 3, 33, 333. Ograniczenia to [0,0 ,1,2,1,2,3]* x =31 i [1,2,1,1,0,0,0]* x =7. Optymalnym rozwiązaniem ułamkowego LP jest [0,0,0,7,0,0,17/3] To znaczy: jest 7 pojemników o konfiguracji 334 i 17/3 pojemników o konfiguracji 333. Zauważ, że tylko dwie różne konfiguracje są potrzebne.
Oznacz optymalne rozwiązanie programu liniowego przez LOPT. Oczywiste są następujące zależności:
- FOPT(I) ≤ LOPT(I), ponieważ FOPT(I) to (prawdopodobnie ułamkowa) liczba pojemników, gdy wszystkie pojemniki są całkowicie wypełnione przedmiotami lub ułamkami przedmiotów. Oczywiście żadne rozwiązanie nie może być bardziej wydajne.
- LOPT(I) ≤ OPT(I), ponieważ LOPT(I) jest rozwiązaniem problemu minimalizacji z mniejszą liczbą ograniczeń.
- OPT(I) < 2*FOPT(I), ponieważ w dowolnym opakowaniu z co najmniej 2 pojemnikami*FOPT(I) suma dwóch najmniej zapełnionych pojemników wynosi co najwyżej B , więc można je połączyć w jeden pojemnik .
Rozwiązanie ułamkowego LP można zaokrąglić do rozwiązania całkowego w następujący sposób.
Załóżmy, że mamy rozwiązanie x dla ułamka LP. Zaokrąglamy x do rozwiązania dla całkowego ILP w następujący sposób.
- Niech x będzie optymalnym podstawowym możliwym rozwiązaniem ułamkowego LP. Załóżmy, że jako { być liczba ułamkowa). Ponieważ ułamkowy LP ma m ograniczeń (po jednym dla każdego odrębnego rozmiaru), x ma co najwyżej m zmiennych niezerowych, to znaczy co najwyżej m stosowane są różne konfiguracje. Konstruujemy z x opakowanie integralne składające się z części głównej i części szczątkowej .
- Główna część zawiera kosze floor( x c ) każdej konfiguracji c , dla której x c > 0.
- Dla części resztkowej (oznaczonej przez R ) konstruujemy dwa opakowania kandydujące:
- Pojedynczy przedział każdej konfiguracji c , dla której x c > 0; w sumie potrzebnych jest m pojemników.
- Pakowanie zachłanne, z mniej niż 2 pojemnikami*FOPT( R ) (ponieważ jeśli są co najmniej 2 pojemniki*FOPT( R ), dwa najmniejsze można połączyć).
- Najmniejsze z tych opakowań wymaga min( m , 2*FOPT( R )) ≤ średnia ( m , 2*FOPT( R )) = FOPT(R) + m /2.
- głównej części daje . [ wymagane wyjaśnienie ]
- Czas wykonania tego algorytmu konwersji wynosi O( n log n ).
Oznacza to również, że .
Krok 4. Rozwiązanie ułamkowego LP
Głównym wyzwaniem w rozwiązaniu ułamkowego LP jest to, że może on mieć ogromną liczbę zmiennych - zmienną dla każdej możliwej konfiguracji.
Podwójny LP
Podwójny program liniowy ułamkowego LP to:
.
Ma m zmiennych i ograniczenia C - ograniczenie dla każdej konfiguracji. Ma następującą interpretację ekonomiczną. Dla każdego rozmiaru s powinniśmy określić nieujemną cenę . Nasz zysk to łączna cena wszystkich przedmiotów. Chcemy maksymalizować zysk n y z zastrzeżeniem ograniczeń, że łączna cena przedmiotów w każdej konfiguracji wynosi co najwyżej 1. Ten LP ma teraz tylko m zmiennych, ale ogromną liczbę ograniczeń. Nawet wymienienie wszystkich ograniczeń jest niewykonalne.
Na szczęście możliwe jest rozwiązanie problemu z dowolną precyzją bez wymieniania wszystkich ograniczeń, używając wariantu metody elipsoidalnej . Ten wariant otrzymuje jako dane wejściowe wyrocznię separacji : funkcję, która przy danym wektorze y ≥ 0 zwraca jedną z następujących dwóch opcji:
- Twierdź, że y jest wykonalne, to znaczy ; Lub -
- Twierdź, że y jest niewykonalne i zwróć określone ograniczenie, które zostało naruszone, to znaczy wektor a taki, że za .
Metoda elipsoidy zaczyna się od dużej elipsoidy, która zawiera całą wykonalną domenę . Na każdym kroku t bierze środek bieżącej elipsoidy i wysyła go do wyroczni separacji:
- Jeśli wyrocznia mówi, że to wykonujemy „cięcie optymalności”: wycinamy z elipsoidy wszystkie punkty y , dla których . Te punkty zdecydowanie nie są optymalne.
- Jeśli wyrocznia mówi, że narusza ograniczenie a , to wykonujemy „cięcie wykonalności”: wycinamy z elipsoidy wszystkie punkty y , dla których . Te punkty są zdecydowanie niewykonalne.
Po wykonaniu cięcia konstruujemy nową, mniejszą elipsoidę. Można wykazać, że proces ten zbiega się do rozwiązania przybliżonego, w czasie wielomianu z wymaganą dokładnością.
Wyrocznia separacji dla podwójnego LP
Dano nam kilka m liczb nieujemnych . Musimy zdecydować między dwiema opcjami:
- możliwej konfiguracji suma tej konfiguracji wynosi co najwyżej 1 oznacza to, że y jest wykonalne.
- Istnieje wykonalna konfiguracja, dla której suma 1; oznacza to, że y jest niewykonalne. W takim przypadku również musimy zwrócić konfigurację.
Ten problem można rozwiązać, rozwiązując problem plecakowy , gdzie wartości przedmiotów to , wagi przedmiotów to , a nośność to B (rozmiar pojemnika).
- Jeśli całkowita wartość optymalnego rozwiązania plecakowego wynosi co najwyżej 1, to mówimy, że y jest wykonalne.
- Jeśli całkowita wartość optymalnego rozwiązania plecakowego jest większa niż 1, to mówimy, że y jest niewykonalne, a elementy w optymalnym rozwiązaniu plecakowym odpowiadają konfiguracji, która narusza ograniczenie (ponieważ dla wektora a odpowiadającego tej konfiguracji).
dynamicznego w czasie pseudowielomianowym: to liczba wejść, a to liczba możliwych Aby otrzymać algorytm czasu wielomianowego, możemy w przybliżeniu rozwiązać problem plecakowy, stosując zaokrąglanie danych wejściowych. Załóżmy, że chcemy rozwiązania z tolerancją . Możemy zaokrąglić każdy z w dół do najbliższej wielokrotności / n . Wtedy liczba możliwych wartości między 0 a 1 wynosi n / , a czas wykonania to . Rozwiązaniem jest co najmniej rozwiązanie optymalne minus / n .
Metoda elipsoidalna z przybliżoną wyrocznią separacji
Metodę elipsoidalną należy dostosować do stosowania przybliżonej wyroczni separacji. Biorąc pod uwagę obecny środek elipsoidy :
- Jeśli przybliżona wyrocznia zwróci rozwiązanie o wartości większej niż 1, to niewykonalne, a rozwiązanie odpowiada konfiguracji, która narusza a . Wykonujemy „cięcie wykonalności” w elipsoidę wszystkie punkty y , dla których .
- rozwiązanie o wartości co najwyżej 1, to może być wykonalne lub nie, ale zaokrąglone w dół (oznacz to przez . Z definicji zaokrąglenia wiemy, że . Nadal wykonujemy „cięcie optymalności” w z elipsoidy wszystkie punkty dla których . Zauważ, że , więc jego wartość może być większa niż OPT. Dlatego możemy usunąć niektóre punkty, których cel jest optymalny. Jednak usunięte punkty spełniają [ potrzebne wyjaśnienie ] ; żaden punkt nie zostanie usunięty, jeśli jego przekroczy wartość o więcej niż .
Korzystanie z przybliżonej wyroczni separacji daje wykonalne rozwiązanie y * dla podwójnego LP, gdzie , po co najwyżej , gdzie . Całkowity czas działania metody elipsoidalnej z przybliżoną wyrocznią separacji wynosi .
Eliminacja ograniczeń
Podczas metody elipsoidy używamy co najwyżej ograniczeń Q postaci za . Wszystkie inne ograniczenia można wyeliminować, ponieważ nie mają one wpływu na wynik y* metody elipsoidalnej. Możemy wyeliminować jeszcze więcej ograniczeń. Wiadomo, że w każdym LP z m zmiennymi istnieje zbiór m ograniczeń wystarczających do wyznaczenia optymalnego rozwiązania (czyli optymalna wartość jest taka sama, nawet jeśli tylko te m stosowane są ograniczenia). Możemy wielokrotnie uruchamiać metodę elipsoidalną jak powyżej, za każdym razem próbując usunąć określony zestaw ograniczeń. Jeśli wynikowy błąd jest co najwyżej trwale usuwamy te ograniczenia. Można _ wynosi co najwyżej . Jeśli spróbujemy zestawów ograniczeń deterministycznie, to w najgorszym przypadku jedna z m prób się powiedzie, więc musimy uruchomić metodę elipsoidy co najwyżej razy. Jeśli wybierzemy ograniczenia do usunięcia losowo, to oczekiwana liczba iteracji to .
Wreszcie mamy zredukowany podwójny LP, z tylko m zmiennymi i m ograniczeniami. Optymalna wartość zredukowanego LP to ≈ .
Rozwiązanie pierwotnego LP
Zgodnie z twierdzeniem o dualności LP minimalna wartość pierwotnego LP jest równa maksymalnej wartości podwójnego LP, którą oznaczyliśmy przez LOPT. Gdy mamy zredukowany podwójny LP, bierzemy jego podwójny i bierzemy zredukowany pierwotny LP. Ten LP ma tylko m zmiennych - odpowiadających tylko m z konfiguracji C. Maksymalna wartość zredukowanego podwójnego LP wynosi co najmniej . Można to pokazać [ wymagane wyjaśnienie ] że optymalnym rozwiązaniem zredukowanego pierwotnego LP jest co najwyżej . . Rozwiązanie zapewnia niemal optymalne pakowanie pojemników przy użyciu maksymalnie m konfiguracji.
Całkowity czas działania algorytmu deterministycznego, gdy wszystkie elementy są większe niż , wynosi:
,
Oczekiwany całkowity czas działania losowego algorytmu to: .
Algorytmy od końca do końca
Karmarkar i Karp przedstawili trzy algorytmy wykorzystujące powyższe techniki o różnych parametrach. Czas działania wszystkich tych algorytmów zależy od funkcji jest wielomianową opisującą czas potrzebny do rozwiązania ułamkowego h 1, czyli dla wersji deterministycznej .
Algorytm 1
Niech stałą reprezentującą pożądaną dokładność
- 1-a. Ustaw sol . Niech instancją zbudowaną z niż g .
- 2-a. Ustaw . Niech instancją zbudowaną z z parametrem k niech pozostałą instancją (grupą k elementów) Zauważ, że .
- 3-a. Skonstruuj program liniowy dla , bez ograniczeń integralności
- Oblicz rozwiązanie x dla , z tolerancją h = . Rezultatem _ Czas działania to .
- 3-b. Zaokrąglij x do rozwiązania całkowego dla . Dodaj najwyżej Całkowita liczba pojemników to .
- 3-a. Skonstruuj program liniowy dla , bez ograniczeń integralności
- 2-b. Zapakuj elementy w , używając co najwyżej k pojemników; zdobądź opakowanie . Liczba pojemników to .
- 2-a. Ustaw . Niech instancją zbudowaną z z parametrem k niech pozostałą instancją (grupą k elementów) Zauważ, że .
- 1b. Dodaj elementy mniejsze niż g aby uzyskać rozwiązanie . Liczba pojemników to: .
W sumie liczba pojemników jest w i bieg -czas jest w . Wybierając P .
Algorytm 2
Niech parametrem rzeczywistym, a całkowitym, który zostanie określony później.
- 1-a. Niech instancją zbudowaną z niż g .
- 2. Podczas gdy wykonaj:
- 2-a. Wykonaj alternatywne grupowanie geometryczne z parametrem k . Niech i niech instancją Mamy .
- 3-a. Skonstruuj program liniowy dla , bez ograniczeń integralności
- Oblicz rozwiązanie x dla , z tolerancją h = . Rezultatem _ Czas działania to .
- 3-b. Zaokrąglij x do rozwiązania całkowego dla . Nie dodawaj przedziałów dla części ułamkowej. Zamiast tego po prostu wyjmij spakowane elementy z .
- 3-a. Skonstruuj program liniowy dla , bez ograniczeń integralności
- 2-b. elementy do co najwyżej .
- 2-a. Wykonaj alternatywne grupowanie geometryczne z parametrem k . Niech i niech instancją Mamy .
- 2. Raz , pozostałe pozycje chciwie spakuj do co najwyżej pojemniki.
- W każdej iteracji pętli w kroku 2 ułamkowa część x ma co najwyżej m ( K ) wzorców, więc . FOPT spada o współczynnik k w każdej iteracji, więc liczba iteracji wynosi co najwyżej .
- Dlatego całkowita liczba pojemników używanych : .
- 1b. Dodaj elementy mniejsze niż g aby uzyskać rozwiązanie . Liczba pojemników wynosi: .
Czas wykonania jest w .
Teraz, jeśli wybierzemy k = 2 i g = 1/FOPT (I), otrzymamy:
,
i stąd:
,
więc całkowita liczba pojemników wynosi . Czas wykonania to .
Ten sam algorytm może być używany z różnymi parametrami, aby uzyskać kompromis między czasem wykonywania a dokładnością. Dla jakiegoś parametru = i . Następnie opakowanie potrzebuje co najwyżej , a czas wykonywania jest w .
Algorytm 3
Trzeci algorytm jest przydatny, gdy liczba rozmiarów m jest mała (patrz także pakowanie bin o dużej wielokrotności ).
- 1-a. Ustaw sol . Niech instancją zbudowaną z niż g .
- Jeśli to:
- 3-a. Skonstruuj program liniowy dla , bez ograniczeń integralności
- Oblicz rozwiązanie x dla , z tolerancją h = . Rezultatem _ Czas działania to .
- 3-b. Zaokrąglij x do rozwiązania całkowego dla . Nie dodawaj przedziałów dla części ułamkowej. Zamiast tego po elementy z .
- 3-a. Skonstruuj program liniowy dla , bez ograniczeń integralności
- Uruchom krok 2 algorytmu 2 na pozostałych elementach.
- 1-b. Dodaj elementy mniejsze niż g aby uzyskać rozwiązanie . Liczba pojemników wynosi: .
Wykorzystuje _ .
Ulepszenia
Techniki KK zostały później ulepszone, aby zapewnić jeszcze lepsze przybliżenia.
Rothvoss używa tego samego schematu co algorytm 2, ale z inną procedurą zaokrąglania w kroku 2. Wprowadził krok „sklejania”, w którym małe elementy są sklejane w celu uzyskania jednego większego elementu. To klejenie można wykorzystać do zwiększenia najmniejszego rozmiaru elementu do około . Gdy wszystkie rozmiary są co najmniej , możemy zastąpić w gwarancji algorytmu 2 i uzyskaj:
,
co daje za pojemniki.
Hoberg i Rothvoss stosują podobny schemat, w którym przedmioty są najpierw pakowane do „kontenerów”, a następnie pojemniki są pakowane do pojemników. Ich _