Esercizi · PD per il problema degli zaini multipli¶
Esercizi · Capitolo 24 · ogni soluzione si apre con un clic · Capitolo 24: Zaini multipli (MKP) · Eserciziario, volume 3 (PDF)
Ricorrenza usata in questi esercizi
L'algoritmo di PD del capitolo «PD per il problema degli zaini multipli», con \(m\) zaini, il vettore \(\vet{k}=(k_1,\dots,k_m)\) delle loro capacità residue e i vettori unitari \(\vet{e}_i\):
Il valore ottimo è \(v(n,\vet{c})\). Le tabelle \(s\) memorizzano \(s[j][\vet{k}]=i\) se l'oggetto \(j\) è inserito nello zaino \(i\), e \(0\) se è escluso; una soluzione ottima si ricostruisce da \(j=n\) e \(\vet{k}=\vet{c}\) con \(a_j\leftarrow s[j][\vet{k}]\) e, se \(a_j=i\ge 1\), \(\vet{k}\leftarrow\vet{k}-w_j\vet{e}_i\).
Esercizio 24.1: Esercizio 1: problema degli zaini multipli
Consideriamo la seguente istanza dell'MKP, con \(m=2\) zaini di capacità \(c_1=3\) e \(c_2=2\), e \(3\) oggetti con profitti e pesi:
Domande
-
Eseguire l'algoritmo di PD bottom-up: per ogni oggetto \(j\), scrivere le matrici \(v[j][k_1][k_2]\) e \(s[j][k_1][k_2]\), e mostrare il calcolo della cella \(\vet{k}=\vet{c}\).
-
Usando le tabelle \(s\), ricostruire una soluzione ottima come vettore \((a_1,a_2,a_3)\) degli zaini, e riportare il valore ottimo.
-
Risolvere per enumerazione il KP con gli stessi oggetti e capacità \(c_1+c_2=5\), e confrontarne il valore ottimo con il valore ottimo dell'MKP.
Soluzione
La ricorrenza e le convenzioni sono quelle del box all'inizio di questi esercizi.
-
La riga \(j=0\) è \(v[0][\vet{k}]=0\) per ogni \(\vet{k}\). In ogni matrice c'è una riga per ogni \(k_1\) e una colonna per ogni \(k_2\); in \(s\), \(0\) indica che l'oggetto \(j\) è escluso, e \(1\) o \(2\) lo zaino in cui è inserito. In caso di pareggio si conserva la prima opzione: oggetto \(j\) escluso, poi zaino \(1\).
Oggetto \(j=1\), con \(p_1=8\) e \(w_1=2\): \(v[1][(3,2)]=\max\{v[0][(3,2)],\,p_1+v[0][(1,2)],\,p_1+v[0][(3,0)]\}=\max\{0,\,8+0,\,8+0\}=8\); \(v[1][(0,2)]=\max\{v[0][(0,2)],\,p_1+v[0][(0,0)]\}=\max\{0,\,8+0\}=8\).
\[ \begin{array}{l|rrr} \hline {v[1][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} \\ \hline {k_1=0} & {0} & {0} & {8} \\ {k_1=1} & {0} & {0} & {8} \\ {k_1=2} & {8} & {8} & {8} \\ {k_1=3} & {8} & {8} & {8} \\ \hline \end{array} \]\[ \begin{array}{l|rrr} \hline {s[1][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} \\ \hline {k_1=0} & {0} & {0} & {2} \\ {k_1=1} & {0} & {0} & {2} \\ {k_1=2} & {1} & {1} & {1} \\ {k_1=3} & {1} & {1} & {1} \\ \hline \end{array} \]Oggetto \(j=2\), con \(p_2=7\) e \(w_2=3\): \(v[2][(3,2)]=\max\{v[1][(3,2)],\,p_2+v[1][(0,2)]\}=\max\{8,\,7+8\}=15\).
\[ \begin{array}{l|rrr} \hline {v[2][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} \\ \hline {k_1=0} & {0} & {0} & {8} \\ {k_1=1} & {0} & {0} & {8} \\ {k_1=2} & {8} & {8} & {8} \\ {k_1=3} & {8} & {8} & {15} \\ \hline \end{array} \]\[ \begin{array}{l|rrr} \hline {s[2][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} \\ \hline {k_1=0} & {0} & {0} & {0} \\ {k_1=1} & {0} & {0} & {0} \\ {k_1=2} & {0} & {0} & {0} \\ {k_1=3} & {0} & {0} & {1} \\ \hline \end{array} \]Oggetto \(j=3\), con \(p_3=6\) e \(w_3=3\): \(v[3][(3,2)]=\max\{v[2][(3,2)],\,p_3+v[2][(0,2)]\}=\max\{15,\,6+8\}=15\).
\[ \begin{array}{l|rrr} \hline {v[3][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} \\ \hline {k_1=0} & {0} & {0} & {8} \\ {k_1=1} & {0} & {0} & {8} \\ {k_1=2} & {8} & {8} & {8} \\ {k_1=3} & {8} & {8} & {15} \\ \hline \end{array} \]\[ \begin{array}{l|rrr} \hline {s[3][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} \\ \hline {k_1=0} & {0} & {0} & {0} \\ {k_1=1} & {0} & {0} & {0} \\ {k_1=2} & {0} & {0} & {0} \\ {k_1=3} & {0} & {0} & {0} \\ \hline \end{array} \] -
Partendo da \(j=3\) e \(\vet{k}=(3,2)\):
Iterazione \(j\) \(\vet{k}\) \(s[j][\vet{k}]\) \(a[1]\) \(a[2]\) \(a[3]\) Azione \(-\) \(-\) \(-\) \(-\) 0 0 0 \(\vet{k}=(3,2)\) \(1\) \(3\) \((3,2)\) \(0\) 0 0 0 \(a[3]\leftarrow 0\), \(\vet{k}=(3,2)\) \(2\) \(2\) \((3,2)\) \(1\) 0 1 0 \(a[2]\leftarrow 1\), \(\vet{k}\leftarrow (0,2)\) \(3\) \(1\) \((0,2)\) \(2\) 2 1 0 \(a[1]\leftarrow 2\), \(\vet{k}\leftarrow (0,0)\) Il vettore \((2,1,0)\) è una soluzione ottima: lo zaino \(1\) contiene gli oggetti \(\{2\}\), di peso totale \(3\le c_1\), e lo zaino \(2\) gli oggetti \(\{1\}\), di peso totale \(2\le c_2\). Il valore ottimo è \(v[3][(3,2)]=7+8=15\).
-
Il KP con capacità \(5\) ha valore ottimo \(15\), uguale al valore ottimo dell'MKP: qui l'upper bound dato dalla capacità totale è stretto.
Esercizio 24.2: Esercizio 2: problema degli zaini multipli
Consideriamo la seguente istanza dell'MKP, con \(m=2\) zaini di capacità \(c_1=4\) e \(c_2=3\), e \(3\) oggetti con profitti e pesi:
Domande
-
Eseguire l'algoritmo di PD bottom-up: per ogni oggetto \(j\), scrivere le matrici \(v[j][k_1][k_2]\) e \(s[j][k_1][k_2]\), e mostrare il calcolo della cella \(\vet{k}=\vet{c}\).
-
Usando le tabelle \(s\), ricostruire una soluzione ottima come vettore \((a_1,a_2,a_3)\) degli zaini, e riportare il valore ottimo.
-
Risolvere per enumerazione il KP con gli stessi oggetti e capacità \(c_1+c_2=7\), e confrontarne il valore ottimo con il valore ottimo dell'MKP.
Soluzione
La ricorrenza e le convenzioni sono quelle del box all'inizio di questi esercizi.
-
La riga \(j=0\) è \(v[0][\vet{k}]=0\) per ogni \(\vet{k}\). In ogni matrice c'è una riga per ogni \(k_1\) e una colonna per ogni \(k_2\); in \(s\), \(0\) indica che l'oggetto \(j\) è escluso, e \(1\) o \(2\) lo zaino in cui è inserito. In caso di pareggio si conserva la prima opzione: oggetto \(j\) escluso, poi zaino \(1\).
Oggetto \(j=1\), con \(p_1=7\) e \(w_1=4\): \(v[1][(4,3)]=\max\{v[0][(4,3)],\,p_1+v[0][(0,3)]\}=\max\{0,\,7+0\}=7\); \(v[1][(4,0)]=\max\{v[0][(4,0)],\,p_1+v[0][(0,0)]\}=\max\{0,\,7+0\}=7\).
\[ \begin{array}{l|rrrr} \hline {v[1][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {0} & {0} \\ {k_1=1} & {0} & {0} & {0} & {0} \\ {k_1=2} & {0} & {0} & {0} & {0} \\ {k_1=3} & {0} & {0} & {0} & {0} \\ {k_1=4} & {7} & {7} & {7} & {7} \\ \hline \end{array} \]\[ \begin{array}{l|rrrr} \hline {s[1][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {0} & {0} \\ {k_1=1} & {0} & {0} & {0} & {0} \\ {k_1=2} & {0} & {0} & {0} & {0} \\ {k_1=3} & {0} & {0} & {0} & {0} \\ {k_1=4} & {1} & {1} & {1} & {1} \\ \hline \end{array} \]Oggetto \(j=2\), con \(p_2=3\) e \(w_2=3\): \(v[2][(4,3)]=\max\{v[1][(4,3)],\,p_2+v[1][(1,3)],\,p_2+v[1][(4,0)]\}=\max\{7,\,3+0,\,3+7\}=10\); \(v[2][(4,0)]=\max\{v[1][(4,0)],\,p_2+v[1][(1,0)]\}=\max\{7,\,3+0\}=7\).
\[ \begin{array}{l|rrrr} \hline {v[2][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {0} & {3} \\ {k_1=1} & {0} & {0} & {0} & {3} \\ {k_1=2} & {0} & {0} & {0} & {3} \\ {k_1=3} & {3} & {3} & {3} & {3} \\ {k_1=4} & {7} & {7} & {7} & {10} \\ \hline \end{array} \]\[ \begin{array}{l|rrrr} \hline {s[2][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {0} & {2} \\ {k_1=1} & {0} & {0} & {0} & {2} \\ {k_1=2} & {0} & {0} & {0} & {2} \\ {k_1=3} & {1} & {1} & {1} & {1} \\ {k_1=4} & {0} & {0} & {0} & {2} \\ \hline \end{array} \]Oggetto \(j=3\), con \(p_3=8\) e \(w_3=3\): \(v[3][(4,3)]=\max\{v[2][(4,3)],\,p_3+v[2][(1,3)],\,p_3+v[2][(4,0)]\}=\max\{10,\,8+3,\,8+7\}=15\).
\[ \begin{array}{l|rrrr} \hline {v[3][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {0} & {8} \\ {k_1=1} & {0} & {0} & {0} & {8} \\ {k_1=2} & {0} & {0} & {0} & {8} \\ {k_1=3} & {8} & {8} & {8} & {11} \\ {k_1=4} & {8} & {8} & {8} & {15} \\ \hline \end{array} \]\[ \begin{array}{l|rrrr} \hline {s[3][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {0} & {2} \\ {k_1=1} & {0} & {0} & {0} & {2} \\ {k_1=2} & {0} & {0} & {0} & {2} \\ {k_1=3} & {1} & {1} & {1} & {1} \\ {k_1=4} & {1} & {1} & {1} & {2} \\ \hline \end{array} \] -
Partendo da \(j=3\) e \(\vet{k}=(4,3)\):
Iterazione \(j\) \(\vet{k}\) \(s[j][\vet{k}]\) \(a[1]\) \(a[2]\) \(a[3]\) Azione \(-\) \(-\) \(-\) \(-\) 0 0 0 \(\vet{k}=(4,3)\) \(1\) \(3\) \((4,3)\) \(2\) 0 0 2 \(a[3]\leftarrow 2\), \(\vet{k}\leftarrow (4,0)\) \(2\) \(2\) \((4,0)\) \(0\) 0 0 2 \(a[2]\leftarrow 0\), \(\vet{k}=(4,0)\) \(3\) \(1\) \((4,0)\) \(1\) 1 0 2 \(a[1]\leftarrow 1\), \(\vet{k}\leftarrow (0,0)\) Il vettore \((1,0,2)\) è una soluzione ottima: lo zaino \(1\) contiene gli oggetti \(\{1\}\), di peso totale \(4\le c_1\), e lo zaino \(2\) gli oggetti \(\{3\}\), di peso totale \(3\le c_2\). Il valore ottimo è \(v[3][(4,3)]=7+8=15\).
-
Il KP con capacità \(7\) ha valore ottimo \(15\), uguale al valore ottimo dell'MKP: qui l'upper bound dato dalla capacità totale è stretto.
Esercizio 24.3: Esercizio 3: problema degli zaini multipli
Consideriamo la seguente istanza dell'MKP, con \(m=2\) zaini di capacità \(c_1=5\) e \(c_2=2\), e \(3\) oggetti con profitti e pesi:
Domande
-
Eseguire l'algoritmo di PD bottom-up: per ogni oggetto \(j\), scrivere le matrici \(v[j][k_1][k_2]\) e \(s[j][k_1][k_2]\), e mostrare il calcolo della cella \(\vet{k}=\vet{c}\).
-
Usando le tabelle \(s\), ricostruire una soluzione ottima come vettore \((a_1,a_2,a_3)\) degli zaini, e riportare il valore ottimo.
-
Risolvere per enumerazione il KP con gli stessi oggetti e capacità \(c_1+c_2=7\), e confrontarne il valore ottimo con il valore ottimo dell'MKP.
Soluzione
La ricorrenza e le convenzioni sono quelle del box all'inizio di questi esercizi.
-
La riga \(j=0\) è \(v[0][\vet{k}]=0\) per ogni \(\vet{k}\). In ogni matrice c'è una riga per ogni \(k_1\) e una colonna per ogni \(k_2\); in \(s\), \(0\) indica che l'oggetto \(j\) è escluso, e \(1\) o \(2\) lo zaino in cui è inserito. In caso di pareggio si conserva la prima opzione: oggetto \(j\) escluso, poi zaino \(1\).
Oggetto \(j=1\), con \(p_1=2\) e \(w_1=2\): \(v[1][(5,2)]=\max\{v[0][(5,2)],\,p_1+v[0][(3,2)],\,p_1+v[0][(5,0)]\}=\max\{0,\,2+0,\,2+0\}=2\); \(v[1][(1,2)]=\max\{v[0][(1,2)],\,p_1+v[0][(1,0)]\}=\max\{0,\,2+0\}=2\).
\[ \begin{array}{l|rrr} \hline {v[1][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} \\ \hline {k_1=0} & {0} & {0} & {2} \\ {k_1=1} & {0} & {0} & {2} \\ {k_1=2} & {2} & {2} & {2} \\ {k_1=3} & {2} & {2} & {2} \\ {k_1=4} & {2} & {2} & {2} \\ {k_1=5} & {2} & {2} & {2} \\ \hline \end{array} \]\[ \begin{array}{l|rrr} \hline {s[1][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} \\ \hline {k_1=0} & {0} & {0} & {2} \\ {k_1=1} & {0} & {0} & {2} \\ {k_1=2} & {1} & {1} & {1} \\ {k_1=3} & {1} & {1} & {1} \\ {k_1=4} & {1} & {1} & {1} \\ {k_1=5} & {1} & {1} & {1} \\ \hline \end{array} \]Oggetto \(j=2\), con \(p_2=5\) e \(w_2=3\): \(v[2][(5,2)]=\max\{v[1][(5,2)],\,p_2+v[1][(2,2)]\}=\max\{2,\,5+2\}=7\); \(w_2=3\) non entra in alcuno zaino, quindi \(v[2][(1,2)]=v[1][(1,2)]=2\).
\[ \begin{array}{l|rrr} \hline {v[2][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} \\ \hline {k_1=0} & {0} & {0} & {2} \\ {k_1=1} & {0} & {0} & {2} \\ {k_1=2} & {2} & {2} & {2} \\ {k_1=3} & {5} & {5} & {7} \\ {k_1=4} & {5} & {5} & {7} \\ {k_1=5} & {7} & {7} & {7} \\ \hline \end{array} \]\[ \begin{array}{l|rrr} \hline {s[2][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} \\ \hline {k_1=0} & {0} & {0} & {0} \\ {k_1=1} & {0} & {0} & {0} \\ {k_1=2} & {0} & {0} & {0} \\ {k_1=3} & {1} & {1} & {1} \\ {k_1=4} & {1} & {1} & {1} \\ {k_1=5} & {1} & {1} & {1} \\ \hline \end{array} \]Oggetto \(j=3\), con \(p_3=9\) e \(w_3=4\): \(v[3][(5,2)]=\max\{v[2][(5,2)],\,p_3+v[2][(1,2)]\}=\max\{7,\,9+2\}=11\).
\[ \begin{array}{l|rrr} \hline {v[3][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} \\ \hline {k_1=0} & {0} & {0} & {2} \\ {k_1=1} & {0} & {0} & {2} \\ {k_1=2} & {2} & {2} & {2} \\ {k_1=3} & {5} & {5} & {7} \\ {k_1=4} & {9} & {9} & {11} \\ {k_1=5} & {9} & {9} & {11} \\ \hline \end{array} \]\[ \begin{array}{l|rrr} \hline {s[3][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} \\ \hline {k_1=0} & {0} & {0} & {0} \\ {k_1=1} & {0} & {0} & {0} \\ {k_1=2} & {0} & {0} & {0} \\ {k_1=3} & {0} & {0} & {0} \\ {k_1=4} & {1} & {1} & {1} \\ {k_1=5} & {1} & {1} & {1} \\ \hline \end{array} \] -
Partendo da \(j=3\) e \(\vet{k}=(5,2)\):
Iterazione \(j\) \(\vet{k}\) \(s[j][\vet{k}]\) \(a[1]\) \(a[2]\) \(a[3]\) Azione \(-\) \(-\) \(-\) \(-\) 0 0 0 \(\vet{k}=(5,2)\) \(1\) \(3\) \((5,2)\) \(1\) 0 0 1 \(a[3]\leftarrow 1\), \(\vet{k}\leftarrow (1,2)\) \(2\) \(2\) \((1,2)\) \(0\) 0 0 1 \(a[2]\leftarrow 0\), \(\vet{k}=(1,2)\) \(3\) \(1\) \((1,2)\) \(2\) 2 0 1 \(a[1]\leftarrow 2\), \(\vet{k}\leftarrow (1,0)\) Il vettore \((2,0,1)\) è una soluzione ottima: lo zaino \(1\) contiene gli oggetti \(\{3\}\), di peso totale \(4\le c_1\), e lo zaino \(2\) gli oggetti \(\{1\}\), di peso totale \(2\le c_2\). Il valore ottimo è \(v[3][(5,2)]=9+2=11\).
-
Il KP con capacità \(7\) ha valore ottimo \(14>11\), con gli oggetti \(\{2,3\}\) di peso totale \(7\le 7\). Questi oggetti non si possono dividere fra i due zaini di capacità \(5\) e \(2\): il KP con la capacità totale dà solo un upper bound sul valore ottimo dell'MKP.
Esercizio 24.4: Esercizio 4: problema degli zaini multipli
Consideriamo la seguente istanza dell'MKP, con \(m=2\) zaini di capacità \(c_1=4\) e \(c_2=3\), e \(4\) oggetti con profitti e pesi:
Domande
-
Eseguire l'algoritmo di PD bottom-up: per ogni oggetto \(j\), scrivere le matrici \(v[j][k_1][k_2]\) e \(s[j][k_1][k_2]\), e mostrare il calcolo della cella \(\vet{k}=\vet{c}\).
-
Usando le tabelle \(s\), ricostruire una soluzione ottima come vettore \((a_1,a_2,a_3,a_4)\) degli zaini, e riportare il valore ottimo.
-
Risolvere per enumerazione il KP con gli stessi oggetti e capacità \(c_1+c_2=7\), e confrontarne il valore ottimo con il valore ottimo dell'MKP.
Soluzione
La ricorrenza e le convenzioni sono quelle del box all'inizio di questi esercizi.
-
La riga \(j=0\) è \(v[0][\vet{k}]=0\) per ogni \(\vet{k}\). In ogni matrice c'è una riga per ogni \(k_1\) e una colonna per ogni \(k_2\); in \(s\), \(0\) indica che l'oggetto \(j\) è escluso, e \(1\) o \(2\) lo zaino in cui è inserito. In caso di pareggio si conserva la prima opzione: oggetto \(j\) escluso, poi zaino \(1\).
Oggetto \(j=1\), con \(p_1=5\) e \(w_1=2\): \(v[1][(4,3)]=\max\{v[0][(4,3)],\,p_1+v[0][(2,3)],\,p_1+v[0][(4,1)]\}=\max\{0,\,5+0,\,5+0\}=5\); \(w_1=2\) non entra in alcuno zaino, quindi \(v[1][(0,0)]=v[0][(0,0)]=0\).
\[ \begin{array}{l|rrrr} \hline {v[1][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {5} & {5} \\ {k_1=1} & {0} & {0} & {5} & {5} \\ {k_1=2} & {5} & {5} & {5} & {5} \\ {k_1=3} & {5} & {5} & {5} & {5} \\ {k_1=4} & {5} & {5} & {5} & {5} \\ \hline \end{array} \]\[ \begin{array}{l|rrrr} \hline {s[1][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {2} & {2} \\ {k_1=1} & {0} & {0} & {2} & {2} \\ {k_1=2} & {1} & {1} & {1} & {1} \\ {k_1=3} & {1} & {1} & {1} & {1} \\ {k_1=4} & {1} & {1} & {1} & {1} \\ \hline \end{array} \]Oggetto \(j=2\), con \(p_2=2\) e \(w_2=1\): \(v[2][(4,3)]=\max\{v[1][(4,3)],\,p_2+v[1][(3,3)],\,p_2+v[1][(4,2)]\}=\max\{5,\,2+5,\,2+5\}=7\); \(v[2][(0,1)]=\max\{v[1][(0,1)],\,p_2+v[1][(0,0)]\}=\max\{0,\,2+0\}=2\).
\[ \begin{array}{l|rrrr} \hline {v[2][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {2} & {5} & {7} \\ {k_1=1} & {2} & {2} & {7} & {7} \\ {k_1=2} & {5} & {7} & {7} & {7} \\ {k_1=3} & {7} & {7} & {7} & {7} \\ {k_1=4} & {7} & {7} & {7} & {7} \\ \hline \end{array} \]\[ \begin{array}{l|rrrr} \hline {s[2][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {2} & {0} & {2} \\ {k_1=1} & {1} & {1} & {1} & {1} \\ {k_1=2} & {0} & {2} & {1} & {1} \\ {k_1=3} & {1} & {1} & {1} & {1} \\ {k_1=4} & {1} & {1} & {1} & {1} \\ \hline \end{array} \]Oggetto \(j=3\), con \(p_3=6\) e \(w_3=2\): \(v[3][(4,3)]=\max\{v[2][(4,3)],\,p_3+v[2][(2,3)],\,p_3+v[2][(4,1)]\}=\max\{7,\,6+7,\,6+7\}=13\); \(v[3][(0,3)]=\max\{v[2][(0,3)],\,p_3+v[2][(0,1)]\}=\max\{7,\,6+2\}=8\).
\[ \begin{array}{l|rrrr} \hline {v[3][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {2} & {6} & {8} \\ {k_1=1} & {2} & {2} & {8} & {8} \\ {k_1=2} & {6} & {8} & {11} & {13} \\ {k_1=3} & {8} & {8} & {13} & {13} \\ {k_1=4} & {11} & {13} & {13} & {13} \\ \hline \end{array} \]\[ \begin{array}{l|rrrr} \hline {s[3][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {2} & {2} \\ {k_1=1} & {0} & {0} & {2} & {2} \\ {k_1=2} & {1} & {1} & {1} & {1} \\ {k_1=3} & {1} & {1} & {1} & {1} \\ {k_1=4} & {1} & {1} & {1} & {1} \\ \hline \end{array} \]Oggetto \(j=4\), con \(p_4=6\) e \(w_4=4\): \(v[4][(4,3)]=\max\{v[3][(4,3)],\,p_4+v[3][(0,3)]\}=\max\{13,\,6+8\}=14\).
\[ \begin{array}{l|rrrr} \hline {v[4][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {2} & {6} & {8} \\ {k_1=1} & {2} & {2} & {8} & {8} \\ {k_1=2} & {6} & {8} & {11} & {13} \\ {k_1=3} & {8} & {8} & {13} & {13} \\ {k_1=4} & {11} & {13} & {13} & {14} \\ \hline \end{array} \]\[ \begin{array}{l|rrrr} \hline {s[4][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {0} & {0} \\ {k_1=1} & {0} & {0} & {0} & {0} \\ {k_1=2} & {0} & {0} & {0} & {0} \\ {k_1=3} & {0} & {0} & {0} & {0} \\ {k_1=4} & {0} & {0} & {0} & {1} \\ \hline \end{array} \] -
Partendo da \(j=4\) e \(\vet{k}=(4,3)\):
Iterazione \(j\) \(\vet{k}\) \(s[j][\vet{k}]\) \(a[1]\) \(a[2]\) \(a[3]\) \(a[4]\) Azione \(-\) \(-\) \(-\) \(-\) 0 0 0 0 \(\vet{k}=(4,3)\) \(1\) \(4\) \((4,3)\) \(1\) 0 0 0 1 \(a[4]\leftarrow 1\), \(\vet{k}\leftarrow (0,3)\) \(2\) \(3\) \((0,3)\) \(2\) 0 0 2 1 \(a[3]\leftarrow 2\), \(\vet{k}\leftarrow (0,1)\) \(3\) \(2\) \((0,1)\) \(2\) 0 2 2 1 \(a[2]\leftarrow 2\), \(\vet{k}\leftarrow (0,0)\) \(4\) \(1\) \((0,0)\) \(0\) 0 2 2 1 \(a[1]\leftarrow 0\), \(\vet{k}=(0,0)\) Il vettore \((0,2,2,1)\) è una soluzione ottima: lo zaino \(1\) contiene gli oggetti \(\{4\}\), di peso totale \(4\le c_1\), e lo zaino \(2\) gli oggetti \(\{2,3\}\), di peso totale \(1+2=3\le c_2\). Il valore ottimo è \(v[4][(4,3)]=6+2+6=14\).
-
Il KP con capacità \(7\) ha valore ottimo \(14\), uguale al valore ottimo dell'MKP: qui l'upper bound dato dalla capacità totale è stretto.
Esercizio 24.5: Esercizio 5: problema degli zaini multipli
Consideriamo la seguente istanza dell'MKP, con \(m=2\) zaini di capacità \(c_1=5\) e \(c_2=3\), e \(4\) oggetti con profitti e pesi:
Domande
-
Eseguire l'algoritmo di PD bottom-up: per ogni oggetto \(j\), scrivere le matrici \(v[j][k_1][k_2]\) e \(s[j][k_1][k_2]\), e mostrare il calcolo della cella \(\vet{k}=\vet{c}\).
-
Usando le tabelle \(s\), ricostruire una soluzione ottima come vettore \((a_1,a_2,a_3,a_4)\) degli zaini, e riportare il valore ottimo.
-
Risolvere per enumerazione il KP con gli stessi oggetti e capacità \(c_1+c_2=8\), e confrontarne il valore ottimo con il valore ottimo dell'MKP.
Soluzione
La ricorrenza e le convenzioni sono quelle del box all'inizio di questi esercizi.
-
La riga \(j=0\) è \(v[0][\vet{k}]=0\) per ogni \(\vet{k}\). In ogni matrice c'è una riga per ogni \(k_1\) e una colonna per ogni \(k_2\); in \(s\), \(0\) indica che l'oggetto \(j\) è escluso, e \(1\) o \(2\) lo zaino in cui è inserito. In caso di pareggio si conserva la prima opzione: oggetto \(j\) escluso, poi zaino \(1\).
Oggetto \(j=1\), con \(p_1=5\) e \(w_1=4\): \(v[1][(5,3)]=\max\{v[0][(5,3)],\,p_1+v[0][(1,3)]\}=\max\{0,\,5+0\}=5\); \(v[1][(5,1)]=\max\{v[0][(5,1)],\,p_1+v[0][(1,1)]\}=\max\{0,\,5+0\}=5\).
\[ \begin{array}{l|rrrr} \hline {v[1][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {0} & {0} \\ {k_1=1} & {0} & {0} & {0} & {0} \\ {k_1=2} & {0} & {0} & {0} & {0} \\ {k_1=3} & {0} & {0} & {0} & {0} \\ {k_1=4} & {5} & {5} & {5} & {5} \\ {k_1=5} & {5} & {5} & {5} & {5} \\ \hline \end{array} \]\[ \begin{array}{l|rrrr} \hline {s[1][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {0} & {0} \\ {k_1=1} & {0} & {0} & {0} & {0} \\ {k_1=2} & {0} & {0} & {0} & {0} \\ {k_1=3} & {0} & {0} & {0} & {0} \\ {k_1=4} & {1} & {1} & {1} & {1} \\ {k_1=5} & {1} & {1} & {1} & {1} \\ \hline \end{array} \]Oggetto \(j=2\), con \(p_2=3\) e \(w_2=4\): \(v[2][(5,3)]=\max\{v[1][(5,3)],\,p_2+v[1][(1,3)]\}=\max\{5,\,3+0\}=5\); \(v[2][(5,1)]=\max\{v[1][(5,1)],\,p_2+v[1][(1,1)]\}=\max\{5,\,3+0\}=5\).
\[ \begin{array}{l|rrrr} \hline {v[2][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {0} & {0} \\ {k_1=1} & {0} & {0} & {0} & {0} \\ {k_1=2} & {0} & {0} & {0} & {0} \\ {k_1=3} & {0} & {0} & {0} & {0} \\ {k_1=4} & {5} & {5} & {5} & {5} \\ {k_1=5} & {5} & {5} & {5} & {5} \\ \hline \end{array} \]\[ \begin{array}{l|rrrr} \hline {s[2][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {0} & {0} \\ {k_1=1} & {0} & {0} & {0} & {0} \\ {k_1=2} & {0} & {0} & {0} & {0} \\ {k_1=3} & {0} & {0} & {0} & {0} \\ {k_1=4} & {0} & {0} & {0} & {0} \\ {k_1=5} & {0} & {0} & {0} & {0} \\ \hline \end{array} \]Oggetto \(j=3\), con \(p_3=7\) e \(w_3=2\): \(v[3][(5,3)]=\max\{v[2][(5,3)],\,p_3+v[2][(3,3)],\,p_3+v[2][(5,1)]\}=\max\{5,\,7+0,\,7+5\}=12\).
\[ \begin{array}{l|rrrr} \hline {v[3][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {7} & {7} \\ {k_1=1} & {0} & {0} & {7} & {7} \\ {k_1=2} & {7} & {7} & {7} & {7} \\ {k_1=3} & {7} & {7} & {7} & {7} \\ {k_1=4} & {7} & {7} & {12} & {12} \\ {k_1=5} & {7} & {7} & {12} & {12} \\ \hline \end{array} \]\[ \begin{array}{l|rrrr} \hline {s[3][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {2} & {2} \\ {k_1=1} & {0} & {0} & {2} & {2} \\ {k_1=2} & {1} & {1} & {1} & {1} \\ {k_1=3} & {1} & {1} & {1} & {1} \\ {k_1=4} & {1} & {1} & {2} & {2} \\ {k_1=5} & {1} & {1} & {2} & {2} \\ \hline \end{array} \]Oggetto \(j=4\), con \(p_4=2\) e \(w_4=2\): \(v[4][(5,3)]=\max\{v[3][(5,3)],\,p_4+v[3][(3,3)],\,p_4+v[3][(5,1)]\}=\max\{12,\,2+7,\,2+7\}=12\).
\[ \begin{array}{l|rrrr} \hline {v[4][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {7} & {7} \\ {k_1=1} & {0} & {0} & {7} & {7} \\ {k_1=2} & {7} & {7} & {9} & {9} \\ {k_1=3} & {7} & {7} & {9} & {9} \\ {k_1=4} & {9} & {9} & {12} & {12} \\ {k_1=5} & {9} & {9} & {12} & {12} \\ \hline \end{array} \]\[ \begin{array}{l|rrrr} \hline {s[4][k_1][k_2]} & {k_2=0} & {k_2=1} & {k_2=2} & {k_2=3} \\ \hline {k_1=0} & {0} & {0} & {0} & {0} \\ {k_1=1} & {0} & {0} & {0} & {0} \\ {k_1=2} & {0} & {0} & {1} & {1} \\ {k_1=3} & {0} & {0} & {1} & {1} \\ {k_1=4} & {1} & {1} & {0} & {0} \\ {k_1=5} & {1} & {1} & {0} & {0} \\ \hline \end{array} \] -
Partendo da \(j=4\) e \(\vet{k}=(5,3)\):
Iterazione \(j\) \(\vet{k}\) \(s[j][\vet{k}]\) \(a[1]\) \(a[2]\) \(a[3]\) \(a[4]\) Azione \(-\) \(-\) \(-\) \(-\) 0 0 0 0 \(\vet{k}=(5,3)\) \(1\) \(4\) \((5,3)\) \(0\) 0 0 0 0 \(a[4]\leftarrow 0\), \(\vet{k}=(5,3)\) \(2\) \(3\) \((5,3)\) \(2\) 0 0 2 0 \(a[3]\leftarrow 2\), \(\vet{k}\leftarrow (5,1)\) \(3\) \(2\) \((5,1)\) \(0\) 0 0 2 0 \(a[2]\leftarrow 0\), \(\vet{k}=(5,1)\) \(4\) \(1\) \((5,1)\) \(1\) 1 0 2 0 \(a[1]\leftarrow 1\), \(\vet{k}\leftarrow (1,1)\) Il vettore \((1,0,2,0)\) è una soluzione ottima: lo zaino \(1\) contiene gli oggetti \(\{1\}\), di peso totale \(4\le c_1\), e lo zaino \(2\) gli oggetti \(\{3\}\), di peso totale \(2\le c_2\). Il valore ottimo è \(v[4][(5,3)]=5+7=12\).
-
Il KP con capacità \(8\) ha valore ottimo \(14>12\), con gli oggetti \(\{1,3,4\}\) di peso totale \(8\le 8\). Questi oggetti non si possono dividere fra i due zaini di capacità \(5\) e \(3\): il KP con la capacità totale dà solo un upper bound sul valore ottimo dell'MKP.