vuoi
o PayPal
tutte le volte che vuoi
Operatori tra insiemi generici:
A union B : insieme di elementi che stanno in A o in B;
A inter B : insieme di elementi che stanno sia in A che in B;
A within B : A sottoinsieme di B;
A diff B : insieme di elementi che stanno in A ma non in B;
A symdiff B : insieme di elementi che stanno in A o in B ma non in entrambi;
card(A) : numeri di elementi che stanno in A.
Operatori per un insieme ordinato A:
first(A) : primo elemento di A;
last(A) : ultimo elemento di A;
next(a,A) : elemento di A dopo a;
prev(a,A) : elemento di A prima di a;
next(a,A,k) : k-esimo elemento di A dopo a;
prev(a,A,k) : k-esimo elemento di A prima di a;
ord(a,A) : posizione di a in A;
ord0(a,A) : come ord(a,A) ma restituisce 0 se a non è in A;
member(k,A) : elemento di A in k-esima posizione.
Insiemi multidimensionali:
Nel file.mod: set INSIEME dimensione p;
Si usa per indicare che l'insieme INSIEME è costituito da p-uple ordinate, ovvero i suoi elementi sono della forma (a1,a2,...ap). Un altro modo per creare
insiemimultidimensionali è l'utilizzo del prodotto cartesiano che si indica con cross
. Esempio: set TERNE := A cross B cross C; che indica l'insieme delle terne ordinate (a,b,c) con a appartenente ad A, b a B e c a C.
L'operazione inversa del prodotto cartesiano è setof
: esempio precedente per ottenere A, B e C: set A := setof{(i,j,k) in TERNE} i; set B := setof{(i,j,k) in TERNE} j; set C := setof{(i,j,k) in TERNE} k;
Si possono definire insiemi anche in modo implicito, senza specificarne il nome: {A,B} {a in A, b in B} Sono due espressioni equivalenti per definire il prodotto cartesiano tra A e B.
Un altro esempio: {a in A: costo[a]>=5} (sta ad indicare tutti gli elementi di A che hanno un costo>=5, con costo=parametro indicizzato sull'insieme A).
PARAMETRI: i parametri rappresentano i dati del problema. Una volta assegnati (nel file.dat) non vengono più modificati dal solutore. Un parametro deve essere dichiarato nel file.mod e assegnato nel file.dat.
Esempio: perdichiarare il parametro T nel file.mod:<param> T;
Ma è possibile dichiarare anche vettori e matrici di parametri. Esempio:
<param> costi{PROD};
<param> domanda{PROD,ZONA,1...T};
(Definisce un parametro a 3 dimensioni domanda, indicizzato dagli PROD,ZONA ed
dall'insieme dei numeri interi che vanno da 1 a T).
Esempio di assegnazione nel file.dat:
<param> T := 2;
<param> costi :=
p1 5
p2 4;
<param> prezzo : z1 z2 :=
p1 2 7
p2 5 9
<param> domanda :=
OPPURE
<param> :domanda :=
[*,*,1] : z1 z2 := p1 z1 110 P1 10 15 p1 z2 115 P2 12 22;
.......
Scrivere i dati in colonna è solo una questione di leggibilità. In AMPL non sono
richieste particolari formattazioni. I ':' sono obbligatori se si assegnano valori
a due o più vettori di parametri monodimensionali indicizzati sullo stesso
insieme (esempio in prezzo e domanda).
Nelle dichiarazioni di parametri (file.mod) si possono anche includere restrizioni
sui parametri stessi. Esempio:
<param> T >0;
<param> N integer, <=
T;Esiste anche un'istruzione check per effettuare controlli contenenti espressioni logiche. Esempio:
set PROD;
param offertatot >0;
param offerta {prod} >0;
check : sum{p in PROD} offerta [p]=offertatot;
Inoltre c'è la possibilità di dichiarare parametri 'calcolati':
param offertatot:= sum{p in PROD} offerta [p];
VARIABILI: rappresentano le incognite del problema e il loro valore è calcolato dal solutore. Una volta che la soluzione è stata determinata, il valore delle variabili all'ottimo rappresenta la soluzione del problema. Differenza con i parametri: questi vengono assegnati dall'utente e restano costanti; le variabili invece cambiano durante le iterazioni del solutore. Si possono tuttavia assegnare valori iniziali alle variabili. Tali valori saranno poi modificati dal solutore. La dichiarazione delle variabili è obbligatoria. Per default una variabile reale intera binaria è considerata, oppure può esserespecificata o ({0,1}).var x;
var n integer;
var d binary;
Anche le variabili possono essere indicizzate da insiemi:
var num{PROD} integer;
var assegnamento{PROD,OPERAI} binary;
Anche per le variabili si possono introdurre controlli:
var x>=0;
var quantita{p in PROD} >=0, <= dom[p];
Si possono fissare le variabili ad un valore mediante l’istruzione fix che può essere usata nel file.dat o nel file.run . Esempio:
fix x := 4;
In tal caso il solutore non modificherà il valore di x che resterà fisso a 4. Per sbloccare una variabile si usa il comando unfix :
unfix x;
Infine c’è la possibilità di inizializzare una variabile ad un determinato valore, che verrà poi cambiato dal solutore, attraverso il comando let (nel file.dat o nel file.run) :
let x:= 10;
FUNZIONE OBIETTIVO: deve essere specificata nel file.mod. La parola chiave per introdurla è maximize o minimize. La sintassi é:
maximize nome_funzione_obiettivo :
espressione_aritmetica;minimize nome_funzione_obiettivo : espressione_aritmetica;
VINCOLI: sono specificati nel file.mod e sono introdotti da subject to oppure s.t. . La sintassi è:
subject to nome_vincolo : espressione_aritmetica e/o logica;
Anche i vincoli possono essere indicizzati. Esempio:
subject to vincoli{j in REPARTI} : sum{i in PROD} orelavoro[i,j]*x[i] <= maxore[j];
In questo modo con un unico vincolo si scrivono tanti vincoli quanti sono gli elementi di REPARTI.
Con la scrittura indicizzata non si incorre in errori nel caso in cui dovessero cambiare dei dati nel file.dat .
ESPRESSIONI:
FUNZIONI:
abs(x) : valore assoluto di x;
sin(x) / cos(x) / tan(x) / asin(x) / acos(x) / atan(x)
exp(x)
sqrt(x) : radice quadrata di x;
log(x) : logaritmo naturale di x (ln(x));
log10(x) : logaritmo base 10 di x;
ceil(x) : parte intera superiore di x;
floor(x) : parte intera inferiore di x.
OPERATORI ARITMETICI: LOGICI:
^ : potenza
not : negazione logica
+ or : "or" logico
- and
“and” logico* : moltiplicazione
exists :quantificatore esistenziale logico/ : divisione
forall :quantificatore universale
logicodiv : divisione intera
if then else :espressione condizionale
mod : modulo
sum : sommatoria
prod : produttoria
min : minimo
max : massimo
>, >= : maggiore, maggiore o uguale
<,<= : minore, minore o uguale
= : uguale
<>, != : diverso
COMANDO OPTION: serve per visualizzare o cambiare il valore delle opzioni. Le opzioni sono variabili di stato dell’ambiente AMPL. Ciascuna di esse ha un nome e un valore che può essere un numero o una stringa di caratteri. Sul prompt dei comandi l’istruzione option; serve per visualizzare il valore delle variabili di stato. Il comando option accetta una “wild card” che è rappresentata dal carattere ‘*’ ed è utilizzato per rappresentare qualsiasi stringa. Esempio: con option presolve*; si otterrà una lista di tutte le opzioni il cui nome inizia per
Il comando option
permette di visualizzare e modificare le opzioni del sistema. Utilizzando option nomeopzione
si visualizza il valore di una determinata opzione (in questo caso l'opzione nomeopzione). Per modificare il valore dell'opzione nomeopzione si utilizza il comando option nomeopzione nuovovalore
. Ad esempio, option solver cplex
imposta il valore di solver su cplex.
N.B. Il comando option
non controlla subito che il valore assegnato abbia senso o meno; un messaggio di errore si avrà solo in fase di esecuzione.
Per riportare tutte le opzioni al valore di default si utilizza il comando reset options
.
Alcune opzioni frequenti sono:
- solver: specifica il solutore. Ha un suo valore di default e può essere cambiato utilizzando il nome degli altri solutori.
- presolve: specifica le opzioni del processamento, un'operazione che AMPL può effettuare allo scopo di ridurre il problema, ad esempio eliminando vincoli ridondanti o fissando valori di alcune variabili. Il valore di default è 10. Per inibire il processamento si utilizza il valore 0.
Sufficiente assegnare valore 0 a presolve.show_stats
: specifica il livello di dettaglio delle informazioni sul problema e sulla soluzione che devono essere visualizzate. Il valore di default è 0, in corrispondenza del quale vengono visualizzate informazioni minime. Assegnando il valore 1 o superiori a show_stats
aumenta il livello di dettaglio delle informazioni visualizzate.
COMANDO DISPLAY: si utilizza per visualizzare oggetti presenti nel modello come ad esempio gli elementi di un insieme, il valore delle variabili, dei parametri, della f.o., dei vincoli. Per visualizzare il valore di un oggetto (esempio di nomeoggetto
): display nomeoggetto;
Dopo il comando display
possono anche essere elencati un certo numero di oggetti da visualizzare separati dalla virgola. Possono anche essere utilizzate espressioni algebriche o logiche. Esempio: display {i in tipi} x[i,1,"nov"];
display sum{i in tipi, j in linee, k in mesi} costo_materiale_grezzo[i]*x[i,j,k];
display {i in tipi, k in mesi :
x[i,1.k]> 100};
L'uso dei ":" può essere introdotto nei costrutti logici con il significato di "taleche".
Le opzioni del comando display riguardano la formattazione delle informazioni da visualizzare e l'approssimazione utilizzata nell'arrotondamento dei valori numerici da visualizzare.
È molto utile poter reindirizzare l'output dei comandi in un file nel quale conservare tale output. In questo modo si può facilmente memorizzare la soluzione ottima e altre informazioni.
Per creare un file testo di output nomefile.out nel quale reindirizzare l'output del comando display è sufficiente il comando:
display oggetto > nomefile.out;
In questo modo viene creato o eventualmente sovrascritto (se esiste) il file nomefile.out nel quale verrà scritto l'output del comando. Se si vogliono 'appendere' altri output al file:
display oggetto2 >> nomefile.out;
AMPL permette di visualizzare, oltre la
soluzione ottima (se esiste) anche iprezzi ombra, i costi ridotti associati alla soluzione ottima. Per visualizzare tali elementi basta aggiungere dei suffissi al nome della variabile. Esempio: display x.lb
, x.ub
; per visualizzare upper e lower bound di x. display x.slack
; per visualizzare la differenza tra il valore della variabile e il più vicino bound. display vinc.lb
, vinc.body
, vinc.ub
; per visualizzare il lower e l'upper bound e il valore della parte variabile di un vincolo. display vinc.slack
; come sopra ma per il vincolo.