Anteprima
Vedrai una selezione di 4 pagine su 13
Riassunto dei comandi di AMPL Pag. 1 Riassunto dei comandi di AMPL Pag. 2
Anteprima di 4 pagg. su 13.
Scarica il documento per vederlo tutto.
Riassunto dei comandi di AMPL Pag. 6
Anteprima di 4 pagg. su 13.
Scarica il documento per vederlo tutto.
Riassunto dei comandi di AMPL Pag. 11
1 su 13
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

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ò essere

specificata 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.

Dettagli
Publisher
A.A. 2018-2019
13 pagine
SSD Scienze matematiche e informatiche MAT/09 Ricerca operativa

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Ludo.97 di informazioni apprese con la frequenza delle lezioni di Ricerca operativa e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Roma La Sapienza o del prof Grani Giorgio.