cerca
Ricerca Operativa - PLI - 15 giugno 2004
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Uni.RP-PLI-15giugno2004 History

Hide minor edits - Show changes to output

Added lines 88-90:

!!!Discussione su unicità e ottimalità
Risolvendo il problema, Lingo ci dice che è arrivato al Global Optimum. Ne siamo felici. Per quanto riguarda l'unicità, Lingo non ci dice nulla, e la soluzione del professore dice che non si sa niente dell'unicità, e pertanto dichiariamo che non è necessariamente unica.
Deleted line 9:
[@
Changed lines 12-16 from:
Oggetto 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Valore 27 41 23 32 39 8 50 2 30 54 85 2 23 18 73 41 78 32 18 23 34 58 12 31 63 14 13 87 56 32
Volume 10 58 97 23 19 5 71 94 81 92 74 3 41 57 12 47 10 25 61 23 74 28 62 35 63 49 13 95 87 23
Penalty 34 59 87 34 40 29 84 67 53 48 53 85 37 49 85 37 90 57 62 34 75 88 43 75 93 75 39 58 37 6
to:
'''Oggetto''' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30\\
'''
Valore''' 27 41 23 32 39 8 50 2 30 54 85 2 23 18 73 41 78 32 18 23 34 58 12 31 63 14 13 87 56 32\\
'''
Volume''' 10 58 97 23 19 5 71 94 81 92 74 3 41 57 12 47 10 25 61 23 74 28 62 35 63 49 13 95 87 23\\
'''
Penalty''' 34 59 87 34 40 29 84 67 53 48 53 85 37 49 85 37 90 57 62 34 75 88 43 75 93 75 39 58 37 6
Changed line 18 from:
@]
to:
Added lines 1-91:
(:title Ricerca Operativa - PLI - 15 giugno 2004:)
%titolo%''':: Ricerca Operativa - PLI - 15 giugno 2004 ::'''

!!Testo
Nel problema di Knapsack (KP) si ha un insieme di oggetti dati, ciascuno con un valore ed un volume noti. Si ha uno zaino di capacità nota e si vuole scegliere un sottinsieme di oggetti tali che il volume complessivo degli oggetti scelti non ecceda la capacità dello zaino ed il valore complessivo degli oggetti scelti sia massimo.\\
Si consideri la seguente variante del problema, denominata “Penalized KP”, cioè problema di zaino con penalità: ad ogni oggetto è associata anche una penalità ed il valore della funzione obiettivo da massimizzare è i lvalore totale degli oggetti scelti meno la massima penalità tra quelle associate agli oggetti scelti.

Formulare il problema, classificarlo e risolverlo con i dati contenuti nel file PENALIZED KP.TXT. Discutere unicità e ottimalità della soluzione ottenuta.

[@
Gli oggetti sono 30.

Oggetto 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Valore 27 41 23 32 39 8 50 2 30 54 85 2 23 18 73 41 78 32 18 23 34 58 12 31 63 14 13 87 56 32
Volume 10 58 97 23 19 5 71 94 81 92 74 3 41 57 12 47 10 25 61 23 74 28 62 35 63 49 13 95 87 23
Penalty 34 59 87 34 40 29 84 67 53 48 53 85 37 49 85 37 90 57 62 34 75 88 43 75 93 75 39 58 37 6

La capacità disponibile è pari a 1000 unità di volume.
@]

!!Soluzione
!!!Dati
I dati che abbiamo sono:
* oggetti
** N = 30 : numero di oggetti
** valore'_i_', i = 1..N : valore dell'i-esimo oggetto
** volume'_i_', i = 1..N : volume dell'i-esimo oggetto
** penalita'_i_', i = 1..N : penalità dell'i-esimo oggetto
* maxvol = 1000 : massima capacità del sacco

!!!Variabili
Quello che dobbiamo decidere è quali oggetti mettere nel sacco e quali no. Per modellare ciò, usiamo una variabile binaria indicizzata con N elementi, i quali ci dicono se l'elemento è stato messo nel sacco, oppure no:

x'_i_', i=1..N: variabile binaria: 1 = l'oggetto è stato scelto, 0 no

!!!Funzione obiettivo
Come spiegato nel testo, voglio avere sì il massimo valore degli oggetti nel sacco, senza eccedere nel volume, ma a questo valore devo sottrarre la massima penalità tra quelle degli oggetti scelti.\\
Per fare un esempio, se ho scelto 10 oggetti e il valore complessivo è 503, e la penalità massima di questi oggetti è quella dell'oggetto 7, la quale vale 32, allora il mio massimo è 503 - 32 = 471.

max (SOMMA'_i_' x'_i_' * valore'_i_') - maxPenalità

Per definire bene la penalità, aggiungeremo dei vincoli.

!!!Vincoli
Il primo vincolo è quello sulla capacità: il volume di tutti gli oggetti selezionati non deve eccedere '''maxvol''':

SOMMA(x'_i_' * peso'_i_') <= maxvol, i = 1..N

La variabile x'_i_' è binaria, quindi l'oggetto non selezionato avrà la sua x'_i_' = 0, e siamo felici.

Poi, occorre vincolare la maxPenalità:

maxPenalita >= x'_i_' * penalita'_i_', i = 1..N

In questo modo, la maxPenalita sarà maggiore alla più alta penalità tra gli oggetti selezionati. Come sopra, la variabile x'_i_' ci assicura che solo gli oggetti selezionati verranno presi in considerazione (avranno x'_i_' = 1).

!!!Codice Lingo
[@
model:

sets:
oggetto /1..30/: volume, valore, penalita, x;
endsets

data:
valore = 27 41 23 32 39 8 50 2 30 54 85 2 23 18 73
41 78 32 18 23 34 58 12 31 63 14 13 87 56 32;
volume = 10 58 97 23 19 5 71 94 81 92 74 3 41 57 12
47 10 25 61 23 74 28 62 35 63 49 13 95 87 23;
penalita = 34 59 87 34 40 29 84 67 53 48 53 85 37 49 85
37 90 57 62 34 75 88 43 75 93 75 39 58 37 6;

maxvol = 1000;
enddata

!Funzione obiettivo;
max = @sum(oggetto(i): x(i) * valore(i)) - maxpenalita;

!Vincoli per definire maxpenalita;
@for(oggetto(i): maxpenalita >= x(i) * penalita(i));

!Vincolo sulla capacità;
@sum(oggetto(i): x(i) * volume(i)) <= maxvol;

! Binarietà di x;
@for(oggetto(i): @bin(x));
end
@]

----
[[Torna alla pagina di Ricerca Operativa -> Ricerca Operativa ]]