Karmarkar-Karp bin packningsalgoritmer
Karmarkar -Karp (KK) binpackningsalgoritmer är flera relaterade approximationsalgoritmer för binpackningsproblemet . Fackpackningsproblemet är ett problem med att packa föremål av olika storlekar i kärl med identisk kapacitet, så att det totala antalet kärl blir så litet som möjligt. Att hitta den optimala lösningen är beräkningsmässigt svårt . Karmarkar och Karp tog fram en algoritm som körs i polynomtid och som mest fack, där OPT är antalet fack i den optimala lösningen. De utarbetade också flera andra algoritmer med något annorlunda approximationsgarantier och körtidsgränser.
KK-algoritmerna ansågs vara ett genombrott i studien av binpackning: de tidigare kända algoritmerna fann multiplikativ approximation, där antalet fack var som mest för vissa konstanter eller som mest . KK-algoritmerna var de första som uppnådde en additiv approximation.
Inmatning
Ingången till ett bin-packningsproblem är en uppsättning artiklar av olika storlekar, a 1 ,... a n . Följande notation används:
- n - antalet artiklar.
-
m - antalet olika objektstorlekar. För varje i på 1,..., m :
- s i är den i -te storleken;
- n i är antalet föremål i storleken s i .
- B - behållarens storlek.
Givet ett fall I betecknar vi:
- OPT(I) = den optimala lösningen av instans I .
- FOPT( I ) = ( a 1 +...+ a n )/ B = det teoretiskt optimala antalet fack, när alla fack är helt fyllda med artiklar eller artikelfraktioner.
Uppenbarligen är FOPT( I ) ≤ OPT(I).
System på hög nivå
KK-algoritmerna löser i huvudsak det linjära konfigurationsprogrammet :
.
Här är A en matris med m rader. Varje kolumn av A representerar en genomförbar konfiguration - en multiuppsättning av objektstorlekar, så att summan av alla dessa storlekar är som mest B . Uppsättningen av konfigurationer är C . x är en vektor med storlek C. Varje element xc . av x representerar antalet gånger som konfiguration c används
- Exempel : anta att artikelstorlekarna är 3,3,3,3,3,4,4,4,4,4 och B =12. Sedan finns det C =10 möjliga konfigurationer: 3333; 333; 33, 334; 3, 34, 344; 4, 44, 444. Matrisen A har två rader: [4,3,2,2,1,1,1,0,0,0] för s=3 och [0,0,0,1,0, 1,2,1,2,3] för s=4. Vektorn n är [5,5] eftersom det finns 5 objekt av varje storlek. En möjlig optimal lösning är x =[1,0,0,0,0,0,1,0,0,1], vilket motsvarar att använda tre fack med konfigurationerna 3333, 344, 444.
Det finns två huvudsakliga svårigheter att lösa detta problem. För det första är det ett linjärt heltalsprogram , vilket är beräkningsmässigt svårt att lösa. För det andra är antalet variabler C - antalet konfigurationer, vilket kan vara enormt. KK-algoritmerna hanterar dessa svårigheter med hjälp av flera tekniker, av vilka några redan introducerades av de-la-Vega och Lueker. Här är en beskrivning på hög nivå av algoritmen (där är den ursprungliga instansen):
- 1-a. Låt vara en instans konstruerad från genom att ta bort små objekt.
- 2-a. Låt vara en instans konstruerad från genom att gruppera objekt och avrunda storleken på objekt i varje grupp till det högsta objektet i gruppen.
- 3-a. Konstruera det linjära konfigurationsprogrammet för , utan integralitetsbegränsningarna.
- 4. Beräkna en (fraktionell) lösning x för det avslappnade linjära programmet.
- 3-b. Avrunda x till en integrallösning för .
- 3-a. Konstruera det linjära konfigurationsprogrammet för , utan integralitetsbegränsningarna.
- 2-b. "Avgruppera" objekten för att få en lösning för .
- 2-a. Låt vara en instans konstruerad från genom att gruppera objekt och avrunda storleken på objekt i varje grupp till det högsta objektet i gruppen.
- 1-b. Lägg till de små föremålen för att få en lösning för .
Nedan beskriver vi vart och ett av dessa steg i tur och ordning.
Steg 1. Ta bort och lägga till små föremål
Motivet för att ta bort små föremål är att när alla föremål är stora måste antalet föremål i varje papperskorg vara litet, så antalet möjliga konfigurationer är (relativt) litet. Vi väljer någon konstant , och tar bort från den ursprungliga instansen alla objekt mindre än . Låt vara den resulterande instansen. Observera att i kan varje fack innehålla högst objekt. Vi packar och får en packning med några fack.
Nu lägger vi till de små föremålen i de befintliga papperskorgen i en godtycklig ordning, så länge det finns plats. När det inte finns mer plats i de befintliga kärlen, öppnar vi en ny behållare (som i nästa-fit kärlpackning) . Låt vara antalet papperskorgar i den slutliga förpackningen. Sedan:
.
Bevis . Om inga nya fack öppnas förblir antalet fack . Om en ny papperskorg öppnas innehåller alla fack utom kanske den sista en total storlek på minst , så den totala instansstorleken är minst . Därför så den optimala lösningen behöver minst fack. Så . I synnerhet, genom att ta g =1/ n , får vi:
,
eftersom . Därför är det vanligt att anta att alla objekt är större än 1/ n .
Steg 2. Gruppera och avgruppera objekt
Motivet för att gruppera artiklar är att minska antalet olika objektstorlekar, att minska antalet begränsningar i konfigurationen LP. Den allmänna grupperingsprocessen är:
- Beställ föremålen efter fallande storlek.
- Dela upp objekten i grupper.
- För varje grupp, ändra storleken på alla objekt i gruppen till den största storleken i gruppen.
Det finns flera olika grupperingsmetoder.
Linjär gruppering
Låt vara en heltalsparameter. Lägg de största objekten i grupp 1; de näst största objekten i grupp 2; och så vidare (den sista gruppen kan ha färre än objekt). Låt vara den ursprungliga instansen. Låt vara den första gruppen (gruppen av de största objekten), och den grupperade instansen utan den första gruppen. Sedan:
- I har alla objekt samma storlek. I är antalet olika storlekar .
- eftersom grupp 1 i dominerar grupp 2 i (alla k objekt i grupp 1 är större än k objekt i grupp 2); på samma sätt dominerar grupp 2 i osv.
- - eftersom det är möjligt att packa varje artikel i i en enda papperskorg.
Därför . Givet en lösning till med bins, kan vi faktiskt få en lösning till med högst fack.
Geometrisk gruppering
Låt vara en heltalsparameter. Geometrisk gruppering sker i två steg:
- Partitionera instansen i flera instanser så att i varje instans , alla storlekar är i intervallet . Observera att om alla objekt i har storleken minst , så är antalet instanser som mest .
- För varje instans utför du linjär avrundning med parametern . Låt vara de resulterande instanserna. Låt och .
Sedan avgränsas antalet olika storlekar enligt följande:
- För alla r , och . Eftersom alla objekt i är större än , har vi så . Att summera över alla r ger .
Antalet fack är avgränsat enligt följande:
- För alla r , - eftersom har objekt, och alla är mindre än , så de kan packas i högst papperskorgar.
- Därför, .
- Därför .
Alternativ geometrisk gruppering
Låt vara en heltalsparameter. Beställ föremålen efter fallande storlek. Dela upp dem i grupper så att den totala storleken i varje grupp är minst . Eftersom storleken på varje objekt är mindre än B , är antalet objekt i varje grupp minst . Antalet föremål i varje grupp ökar svagt. Om alla objekt är större än , då är antalet objekt i varje grupp högst . I varje grupp avrundas endast de större föremålen uppåt. Detta kan göras så att:
- .
- .
Steg 3. Konstruera LP och runda lösningen
Vi betraktar det linjära konfigurationsprogrammet utan integralitetsbegränsningarna:
.
Här får vi använda ett bråktal av varje konfiguration.
- Exempel : anta att det finns 31 artiklar i storlek 3 och 7 artiklar i storlek 4, och lådans storlek är 10. Konfigurationerna är: 4, 44, 34, 334, 3, 33, 333. Begränsningarna är [0,0 ,1,2,1,2,3]* x =31 och [1,2,1,1,0,0,0]* x =7. En optimal lösning på fraktionerad LP är [0,0,0,7,0,0,17/3] Det vill säga: det finns 7 fack med konfiguration 334 och 17/3 fack av konfiguration 333. Observera att endast två olika konfigurationer är behövda.
Ange den optimala lösningen för det linjära programmet med LOPT. Följande relationer är uppenbara:
- FOPT(I) ≤ LOPT(I), eftersom FOPT(I) är antalet (möjligen bråkdelar) av fack när alla fack är helt fyllda med artiklar eller bråkdelar av objekt. Det är uppenbart att ingen lösning kan vara mer effektiv.
- LOPT(I) ≤ OPT(I), eftersom LOPT(I) är en lösning på ett minimeringsproblem med färre begränsningar.
- OPT(I) < 2*FOPT(I), eftersom i varje packning med minst 2*FOPT(I)-fack är summan av de två minst fulla fack högst B , så de kan kombineras till en enda fack .
En lösning till fraktionell LP kan avrundas till en integrerad lösning enligt följande.
Antag att vi har en lösning x till bråktalet LP. Vi avrundar x till en lösning för den integrerade ILP enligt följande.
- Låt x vara en optimal grundläggande genomförbar lösning av fraktionell LP. Antag att det är bins (observera att kan vara ett bråktal). Eftersom bråk-LP har m begränsningar (en för varje distinkt storlek), har x högst m icke-nollvariabler, det vill säga högst m olika konfigurationer används. Vi konstruerar av x en integrerad packning som består av en huvuddel och en restdel .
- Huvuddelen innehåller golv( x c )-fack för varje konfiguration c för vilka x c > 0.
- För restdelen (betecknad med R ) konstruerar vi två kandidatpackningar:
- Ett enda fack för varje konfiguration c för vilket x c > 0; allt som allt behövs m soptunnor.
- En girig packning, med färre än 2*FOPT( R )-fack (eftersom om det finns minst 2*FOPT( R )-fack, kan de två minsta kombineras).
- Den minsta av dessa packningar kräver min( m , 2*FOPT( R )) ≤ medel( m , 2*FOPT( R )) = FOPT(R) + m /2.
- Om man lägger till detta de avrundade fackarna för huvuddelen ger som mest fack. [ förtydligande behövs ]
- Exekveringstiden för denna omvandlingsalgoritm är O( n log n ).
Detta innebär också att .
Steg 4. Lösning av fraktionerad LP
Den största utmaningen med att lösa bråk-LP är att den kan ha ett stort antal variabler - en variabel för varje möjlig konfiguration.
Den dubbla LP:n
Det dubbla linjära programmet för fraktionell LP är:
.
Den har m variabler och C- begränsningar - en begränsning för varje konfiguration. Den har följande ekonomiska tolkning. För varje storlek s bör vi bestämma ett icke-negativt pris . Vår vinst är det totala priset på alla varor. Vi vill maximera vinsten n y med förbehåll för begränsningarna att det totala priset för artiklar i varje konfiguration är högst 1. Denna LP har nu bara m variabler, men ett stort antal begränsningar. Att ens lista alla begränsningar är omöjligt.
Lyckligtvis är det möjligt att lösa problemet upp till vilken precision som helst utan att lista alla begränsningar, genom att använda en variant av ellipsoidmetoden . Denna variant får som indata ett separationsorakel : en funktion som, givet en vektor y ≥ 0, returnerar ett av följande två alternativ:
- Påstå att y är genomförbart, det vill säga ; eller -
- Påstå att y är omöjligt, och returnera en specifik begränsning som överträtts, det vill säga en vektor a sådan att .
Ellipsoidmetoden börjar med en stor ellipsoid, som innehåller hela den möjliga domänen . Vid varje steg t tar den mitten av den aktuella ellipsoiden och skickar den till separationsoraklet:
- Om oraklet säger att är genomförbart, så gör vi ett "optimalitetssnitt": vi skär från ellipsoiden alla punkter y för vilka . Dessa punkter är definitivt inte optimala.
- Om oraklet säger att är omöjligt och bryter mot begränsningen a , så gör vi ett "feasibility cut": vi skär från ellipsoiden alla punkter y för vilka . Dessa punkter är definitivt inte genomförbara.
Efter att ha gjort ett snitt konstruerar vi en ny, mindre ellipsoid. Det kan visas att denna process konvergerar till en ungefärlig lösning, i tidspolynom med erforderlig noggrannhet.
Ett separationsorakel för den dubbla LP:n
Vi får några m icke-negativa tal . Vi måste välja mellan följande två alternativ:
- För varje möjlig konfiguration är summan av som motsvarar denna konfiguration högst 1; detta betyder att y är genomförbart.
- Det finns en möjlig konfiguration för vilken summan av är större än 1; detta betyder att y är omöjligt. I det här fallet måste vi också returnera konfigurationen.
Detta problem kan lösas genom att lösa ett ryggsäcksproblem , där artikelvärdena är , föremålens vikter är och viktkapaciteten är B (behållarens storlek).
- Om det totala värdet av den optimala ryggsäckslösningen är högst 1, så säger vi att y är genomförbart.
- Om det totala värdet av den optimala ryggsäckslösningen är större än 1, så säger vi att y är omöjligt, och objekten i den optimala ryggsäckslösningen motsvarar en konfiguration som bryter mot en begränsning (eftersom för vektorn a som motsvarar denna konfiguration).
Ryggsäcksproblemet kan lösas genom dynamisk programmering i pseudopolynomtid: , där m är antalet ingångar och V är antalet olika möjliga värden. För att få en polynom-tidsalgoritm kan vi lösa ryggsäcksproblemet ungefär genom att använda ingångsavrundning. Anta att vi vill ha en lösning med tolerans . Vi kan avrunda var och en av nedåt till närmaste multipel av / n . Sedan är antalet möjliga värden mellan 0 och 1 n / , och körtiden är . Lösningen är åtminstone den optimala lösningen minus / n .
Ellipsoid metod med ett ungefärligt separationsorakel
Ellipsoidmetoden bör anpassas för att använda ett ungefärligt separationsorakel. Givet den nuvarande ellipsoidens mittpunkt :
- Om det ungefärliga oraklet returnerar en lösning med ett värde större än 1, så är definitivt omöjligt, och lösningen motsvarar en konfiguration som bryter mot en begränsning a . Vi gör en "feasibility cut" i , skär ellipsoiden alla punkter y för vilka .
- Om det ungefärliga oraklet returnerar en lösning med ett värde som högst 1, så kan avrundat nedåt (beteckna det med ) är genomförbart. Per definition av avrundningen vet vi att . Vi gör fortfarande ett "optimality cut" i : vi skär från ellipsoiden alla punkter y för vilka . Observera att kan vara omöjligt, så dess värde kan vara större än OPT. Därför kan vi ta bort några punkter vars mål är optimalt. De borttagna punkterna uppfyller dock förtydligande behövs ] ; ingen punkt tas bort om dess värde överstiger värdet vid med mer än .
Att använda det ungefärliga separationsoraklet ger en möjlig lösning y* till den dubbla LP, med , efter högst iterationer, där . Den totala körtiden för ellipsoidmetoden med det ungefärliga separationsoraklet är .
Eliminera begränsningar
Under ellipsoidmetoden använder vi som mest Q- begränsningar av formen . Alla andra begränsningar kan elimineras, eftersom de inte har någon effekt på resultatet y* av ellipsoidmetoden. Vi kan eliminera ännu fler begränsningar. Det är känt att det i varje LP med m variabler finns en uppsättning m begränsningar som är tillräckliga för att bestämma den optimala lösningen (det vill säga det optimala värdet är detsamma även om endast dessa m begränsningar används). Vi kan upprepade gånger köra ellipsoidmetoden enligt ovan, varje gång vi försöker ta bort en specifik uppsättning begränsningar. Om det resulterande felet som mest är , tar vi bort dessa begränsningar permanent. Det kan visas att vi som mest behöver elimineringar, så det ackumulerande felet är som mest . Om vi provar uppsättningar av begränsningar deterministiskt, så lyckas i värsta fall en av m försök, så vi behöver köra ellipsoidmetoden som mest gånger. Om vi väljer de begränsningar som ska tas bort slumpmässigt, är det förväntade antalet iterationer .
Slutligen har vi en reducerad dubbel LP, med endast m variabler och m begränsningar. Det optimala värdet för den reducerade LP:n är åtminstone , där .
Att lösa den ursprungliga LP:n
Med LP-dualitetssatsen är det minsta värdet för den primära LP lika med det maximala värdet för den dubbla LP, som vi betecknade med LOPT. När vi väl har en reducerad dubbel LP tar vi dess dubbla och tar en reducerad primal LP. Denna LP har bara m variabler - motsvarande endast m av C- konfigurationer. Det maximala värdet för den reducerade dubbla LP är minst . Det kan visas förtydligande behövs ] att den optimala lösningen för den reducerade primala LP är som mest . Lösningen ger en i det närmaste optimal kärlpackning, med högst m konfigurationer.
Den totala körtiden för den deterministiska algoritmen, när alla objekt är större än , är:
,
Den förväntade totala körtiden för den randomiserade algoritmen är: .
End-to-end-algoritmer
Karmarkar och Karp presenterade tre algoritmer, som använder ovanstående tekniker med olika parametrar. Körtiden för alla dessa algoritmer beror på en funktion som är en polynomfunktion som beskriver den tid det tar att lösa bråkdelens LP med tolerans h = 1, vilket är, för den deterministiska versionen, .
Algoritm 1
Låt vara en konstant som representerar den önskade approximationsnoggrannheten.
- 1-a. Ställ in . Låt vara en instans konstruerad från genom att ta bort alla objekt som är mindre än g .
- 2-a. Ange . Låt vara en instans konstruerad från genom linjär gruppering med parametern k , och låt vara den återstående instansen (gruppen av k största objekt). Observera att .
- 3-a. Konstruera det linjära konfigurationsprogrammet för utan integralitetsbegränsningarna.
- 4. Beräkna en lösning x för , med tolerans h =1. Resultatet är en bråkdelpackning med fack. Körtiden är .
- 3-b. Avrunda x till en integrallösning för . Lägg till högst fack för bråkdelen. Det totala antalet fack är .
- 3-a. Konstruera det linjära konfigurationsprogrammet för utan integralitetsbegränsningarna.
- 2-b. Packa föremålen i med högst k fack; få en packning av . Antalet fack är .
- 2-a. Ange . Låt vara en instans konstruerad från genom linjär gruppering med parametern k , och låt vara den återstående instansen (gruppen av k största objekt). Observera att .
- 1-b. Lägg till objekt som är mindre än g för att få en lösning för . Antalet fack .
Allt som allt är antalet fack i och körningen -tiden är i . Genom att välja får vi .
Algoritm 2
Låt vara en reell parameter och en heltalsparameter som ska bestämmas senare.
- 1-a. Låt vara en instans konstruerad från genom att ta bort alla objekt som är mindre än g .
- 2. Medan gör:
- 2-a. Gör den alternativa geometriska grupperingen med parametern k . Låt vara den resulterande instansen och låt vara den återstående instansen. Vi har .
- 3-a. Konstruera det linjära konfigurationsprogrammet för , utan integralitetsbegränsningarna.
- 4. Beräkna en lösning x för , med tolerans h =1. Resultatet är en bråkdelpackning med fack. Körtiden är .
- 3-b. Avrunda x till en integrallösning för . Lägg inte till papperskorgar för bråkdelen. Ta istället bara bort de packade föremålen från .
- 3-a. Konstruera det linjära konfigurationsprogrammet för , utan integralitetsbegränsningarna.
- 2-b. Packa föremålen i i högst fack.
- 2-a. Gör den alternativa geometriska grupperingen med parametern k . Låt vara den resulterande instansen och låt vara den återstående instansen. Vi har .
- 2. En gång , packa de återstående föremålen girigt i högst fack.
- Vid varje iteration av slingan i steg 2 har bråkdelen av x som mest m ( K ) mönster, så . FOPT sjunker med en faktor k i varje iteration, så antalet iterationer är som mest .
- det totala antalet fack som används för : .
- 1-b. Lägg till objekt som är mindre än g för att få en lösning för . Antalet fack är: .
Körtiden är i .
Om vi nu väljer k =2 och g =1/FOPT(I), får vi:
,
och följaktligen:
,
så det totala antalet fack är i . Körtiden är .
Samma algoritm kan användas med olika parametrar för att avväga körtid med noggrannhet. För vissa parameter , välj och . Då packningen som mest körtiden är i .
Algoritm 3
Den tredje algoritmen är användbar när antalet storlekar m är litet (se även binpackning med hög multiplicitet ) .
- 1-a. Ange . Låt vara en instans konstruerad från genom att ta bort alla objekt som är mindre än g .
- Om då:
- 3-a. Konstruera det linjära konfigurationsprogrammet för , utan integralitetsbegränsningarna.
- 4. Beräkna en lösning x för , med tolerans h =1. Resultatet är en bråkdelpackning med fack. Körtiden är .
- 3-b. Avrunda x till en integrallösning för . Lägg inte till papperskorgar för bråkdelen. Ta istället bara bort de packade föremålen från .
- 3-a. Konstruera det linjära konfigurationsprogrammet för , utan integralitetsbegränsningarna.
- Kör steg 2 av Algoritm 2 på de återstående bitarna.
- 1-b. Lägg till objekt som är mindre än g för att få en lösning för . Antalet fack är: .
Den använder som mest och körtiden är i .
Förbättringar
KK-teknikerna förbättrades senare för att ge ännu bättre uppskattningar.
Rothvoss använder samma schema som algoritm 2, men med en annan avrundningsprocedur i steg 2. Han introducerade ett "limningssteg", där små föremål limmas ihop för att ge ett enda större föremål. Denna limning kan användas för att öka den minsta föremålsstorleken till ungefär . När alla storlekar är minst , kan vi ersätta i garantin för Algoritm 2, och få:
,
vilket ger en fack.
Hoberg och Rothvoss använder ett liknande schema där föremålen först packas i "containrar", och sedan containrarna packas i papperskorgar. Deras algoritm behöver mest .