Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Universidad de Valladolid
ndice Parte I: Introduccin. 1. Introduccin. 2. Elementos fundamentales. 3. Instalacin de AMPL. 4. Algunos detalles sobre el editor PFE32. Parte II. Modelos explcitos de Programacin Lineal resueltos interactivamente. 1. Introduccin. 2. Creacin de un fichero .mod. 3. Resolucin interactiva del modelo anterior usando la ventana scroll windows. 4. Sufijos. 5. Otros comandos. 6. Cotas y atributos integer y binary para las variables. 7. Un primer ejemplo. El problema del transporte. 8. Ejercicios con print y printf. 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 IV: Ejercicios con algunos comandos. 1. Ejercicios con print y printf. 2. Otros ejercicios (con display, print y printf). 3. Ejercicios con los comandos for, print, printf e if. Parte V: Instrucciones para obtener diferentes valores de la solucin ptima. Parte VI: Instrucciones para anlisis de sensibilidad. Parte VII: Resumen de los comandos usados
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 1 de 15
Universidad de Valladolid
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). De una manera informal: (i) con un fichero .mod indicamos al ordenador qu modelo queremos resolver. (ii) con un fichero .dat le sealamos los datos de ese modelo. (iii) con un fichero .run le decimos con que solvers queremos resolver el problema y que informacin queremos que nos muestre.
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 2 de 15
Universidad de Valladolid
3. Instalacin de AMPL.
Ampl ofrece una versin gratuita para estudiantes. Para instalar los ficheros necesarios pueden seguirse los siguientes pasos. Instalacin de ficheros del entorno de AMPL.
1. Usando internet, entrar en www.ampl.com. 2. Pinchar en la palabra download, situada en la columna izquierda, en el prrafo que sigue a
TryAMPL!
3. Pinchar en CPLEX8.0 Student Edition. 4. Pinchar en For Windows user new to AMPL. 5. Pinchar en amplcml.zip y guardar en la carpeta elegida el fichero .zip correspondiente
(amplcml). 6. Descomprimir el fichero amplcml.zip antes bajado. Puede hacerse pulsando el botn derecho y eligiendo la opcin extract to folder: C:\.......... 7. Entre otros, al final debemos tener los siguientes ficheros: ampl.exe (procesador de AMPL). cplex.exe (solver de PL, PE y redes). cplex80.dll (librera de cplex). minos.exe (solver de PL y PNL). sw.exe (ventana en la que puede ejecutar el procesador de AMPL de una forma cmoda). Instalacin del editor PFE32.exe. Este editor resulta cmodo para trabajar en la elaboracin de los ficheros .mod, .dat y .run. Puede bajarse buscando con google las palabras pfe32.zip. Entre las bsquedas encontradas elegir una adecuada. Por ejemplo, pinchando en factsheet.
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 3 de 15
Universidad de Valladolid
1. 2.
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 4 de 15
Universidad de Valladolid
Ejemplo de un modelo de PL explcito con dos variables (ejemplo1.mod): Supongamos que queremos resolver el problema:
maximizar la funcion 3x1+4x2 sujeta a: x1+x2 <= 2 4x1+6x2 <= 9 x1>=0, x2>=0
3. Resolucin interactiva del problema anterior usando el procesador de comandos en la ventana sw.exe.
Una sesin inicial para resolver el problema anterior puede conseguirse aplicando en modo secuencial e interactivo los siguientes comandos: el comando reset elimina de la memoria de AMPL el modelo y los datos de trabajos anteriores. el comando model enva al procesador de comandos el modelo que queremos resolver. Para ello es necesario sealar la ubicacin exacta del correspondiente fichero .mod, mediante la indicacin del camino o path. con el comando option solver se elige el solver con el que queremos resolver el modelo actual; dependiendo del tipo de problema a resolver elegiremos el ms adecuado. De momento, elegiremos la opcin option solver cplex. el comando solve llama al solver elegido y aplica el algoritmo correspondiente, obtenindose una solucin ptima. 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.
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 5 de 15
Universidad de Valladolid
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 .val .lb .ub .rc Interpretacin Valor actual Cota inferior Cota superior Coste reducido
Los sufijos ms habituales para las restricciones son: Sufijo .body .dual .slack Interpretacin Valor actual de la expresin Variable dual o precio sombra 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).
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 6 de 15
Universidad de Valladolid
Parte III: Resolucin automatizada o por lotes (batch). Creacin de un fichero .run.
1. Introduccin.
Una alternativa cmoda al modo interactivo usado anteriormente se tiene con un fichero .run. De este modo se indica de una sola vez al procesador de comandos de AMPL todo lo que queremos que haga. Es lo que se denomina ejecucin por lotes. Para ello ponemos tales comandos conjuntamente en un fichero .run que ejecutamos en el procesador de comandos por medio de la instruccin include. 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:. Con el editor PFE32 creamos el fichero ejemplo1.run siguiente:
# Ejemplo 1 # fichero ejemplo1.run # include c:\users\ejemplo1.run; reset; model c:\users\ejemplo1.mod; option solver cplex; solve; display x1, x2; display objetivo; # comando para eliminar de memoria el modelo y los datos anteriores # comando para enviar al procesador de AMPL el modelo actual # comando para elegir solver (en este caso elegimos el cplex) # comando para que el solver elegido actue # comando para mostrar en pantalla los valores optimos de las variables # comando para mostrar en pantalla el valor optimo de la funcion objetivo
Nota: Es claro que podemos suprimir todas las lneas de comentarios que siguen al signo #.
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 7 de 15
Universidad de Valladolid
3. Ejemplo resumen.
Un fichero . run con todo lo explicado hasta aqu es el siguiente:
# fichero .run para un problema de Programacion Lineal # inclusion de sufijos y otros comandos # fichero ejemplo1b.run reset; # intruccion para eliminar de la memoria el modelo y los datos anteriores model D:\users\ejemplo1.mod; # intruccion para enviar al procesador el modelo actual option solver cplex; # intruccion para elegir solver (en este caso elegimos el cplex) solve; # intruccion para que el solver elegido actue # instrucion para mostrar en pantalla un rotulo fijo elegido por nosotros printf "\n mostrar en pantalla los valores optimos de las variables indicadas \"; # 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 restricciones indicadas con sufijos display res1, res1.body, res1.dual, res1.slack; display res2, res2.body, res2.dual, res2.slack; # instruccion para mostrar en pantalla el valor optimo de la funcion objetivo display objetivo; # 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:
# instruccin a copiar en el programa AMPL (dentro de la ventana sw.exe) # para facilitar a AMPL la ubicacin de este fichero # include D:\users\ejemplo1b.run;
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 8 de 15
Universidad de Valladolid
B. Mochila continua con cotas. 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 0<=x1<=1, 0<=x2<=1, 0<=x3<=1, 0<=x4<=1.
# fichero mochila2.mod # declaracion de las variables, de su no negatividad y de sus cotas var x1>=0,<=1; var x2>=0,<=1; var x3>=0,<=1; var x4>=0,<=1; # 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 ;
C. Mochila entera sin cotas. 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>=0, x2>=0, x3>=0, x4>=0 y enteras.
# fichero mochila3.mod # declaracion de las variables, de su no negatividad y de ser enteras var x1>=0,integer; var x2>=0,integer; var x3>=0,integer; var x4>=0,integer; # 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 ;
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 9 de 15
Universidad de Valladolid
D. Mochila entera con cotas. 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 0<=x1<=3, 0<=x2<=2, 0<=x3<=2, 0<0x4<=3 y enteras.
# fichero mochila3.mod # declaracion de las variables, de su no negatividad y de ser enteras var x1>=0,<=3,integer; var x2>=0, <=2,integer; var x3>=0, <=2,integer; var x4>=0, <=3,integer; # 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 ;
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 10 de 15
Universidad de Valladolid
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 11 de 15
Universidad de Valladolid
---------------------------------------------------------------------------------------------
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 12 de 15
Universidad de Valladolid
ampl: for{i in 1..10} {printf "pepe\t pepe pepe pepe pepe pepe
pepe
pepe pepe
pepe pepe
pepe pepe
pepe pepe
ampl:
---------------------------------------------------------------------------------------------
ampl: for{i in 1..10} {printf "pepe\t"} printf"\n"; pepe pepe pepe pepe pepe pepe ampl:
---------------------------------------------------------------------------------------------
ampl: for{i in 1..10} {if i<5 then print "pepe"}; pepe pepe pepe pepe
---------------------------------------------------------------------------------------------
ampl: for{i in 1..10} {if i<5 then {print "pepe"} else {print "luis"}}; pepe pepe pepe pepe luis luis luis luis luis luis ampl:
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 13 de 15
Universidad de Valladolid
# 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 printf\n Valor de las rectricciones\n\n; display {i in 1.._ncons} (_conname[i],_con[i].body, _con[i].dual, _con[i].slack);
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 14 de 15
Universidad de Valladolid
Fichero AMPL-notas-nivel-1-(2006-10-10).doc
Pgina 15 de 15