Esercizio - (2,1)-boxing di oggetti, scelta greedy e ottimalità (esercitazione greedy, es. 10.3)
In questa pagina 5
Testo (esercitazione sul paradigma greedy, dispense del corso di Algoritmi per l'Ingegneria, Ing. Informatica UniPD). Sia e sia un insieme di oggetti, ciascuno con un peso . Senza perdita di generalità i pesi sono normalizzati in e gli oggetti sono ordinati per peso non decrescente: Un boxing di è una partizione di in sottoinsiemi non vuoti (le "scatole"): per e . Un boxing è un (2,1)-boxing se cioè ogni scatola contiene al più due oggetti, di peso complessivo al più . Si vuole un (2,1)-boxing di cardinalità minima, con un approccio greedy: algoritmo, correttezza (scelta greedy e sottostruttura ottima), complessità.
Esempio. Con , , i (2,1)-boxing sono tre: , e (la coppia pesa ). Gli ultimi due sono ottimi, con 2 scatole.
Passo 1: la scelta greedy
Si guarda l'oggetto più pesante, , perché è quello più difficile da sistemare. Casi:
- : è l'unico oggetto, scatola .
- e : anche accoppiato con l'oggetto più leggero si supera , quindi con qualsiasi altro oggetto (di peso almeno ) si supererebbe: sta da solo, .
- e : si fa la scatola , accoppiando il più pesante con il più leggero.
Nel caso 3 la scelta è "azzardata": si accontenta di accoppiare con , anche se potrebbe esistere un oggetto più pesante di che ci sta ancora con , sprecando parte della portata. La proprietà di scelta greedy proverà che non si perde nulla.
Clean-up: nessuno. Dopo la scelta la sottoistanza residua è formata dagli oggetti ancora da sistemare:
- casi 1 e 2: (nel caso 1 è vuoto);
- caso 3: .
La residua è ancora ordinata per peso e soddisfa le stesse ipotesi, e ha almeno un oggetto in meno (Paradigma greedy - scelta golosa, sottostruttura e selezione delle attivitàIl paradigma greedy compie subito una scelta localmente migliore (scelta greedy), pulisce l'istanza (clean-up) e risolve l'unica sottoistanza residua, con ricorsione di coda eliminabile; il codice è facile, la correttezza no e richiede due proprietà, la scelta greedy (esiste un ottimo che la contiene) e la sottostruttura ottima (cut-and-paste), da cui la correttezza segue per induzione. Caso di studio: la selezione delle attività, con l'algoritmo del primo che finisce, correttezza completa, complessità Theta(n) dopo l'ordinamento e controesempi per le scelte greedy sbagliate.Paradigma greedy - scelta golosa, sottostruttura e selezione delle attività →).
Passo 2: l'algoritmo
Gli indici first e last delimitano la residua: .
BOXING_2_1(O, p) {p ordinato non decrescente}
n <- |O|
B <- {}
first <- 1; last <- n
while first <= last do
if first = last or p[first] + p[last] > 1 then // casi 1 e 2
B <- B U { {o_last} }
else // caso 3
B <- B U { {o_first, o_last} }
first <- first + 1
last <- last - 1
return B(last diminuisce sempre, first aumenta solo nel caso 3, quando è stato inscatolato.)
Ritorna un (2,1)-boxing. Ogni iterazione inscatola e, nel caso 3, anche , poi li esclude dalla residua; il ciclo termina con , cioè dopo aver inscatolato ogni oggetto in una e una sola scatola. Le scatole hanno uno o due oggetti e peso totale : nel caso 3 per la condizione dell'if, altrimenti c'è un solo oggetto con .
Complessità. last decresce di a ogni iterazione, quindi le iterazioni sono al più ; sono almeno (ogni iterazione sistema al più due oggetti). Ogni iterazione fa una somma e un confronto: confronti tra pesi (più se i pesi non sono già ordinati).
Esempio eseguito a mano
Pesi , .
| iter. | first, last | caso | scatola | dopo (first, last) | |
|---|---|---|---|---|---|
| 1 | 1, 8 | 2 | 1, 7 | ||
| 2 | 1, 7 | 3 | 2, 6 | ||
| 3 | 2, 6 | 3 | 3, 5 | ||
| 4 | 3, 5 | 3 | 4, 4 | ||
| 5 | 4, 4 | 1 | 4, 3 (fine) |
Risultato: scatole, che è l'ottimo (verificato con una ricerca esaustiva). Con l'esempio del testo (): , dà ; resta con : . Due scatole.
Passo 3: proprietà di scelta greedy
Enunciato. Esiste un (2,1)-boxing ottimo che contiene la scelta greedy.
Dimostrazione. Casi 1 e 2. In ogni (2,1)-boxing sta da solo (non può stare con nessun altro oggetto), quindi ogni boxing, in particolare uno ottimo, contiene .
Caso 3 (scelta greedy con ). Sia un (2,1)-boxing ottimo.
- Se e sono nella stessa scatola, questa è proprio (al più due oggetti): contiene la scelta greedy.
- Altrimenti sono in due scatole distinte e . Si costruisce sostituendo le due scatole con la scatola greedy e una scatola con gli oggetti rimasti.
Verifiche:
- Numero di scatole. (la seconda nuova scatola, se fosse vuota, si toglie: ci sarebbe una scatola in meno, assurdo per l'ottimalità; quindi non è vuota e ).
- La scatola greedy è ammissibile per ipotesi ().
- La seconda scatola contiene al più due oggetti, perché porta al più un oggetto oltre a e al più uno oltre a . Se ne ha uno solo, rispetta il vincolo di peso. Se ne ha due, siano e . Allora ( è il più pesante) e (vincolo su , che contiene e ), cioè . Sommando,
- Gli altri oggetti restano nelle scatole di prima.
Dunque è un (2,1)-boxing con la stessa cardinalità di , quindi ottimo, e contiene la scelta greedy.
Passo 4: proprietà di sottostruttura ottima
Enunciato. Se è un (2,1)-boxing ottimo che contiene la scelta greedy, allora le altre scatole formano un (2,1)-boxing ottimo della residua .
Dimostrazione. Non c'è clean-up, quindi è semplice. Le scatole di diverse dalla scatola greedy contengono tutti e soli gli oggetti di , nel rispetto dei vincoli: sono un (2,1)-boxing ammissibile di . Se non fosse ottimo, aggiungendo la scatola greedy a un (2,1)-boxing ottimo di si otterrebbe un (2,1)-boxing di con meno scatole di (cut-and-paste), contro la sua ottimalità.
In formula , con .
Passo 5: correttezza dell'algoritmo
Per induzione sul numero di oggetti . Base: , nessuna scatola. Passo: l'algoritmo compie la scelta greedy dei casi 1, 2 o 3 e prosegue, con le stesse istruzioni, sulla residua (la parte rimasta tra first e last), che per ipotesi induttiva è risolta in modo ottimo. Per la sottostruttura il numero di scatole è .
Verifica numerica: confronto con la ricerca esaustiva del minimo numero di scatole su 3000 istanze casuali (, pesi interi in con limite ) e controllo che ogni uscita sia un (2,1)-boxing con iterazioni .
Versione ripasso
- Problema: pesi ; partizione in scatole con al più oggetti e peso totale (un (2,1)-boxing); si vuole il minimo numero di scatole. Esempio : i (2,1)-boxing sono , due ottimi con scatole.
- Scelta greedy (si guarda l'oggetto più pesante ): caso 1 e caso 2 danno (con nessun altro ci sta); caso 3 dà (accoppia con il più leggero, anche se ne esiste uno più pesante che ci starebbe). Clean-up vuoto; residua (casi 1 e 2) o (caso 3), ancora ordinata (Paradigma greedy - scelta golosa, sottostruttura e selezione delle attivitàIl paradigma greedy compie subito una scelta localmente migliore (scelta greedy), pulisce l'istanza (clean-up) e risolve l'unica sottoistanza residua, con ricorsione di coda eliminabile; il codice è facile, la correttezza no e richiede due proprietà, la scelta greedy (esiste un ottimo che la contiene) e la sottostruttura ottima (cut-and-paste), da cui la correttezza segue per induzione. Caso di studio: la selezione delle attività, con l'algoritmo del primo che finisce, correttezza completa, complessità Theta(n) dopo l'ordinamento e controesempi per le scelte greedy sbagliate.Paradigma greedy - scelta golosa, sottostruttura e selezione delle attività →).
- Algoritmo:
first <- 1; last <- n; finchéfirst <= last: sefirst = lastop[first] + p[last] > 1scatola{o_last}, altrimenti scatola{o_first, o_last}efirst <- first + 1; semprelast <- last - 1. Ogni oggetto finisce in una sola scatola, il ciclo termina confirst > last; iterazioni tra e , una somma e un confronto ciascuna: . - Esempio : dà ; dà ; dà ; dà ;
first = lastdà . In tutto scatole, ottimo. - Scelta greedy (prova): casi 1 e 2 banali ( è sempre solo). Caso 3: ottimo; se e sono nella stessa scatola questa è ; altrimenti , e si sostituisce con . La seconda scatola ha al più due oggetti , con e (vincolo di ): . Stessa cardinalità, dunque è ottimo e contiene la scelta greedy.
- Sottostruttura: le altre scatole di un ottimo con la scelta greedy sono un boxing ammissibile di ; se non fosse ottimo, con la scatola greedy si migliorerebbe l'ottimo (cut-and-paste). , .
- Correttezza: induzione su ; base istanza vuota; il passo applica scelta greedy e sottostruttura. Verificato con la ricerca esaustiva su 3000 istanze casuali.
- Errori tipici: incrementare
firstanche nei casi 1 e 2 (quando non è stato inscatolato); non trattarefirst = last; dimenticare che se e sono già nella stessa scatola non c'è nulla da scambiare; usare senza citare il vincolo su ; dimenticare che la seconda scatola può avere un solo oggetto.