Utilizarea si programarea calculatoarelor 2 - Laborator 12
Problema rucsacului
Se dă o mulțime de obiecte, fiecare caracterizat prin dimensiune și valoare
(numere reale), și un rucsac cu o dimensiune totală dată. Să se aleagă o
mulțime de obiecte de valoare maximă care să încapă în rucsac.
Programul va citi de la intrare întâi dimensiunea rucsacului, numărul de
obiecte, și apoi perechi cu dimensiunea și valoarea obiectelor.
Indicații de rezolvare
Efectuați o căutare recursivă în care încercați pentru fiecare obiect atât
o soluție în care este ales, cât și o soluție în care nu este ales, și
continuați recursiv procedeul pentru obiectul următor. Considerați următoarele
aspecte:
- e necesară o structură de date în care să se rețină starea fiecărui
obiect (ales sau nu), actualizată în timpul apelului recursiv
- fiind vorba de o problemă de maxim, soluția optimă nu va fi cunoscută
decât după ce am examinat toate soluțiile fezabile (sau eventual putem afirma
cu certitudine că niciuna din soluțiile neexaminate nu poate fi mai bună
decât cea găsită). E necesară deci o variabilă în care se ține minte soluția
cea mai bună găsită până în prezent, și care e actualizată când se găsește
una mai bună.
- în apelul recursiv trebuie actualizate valoarea curentă, locul rămas
disponibil în rucsac, și starea obiectului curent (ales sau nu), inclusiv
la revenirea din apel.
Observații pentru studiu suplimentar (facultativ)
În formularea dată, cu dimensiuni numere reale, problema necesită în
general un număr de încercări exponențial în numărul de obiecte. O
abordare greedy care alege întâi obiectul cu valoare relativă
maximă (raportată la dimensiune) nu conduce în mod necesar la soluția optimă.
Totuși, sortarea obiectelor după valoare relativă și folosirea celor mai bune
întâi în procedura recursivă poate fi uneori o euristică bună.
Se poate reține pe parcurs o estimare optimistă (limită superioară) pentru
valoarea maximă cu care ar putea crește soluția curentă dacă rucsacul s-ar
umple complet (dimensiunea rămasă înmulțită cu valoarea relativă a celui
mai bun obiect neales), și se poate renunța la căutarea pe ramura curentă
dacă această limită superioară e mai mică decât cea mai bună soluție găsită
deja (o tehnică denumită branch and bound).
În varianta cu dimensiuni numere întregi, problema admite o rezolvare
diferită, mai eficientă. Se completează un tabel cu două dimensiuni:
numărul de obiecte și dimensiunea întreagă a rucsacului, în care
t[k][D] reține valoarea maximă ce se poate obține pentru
dimensiunea D cu obiectele 1..k. Se poate stabili
atunci relația recursivă: t[k+1][D] = max(t[k][D] +
t[k][D-d[k+1]]) (soluția fie va nu include obiectul k+1, fie
îl va include, în ambele cazuri restul spațiului trebuie umplut optim cu
obiecte până la k. Tabelul se poate completa pornind de la k
= 1 la numărul de obiecte, procedeul general fiind numit
programare dinamică.
Marius Minea
Last modified: Sun May 16 17:39:04 EEST 2004