/* file: knapsack_glpk_mod_with_ampl_data.txt date: 6-April-2015 author: Romeo Rizzi (romeo.rizzi@univr.it) Questo modello GMPL e' stato creato da Romeo Rizzi (romeo.rizzi@univr.it) coi seguenti scopi didattici: - introdurre alla modellazione matematica come strumento operativo. - modellare un nostro problema trovando riferimento in meta-modelli classici della ricerca operativa: zaino (knapsack) e subset sum. - qui nello specifico (questo file ha dei fratelli sostanzialmente identici, solo coniugati con riferimento ad altri linguaggi di modellazione matematica), introduciamo all'uso del GNU Modeling Programming Language (GMPL, http://en.wikibooks.org/wiki/GLPK). In fondo a questo file troverai le semplici istruzioni su come utilizzare o testare questo file, dove ottenere informazioni su GLPSOL, come eventualmente installartelo (software libero) e come validarne l'installazione tramite questo stesso file. Ma torniamo alla nostra proposta didattica ... Problema target del presente esempio: Voglio masterizzarmi un CD di brani musicali. Ogni canzone richiede una certa quantita' di memoria, ed il CD ha una capacita' fissata. Voglio scegliere le canzoni al meglio, in modo da massimizzare il valore totale delle canzoni masterizzate sul CD. */ # questa e' una riga di commento grazie al cancelletto (#) che nega al parser di AMPL l'accesso ai successivi caratteri della rigam /* questa e la seguente sono: 2 righe di commento (con un soluzione che se guardi e' stata gia' adottata piu' sopra per l'autopresentazione del presente file) */ # Size of knapsack param CD_DIM; set BRANI; param VALORE{BRANI}; param INGOMBRO{BRANI}; # Assignment var scelgo{BRANI}, binary; maximize ValoreTotaleDelCD: sum{i in BRANI} VALORE[i]*scelgo[i]; s.t. StarciDentro: sum{i in BRANI} INGOMBRO[i]*scelgo[i] <= CD_DIM; solve; printf "VALORE TOTALE DEL CD = %d\n", ValoreTotaleDelCD; printf "INGOMBRO TOTALE = %d\n", sum{i in BRANI} INGOMBRO[i] * scelgo[i]; printf "DIMENSIONE DEL CD = %d\n", CD_DIM; printf "SPAZIO INUTILIZZATO DEL CD = %d\n", CD_DIM - sum{i in BRANI} INGOMBRO[i] * scelgo[i]; display scelgo; printf "Consigliamo di masterizzarti un CD con i seguenti brani:\n"; printf {i in BRANI: scelgo[i] == 1} " %s,", i; printf "\n"; data; # Capacita' del CD param CD_DIM := 64; # BRANI musicali tra cui scegliere quelli da masterizzare param: BRANI: VALORE INGOMBRO := 1 10 10 2 10 10 3 15 15 WeWillRockYou 20 20 TheSoundOfSilence 20 20 StilleNacht 24 24 JingleBells 24 24 HellsBells 50 50; # indice/nome, ingombro, valore end; /* Come utilizzare/testare questo file: lancia questo modello attraverso GLPSOL (http://en.wikibooks.org/wiki/GLPK). $ glpsol --math knapsack_glpk_mod_with_ampl_data.txt Se funziona, otterrai il consiglio di masterizzare le seguenti canzoni: WeWillRockYou, TheSoundOfSilence, StilleNacht Oppure puoi laciare il modello su file di dati esterno (in questo caso i dati interni vengono ignorati/sovrascritti) $ glpsol -m knapsack_glpk_mod_with_ampl_data.txt -d knapsack_ampl_dat.txt In questo secondo caso, se funziona, otterrai il consiglio di masterizzare le seguenti canzoni: Roxane, HeyJude, HellsBells, MyWay. */