Il problema dello zaino

Похожие документы
Esercizi di Algoritmi e Strutture Dati

Programmazione in Python. Moreno Marzolla

Alberi Bilanciati di Ricerca

Alberto Montresor Università di Trento

Programmazione Procedurale in Linguaggio C++

Alberi Binari di Ricerca

Algoritmi di Visita di Grafi. Damiano Macedonio

Il problema dello zaino

Problemi dello zaino e di bin packing

Algoritmi greedy. Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione

Algoritmi e Strutture Dati

Programmazione Orientata agli Oggetti in Linguaggio Java

Algoritmi e Strutture Dati

Tabelle hash. Damiano Macedonio Università Ca' Foscari di Venezia.

Programmazione Orientata agli Oggetti in Linguaggio Java

Grafi. Moreno Marzolla Dip. di Informatica Scienza e Ingegneria Università di Bologna. moreno.marzolla@unibo.it

Programmazione Orientata agli Oggetti in Linguaggio Java

Algoritmi e Strutture Dati (Mod. B) Algoritmi Greedy (parte I)

Reti di calcolatori Introduzione al corso

Basi territoriali e numeri civici come infrastrutture informative per il censimento e oltre

Informatica II. Capitolo 16 Backtrack

Note per la Lezione 6 Ugo Vaccaro

Programmazione Orientata agli Oggetti in Linguaggio Java

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

Esercitazione 10 Algorithmi e Strutture Dati (Informatica) A.A 2015/2016

Architettura dei calcolatori. Moreno Marzolla

2.3 Cammini ottimi. E. Amaldi Fondamenti di R.O. Politecnico di Milano 1

Esercizi di Algoritmi e Strutture Dati

Programmazione Orientata agli Oggetti in Linguaggio Java

Metodi di Ottimizzazione per la Logistica e la Produzione

Programmazione dinamica

Sommario. Introduzione Architettura Client-Server. Server Web Browser Web. Architettura a Due Livelli Architettura a Tre Livelli

Programmazione Orientata agli Oggetti in Linguaggio Java

Mappatura dei canali logici sui canali fisici

LibreOffice Calc. Moreno Marzolla

Alberto Montresor Università di Trento

Programmazione Procedurale in Linguaggio C++

Introduzione alla rete Internet

Branch-and-bound per KNAPSACK

Programmazione Orientata agli Oggetti in Linguaggio Java

Problemi, istanze, soluzioni

Algoritmi e strutture dati. Analisi di algoritmi Funzioni di costo, notazione asintotica

Programmazione Procedurale in Linguaggio C++

Introduzione alla rete Internet

Introduzione alle Reti Telematiche

Tecnologie di Sviluppo per il Web

Introduzione alla rete Internet

Programmazione a blocchi. Algobuild Prof. Sergio Roselli

ALGORITMI DI OTTIMIZZAZIONE M Esercizi Parte I

PROBLEMA DELLO ZAINO DI VALORE MASSIMO

Il problema dello zaino: dalla gita in montagna ai trasporti internazionali. Luca Bertazzi

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

10 STRUTTURE DI CONTROLLO REPEAT E WHILE. Strutture di controllo e variabili strutturate

Tecnologie di Sviluppo per il Web

GIUSEPPE DI GRANDE CORSO DI FORMAZIONE SU BIBLOS

Programmazione Orientata agli Oggetti in Linguaggio Java

Sicurezza e Crittografia

2.2 Alberi di supporto di costo ottimo

PROGRAMMAZIONE DINAMICA

Parte V: Rilassamento Lagrangiano

Cenni di apprendimento in Reti Bayesiane

Esercizi di Algoritmi e Strutture Dati

COORDINATOMETRO E MAPPE GEOREFERENZIATE

Транскрипт:

Il problema dello zaino (knapsack problem) Damiano Macedonio mace@unive.it

Copyright 2010 2012 Moreno Marzolla, Università di Bologna (http://www.moreno.marzolla.name/teaching/asd2011b/) This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. Algoritmi e Strutture Dati 2

Problema dello zaino 0-1 Supponiamo di avere un insieme X composto da n oggetti etichettati con gli interi da 1 a n: {1, 2,..., n} L'oggetto i-esimo ha peso p[i] e valore v[i] Esiste una unica istanza di ciascun oggetto Disponiamo un contenitore in grado di trasportare al massimo un peso pari a P Vogliamo determinare un sottoinsieme Y X di oggetti, tale che Il peso complessivo degli oggetti in Y sia P Il valore complessivo degli oggetti in Y sia il massimo possibile Algoritmi e Strutture Dati 3

Definizione formale Vogliamo determinare un sottoinsieme Y X di oggetti tale che: x Y p x P e tale da massimizzare il valore complessivo: x Y v x Algoritmi e Strutture Dati 4

Approccio greedy #1 Ad ogni passo, scelgo tra gli oggetti non ancora nello zaino quello di valore massimo, tra tutti quelli che hanno un peso minore o uguale alla capacità residua dello zaino Algoritmi e Strutture Dati 5

Esempio 15 / 10Kg 20 / 8Kg 20Kg 15 / 10Kg 20 / 8Kg 28 / 20Kg 28 / 20Kg La soluzione calcolata in questo esempio non è la soluzione ottima! Nota: questo algoritmo non fornisce sempre la soluzione ottima Algoritmi e Strutture Dati 6

Approccio greedy #2 Ad ogni passo, scelgo tra gli oggetti non ancora nello zaino quello di valore specifico massimo, tra tutti quelli che hanno un peso minore o uguale alla capacità residua dello zaino Il valore specifico è definito come il valore di un oggetto diviso il suo peso Algoritmi e Strutture Dati 7

Esempio 20Kg 20 / 8Kg 15 / 10Kg 15 / 10Kg 20 / 8Kg 1.5 2.5 28 / 20Kg 1.4 28 / 20Kg 1.4 In questo esempio, l'algoritmo greedy #2 calcola la soluzione ottima, ma... Algoritmi e Strutture Dati 8

Esempio 20Kg 33 / 11Kg 9Kg 15 / 10Kg 1.5 15 / 10Kg 1.5 20 / 10Kg 2.0 20 / 10Kg 2.0 33 / 11Kg 3.0...in questo altro esempio anche l'algoritmo greedy #2 non produce la soluzione ottima Algoritmi e Strutture Dati 9

Soluzione ottima basata sulla Programmazione Dinamica Questa soluzione funziona esclusivamente se i pesi sono numeri interi Sia V[i, j] il massimo valore ottenibile da un sottoinsieme degli oggetti {1, 2,... i} in uno zaino che ha capacità massima j i=1, 2,...n j=0, 1,...P Algoritmi e Strutture Dati 10

Soluzione ottima basata sulla Programmazione Dinamica Sia V[i, j] il massimo valore ottenibile da un sottoinsieme degli oggetti {1, 2,..., i} in uno zaino che ha capacità massima j V[i, 0] = 0 per ogni i=1..n Se il peso massimo è zero, il valore è sempre zero V[1, j] = v[1] se j p[1] C'è abbastanza spazio per l'oggetto numero 1 V[1, j] = 0 se j < p[1] Non c'è abbastanza spazio per l'oggetto numero 1 Algoritmi e Strutture Dati 11

Soluzione ottima basata sulla Programmazione Dinamica Per calcolare V[i, j] distinguiamo due casi Se j<p[i] significa che l'i-esimo oggetto è troppo pesante per essere contenuto nello zaino. In tal caso V[i, j] = V[i-1, j] Se j p[i] possiamo scegliere la migliore tra le seguenti possibilità Inserire l'oggetto i-esimo nello zaino. Lo spazio residuo è j-p[i], il valore massimo ottenibile in questa ipotesi è V[i-1, j-p[i] ]+v[i] Non inserire l'oggetto i-esimo nello zaino. Il valore massimo ottenibile in questa ipotesi è V[i-1, j] Scegliendo la migliore delle possibilià, possiamo dire V[i, j] = max{ V[i-1, j], V[i-1, j-p[i] ]+v[i] } Algoritmi e Strutture Dati 12

Soluzione ottima basata sulla Programmazione Dinamica Riassumendo V [i 1, j] V i, j ={ max {V [i 1, j],v [i 1, j p[i]] v [i]} se j p[i] se j p[i] V[i-1, j-p[i] ] v[i] j-p[i] Kg p[i] Kg Algoritmi e Strutture Dati 13

i 1 2 3 4 Tabella di programmazione dinamica / matrice V p =[ 2, 7, 6, 4 ] v = [, 6.4, 1.7, 0.3] j 0 1 2 3 4 5 6 7 8 9 10 13.0 13.0 14.4 14.4 19.1 19.1 19.1 19.1 19.1 19.1 Algoritmi e Strutture Dati 14

i 1 2 3 4 Tabella di programmazione dinamica / matrice V p =[ 2, 7, 6, 4 ] v = [, 6.4, 1.7, 0.3] j 0 1 2 3 4 5 6 7 8 9 10 13.0 13.0 14.4 14.4 19.1 19.1 19.1 19.1 19.1 19.1 V 3,8 =max {V 2,8,V 2,8 p[3] v [3]} =max {,14.4 } Algoritmi e Strutture Dati 15

Stampare la soluzione Il massimo valore che è possibile inserire nello zaino rispettando il vincolo di peso massimo è contenuto nella cella V[n, P] della tabella di programmazione dinamica Come facciamo a sapere quali oggetti fanno parte della soluzione ottima? Usiamo una tabella ausiliaria booleana K[i, j] che ha le stesse dimensioni di V[i, j] K[i, j] = true se e solo se l'oggetto i-esimo fa parte della soluzione ottima che ha valore complessivo V[i, j] Algoritmi e Strutture Dati 16

Tabella di programmazione dinamica / stampa soluzione ottima d := P; i := n; while( i>0 ) do if ( K[i,d] == true ) then stampa Seleziono oggetto i d := d-p[i]; endif i := i-1; endwhile p =[ 2, 7, 6, 4 ] v = [, 6.4, 1.7, 0.3] 0 1 2 3 4 5 6 7 8 9 10 1 2 3 4 F F T T T T T T F F F F F F F F F F F F F F F F F F F F F F F T T Algoritmi e Strutture Dati 17 T T T T T T F F F F F