Provare una variante di Zaino in cui le regole sono
- Ogni oggetto che prendi deve essere inserito completamente nella borsa
- Le metriche utilizzabili della borsa sono lunghezza (l), larghezza (w), altezza (h) e si può presumere che se i prodotti si inseriscono nella borsa sia singolarmente che insieme per volume totale, c'è un modo per impacchettarli in
- Il valore del prezzo deve essere massimizzato
- Il peso deve essere ridotto al minimo senza compromettere il valore in dollari
L'input è fondamentalmente un elenco di elementi con l, w, h, valore in dollari e peso. Sembra che ci siano molti parametri oltre alle normali varianti dello zaino. Quello che sto facendo è eliminare prima tutti i prodotti che non si adattano al sacchetto (volume e dimensioni). Quindi eseguo la logica dello zaino normale (calcolando se ciascun elemento appartiene o no alla borsa) in base al volume e al prezzo utilizzando lo pseudo codice DP comune
if (volume[i] > V) {
return knapsack(i-1, V);
} else {
return Math.max(knapsack(i-1, V), knapsack(i-1, V - volume[i]) + values[i]);
}
Questo sembra andare in tilt considerando che il massimo l, w, h della borsa è come 40, 40, 40. (Quindi il volume è 64000) e il numero di elementi è sul tono di 16k. (Errore di memoria esaurita Java). Provare Branch e Bound (non sono sicuro se correttamente)
Un altro modo subottimale che ho provato è quello di utilizzare l'euristica in base al rapporto valore / peso e quindi prendere il miglior adattamento del volume. Un altro modo sarebbe quello di trovare tutti i possibili modi di imballaggio e quindi scegliere il miglior adattamento del peso (ma anche in questo caso sarebbe iper esponenziale)
Come risolvere questo?