/* file: knapsack_ampl_mod.txt date: 4-April-2015 author: Romeo Rizzi (romeo.rizzi@univr.it) - WARNING: questo file fa pezzo unico con altri due files per comporre un unico tris: knapsack_ampl_mod.txt knapsack_ampl_dat.txt knapsack_ampl_run.txt Il tris implementa un modello AMPL 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 dell'Algebraic Modeling Programming Language (AMPL, http://ampl.com/). In fondo a questo file troverai le semplici istruzioni su come utilizzare o testare questo file, dove ottenere informazioni su AMPL, come eventualmente installartelo (software libero) e come validarne l'installazione tramite questo stesso file. Ma torniamo alla nostra proposta didattica ... Problema target: 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 riga /* 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) */ set BRANI; # Insieme delle etichette (nomi, identificatori) per i brani musicali param CD_DIM integer, >= 1; # Capacita' del CD param VALORE{BRANI} >= 0; # Valore delle canzoni (domanda aperta: si potra' mai definire perche' una canzone mi piace?) param INGOMBRO{BRANI} >= 0; # Quantita` di memoria richiesta da ogni singola canzone var scelgo{BRANI} binary; # introduciamo una variabile di scelta binaria per ogni brano, essa vale 1 se masterizziamo il brano, 0 altrimenti # Definizione della funzione obiettivo: massimizzare il "valore" totale maximize ValoreTotaleDelCD: sum{i in BRANI} VALORE[i] * scelgo[i]; # se invece io volessi minimizzare lo spazio vuoto lasciato sul CD: minimize SpazioResiduo: CD_DIM - sum{i in BRANI} INGOMBRO[i] * scelgo[i]; # vincolo dettato dalla capacita` del CD subject to StarciDentro: sum{i in BRANI} INGOMBRO[i] * scelgo[i] <= CD_DIM; data; # apertura della sezione con i dati specifici d'istanza # volendo potremmo proseguire qui con i dati specifici dell'istanza. # Tuttavia, e' di gran lunga preferibile porre questi dati specifici ad una particolare istanza in un file di descrizione dell'istanza, del tutto separato. Volendo, sarebbe poi possibile includere tale file decommentando la seguente riga: #data knapsack_ampl_dat.txt; # che tuttavia preferiamo tenere commentata per rendere del tutti intecambiabili i nostri file, e per facilitare eventuali sottomissioni a solutori online. # allo stesso modo, anche se potremmo metterle qui, direttamente in questo file (come fatto nel file knapsack_ampl_all.txt), preferiamo includere da file separato le istruzione per lanciare il Solutore (CPLEX, Gurobi, GLPK, Matlab, Octave) # come anche le istruzioni per visualizzare e rappresentare la soluzione in modo efficace # o per guidare analisi di postottimalita' e/o di revisione del modello. # Anche in questo caso, volendo, sarebbe poi possibile includere tale file decommentando la seguente riga: #include knapsack_ampl_run.txt; /* Come utilizzare/testare questo file: 1. utilizzare/testare questo file senza installarsi AMPL: puoi sottomettere questi files ad uno dei due seguenti servizi online: 1.1. a un solutore di MIPs tra quelli listati alla pagina: http://www.neos-server.org/neos/solvers/ ad esempio al solutore Gurobi con formato di interfaccia in AMPL: http://www.neos-server.org/neos/solvers/milp:Gurobi/AMPL.html sottomettendo il presente file knapsack_ampl_mod.txt (come file .mod) insieme al suo file di corredo: knapsack_ampl_dat.txt (come file .dat) otterrete in risposta che: optimal solution; objective 128 Objective = ValoreTotaleDelCD se volete ottenere un output piu' informativo, allora dovete scrivervi un vostro file .run od adattare il nostro knapsack_ampl_run.txt rimuovendo o commentando le righe in cui si specifica il Solutore da utilizzare (il Solutore va scelto a livello del sito NEOS). Una caratteristica davvero notevole di questo sito e' che esso offre la possibilita' di sperimentare anche modelli e Solutori di varie forme di programmazione non-lineare. 1.2. al servizio offerto dal sito ufficile di AMPL: http://ampl.com/cgi-bin/ampl/amplcgi questo secondo servizio risulta piu' veloce nel rispondere ed anche piu' "interattivo", ma come Solutore devi selezionare lpsolve se vuoi che non ignori i vincoli di interezza. 2. lancia questo modello sulla tua installazione locale di AMPL istanziando il seguente comando: $ ampl knapsack_ampl_mod.txt knapsack_ampl_dat.txt knapsack_ampl_run.txt oppure: $ ampl knapsack_ampl_all.txt In queso caso, devi assicurarti che il Solver impostato sia tra quelli previsti dalla tua installazione locale di AMPL, e gestisca i vincoli di interezza. Ad esempio, se hai installato la versione demo di AMPL puoi riferirti a cplex introducendo (o decommentando) la riga: option solver cplex; ed eliminando (o commentando) le eventuali righe ove vengano impostati altri solvers. Se la tua installazione di AMPL funziona, otterrai il consiglio di masterizzare le seguenti canzoni: Roxane, HeyJude, HellsBells, MyWay occupando 32/33 della capacita' totale del CD e realizzando un valore totale di 128. */