Sie sind auf Seite 1von 28

Lenguaje AMPL.

Pedro Luis Luque Marzo de 2000. Versi´on: 2a

Tabla de Contenido

1 Lenguaje AMPL.

1

1.1 Reglas l´exicas de

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

3

1.2 Los elementos de un

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

4

1.3 Expresiones que indexan y sub´ındices.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

4

1.4 Expresiones aritm´eticas, l´ogicas y de conjuntos.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

5

1.5 Declaraciones de elementos del modelo.

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

8

1.6 Especificaci´on de datos.

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

12

1.7 Comandos del lenguaje.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

20

1.8 Optimizadores.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

22

2 Entorno AMPL para Msdos.

 

23

3 Entorno AMPL para Windows: AMPL Plus.

 

24

3.1 Componentes de AMPL Plus.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

25

3.2 Resoluci´on de problemas en AMPL

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

27

1 Lenguaje AMPL.

AMPL es un lenguaje de modelado algebraico para programaci´on matem´atica: un lenguaje capaz de expresar en notaci´on algebraica problemas de optimizaci´on tales como los problemas de programaci´on

lineal. Veamos un pequeno˜

ejemplo.

Ejemplo 1.1. Una compan˜´ıa fabrica tres productos, P 1 , P 2 y P 3 , que precisan para su elaboraci´on dos materias primas, M 1 y M 2 . Las disponibilidades semanales de estas materias son 25 y 30 unidades, respectivamente. El beneficio neto que proporciona cada unidad de producto, as´ı como las unidades de materia prima que necesita para su elaboraci´on, vienen dados en la siguiente tabla:

 

P 1

P 2

P 3

M 1

1

2

2

M 2

2

1

3

Beneficio (u.m.)

2

6

3

1

Planificar la producci´on semanal de forma que se maximice el beneficio.

Soluci´on:

Sean x 1 , x 2 , x 3 (x i ) la cantidad producida de P 1 , P 2 , P 3 respectivamente (P i , i = 1, 2, 3). El problema a resolver ser´ıa el siguiente:

max

s.a.

z = 2x 1 + 6x 2 + 3x 3

x 1 + 2x 2 + 2x 3 2x 1 + x 2 + 3x 3 x 1 , x 2 , x 3

25

30

0

El modelo (modelo+datos) escrito en AMPL del ejemplo (1.1) fue el siguiente:

# FABRICACION DE 3 PRODUCTOS CON 2 MATERIAS PRIMAS

# VARIABLES DE DECISION Y RESTRICCIONES NO NEGATIVIDAD

var

x1

> =

0 ;

var

x2

> =

0 ;

var

x3

> =

0 ;

# FUNCION OBJETIVO DEL MODELO

2 * x1

# RESTRICCIONES DEL MODELO

maximize z

:

+

6 * x2

+

3 * x3 ;

subject

to

r e s t r i c c i o n 1

:

x1

+

2 * x2

+

2 *

x3

< =

2 5 ;

subject

to

r e s t r i c c i o n 2

: 2 * x1

+

x2

+

3 * x3

< =

3 0 ;

Tabla 1: Modelo b´asico del ejemplo.

1.0.1 Ejemplo en AMPL.

La gran potencia del lenguaje AMPL est´a en separar el modelo en s´ı por un lado y por otro los datos particulares del problema concreto. Para entender esto mejor escribimos el problema del ejemplo 1.1 desde este punto de vista. El modelo general con n productos y con m materias primas podr´ıamos escribirlo de la siguiente manera:

max

s.a.

O de forma m´as abreviada:

max

s.a.

z = c 1 x 1 + c 2 x 2 +

.

.

a 11 x 1 + a 21 x 1 +

a m1 x 1 +

.

.

.

.

+

c n x n

a 1n x n a 2n x n

.

.

.

+ a mn x n

+

+

x 1 , x 2 ,

, x n

b 1 b 2

.

.

.

b m 0

z =

n

j=1 c j x j

n

j=1 a ij x j

j

x

b i ,

i = 1,

, m

0,

j = 1,

, n

(1)

En este problema general los valores de c j , a ij y b i son datos del problema concreto y la estructura del problema (1) ser´ıa el modelo general. Esto en AMPL se escribir´ıa de la forma siguiente en dos ficheros. En el fichero del modelo aparecer´ıa:

2

# MODELO: EJEMPLO1.MOD

# FABRICACION DE n PRODUCTOS CON m MATERIAS PRIMAS

# PARAMETROS DEL MODELO

param

n

> = 0 ,

integer ;

param

m

> = 0 ,

integer ;

# CONJUNTOS DE INDICES

set

P R O D U C T O S

: =

1

n

;

set

M P R I M A S

: =

1

m

;

# VARIABLES DE DECISION Y RESTRICCIONES NO NEGATIVIDAD

var

# MAS PARAMETROS DEL MODELO

x

{ j

in

P R O D U C T O S }

> =

0 ;

param

c

{

i

in

P R O D U C T O S };

param

b

{

j

in

M P R I M A S };

param a

# FUNCION OBJETIVO DEL MODELO

maximize z

# RESTRICCIONES DEL MODELO

{( i , j )

:

in

{ M P R I M A S , P R O D U C T O S }};

{ j

in

P R O D U C T O S }

sum

c [ j ]* x [ j ];

subject

to

sum

r e s t r i c c i o n

{ i

{ j

in

P R O D U C T O S }

in

M P R I M A S }

a [ i , j ]* x [ j ]

:

< =

b [ i ];

Tabla 2: Modelo general del ejemplo.

Y el fichero de datos para nuestro ejemplo particular ser´ıa:

# DATOS: EJEMPLO1.DAT

param

param

param

1

2

3

param a

n

m

: =

: =

3 ;

2 ;

c :=

2

6

3 ;

:

1

2

3 : =

1

2

param

1

2

b :=

1 2 5

2 3 0 ;

2

1

2

3;

Tabla 3: Datos para el ejemplo.

Podr´ıamos escribir un fichero de datos con valores diferentes y resolverlo junto al modelo general (por ejemplo con n = 4 y m = 5).

1.1 Reglas l´exicas de AMPL.

Los modelos AMPL envuelven variables, restricciones, y objetivos, expresados con la ayuda de conjuntos y par´ametros. A todos se les llama elementos del modelo. Cada elemento del modelo tiene un nombre alfanum´erico (una cadena de uno o m´as letras, d´ıgitos, y caracteres de subrayado):

x1, z, restriccion1. Nota: las letras mayusculas´ son distintas de las letras minusculas´ en AMPL. Existen dos tipos de constantes:

3

Constantes num´ericas: un signo opcional, una secuencia de d´ıgitos que pueden contener un punto decimal, y un exponente opcional que comienza con una de las letras: d,D,e,E, como en 1.23D-45. Toda la aritm´etica en AMPL tiene la misma precisi´on (sobre la mayor´ıa de las m´aquinas tiene doble precisi´on).

Constantes literales son cadenas delimitadas por una comilla simple o por dobles comillas. Si la comilla simple forma parte de la constante literal debe aparecer dos veces seguidas (igual ocurre con la doble comilla).

Cada l´ınea de instrucciones debe ir finalizada con un punto y coma (;). Los comentarios comienzan con # y se extienden hasta el final de la l´ınea, o se pueden delimitar entre /* y */, en cuyo caso pueden extenderse m´as de una l´ınea.

1.2 Los elementos de un conjunto.

Un conjunto contiene cero o m´as elementos o miembros, cada uno de los cuales es una lista ordenada de una o m´as componentes. Cada miembro de un conjunto debe ser distinto. Todos los miembros deben tener el mismo numero´ de componentes; a este numero´ comun´ se le conoce como dimensi´on del conjunto. Un conjunto expl´ıcitamente se escribe como una lista de miembros separada por comas, colocados

}”. Si el conjunto es de dimensi´on uno, los miembros son simplemente constantes

num´ericas o constantes de cadena, o cualquier expresi´on cuyo valor sea un numero´ o una cadena:

entre llaves: “{

{" a "," b "," c "}

{ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 }

{ t , t +1, t +2}

Para un conjunto multidimensional, cada miembro debe escribirse como una lista separada por comas entre par´entesis:

{("

{

"

( 1 , 2

a

,

, 3

2

)

)

( "

(

,

" 1 , 2

a

, 4 ) ,

)

3

( "

1

(

,

b

2

" , 5 ) } ,

5

)

( 1 , 3

7 ) , ( 1 , 4 , 6 ) }

, El valor de un miembro num´erico es el resultado de redondear su representaci´on decimal por un valor real de precisi´on limitada. Los miembros num´ericos que parecen diferentes pero que al ser redondeados al valor de precisi´on limitada son el mismo, tales como 1 y 0.01E2, son considerados iguales.

,

,

,

,

1.3 Expresiones que indexan y sub´ındices.

Muchos elementos de AMPL pueden definirse como colecciones indexadas sobre un conjunto; los miembros individuales son seleccionados al anadir˜ un “sub´ındice” al nombre del elemento. El rango de posibles sub´ındices es indicado por una expresi´on que indexa en la declaraci´on del modelo.

Operadores de reducci´on, tales como sum, tambi´en usan expresiones que indexan para especificar conjuntos sobre los que las operaciones son iteradas. Un sub´ındice es una lista de expresiones simb´olicas o num´ericas, separadas por comas y encerradas entre corchetes, como en:

d

e m a n d a

[ i ]

c

o s t o s

[ j , p [ k ]," O -"]

Cada expresi´on con sub´ındices debe evaluar a un numero´ o a un literal. El valor resultante o se- cuencia de valores debe dar un miembro de un conjunto de ´ındices unidimensional o multidimensional. Una expresi´on que indexa es una lista de expresiones de conjunto separadas por comas, seguida opcionalmente por dos puntos “:” y una expresi´on l´ogica, todo encerrado entre llaves:

Expresiones que indexan:

4

 

{ l i s t a

de

e x p r e s i o n e s

de

c o n j u n t o s

}

{ l i s t a

de

e x p r e s i o n e s

de

c o n j u n t o s

:

e x p r e s i ´on

l´o g i c a

}

lista de expresiones de conjuntos:

 

e

x p r e s i ´on

de

c o n j u n t o s

 

m

i e m b r o - c i e g o

in

e x p r e s i ´on

de

c o n j u n t o s

l

i s t a

de

e x p r e s i o n e s

de

c o n j u n t o s

,

l i s t a

de

e x p r e s i o n e s

de

c o n j u n t o s

Cada expresi´on de conjunto puede ser precedida por un miembro ciego y la palabra clave in. Un miembro ciego para un conjunto unidimensional es un nombre no referenciado, es decir, un nombre no definido hasta ese punto. Un miembro ciego para un conjunto multidimensional es una lista separada por comas, encerrada entre par´entesis, de expresiones o nombres no referenciados; la lista debe incluir al menos un nombre no referenciado. Un miembro ciego introduce uno o m´as ´ındices ciegos (nombres no referenciados en sus componen-

tes), cuyo campo, o rango de definici´on, comienza en la siguiente expresi´on de conjunto; el campo de un ´ındice corre a trav´es del resto de la expresi´on que indexa, hasta el final de la declaraci´on usando la expresi´on que indexa, o hasta el final del operando que usa la expresi´on que indexa. Cuando un miembro ciego tiene una o m´as expresiones componentes, los ´ındices ciegos del miembro ciego var´ıan sobre una proyecci´on del conjunto; es decir, ellos toman todos los valores para que el miembro ciego pertenezca al conjunto.

{ A }

# todos los elementos de A

{ A , B }

 

# todos los pares, uno de A, uno de B

{ i

i n

A ,

j

i n

]}

B }

# el mismo que antes

{ i

i n

A ,

C [ i

# el mismo que antes

{ i

i n

A ,

(

j , k )

i n

D

}

# 1 de A y 1 (un par) de D

{ i

i n

A :

p [ i

] > 3 0 }

 

# todo i de A tal que p[i] sea mayor que 30

{ i

i n

A ,

j

i n

C [ i ]:

 

i <= j }

# nota: i y j deben ser num´ericos

{ i

i n

A ,

(

i , j )

i n

D

:

i <= j }

# todos los pares con i en A y i,j en D # (mismo valor de i) e i menor o igual que j

El argumento opcional “: expresi´on l´ogica” en una expresi´on que indexa, selecciona solamente los miembros que verifican la expresi´on l´ogica y excluye a los dem´as. La expresi´on l´ogica t´ıpicamente envuelve uno o m´as ´ındices ciegos de la expresi´on que indexa.

1.4 Expresiones aritm´eticas, l´ogicas y de conjuntos. Funciones matem´aticas.

En las expresiones l´ogicas y aritm´eticas de AMPL, pueden combinarse varios elementos. A partir de ahora consideraremos que una expresi´on que puede contener variables se representar´a como vexpr. Una expresi´on que no puede contener variables se denota como expr y algunas veces ser´a llamada “expresi´on constante”, a pesar de que pueda contener ´ındices ciegos. Una expresi´on l´ogica, represen- tada como lexpr, puede contener variables s´olo cuando es parte de una expresi´on if que produzca una vexpr. Las expresiones de conjuntos ser´an denotadas como sexpr. Los operadores aritm´eticos, l´ogicos y de conjuntos, en orden de precedencia creciente, se muestran en la tabla 4. Los valores num´ericos que aparecen como expresiones l´ogicas valen falso (false) si es 0, y verda- dero (true) para cualquier otro valor num´erico.

1.4.1 Expresiones Aritm´eticas.

Las expresiones aritm´eticas son construidas con los operadores aritm´eticos usuales, con funciones de AMPL, y con operadores de reducci´on aritm´eticos como sum:

5

Nombre

 

Tipo

Notas

if

then

else

A,S

A: si no hay else, se supone else 0 S: es obligatorio else sexpr o l´ogico operadores de reducci´on l´ogica y l´ogico operadores relacionales pertenencia a un conjunto

or,

||

L

exists, forall

 

L

and, &&

 

L

<,

<=,

=,

==,

<>,=!, >=,

>

L

in, not

in

 

L

within, not within not,! union, diff, symdiff inter cross

 

L

S

within T significa S T

L

negaci´on l´ogica symdiff es la diferencia sim´etrica intersecci´on producto cartesiano constructor de conjuntos a less b = max(a b, 0) operadores de reducci´on aritm´etica div cociente entero m´as y menos unario exponenciaci´on

S

S

S

setof

by

 

S

-, sum, prod, min, max

+,

less

 

A

A

*,

/,

div, mod

A

+,

-

A

ˆ, **

A

Tabla 4: Operadores aritm´eticos (A), l´ogicos (L) y de conjuntos (S).

n

u m e r o

 

v

a r i a b l e

 

e

x p r e s i ´on

o p . a r i t m ´e t i c o

e x p r e s i ´on

( + , - ,

less

, * , / ,mod, div , ^ , * * )

u

n a r i o

 

e x p r e s ´on

 

f

u n c i ´on

(

l i s t a

de

e x p r e s i o n e s

)

]

(sum,

i

f

l e x p r

then

v e x p r

[

else

v e x p r

o

p e r a d o r - r e d u c c i ´on

e x p r e s ´on

que

i n d e x a

prod , max, min)

{

e x p r

}

Las funciones aritm´eticas incorporadas en AMPL se muestran en la tabla 5 y tabla 6.

Sintaxis

Significado

Beta(a,b)

x a1 (1 x) b1 /(Γ(a)Γ(b)/Γ(a + b)), x [0, 1] 1/(π(1 + x 2 )) e x , x > 0 x a1 e x /Γ(a), x 0, a > 0 Uniforme entera en [0, 2 24 )

Cauchy()

Exponential()

Gamma(a)

Irand224()

Normal(µ, σ) N (µ, σ) varianza

Normal01()

Poisson(µ) e µ µ k /k!, k = 0, 1, Uniform(m,n) Uniforme[m, n) Uniform01() Uniforme[0, 1)

N (0, 1)

Tabla 5: Funciones de generaci´on de var. aleatorias en AMPL.

6

Sintaxis

Significado

abs(x)

valor absoluto cos 1 (x) cosh 1 (x) sin 1 (x) sinh 1 (x) tan 1 (x) tan 1 (y/x) tanh 1 (x) entero mayor m´as cercano coseno exponencial menor entero m´as cercano log e (x) log 10 (x) m´aximo m´ınimo seno seno hiperb´olico ra´ız cuadrada tangente tangente hiperb´olica

acos(x)

acosh(x)

asin(x)

asinh(x)

atan(x)

atan2(y,x)

atanh(x)

ceil(x)

cos(x)

exp(x)

floor(x)

log(x)

log10(x)

max(x,y,

)

min(x,y,

)

sin(x)

sinh(x)

sqrt(x)

tan(x)

tanh(x)

precision(x,n)

x redondeada a n cifras significativas x redondeado a n d´ıgitos despu´es del punto decimal x redondeado al entero m´as cercano x truncado a n d´ıgitos despu´es del punto decimal x truncado a un entero

round(x,n)

round(x)

trunc(x,n)

trunc(x)

Tabla 6: Funciones aritm´eticas en AMPL.

Sobre los operadores de reducci´on aritm´etica:

La palabra clave sum debe seguirle cualquier expresi´on que indexa. La expresi´on aritm´etica siguiente se evalua´ una vez para cada miembro del conjunto de ´ındices, y todos los valores resultantes se suman. El operador sum tiene menor precedencia que *, as´ı podemos escribir:

sum

{

i

in

O R I G ,

j

D E S T

,

in

P R O D }

 

c o s t o [ i , j , p

]

 

*

in T r a n s

p [ i , j , p ]

 
 

representa el total de costo[i,j,p] * Trans[i,j,p] sobre todas las combinaciones de or´ıgenes, destinos y productos.

Otros operadores aritm´eticos iterados son prod para la multiplicaci´on, min para el m´ınimo, y max para el m´aximo. Como ejemplo, podr´ıamos usar:

max

{ i

in

O R I G

}

o f e r t a [ i , p ]

 

para describir la mayor oferta del producto p de todos los or´ıgenes.

 

1.4.2

Expresiones L´ogicas.

 

Las expresiones l´ogicas aparecen donde se requiera un valor: “verdadero” o “falso”. Por ejemplo, en el comando check, en la parte “tal que” de las expresiones que indexan (sigue a los “:”), y en

7

if lexp then

Las expresiones l´ogicas pueden ser de la siguiente forma (lexpr):

e

x p r

e

x p r

o p e r

-- c o m p a r a

e x p r

e x p r not

l

o p e r -- l e x p r

l o g i c o

l e x p r

m

i e m b r o

in

s e x p r

m

i e m b r o

not

in

s e x p r

s

e x p r

within

s e x p r

s

e x p r

not

within

s e x p r

exists forall

i n d e x a d o i n d e x a d o

l e x p r l e x p r

{ l e x p r

}

El operador exists, cuando se aplica sobre un conjunto vac´ıo, devuelve falso y el operador forall devuelve verdadero.

1.4.3 Expresiones de conjunto.

Las expresiones de conjuntos (sexpr) que producen conjuntos pueden tener uno de los siguientes formatos:

{

[

m i e m b r o

[

,

m i e m b r o

]

]

}

s

e x p r

op

--

c o n j u n t o

s e x p r

 

( union

diff

symdiff

inter

cross )

union

i n d e x a d o

s e x p r

inter

i n d e x a d o

s e x p r

e x p r

 

e x p r

[

by

e x p r

]

setof

i n d e x a d o

m i e m b r o

i

f

l e x p r

then

 

s e x p r

else

s e x p r

 

( s e x p r interval

)

c o n j -- p r e d e f i n i d o

i n d e x a d o

Podemos ver el uso del operador setof, en el siguiente ejemplo:

^ 2 ) ;

ampl:

ampl:

y display ( 1 , 1 )

set

: =

setof y ; ( 2 , 4 )

{ i

in

1

5

}

( i

,

i

set

y

: =

( 3 , 9 )

( 4 , 1 6 )

( 5 , 2 5 ) ;

1.5 Declaraciones de elementos del modelo.

La declaraci´on de los elementos del modelo tiene el siguiente formato general:

elemento nombre [alias] [exp. indexada] [cuerpo] ;

Las palabras claves para los elementos del modelo AMPL pueden ser una de las siguientes:

set

param

var

arc

minimize

maximize

subject

to ,

subj

to ,

s . t .

node

8

Si se suprime el nombre del elemento se supone que es subject to. Las declaraciones pueden aparecer en cualquier orden, con la excepci´on de que cada nombre debe estar declarado antes de ser usado. Para las declaraciones de variables, restricciones y objetivos, se permite una forma especial de expresi´on indexada:

{ if lexpr} Si la expresi´on l´ogica lexpr es verdad, entonces el resultado es un elemento simple (no indexado); en otro caso el elemento es excluido del modelo.

1.5.1 Declaraci´on de conjuntos.

La declaraci´on de un conjunto del modelo tiene el siguiente formato general:

set

nombre

[alias]

[exp.

indexada]

[atributos]

;

en la que atributos es un lista de atributos opcionalmente separada por comas. Los cuales pueden ser (sexpr indica una expresi´on de conjuntos):

dimen n

s e x p r s e x p r default

within

:=

s e x p r

La frase := especifica un valor para el conjunto; esto implica que el conjunto no ser´a definido posteriormente en una l´ınea de instrucciones espec´ıfica para datos (:= y default son mutuamente exclusivas). El conjunto vac´ıo se indica con: {}. Existe la funci´on card(S) la cual da el numero´ de elementos del conjunto S. Tambi´en se pueden realizar operaciones entre conjuntos, como:

set

A : =

1

n

;

set

B :=

i

.

. j

by

k ;

set

C :=

A

diff

B ;

set

D :=

A

union

B ;

set

E :=

A

inter

B ;

set

F :=

A

symdiff B ;

Se pueden definir conjuntos con infinitos elementos (Nota: no se puede iterar sobre conjuntos infi- nitos), los cl´asicos intervalos cerrados, abiertos o semicerrados, bien de numeros´ reales (interval [a,b]) o bien de numeros´ enteros (integer [a,b]). Nota: la palabra interval puede omitirse.

1.5.2 Declaraci´on de par´ametros.

La declaraci´on de un par´ametro del modelo tiene el siguiente formato general:

param

nombre

[alias]

[exp.

indexada]

[atributos]

;

en la que atributos es un lista de atributos opcionalmente separada por comas. Los cuales pueden ser (sexpr indica una expresi´on de conjuntos):

binary

integer

symbolic

o p r e l in

s e x p r

e x p r default

e x p r

:=

e x p r

9

donde “oprel” puede ser:

<

< =

=

= =

! =

< >

>

> =

El atributo in especifica un chequeo para ver que el par´ametro se encuentra en el conjunto dado. Los par´ametros indexados pueden definirse de forma recursiva. Por ejemplo:

param c o m b i

:=

f

’ n

k =0

s o b r e

k = n

or

k ’

then 1

{ n

in

0

else

N

,

k

in

0

n }

c o m b [ n -1, k - 1 ]

+

c o m b [ n -1, k ];

Infinity es un par´ametro predefinido; al igual que -Infinity.

1.5.3 Declaraci´on de variables.

La declaraci´on de una variable del modelo tiene el siguiente formato general:

var

nombre

[alias]

[exp.

indexada]

[atributos]

;

en la que atributos es un lista de atributos opcionalmente separada por comas. Los cuales pueden ser (vexpr indica una expresi´on de variables):

binary

integer

e x p r e x p r e x p r default

>=

<=

:=

e x p r

= v e x p r

c

o e f f

[

e x p . i n d e x a d a

]

r e s t r i c c i ´on

]

v e x p r

cover

[

i n d e x a d a

r e s t r i c c i ´on

obj

[

e x p . i n d e x a d a

e x p .

]

o b j e t i v o

v e x p r

Las frases >= y <= especifican cotas, y la frase := indica un valor inicial. La frase default indica los valores iniciales por defecto, cuyos valores pueden darse en una l´ınea de instrucciones espec´ıfica para datos. Las frases coeff y obj se utilizan para la generaci´on de coeficientes por columnas; estas especifican los coeficientes que ser´an colocados en la restricci´on indicada u objetivo indicado, el cual debe ser previamente referenciado usando to come. Una frase cover es equivalente a la frase coeff pero con vexpr igual a 1.

1.5.4 Declaraci´on de restricciones.

La declaraci´on de una restricci´on del modelo tiene el siguiente formato general:

[subject to] nombre [alias] [exp. indexada] [ := dual--inic] [default dual--inic] [ : expr restriccion];
[subject
to] nombre [alias] [exp.
indexada]
[
:=
dual--inic]
[default
dual--inic]
[
:
expr
restriccion];

La frase opcional := dual--inicial especifica un valor inicial para la variable dual (multiplicador de Lagrange) asociado con la restricci´on. La expresi´on de restricci´on debe estar en uno de los siguientes

formatos: v e x p r

< =

v e x p r

v

e x p r

=

v e x p r

v

e x p r

> =

v e x p r

e

x p r

< =

v e x p r

< =

e x p r

e

x p r

> =

v e x p r

> =

e x p r

10

Para permitir la generaci´on de coeficientes por columna para la restricci´on, una de las vexprs puede tener una de las siguientes formas:

to come

v e x p r

+

to come

v e x p r to come

+

Los t´erminos de esta restricci´on que se especifican en una declaraci´on var son colocados en la posici´on de to come.

1.5.5 Declaraci´on de objetivos.

La declaraci´on de un objetivo del modelo tiene el siguiente formato general:

maximize nombre

[alias]

[exp.

indexada]

[:

expresion]

;

minimize nombre

[alias]

[exp.

indexada]

[:

expresion]

;

y puede especificarse una expresi´on en una de las siguientes formas:

e x p r to come +

v

v

to come

e x p r

v e x p r to come

+

La forma to come permite la generaci´on de coeficientes por columna, como con las restricciones.

1.5.6 Notaci´on de sufijos para valores auxiliares.

Las variables, restricciones, y objetivos tienen una variedad de valores auxiliares asociados, a los cuales se puede acceder anadiendo˜ al nombre uno de los siguientes sufijos dependiendo del tipo de elemento del modelo.

Sufijos para variables

.init

.init0

.lb

.lb0

.lrc

.lslack

.rc

.slack

.ub

.ub0

.urc

.uslack

.val

valor actual inicial valor inicial inicial (x cota inferior actual cota inferior inicial (l j ) costo reducido menor (.rc, x j l j ) menor holgura (x j l j ) costo reducido: (z j c j ) min(lslack,uslack) cota superior actual cota superior inicial (u j ) costo reducido superior (.rc, x j u j ) holgura superior (u j x j ) valor actual (x j )

0

j

)

11

Sufijos para restricciones

.body

.dinit

.dinit0

.dual

.lb

.ldual

.lslack

.slack

.ub

.udual

.uslack

valor actual del cuerpo de la restricci´on (A i x) valor inicial actual para la variable dual valor inicial inicial para la variable dual (w variable dual actual (w i ) cota inferior (rl i ) valor dual menor (.dual, A i x rl i ) holgura menor (A i x rl i ) min(lslack,uslack) cota superior (ru i ) valor dual superior (.dual, A i x ru i ) holgura superior (ru i A i x)

0

i

)

Sufijos para objetivos

.val

valor actual

1.6 Especificaci´on de datos.

Hay que tener en cuenta que:

La lectura de datos se inicializa con el comando: “data”. Por ejemplo:

ampl: data

d i e t . d a t ;

lee comandos de datos de un fichero llamado diet.dat.

AMPL trata cualquier secuencia de espacios, tabuladores y caracteres de nueva l´ınea como un solo espacio.

El final de cualquier comando de datos se indica por un punto y coma “;”.

1.6.1

Datos en conjuntos.

Conjuntos unidimensionales.

Un conjunto simple se especifica al listar sus miembros.

set

O R I G

: =

SE

MD

BA

;

set

set

D E S T P R O D

: =

: =

CO

p l a t o

CA

JA

c u c h i l l o

HU

AL

; t e n e d o r

MA

GR

;

Si un conjunto se ha declarado con el atributo ordered o circular, debemos listar sus miembros en orden:

set

S E M A N A S

: =

2 7 s e p 9 3

04 o c t 9 3

11 o c t 9 3

18 o c t 9 3

;

Si una cadena de la lista incluye caracteres distintos de letras, d´ıgitos, signo de subrayado ( ), punto, + y -, debe ser cerrado entre comillas:

set

A L M A C E N

: =

" A & P "

J E W E L

V O N S

;

Tambi´en para distinguir cuando un numero´ debe ser encerrado entre comillas.

Los miembros de un conjunto deben ser todos diferentes; AMPL avisar´ıa de la existencia de elementos duplicados. Los numeros´ que tienen la misma representaci´on en el ordenador ser´an considerados como iguales.

queremos que sea una cadena (“+1” o “3e4”), ´este

12

Para una colecci´on indexada de conjuntos, los miembros de cada conjunto de la colecci´on se especificar´an individualmente.

set

P R O D ;

set

A R E A

{ P R O D };

 

set

P R O D

: =

p l a t o

c u c h i l l o

 

set

set

A R E A [ A R E A [

p l a t o

c u c h i l l o

]

: =

]

; n o r t e

e s t e : =

; o e s t e

e s t e

e x p o r t

;

Podemos especificar expl´ıcitamente que uno o m´as de esos conjuntos es vac´ıo, al dar una lista vac´ıa; poniendo el punto y coma justo despu´es del operador “:=”. Si queremos que AMPL suponga que cada conjunto es vac´ıo excepto si se especifica otra cosa, incluyendo una frase default en el modelo:

set

A R E A

{ P R O D }

default

{ } ;

En otro caso ser´ıamos avisados de que la especificaci´on de los miembros de un conjunto no se ha realizado.

Conjuntos de dos dimensiones.

Para un conjunto de pares, los miembros pueden especificarse de varias maneras:

set

set

O R I G D E S T

;

;

 

set

L I N K S

within

{

O R I G

, D E S T };

1. lista de pares

set

L I N K S

:=

(

SE , CO

)

( SE , HU

)

( SE , JA

)

(

SE , GR

)

(

MD , CA )

(

MD , CO

)

( MD , HU

)

( MD , AL

)

(

MD , JA

)

(

MD , GR )

(

BA , CA

)

( BA , AL

)

( BA , JA

)

(

BA , MA

)

;

2. lista de pares, sin los par´entesis y las comas

 

set

L I N K S

:=

SE

CO

SE

HU

SE

JA

SE

GR

MD

CA

MD

CO

MD

HU

MD

AL

MD

JA

MD

GR

BA

CA

BA

AL

BA

JA

BA

MA

;

3. Un conjunto de pares puede especificarse en una tabla tambi´en de la siguiente forma:

set

L I N K S :

CA

CO

HU

AL

JA

MA

GR

:=

SE

-

+

+

-

+

-

+

MD

+

+

+

+

+

-

+

BA

+

-

-

+

+

+

-

;

Un signo “+” indica un par que est´a en el conjunto, y un signo “-” indica que no est´a ese

par. Normalmente las filas son etiquetadas con la primera componente, y las columnas con la segunda. Si preferimos lo opuesto, podemos indicar una tabla traspuesta al anadir˜ (tr) despu´es del nombre del conjunto:

set

L I N K S

( tr ):

 

SE

MD

BA

:=

CA

-

+

+

CO

+

+

-

HU

+

+

-

13

AL

-

+

+

JA

+

+

+

MA

-

-

+

GR

+

+

-

;

Las tablas son m´as convenientes para conjuntos que son relativamente densos. En otro caso la lista de pares va mejor; y es tambi´en m´as f´acil de generar por un programa.

4. Otra forma de describir un conjunto de pares es listar todas las segundas componentes que unen con cada primera componente:

set

L I N K S

:=

(

SE

, * )

CO

HU

JA

GR

(

MD

, * )

CA

CO

HU

AL

JA

GR

(

BA

, * )

CA

AL

JA

MA

;

Se podr´ıa hacer listando todas las primeras componentes que unen con cada una de las segundas componentes: (*,CA) MD BA.

Cada comod´ın * es seguido por una lista, cuyas entradas son sustituidas por el * para generar pares en el conjunto.

Conjuntos multidimensionales.

Utilizamos los siguientes ejemplos, para ver las distintas formas de definir conjuntos multidimen- sionales:

set

R U T A S

within

{

O R I G

,

D E S T ,

P R O D };

 

set

R U T A S

(

:=

SE ,

HU

,

c u c h i l l o

)

(

SE

,

JA

,

c u c h i l l o

)

(

SE

,

GR

c u c h i l l o )

 

(

MD ,

CA

,

p l a t o

)

(

MD

,

CA

,

c u c h i l l o

)

( MD ,

CO

,

, p l a t o

)

 

;

set

R U T A S

:=

 

SE

HU

c u c h i l l o

 

SE

JA

c u c h i l l o

SE

GR

c u c h i l l o

MD

CA

p l a t o

 

MD

CA

c u c h i l l o

MD

CO

p l a t o

 
 

;

set

R U T A S

:=

 

(

MD ,*,

p l a t o

)

CA

CO

HU

JA

GR

(

BA ,*,

p l a t o

)

CA

AL

JA

MA

 

;

set

:=

 

R U T A S (*, CA

R U T A S

, * )

MD

MD

 

p l a t o

 

MD

c u c h i l l o

BA

p l a t o

 

(*, CO

, * )

p l a t o

MD

c u c h i l l o

 

set

;

 

( * , * ,

:= p l a t o

):

CA

CO

HU

AL

JA

MA

GR

:=

SE

-

-

-

-

-

-

-

MD

+

+

+

-

+

-

+

BA

+

-

-

+

+

+

-

14

( * , * , c u c h i l l o ):

CA

CO

HU

AL

JA

MA

GR

:=

SE

-

-

+

-

+

-

+

MD

+

+

+

+

+

-

-

BA

- Tambi´en se puede usar la notaci´on (tr).

-

-

-

-

+

-

;

1.6.2 Datos de par´ametros.

Para un par´ametro escalar (no indexado), la asignaci´on de un valor ser´ıa:

param

a v a i l

: =

4 0 ;

Par´ametros unidimensionales.

La forma m´as simple para dar datos para un par´ametro indexado es por medio de una lista. Para un par´ametro indexado sobre un conjunto simple:

set

P R O D

; v a l o r

>

Cada elemento de la lista de datos consta de un miembro del conjunto y de un valor:

param

{ P R O D }

0 ;

set

P R O D

:=

p l a t o

c u c h i l l o

t e n e d o r

;

param

v a l o r

:=

 

p

l a t o

2 0 0

 

c

u c h i l l o

1 4 0

t

e n e d o r

1 6 0

;

equivalentemente:

param

v a l o r

: =

p l a t o

 

2 0 0 ,

c u c h i l l o