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:

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