Comandi AMPL
File.mod
AMPLFile.mod serve per scrivere il modello nel modo generale. In questo file si dichiarano e effettuano le definizioni di insiemi e parametri. In AMPL basta scrivere il comando: model <PATH> \nome_file.mod
File.run
File.run è un file che contiene i comandi da dare, senza doverli digitare più volte. In genere il primo comando è che cancella i dati relativi ad un modello precedente: include <PATH> \nome_file.run
File.dat
File.dat contiene i dati del problema. Nel file dei dati si effettuano le dichiarazioni: data <PATH> \nome_file.dat
Insiemi
Gli insiemi si creano nel file.mod mediante l’istruzione:
- set Prodotti;
- set Risorse;
Con la quale si creano due insiemi di un numero imprecisato di elementi.
Parametri
Per definire i parametri si usano le seguenti istruzioni:
- param q_max{Risorse} >= 0; (Definisce un vettore di parametri con tante componenti quanti sono gli elementi dell’insieme Risorse e definisce le quantità massime disponibili di ciascuna risorsa; il >=0 specifica che i valori immessi devono essere non negativi, AMPL eseguirà autonomamente il controllo sui dati);
- param richiesta{Risorse, Prodotti} >= 0; (Definisce una matrice di parametri con tante righe quanti sono gli elementi di Risorse e quante colonne quanti sono gli elementi di Prodotti, specificando per ogni prodotto la quantità di risorsa necessaria alla sua realizzazione);
- param prezzo{Prodotti} >= 0; (Definisce un vettore di parametri con tante componenti quanti sono gli elementi di Prodotti specificando il prezzo per ogni prodotto).
Esempio di problema
F.O.= maximize profitto: sum{i in Prodotti} prezzo[i]*x[i];
Vincoli = s.t. vincolo_risorsa {j in Risorse}: sum{i in Prodotti} richiesta[j,i]*x[i] <= q.max[j]; (Con questo vincolo si definiscono tanti vincoli quanti sono gli elementi di Risorse).
Dichiarazione di insiemi
La dichiarazione di un insieme generico va fatta nel file.mod: set NomeInsieme;
L’assegnazione di un insieme generico va fatta nel file.dat: set NomeInsieme := e1 e2 e3; In questo caso l’insieme ha 3 elementi.
Si possono definire anche insiemi:
- Ordinati: set NomeInsieme ordered;
- Numerici: set NomeInsieme := 1 ... N; (Tutti i numeri interi tra 1 e N)
- Distanti: set NomeInsieme := 1 ... N by p; (Tutti i numeri interi tra 1 e N distanti tra loro p numeri)
- Ordinati e ciclici: set NomeInsieme circular;
La dichiarazione per gli insiemi numerici è di fatto un’assegnazione quindi non va ripetuta nel file.dat.
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 insiemi multidimensionali è 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: per dichiarare 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 all’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.