Documentos de Académico
Documentos de Profesional
Documentos de Cultura
AMPL Notas 1 PDF
AMPL Notas 1 PDF
ndice
Parte I: Introduccin.
1. Introduccin.
2. Elementos fundamentales.
3. Instalacin de AMPL.
4. Algunos detalles sobre el editor PFE32.
Parte III: Resolucin automtica o por lotes (batch). Creacin de un fichero .run.
1. Introduccin.
2. Una forma prctica de proceder.
3. Ejemplo resumen.
4. Un pequeo truco.
5. Problemas tipo mochila.
Parte I: Introduccin
1. Introduccin.
AMPL es un programa dirigido a la construccin y resolucin de modelos de optimizacin,
fundamentalmente modelos de Programacin Lineal, Programacin Entera y Programacin No
Lineal.
A diferencia de otros programas parecidos, como LINGO, una vez definido un modelo en AMPL
puede especificarse el cmo queremos resolverlo. Esto permite el diseo de muchas alternativas de
ejecucin del programa.
Existe una variedad muy grande de solvers (resolvedores) que pueden ser llamados desde
AMPL (algunos son de dominio pblico), lo que da una gran potencia y versatilidad al programa.
Para una descripcin completa de los elementos bsicos del lenguaje la mejor fuente es el libro de
R. FOURER, D. M. GAY & B. W. KERNIGHAN AMPL, A Modeling Language For Mathematical
Programming, The Scientific Press (1993, 2002).
Para acceder a los servicios de AMPL consultar la direccin http://www.ampl.com.
Para una descripcin de las mejoras que se han ido incorporando desde la versin inicial, de los
solvers disponibles y de otras muchas cuestiones, consultar en
http://netlib.bell-labs.com/cm/cs/what/ampl/index.html
2. Elementos fundamentales.
Para poder trabajar con el programa AMPL necesitamos lo siguiente:
A. El modelizador AMPL, que corresponde al programa ampl.exe. Este programa puede ser
ejecutado en modo comando en una ventana de MS.DOS, o, ms cmodamente, desde una
ventana windows por medio del programa sw.exe (scroll windows).
B. Los solvers (resolvedores), que son los programas que tienen implementados los algoritmos
para resolver diferentes tipos de problemas. La edicin Standard AMPL Student for
Windows puede ejecutarse con diferentes solvers, entre los que destacan CPLEX (para
problemas de PL, PE y Redes) y MINOS (para problemas de PL y PNL), y tiene la
limitacin de hasta 300 variables y 300 restricciones. Adems de la versin Standar AMPL
Student for Windows, hay otras versiones como AMPL Plus para WINDOWS, o versiones
para Linux, Unix y otras plataformas.
La forma ms habitual de trabajar con AMPL es editar primero tres ficheros, con extensiones
.mod, .dat y .run conteniendo, respectivamente, las componentes del modelo, los datos en el
formato AMPL, y los comandos que se van a ejecutar. Estos ficheros de texto pueden editarse y
mantenerse con cualquier editor de textos (p.e. con el bloc de notas). Aunque muchos de los
comandos que aparecen en el archivo .run podran ser ejecutados manualmente en la ventana de
comandos, es ms conveniente agruparlos en un archivo o script con extensin .run, donde
adems pueden ir todo tipo de opciones, bucles repetitivos, etc.
Adems de las tres ventanas de texto, es preciso tener activo el programa AMPL o bien en
una ventana de MS.DOS o, ms cmodamente, en una ventana del programa scroll windows
(sw.exe).
3. Instalacin de AMPL.
Ampl ofrece una versin gratuita para estudiantes. Para instalar los ficheros necesarios pueden
seguirse los siguientes pasos.
1. Introduccin.
En esta seccin vamos a ver cmo se introducen en AMPL ejemplos sencillos de Programacin
Lineal de pocas variables, y cmo se ejecutan archivos de comandos para las sesiones iniciales de
AMPL. En estos ejemplos los datos del problema (coeficientes de la funcin objetivo, de las
restricciones y del lado derecho), estn incluidos en el modelo, por lo que no es preciso crear un
archivo con los datos, es decir, no necesitamos el archivo .dat. Les llamaremos modelos explcitos.
Posteriormente veremos que, como es importante lograr la separacin completa entre el modelo y los
datos, es mejor usar tambin este tipo de archivo. De momento, tampoco usaremos el archivo .run.
Algunas ideas generales son:
Los comentarios pueden ser aadidos desde el smbolo # hasta el final de la lnea.
Al final de cada declaracin o comando debe ir un punto y coma (;).
Las maysculas son distintas de las minsculas.
Se pueden insertar espacios en blanco o lneas en blanco sin afectar a la ejecucin del programa.
La multiplicacin debe indicarse con el signo *; por ejemplo, debe escribirse 3*x1 + 4*x2, y no
3x1 + 4x2.
Resumen
Declaracin Uso
Var Declaracin de variable
Minimize Declaracin de objetivo (minimizar)
Maximize Declaracin de objetivo (maximizar)
Subject to Declaracin de restriccin
# Ejemplo 1
# fichero ejemplo1.mod
Una vez obtenida una solucin ptima, podemos elegir que resultados queremos que el
ordenador nos muestre. Para ello tenemos los comandos display, print y printf. Ellos nos
permiten mostrar en pantalla datos, resultados o mensajes de texto preestablecidos. Por
ejemplo, despus de resolver el Ejemplo1, podemos escribir en la ventana sw.exe:
display x1, x2;
y despus de leer en pantalla los valores de x1 y x2 podemos escribir:
display objetivo;
con lo que obtendremos en pantalla el valor de la funcin objetivo.
4. Sufijos.
Con el comando display se pueden tambin visualizar otros valores asociados a las
variables y a las restricciones, mediante el uso de sufijos.
Los sufijos ms habituales para las variables son:
Sufijo Interpretacin
.val Valor actual
.lb Cota inferior
.ub Cota superior
.rc Coste reducido
Sufijo Interpretacin
.body Valor actual de la expresin
.dual Variable dual o precio sombra
.slack Holgura
5. Otros comandos.
Aunque ms adelante se ver un uso ms intensivo del lenguaje de comandos, hay otros
comandos sencillos que valen para ver el modelo en su conjunto como son:
el comando show que muestra las componentes del modelo.
el comando expand que expande el modelo (salvo, en su caso, la no negatividad).
var x1 >=0 ;
var x2 >=0, <=8 ;
var x3 >=0, integer ;
var x1 binary ;
Ejemplo para resolver el problema de Problema Lineal expuesto en la Parte II, secciones 2
y 3 (modelo explcito), suponiendo que hemos guardado el fichero .mod en
D:\user\ejemplo1.mod, se procede como sigue:.
Nota: Es claro que podemos suprimir todas las lneas de comentarios que siguen al signo #.
3. Ejemplo resumen.
# instruccion para mostrar en pantalla los valores optimos de las variables indicadas con sufijos
display x1, x1.val, x1.lb, x1.ub, x1.rc;
display x2, x2.val, x2.lb, x2.ub, x2.rc;
# instruccion para mostrar en pantalla las componentes del modelo actual (variables, restricciones y objetivo)
show;
# instruccion para mostrar en pantalla el modelo actual expandido (sin las restriciones de no negatividad ni cotas)
expand;
Nota: Es claro que podemos suprimir todas las lneas de comentarios que siguen al signo #.
4. Un pequeo truco.
Puede resultar cmodo incluir en el fichero .run el camino o path donde localizar el
propio fichero .run para luego copiarlo fcilmente en la ventana del programa scroll
windows (sw.exe). Para ello, preferentemente en una de las primeras lneas del programa,
podemos aadir:
# fichero mochila1.mod
# declaracion de las variables y de su no negatividad
var x1>=0;
var x2>=0;
var x3>=0;
var x4>=0;
# declaracion de las restricciones
subject to res1: 5*x1 + 7*x2 + 4*x3 + 3*x4 <= 14; # la palabra res1 es elegible a gusto personal
# declaracion de la funcion objetivo # la palabra objetivo es elegible a gusto personal
maximize objetivo: 16*x1+22*x2+12*x3+8*x4 ;
D. Mochila binaria.
Se trata de resolver el problema:
maximizar z=16*x1+22*x2+12*x3+8*x4 ;
sujeta a:
5*x1+7*x2+4*x3+3*x4 <= 14
x1, x2, x3, x4 binarias.
# fichero mochila4.mod
# declaracion de las variables y de ser binarias
var x1 binary;
var x2 binary;
var x3 binary;
var x4 binary;
# declaracion de las restricciones
subject to res1: 5*x1 + 7*x2 + 4*x3 + 3*x4 <= 14; # la palabra res1 es elegible a gusto personal
# declaracion de la funcion objetivo # la palabra objetivo es elegible a gusto personal
maximize objetivo: 16*x1+22*x2+12*x3+8*x4 ;
sw: ampl
ampl: print "pedro";
pedro
--------------------------------
ampl: printf "pedro";
pedroampl:
--------------------------------
ampl: printf "pedro perez mateos";
pedro perez mateosampl;
--------------------------------
ampl: printf "pedro perez mateos\n";
pedro perez mateos
ampl;
--------------------------------
ampl: printf "\npedro perez mateos\n";
pedro
perez
mateos
--------------------------------
ampl: printf "\npedro \nperez \nmateos\n\n";
pedro
perez
mateos
--------------------------------
ampl: printf "\npedro \tperez \tmateos\n\n";
pedro
perez
mateos
--------------------------------
ampl: printf "\n\tpedro \n\t\tperez \n\t\t\tmateos\n\n";
pedro
perez
mateos
--------------------------------
---------------------------------------------------------------------------------------------
ampl: param a:=3.141592;
ampl: display a;
a = 3.14159
---------------------------------------------------------------------------------------------
ampl: print a;
3.141592
---------------------------------------------------------------------------------------------
ampl: printf "el valor de a es = %.2f\n", a;
el valor de a es = 3.14
---------------------------------------------------------------------------------------------
printf "el valor de a es = %.2f\n", a;
el valor de a es = 3.14
---------------------------------------------------------------------------------------------
ampl: printf "el valor de a es = %.4f\n", a;
el valor de a es = 3.1415
---------------------------------------------------------------------------------------------
ampl: printf "el valor de a es = %.0f\n", a;
el valor de a es = 3
---------------------------------------------------------------------------------------------
ampl: printf "el valor de a es = %.d\n", a;
el valor de a es = 3
# Comandos para obtener diferentes valores de la solucin ptima SIN SABER los nombres de las variables
# ver libro de AMPL (ed 2003) pgina 249.
# Comandos para obtener diferentes valores de la solucin ptima SIN SABER los nombres de las restricciones
# ver libro de AMPL (ed 2003) pgina 249
# _ncons es el nmero de restricciones del modelo
# _conname[i] es el nombre de la restriccin [i] del modelo
# _con[i].body es el valor actual de la restriccin [i] del modelo
# _con[i].dual es el valor de la variable dual de la restriccin [i] del modelo
# _con[i].slack es el valor de la holgura de la restriccin [i] del modelo
Comandos Accin