Appunti delle Esercitazioni di Ottimizzazione VO AMPL - IASI-CNR

Transcript

Appunti delle Esercitazioni di Ottimizzazione VO AMPL - IASI-CNR
Appunti delle Esercitazioni di Ottimizzazione V.O.
AMPL: A Mathematical Programming Language
a cura di G. Liuzzi∗
a.a. 2001-2002
1
Il problema del poligono di massima area
Fissato un numero nv di vertici, il problema che vogliamo trattare in questa sezione è
quello, molto comune p.es. nell’ingegneria meccanica, di determinare il poligono di diametro1
unitario avente area massima [6],[2].
Siano (ri , θi ) i = 1, . . . , nv , i vertici del poligono espressi in coordinate polari. Evidentemente, siccome ogni poligono è univocamente determinato mediante le coordinate dei suoi
vertici, queste sono le variabili di decisione del nostro problema.
Se immaginiamo di posizionare l’ultimo vertice del poligono, quello di coordinate (rnv , θnv )
nell’origine, ovvero imponendo (rnv , θnv ) = (0, π), e se facciamo l’ipotesi che gli angoli θi
siano ordinati dal più piccolo al più grande (vedi figura) ,
r3
r4
r2
r5
θ5 − θ4 θ4 − θ3
θ3 − θ2
θ2 − θ1
r1
θ1
possiamo esprimere l’area del poligono stesso mediante l’espressione
nv −1
1 ri+1 ri sin(θi+1 − θi ),
2 i=1
ovvero come somma delle aree degli nv − 1 triangoli (ciascuno con un vertice nell’origine) in
cui è possibile suddividere il poligono. Vediamo ora di formalizzare i vincoli del problema.
Anzitutto abbiamo i vincoli che impongono l’ordinamento sugli angoli, ovvero
θi ≤ θi+1
i = 1, . . . , nv − 1.
∗ [email protected],
1 Il
http://www.dis.uniroma1.it/∼liuzzi
diametro di un poligono è pari alla massima distanza tra due suoi vertici
1
In secondo luogo avremo un gruppo di vincoli che servono a garantire che i poligoni abbiano diametro non superiore ad uno. Quindi, richiamando la definizione di diametro di un
poligono tali vincoli sono
2
= ri2 + rj2 − 2ri rj cos(θi − θj ) ≤ 1
Di,j
i = 1, . . . , nv − 1 e j = i + 1, . . . , nv .
(1)
In realtà, stando alla descrizione del problema, avremmo dovuto considerare il seguente
(unico) vincolo
2 2
max
Di,j =
max
ri + rj2 − 2ri rj cos(θi − θj ) = 1.
i = 1, . . . , nv −1
j = i+1, . . . , nv
i = 1, . . . , nv −1
j = i+1, . . . , nv
Tuttavia, considerando il fatto che, comunque scelto un poligono di diametro inferiore ad
uno, ne esiste sempre uno, simile al primo ma con diametro esattamente pari ad uno, nel
precedente vincolo possiamo considerare il segno di minore o uguale anziché proprio di
uguale. A questo punto si capisce il perché della presenza dei vincoli (1). Infatti, piuttosto
2
che affermare che il massimo di Di,j
sia minore o uguale di 1, possiamo, equivalentemente
2
richiedere che ogni Di,j sia minore o uguale di 1.
Ci saranno poi dei vincoli che servono a fissare l’ultimo vertice nell’origine e cioè
rnv = 0,
θnv = π.
Infine aggiungiamo dei vincoli di box sulle variabili
0 ≤ ri ≤ 1, 0 ≤ θi ≤ π
i = 1, . . . , nv .
In AMPL2 [3] un file di modello per il problema sopra descritto è il seguente
polygon.mod
model;
param nv integer > 2;
param pi := 3.14159265358979;
# number of vertices in the polygon
# approximation of pi
var
r {i in 1..nv};
var theta {i in 1..nv};
# polar radius
# polar angle
maximize polygon_area:
0.5*sum{i in 1..nv-1} r[i+1]*r[i]*sin(theta[i+1] - theta[i]);
s.t.
r_bounds{i in 1..nv}: 0.0 <=
r[i]
<= 1.0;
s.t. theta_bounds{i in 1..nv}: 0.0 <= theta[i] <= pi;
s.t. fix_theta_nv: theta[nv] = pi;
s.t.
fix_r_nv:
r[nv] = 0.0;
s.t. ordered_theta{i in 1..nv-1}: theta[i] <= theta[i+1];
s.t. distance {i in 1..nv-1,j in i+1..nv}:
r[i]^2 + r[j]^2 - 2*r[i]*r[j]*cos(theta[j] - theta[i]) <= 1;
2 http://www.ampl.com
2
Notiamo che nel precedente file polygon.mod, il numero di vertici del poligono nv essendo
stato dichiarato come parametro, non ha ancora un valore fissato. Inoltre, non è stato
assegnato alcun punto iniziale per le variabili. Prima di poter risolvere il problema, è dunque
necessario specificare all’interprete AMPL quale valore attribuire ad nv e con quali valori
inizializzare le variabili. Un modo per completare queste operazioni, e poter quindi risolvere
il problema, consiste nello scrivere un file di dati (polygon.dat) come il seguente.
polygon.dat
# Largest-small polygon problem
data;
param nv := 3;
# Number of vertices
# Initial values
let {i in 1..nv-1} r[i] := 0.5;
let {i in 1..nv-1} theta[i] := pi*i/nv;
Per chiedere ad AMPL di risolvere il problema usando come solutore SNOPT [5], al prompt
dei comandi di AMPL dobbiamo digitare le seguenti istruzioni:
ampl:
ampl:
ampl:
ampl:
ampl:
reset;
model polygon.mod;
data polygon.dat;
option solver snopt;
solve;
Otteniamo il seguente output
SNOPT 6.1-1(4)(Jun 2001):
Optimal solution found.
10 iterations, objective 0.4330127026
Nonlin evals: obj = 8, grad = 7, constrs = 8, Jac = 7.
Per vedere quale è la soluzione trovata scriviamo al prompt di AMPL il seguente comando:
ampl: printf{i in 1..nv}: "%10.6f, %10.6f,\n",r[i]*cos(theta[i]),r[i]*sin(theta[i]);
3
che restituisce le coordinate cartesiane dei vertici del poligono trovato.
0.500000,
-0.500000,
0.000000,
0.866025,
0.866025,
0.000000,
Come si vede chiaramente anche nella figura, il poligono di area massima con tre vertici è,
come ci saremmo potuti ragionevolmente aspettare, un triangolo equilatero.
Provando a risolvere il problema con nv = 9 , e quindi modificando solo la definizione del
parametro nv nel file di dati polygon.dat, otteniamo la soluzione riportata in figura.
È interessante notare come, all’aumentare del numero dei vertici del poligono, la soluzione
ottima tenda ad una circonferenza di diametro unitario.
Lo studente provi, modificando il file polygon.dat, a cambiare il punto iniziale e/o il numero dei vertici del poligono, tenendo presente che, per le limitazioni imposte sulla versione
studenti di AMPL, non è possibile risolvere questo problema quando nv sia superiore a 24.
2
Problema di localizzazione
Consideriamo il seguente problema (svolto nella esercitazione del 27 Settembre u.s.). Di
seguito, per comodità, riportiamo nuovamente la descrizione verbale del problema di localizzazione in esame.
Una compagnia petrolifera si rifornisce di greggio in tre città portuali, che indicheremo con
A, B, C. Il porto B è ubicato 300Km ad Est e 400Km a Nord del porto A, mentre il porto
C è situato 400Km ad Est e 100Km a Sud del porto B. La compagnia intende costruire una
nuova raffineria per il greggio, ed intende localizzare questo nuovo impianto in modo tale da
minimizzare la quantità totale di tubi occorrenti per collegare la raffineria ai porti A, B e
C. Inoltre, per ragioni territoriali, non è possibile situare la raffineria né a Sud del porto A
né entro un raggio di 360Km dallo stesso.
Al fine di formulare matematicamente il problema di localizzazione in esame, fissamo un sistema di coordinate cartesiane con origine nel porto A. Pertanto i tre porti avranno, in questo
sistema di riferimento, le seguenti coordinate: A(0, 0), B(3, 4), C(7, 3). Ora indichiamo con
x e y le coordinate del punto in cui dislocare la raffineria r. Un modello matematico che
rappresenti il problema in esame è, ad esempio, il seguente
4
min
x,y
x2 + y 2 + (x − 3)2 + (y − 4)2 + (x − 7)2 + (y − 3)2
x2 + y 2 ≥ 3.62
y ≥ 0.
(2)
A questo punto passiamo a vedere come trascrivere il modello matematico in un modello
AMPL. Un modo rapidissimo per risolvere il problema in AMPL, consiste nello scrivere il
seguente file raffineria.mod
raffineria.mod
model;
var x;
var y >= 0;
minimize tubi: sqrt(x**2 + y**2) + sqrt((x-3)**2 + (y-4)**2)
+ sqrt((x-7)**2 + (y-3)**2);
s.t. fuori: x^2 + y^2 >= 3.6^2;
data;
let x:= 1;
let y:= 1;
option solver loqo;
solve;
#seleziona LOQO come solutore di default
display tubi;
display x,y;
e quindi dare, al prompt di AMPL, i seguenti comandi
ampl: reset;
ampl: model raffineria.mod;
In questo modo, AMPL invocherà il solutore LOQO [7] per risolvere il problema, producendo
il seguente output a video
LOQO: optimal solution (12 iterations)
primal objective 11.9333553
dual objective 11.93335506
tubi = 11.9334
x = 3.27586
y = 3.93103
5
Quello che abbiamo fatto fin qui è stato di trascrivere brutalmente il modello matematico (2)
in istruzioni comprensibili all’interprete di AMPL. Tuttavia, è possibile migliorare un poco
il modello AMPL del problema di localizzazione, ad esempio rendendolo il più possibile
indipendente dai dati. In particolare, cosa accadrebbe se aggiungessimo un porto D al
nostro problema? Attualmente, questa semplice modifica comporterebbe la necessità di
modificare il file raffineria.mod aggiungendo un termine nella funzione obiettivo in modo
da considerare anche la distanza tra il nuovo porto D e la raffineria.
Per evitare tutto ciò, sarebbe auspicabile rendere il più possibile parametrico il file di modello. In sostanza quello che si fa è scrivere un file con estensione .mod in cui si descrive
astrattamente il modello matematico, lasciando parametrici tutti i valori particolari per lo
specifico problema in esame. In questa operazione siamo facilitati dall’avere a disposizione la
formulazione matematica del problema di interesse, che ci dovrebbe guidare nella scrittura
di un modello AMPL astratto.
Solamente in seguito, mediante scrittura di un file di dati, con estensione .dat, assegneremo
i valori specifici per la particolare istanza del problema.
In altri termini, il file di modello rappresenterà una intera classe di problemi per esempio di
localizzazione, come in questo caso. Mentre il file dei dati avrà lo scopo di particolarizzare
il modello astratto ad un caso fissato, una singola istanza del problema.
Secondo quanto appena detto, il problema di allocazione sarà quindi rappresentato dai file
di modello e di dati seguenti
raffineria.mod
set PORTI;
param
param
param
param
#dichiara PUNTI come insieme non meglio
#specificato di elementi
xcoord{PORTI};
ycoord{PORTI};
pA symbolic in PORTI;
dist_min;
var x;
var y >= 0;
minimize tubi: sum{i in PORTI}sqrt((x-xcoord[i])**2 + (y-ycoord[i])**2);
s.t. fuori: (x-xcoord[pA])^2 + (y-ycoord[pA])^2 >= dist_min^2;
raffineria.dat
data;
set PORTI := A,B,C,D;
6
param xcoord :=
A 0
B 3
C 7
D 5;
param ycoord :=
A 0
B 4
C 3
D 6;
param pA := A;
param dist_min := 3.6;
let x:= 1;
let y:= 1;
option solver loqo;
solve;
display tubi;
display x,y;
Come si vede, nel file di modello sono presenti le seguenti dichiarazioni:
- set PORTI; che dichiara PORTI come insieme di elementi non meglio specificati, nel
senso che nel file di modello non si fa alcun riferimento esplicito né al numero di
elementi dell’insieme ne alla loro tipologia (numeri, lettere, stringhe,. . . );
- param xcoord{PORTI}; che dichiara xcoord come vettore di elementi. Più in particolare la presente dichiarazione ci dice che il vettore xcoord avrà tanti elementi quanti
saranno gli elementi dell’insieme PORTI precedentemente dichiarato;
- param pA symbolic in PORTI; che dichiara pA come un generico elemento dell’insieme PORTI;
- param dist min; che, infine, dichiara dist min come una quantità parametrica scalare.
Osservando attentamente il file dei dati raffineria.dat notiamo che questo contiene una
definizione per ciscun parametro e/o insieme del file raffineria.dat. In particolare:
- set PORTI := A,B,C,D; che definisce PORTI come insieme costituito dai quattro elementi A,B,C,D;
- param xcoord := ... che definisce ciascuna componente del vettore xcoord;
- param pA := A; che assegna al parametro pA l’elemento A dell’insieme PORTI (come
richiedeva la dichiarazione);
- let x := 1; che fissa ad 1 il valore iniziale per la variabile x;
Infine, nel file raffineria.dat, per comodità, sono stati inserite anche le istruzioni
- option solver loqo; che imposta LOQO come solutore di default per AMPL;
- solve; che avvia la soluzione del problema usando il solutore di defaul;
- display tubi; che stampa a video il valore della funzione obiettivo nel punto soluzione;
7
3
Il problema del serbatoio scoperto
Consideriamo il seguente problema (svolto nella esercitazione del 27 Settembre u.s.). Un’indutria chimica intende utilizzare della lamiera metallica residua, costruendo un serbatoio
scoperto da adibire all’immagazzinamento di un prodotto liquido. La lamiera può essere
tagliata e saldata a piacere ed è disponibile per complessivi 150m2 . Il serbatoio deve essere
contenuto in un capannone a pianta quadrata, con lato di 10m, e con tetto spiovente dall’altezza di 4.5m a 3m. Per semplicità di progetto, si assume che il serbatoio abbia la forma
di un prisma retto con base quadrata. Si vogliono determinare le dimensioni del serbatoio
in modo tale da massimizzare il volume del liquido che vi può essere contenuto.
Nello scrivere il problema in AMPL cerchiamo sempre di tenere separati il modello e i dati
che al modello si riferiscono. Un modo di rappresentare il problema del serbatoio in AMPL
è, ad esempio, quello riportato di seguito nei due file serbatoio.mod e serbatoio.dat.
serbatoio.mod
param
param
param
param
lato >= 0;
hmin >= 0;
hmax >= hmin;
max_area;
var b >= 0,
var h >= 0;
<= lato;
maximize volume: (b^2)*h;
s.t. vin_h: h <= (lato-b)*(hmax-hmin)/lato + hmin;
s.t. area: b^2 + 4*(b*h) <= max_area;
serbatoio.mod
param
param
param
lato := 10;
hmin := 3;
hmax := 4.5;
8
param max_area := 150;
let b:= 1;
let h:= 1;
Per risolvere, ad esempio con il solutore SNOPT, questo problema, al prompt di AMPL diamo
le seguenti istruzioni
ampl:
ampl:
ampl:
ampl:
model serbatoio.mod;
data serbatoio.dat;
option solver snopt;
solve;
che produrranno l’output
SNOPT 6.1-1(4)(Jun 2001):
Optimal solution found.
9 iterations, objective 176.7064536
Nonlin evals: obj = 12, grad = 11, constrs = 12, Jac = 11.
A questo punto se vogliamo farci dire quanto vale la funzione obiettivo all’ottimo e quali
sono i valori ottimi per le due variabili dobbiamo digitare
display volume;
display b,h;
ottenendo
volume = 176.706
b = 7.18586
h = 3.42212
Lo studente controlli se la soluzione trovata utilizza tutta la lamiera disponibile (150m2 ).
4
Traiettoria ottima Terra-Luna
Consideriamo il problema di voler determinare la traiettoria ottima che deve seguire una
navicella in un ipotetico viaggio dalla Terra alla Luna. Ipotizziamo che la navicella si muova
spinta solo dalla forza sviluppata dal suo unico motore. Facciamo inoltre l’ipotesi (tuttaltro
che realistica) che sia trascurabile la diminuzione di massa della navicella dovuta al consumo
del propellente liquido imbarcato al momento della partenza.
Fissiamo un sistema di riferimento cartesiano con origine nel centro della Terra (che avrà
quindi coordinate (0, 0)). Supponiamo, ancora una volta riduttivamente, che il sistema
di riferimento scelto sia un sistema inerziale, ovvero, che sia trascurabile il movimento di
rivoluzione della Terra attorno al Sole. Supponiamo inoltre, per non complicare troppo il
modello, che sia trascurabile anche il moto di rivoluzione della Luna attorno alla Terra.
Nel sistema di riferimento scelto, la Luna occupa la posizione (0, d moon) con d moon= 3.844·
105 m (pari, approssimativamente, alla distanza media Terra-Luna). Di seguito riportiamo
alcune costanti riguardanti il problema in questione:
G
Me
Mm
Re
Rm
=
=
=
=
=
6.627 · 10−11
5.98 · 1024
7.35 · 1022
6.38 · 106
1.738 · 106
m3
Kg·s2
Costante di gravit. universale
Massa della Terra
Massa della Luna
Raggio medio della Terra
Raggio medio della Luna
Kg
Kg
m
m
9
Supponiamo, infine, che la traiettoria della navicella sia interamente contenuta nel piano
xy del nostro sistema di coordinate cartesiane. Con queste ipotesi, possiamo limitarci a
considerare solo le componenti lungo x ed y dei tre vettori che caratterizzano lo stato della
navicella al generico istante t, e cioè: la posizione x(t) = (x(t), y(t)), la velocità v (t) =
(vx (t), vy (t)) e l’accelerazione a(t) = (ax (t), ay (t)). Le precedenti quantità sono legate tra
loro dalle seguenti relazioni differenziali vettoriali
v (t)
=
a(t)
=
d
x(t)
dt
d
v (t),
dt
che equivalgono alle seguenti relazioni differenziali scalari
d
x(t)
dt
d
ax (t) = vx (t)
dt
vx (t) =
d
y(t)
dt
d
ay (t) = vy (t).
dt
vy (t) =
Vediamo ora nel dettaglio quali forze agiscono sulla navicella nel suo viaggio tra la Terra e la
Luna. Esse saranno, stanti le nostre ipotesi e trascurando anche di considerare l’attrazione
esercitata dal Sole e le perturbazioni indotte sul moto della navicella dalla presenza dei
pianeti vicini, le seguenti
- la forza di attrazione gravitazionale esercitata dalla Terra,
- la forza di attrazione gravitazionale esercitata dalla Luna e
- la forza propulsiva dovuta alla spinta del motore.
Pertanto, in base alla seconda legge di Newton, la forza totale che agisce sulla navicella nel
generico istante t è data dalla seguente espressione:
F (t) = ma(t) = G
Mm m
Me m
(xe − x(t)) + G
(xm − x(t)) + θ(t),
xe − x(t)3
xm − x(t)3
ove, con θ(t), si è indicata la forza sviluppata dal motore della navicella. Notiamo che anche
la precedente ralazione di equilibrio delle forze è una relazione vettoriale e che pertanto è
equivalente a due relazioni, una per ogni componente del vettore F (t) = (Fx (t), Fy (t)).
Il problema di ottimizzazione che vogliamo risolvere consiste nel determinare la traiettoria
ottima in modo da minimizzare l’energia spesa dal motore ed il tempo totale di percorrenza.
Una misura dell’energia totale spesa nel viaggio della navicella è per esempio la seguente:
0
T
θ(t)2 dt
ovvero l’integrale, esteso all’intervallo [0, T ] della norma al quadrato della forza θ(t).
10
Quindi una formulazione matematica del problema in esame è, per esempio, la seguente:
min
s.t.
cT +
0
T
θ(t)2 dt
d
x(t)
dt
d
a(t) = v (t)
dt
F (t) = ma(t) = G
v (t) =
Me m
Mm m
(xe − x(t)) + G
(xm − x(t)) + θ(t)
xe − x(t)3
xm − x(t)3
x(0) = x◦
v (0) = v◦
x(T ) = xT
v (T ) = vT
in cui abbiamo riportato anche le condizioni sulle posizioni e velocità iniziali (al tempo t = 0)
e finali (t = T ). Notiamo che la funzione obiettivo è la somma del tempo di percorrenza,
moltiplicato per una costante che serve a far tornare le dimensioni, e dell’energia totale spesa
nel viaggio.
Il precedente problema è un problema di “controllo ottimo” continuo, ove cioè alcune variabili
di decisione del modello sono funzioni del tempo. Un modo piuttosto comune per risolvere
simili problemi, consiste nel ricondursi ad un problema di ottimizzazione in uno spazio finito
dimensionale. A questo scopo, si effettua una discretizzazione dell’intervallo temporale [0, T ]
in n intervallini e si campionano le funzioni x(t), v (t) e a(t) in maniera tale da ottenere un
numero finito di variabili di decisione.
x◦
x1
x2
x3
xn
Avremo, quindi,
- 2(n + 1) varaibili xi = x(iT /n) e yi = y(iT /n) ad indicare le posizioni negli istanti di
campionamento i = 0, 1, . . . , n − 1, n;
- 2n variabili vx,i e vy,i ad indicare le velocità medie negli n intervalli di campionamento
per i = 1, 2, . . . , n;
- 2(n − 1) variabili ax,i e ay,i ad indicare le accelerazioni medie per i = 1, 2, . . . , n − 1 e
- 2(n − 1) variabili θx,i e θy,i ad indicare le componenti della forza esercitata dal motore
negli istanti di campionamento i = 1, 2, . . . , n − 1.
11
Tra queste variabili discrete intercorrono le seguenti relazioni
xi−1
vx,i = tg(180 − α)
α
xi − xi−1
T /n
vx,i+1 − vx,i
=
T /n
yi − yi−1
T /n
vy,i+1 − vy,i
.
=
T /n
vy,i =
vx,i =
ax,i
xi
ay,i
Il modello discretizzato sarà dunque il seguente:
min cT +
s.t.
T
−1
(θ(x, i)2 + θ(y, i)2 )T /n
i=1
xi −xi−1
yi −yi−1
i = 1, . . . , n
T /n , vy,i =
T /n
vx,i+1 −vx,i
vy,i+1 −vy,i
ax,i =
, ay,i =
i = 1, . . . , n − 1
T /n
T /n
θx,i
Me
Mm
ax,i = G ((xe −xi )2 +(y
(x
−
x
)
e
i + G ((xm −xi )2 +(ym −yi )2 )3/2 (xm − xi ) + m
2 3/2
e −yi ) )
θy,i
Me
Mm
ay,i = G ((xe −xi )2 +(y
2 3/2 (ye − yi ) + G ((x −x )2 +(y −y )2 )3/2 (ym − yi ) + m
e −yi ) )
m
i
m
i
vx,i =
x◦ = x(0), y◦ = y(0)
vx,◦ = vx (0), vy,◦ = vy (0)
xn = x(T ), yn = y(T )
vx,n = vx (T ), vy,n = vy (T )
Per ottenere una buona soluzione del problema di controllo ottimo originario, dovremmo
eseguire un campionamento non uniforme dei tempi, campionando con maggiore precisione
in prossimità degli istanti di partenza e di arrivo e usando un campionamento più lasco
in corrispondenza del tratto intermedio della traiettoria. Al fine di ottenere un problema
risolubile con i solutori disponibili per AMPL, un numero di variabili e vincoli che rispetti le
limitazioni della versione per studenti di AMPL e dei risultati soddisfacenti con la discretizzazione uniforme che abbiamo adottato, dobbiamo ulteriormente semplificare il modello del
sistema fisico fin qui analizzato. In particolare consideriamo i seguenti valori delle costanti
in gioco
G
Me
Mm
Re
Rm
d moon
=
=
=
=
=
=
1
10
1
2
0.5
20
m3
Kg·s2
Kg
Kg
m
m
m
Costante di gravit. universale
Massa della Terra
Massa della Luna
Raggio medio della Terra
Raggio medio della Luna
distanza media Terra-Luna
Consideriamo, inoltre, le seguenti condizioni iniziali e finali
x◦ = 0
y◦ = −2
xn = 20
yn = 0.5
vx,◦ = 0
vy,◦ = −1
vx,n = 0
vy,n = −0.5
12
Risolvendo con LOQO o SNOPT il precedente problema, e graficandone la soluzione, otteniamo
la traiettoria seguente
5
Solutori per AMPL
A testimonianza della enorme diffusione che sta avendo AMPL3 come modellatore di problemi
lineari e nonlineari nel contesto scientifico e professionale (soprattuto estero), c’è il fatto che
molti noti solutori sono disponibili anche con interfaccia per AMPL. Tra gli altri, segnaliamo
la disponibilità per AMPL dei seguenti solutori:
- CPLEX (v 7.1.0)4 , per problemi lineari;
- LOQO (v 4.01)5 [7], problemi lineari/nonlineari, convessi/non convessi, vincolati/non
vincolati;
- MINOS (v 5.5)6 [8], problemi vincolati, lineari o non lineari;
- SNOPT (v 6.1)6 [5], problemi vincolati, lineari o non lineari.
Dal prompt di AMPL è possibile, mediante semplici comandi, assegnare il valore di alcuni parametri per regolare il funzionamento del solutore scelto come solutore corrente. In
particolare, qui sotto si riportano alcuni tra i parametri più significativi per i tre solutori
nonlineari (LOQO, MINOS, SNOPT). Il solutore lineare CPLEX, nella versione per studenti
non necessita, praticamente mai, di aggiustamenti sui parametri, che quindi non riportiamo.
LOQO
convex
iterlim = n
outlev
=n
verbose
serve ad indicare a LOQO che il problema che gli stiamo dando è un
problema convesso. Nel caso in cui il problema fosse convesso ma si
omettesse la specifica convex una soluzione verrebbe ugualmente trovata
ma, probabilmente, in maggior tempo.
ampl: option loqo options ’convex’;
serve ad impostare ad n il numero massimo di iterazioni. Il valore di default
è 200.
ampl: option loqo options ’iterlim=100’;
serve ad impostare il livello di printing. Più è alto il valore di n maggiori
informazioni vengono stampate a video. Il valore di default è 0.
ampl: option loqo options ’verbose=1’;
3 http://www.ampl.com
4 http://www.ilog.com/products/cplex/
5 http://www.orfe.princeton.edu/∼loqo/
6 http://www.sbsi-sol-optimize.com/
13
timing = 0/1
timlim = tmax
serve per decidere se stampare o meno statistiche sul tempo di soluzione. Il
valore di default è 0.
ampl: option loqo options ’timing=1’;
serve ad impostare un tempo massimo (in secondi) di soluzione. Per default
non c’è alcun limite.
ampl: option loqo options ’timlim=3600’;
MINOS
Iterations limit = n
Superbasics limit = n
serve ad impostare ad n il numero massimo di iterazioni. Il valore di
default è 99999999.
ampl: option minos options ’Iterations limit=100’;
serve ad impostare ad n il numero massimo di gradi di libertà, ovvero
di variabili che non sono vincolate in un punto soluzione. Il valore di
default è 50.
ampl: option minos options ’Superbasics limit=100’;
SNOPT
Minor iterations limit = n
Major iterations limit = n
Iterations limit = n
Superbasics limit = n
5.1
serve ad impostare ad n il numero massimo di iterazioni interne.
Il valore di default è pari al massimo tra 1000 e 5m, ove m è il
numero di vincoli lineari o non lineari.
ampl: option snopt options ’Minor iterations limit=100’;
serve ad impostare ad n il numero massimo di iterazioni esterne.
Il valore di default è pari al massimo tra 1000 e m.
ampl: option snopt options ’Major iterations limit=100’;
serve ad impostare ad n il numero massimo di iterazioni (intese
come somma di tutte le iterazioni interne estesa a tutte le iterazioni esterne). Il valore di default è pari al massimo tra 10000
e 20m.
ampl: option snopt options ’Iterations limit=100’;
serve ad impostare ad n il numero massimo di gradi di libertà,
ovvero di variabili che non sono vincolate in un punto soluzione.
Il valore di default è pari al minimo tra 500 e nnl + 1, ove nnl è
il numero di variabili non lineari del problema.
ampl: option snopt options ’Superbasics limit=100’;
Il client KESTREL per AMPL
KESTREL (v 1.0) è un interfaccia, progettata per AMPL, al NEOS7 (Network-Enabled Optimization System) server. NEOS è un server che condivide in rete solutori per la programmazione intera, mista, non lineare o lineare. Mediante un semplice web browser, è possibile
a) inviare al server la formulazione di un problema, b) scegliere un solutore tra i molti
disponibili8 , c) ottenerne una soluzione al problema sottomesso.
Mediante il client per AMPL, KESTREL, è possibile, da un qualunque computer con accesso
ad Internet, sfruttare uno dei solutori del NEOS server che accettano input in fomato AMPL,
per risolvere un problema ottimizzatorio. Il funzionamento del client è molto semplice
ed intuitivo. Di seguito riportiamo, sulla sinistra i comandi necessari per far risolvere il
problema descritto nel file Eser2 0.mod a LOQO, e sulla destra i comandi necessari per
risolvere lo stesso problema ma usando come solutore NEOS-LOQO cioè la versione di LOQO
che risiede sul server NEOS.
7 http://www-neos.mcs.anl.gov/neos
8 L’elenco
dei
solutori
disponibili
su
http://www-neos.mcs.anl.gov/neos/server-solvers.html
14
NEOS
è
consultabile
all’indirizzo
ampl:
ampl:
ampl:
ampl:
ampl:
reset;
option solver loqo;
option loqo_options ’verbose=1’;
model Eser2_0.mod;
solve;
ampl:
ampl:
ampl:
ampl:
ampl:
ampl:
reset;
option solver kestrel;
option kestrel_options ’solver=loqo’;
option loqo_options ’verbose=1’;
model Eser2_0.mod;
solve;
Notiamo che a destra abbiamo scelto (fittiziamente) come solutore (locale) KESTREL. Poi,
specifichiamo, come opzione di KESTREL, che vogliamo usare come solutore (remoto) LOQO.
Infine, specifichiamo le opzioni per il solutore remoto che KESTREL provvederà a trasmettere
al NEOS server.
I due set di comandi di sopra producono i seguenti output a video:
LOQO 4.01: verbose=1
1 1.0825318e-001 ...
2 1.9862369e-001 ...
.
.
...
10 5.0000000e-001 ...
LOQO: optimal solution (10 iterations)
primal objective 0.4999999989
dual objective 0.5000000035
Job has been submitted to Kestrel
Kestrel/NEOS Job number
: 106815
Kestrel/NEOS Job password : PHZbbHCl
Check the following URL for progress report :
http://www-neos.mcs.anl.gov/...
In case of problems, e-mail :
[email protected]
Intermediate Solver Output:
Checking the AMPL files
Executing algorithm...
LOQO 6.00: verbose=1
1 1.0825318e-001 ...
2 1.9862369e-001 ...
.
.
...
10 5.0000000e-001 ...
Finished call
LOQO 6.00: optimal solution (10 iterations, 19 evaluations)
primal objective 0.4999999989
dual objective 0.5000000035
Notiamo, tra le altre cose, che la versione di LOQO attualmente disponibile sul server NEOS
è la 6.00, cioè una versione successiva alla 4.01 disponibile in versione per studenti.
6
Il problema della superficie di area minima
L’obiettivo di questo problema [4] è quello di determinare la superficie di area minima che
ricopre il quadrato unitario, essendo fissati dei valori sui bordi del quadrato medesimo.
Supponiamo, anzitutto, che la superficie ammetta una rappresentazione non parametrica
v(x, y) : IR2 → IR. Inoltre, dato che non sempre è possibile calcolare mediante semplici
formule matematiche l’area di una superficie nello spazio, quello che faremo è costruire una
approssimazione della superficie. A questo scopo dividiamo il quadrato unitario in una
griglia
15
(0, 1)
(1, 1)
(i − 1, j)
(i, j)
(i, j − 1)
(0, 0)
(1, 0)
e calcoliamo il valore della funzione sui vertici della griglia stessa. Ogni singolo quadratino
della griglia è poi ulteriormente diviso in due triangoli (superiore ed inferiore), come mostrato
in figura
Dato un dominio convesso D in IR2 , l’area della superficie estesa al dominio D è, secondo
una nota formula di analisi matematica,
f (v) =
1 + ∇v(x, y)2 ds.
D
Il nostro problema è dunque quello di trovare la superficie v(x, y) che minimizza f (v) e che
sui bordi del dominio D (nel nostro caso, il quadrato unitario) assume valori prefissati.
Un modo per risolvere questo problema è, come detto, quello di discritizzare il dominio
di integrazione, introducendo una griglia di punti, e quindi esprimere l’area della superficie
come sommatoria delle aree dei triangolini che la approssimano. Ovviamente, tanto più fine è
la discrettizazione e tanto maggiore sarà la precisione con la quale i triangolini approssimano
la superficie v(x, y).
Dividiamo il quadrato unitario in nx+ 1 per ny + 1 quadratini di dimensioni hx = 1/(nx+ 1)
per hy = 1/(ny + 1) e poi dividiamo, come gia detto, ciascun quadratino in un triangolo
superiore ed un triangolo inferiore. Possiamo scrivere una approssimazione della funzione
f (v) nel modo seguente:
Alt + Aut ,
tutti itriangoli
dove Alt e Aut indicano le aree delle superfici sottese, rispettivamente, dai triangoli inferiore
e superiore, e che valgono:
2 2
hpr − hp
hpt − hp
hxhy
Alt =
1+
+
2
hx
hy
Aut
hxhy
=
2
1+
hpl − hp
hx
2
+
hpb − hp
hy
2
ove hpl , hpr , hpb e hp indicano i valori di v(x, y) nei punti pl, pr, pb e p come mostrato in
figura.
16
Essendo vi,j per i = 0, . . . , nx + 1, j = 0, . . . , ny + 1 (ovvero i valori della funzione v(x, y)
sui punti della griglia) le variabili di decisione del problema, possiamo riscrivere la funzione
obiettivo in questo modo
2 2
vi+1,j − vi,j
vi,j+1 − vi,j
hxhy
1+
+
+
f =
2
hx
hy
i = 0, . . . , nx
j = 0, . . . , ny
i = 1, . . . , nx + 1
j = 1, . . . , ny + 1
hxhy
2
1+
vi,j−1 − vi,j
hy
2
+
vi−1,j − vi,j
hx
2
Dobbiamo ancora specificare i vincoli ovvero i valori che la superficie deve assumere in
corrispondenza dei punti della griglia sui bordi del quadrato unitario. Siano essi i seguenti
v0,j
= 0;
vnx+1,j
vi,0
= 0;
= 1 − (2 i hx − 1)2 ;
vi,ny+1
= 1 − (2 i hx − 1)2 .
Provate a scrivere nel linguaggio di AMPL[3] il precedente problema di ottimizzazione non
lineare e a risolverlo con uno dei solutori disponibili nella versione per studenti.
Il problema della superficie di area minima, cosı̀ come è stato qui brevemente descritto, fa
attualmente parte della collezione di problemi test CUTE[1]. Nella collezione di problemi
COPS[2], è invece presente una versione del problema (nota come superficie minima con
ostacolo) che presenta l’ulteriore vincolo percui la superficie deve essere maggiore di un dato
valore entro una regione assegnata.
Per ulteriori informazioni circa il problema della superficie di area minima si consiglia di
visitare la URL http://www-fp.mcs.anl.gov/otc/Guide/CaseStudies/msa/
superficie di area minima
superficie di area minima con ostacolo
17
superficie di area minima con due ostacoli
Riferimenti bibliografici
[1] I. Bongartz, A. R. Conn, N. I. M. Gould, and Ph. L. Toint, CUTE: Constrained
and unconstrained testing environment, ACM Transaction on Mathematical Software,
21 (1995), pp. 123–160.
[2] A. Bondarenko, D. Bortz, and J. J. Moré, COPS: Large-scale nonlinearly constrained optimization problems, Tech. Rep. ANL/MCS-TM-237, Mathematics and Computer Science Division, Argonne National Laboratory, Argonne, IL, USA, 1998. Revised
October 1999.
[3] R. Fourer, D. M. Gay, and B. W. Kernighan, AMPL a modeling language for
mathematical programming, body & fraser publishing company, Massachusetts, 1993.
[4] A. Friedman, Free boundary problems in science and technology, Notices Amer. Math.
Soc., 47(2000), pp. 854-861.
[5] P. E. Gill, W. Murray, and M. A. Saunders, SNOPT: an SQP algorithm for
large-scale constrained optimization, SIAM J. Optimization, (2001).
[6] R. L. Graham, The largest small hexagon, Journal Combin. Th., 18(1975), pp. 165170.
[7] D. F. Shanno and R. J. Vanderbei, An interior point algorithm for nonconvex
nonlinear programming, Computational Optimization and Applications, 13 (1999),
pp. 231–252.
[8] B. A. Murtagh and M. A. Saunders, A projected Lagrangian algorithm and its implementation for sparse non-linear constraints, Math. Programming Studies, 16 (1982),
pp. 84–117.
18