Jess Sez Aguado Departamento de Estadstica e Investigacin Operativa Universidad de Valladolid February 28, 2003 Parte I: Introduccin 1 Introduccin. AMPL es un programa dirigido a la construccin y resolucin de modelos de op- timizacin, fundamentahnente 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, lo que permite el diseo de muchos tipos de algoritmos, como bucles repetitivos, generacin de columna.'>, planos de corte, relajacin La- grangeana o descomposicin. Simultneamente existe una variedad muy grande de 'solvers' que pueden ser llamados desde AMPL, algunos de dominio pblico, lo que da una gran potencia y versatilidad al programa. Otro hecho a destacar e..'! la continua incorporacin de mejoras y procedimientos recientes. Para una descripcin completa de los elementos bsicos dellenguage la mejor fuente sigue siendo el libro R. FOURER, D. M. GAY & B. W. KERNIGHAN AMPL, A Modeling Language for Mathematical Programming, The Scientific Press 1993. Para una descripcin de todas las mejora.'> que se han ido incorporando desde entonces, de los solvers disponible..'> y de otras muchas cuestione..<>, en las direccines Web siguientes: http:f fnetlib.bell-labs.comfcmfcsfwhatfampl/index.html http:f fwww.ampl.com El programa AMPL consta fundamentalmente de la.'> siguientes componentes: l. El procesador dellenguage AMPL, que corresponde al programa ampl.exe y que compila todos los ficheros y comandos. El procesador puede ser ejecutado en modo comando en una ventana de DOS, o bien puede ser ejecutado ms cmodamente desde una ventana windows ejecutando el programa < 1 2. Los solvers, que son los algoritmos para resolver diferentes tipos de prob- lemas. La edicin Standar AMPL Student for Windows puede ejecutarse con diferentes solvers, entre los que destacan CPLEX (para problema.'> de PL, PE y Rede..">) 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, otras versione..<J como AMPL Plus para Windows, o versiones para Linux, Unix y otras platafor- mas. Cuando se crean modelos con AMPL pueden aparecer los siguientes tipos de archivos: Tipo de archivo .mod .dat .run .amp .qry .nl Descripcin Componentes del modelo Archivo de datos Comandos y scripts Proyecto (slo para AMPL Plus) Archivo SQL para datos externos Archivo creado por AMPL La forma ms habitual de trabajar con AMPL es editar primero tre..'> ficheros, con extensiones .mod, .dat y .run contenien..-; respectivamente, las compo- nentes 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, como el bloc de notas o cualquier otro editor de texto. Aunque muchos de los comandos que aparecen en el archivo .run podran ser ejecutados manualmente en la ventana de comandos, es m..'> conveniente agruparlos en un archivo o script con extensin .run, donde adems pueden ir todo tipo de op- ciones, bucles repetitivos, etc.. Adems de las tres ventanas de texto, es preciso tener activo el procesador de comandos o bien en una ventana de DOS, o ms cmodamente de..">de una ventana windows en sw.exe. 2 Modelos explcitos de Programacin Lineal En e..">ta seccin vamos a ver cmo se introducen ejemplos sencillos de Progra- macin Lineal de poca.<> variables, y cmo se ejecutan archivos de comandos para las sesiones iniciales de AMPL. En estos ejemplos los datos del problema, como los coeficientes de la funcin objetivo, las restricciones y del lado derecho, estn incluidos en el modelo, por lo que no es preciso crear un archivo con los datos. Posteriormente veremos que es importante lograr la separaci6n completa del modelo de los datos. Para definir un modelo de Prgramacin Lineal se pueden usar las siguientes declaraciones, que debern ir incluidas en un fichero con extensin .mod: 2 1 i 1 L
Declaracin sat param var minimiza maximiza subjact to Uso para definir un conjunto declaracin de parmetro declaracin de variable declaracin de objetivo (minimizar) declaracin de objetivo (maximizar) declaracin de restriccin Un modelo de muy pocas variables puede ser introducido en AMPL de forma explcita con las siguientes consideraciones: Comentarios pueden ser aadidos desde el snbolo # hasta el final de la lnea. Al final de cada declaracin o comando debe ir un punto y coma ; Cada variable debe ser declarada explcitamente (con la declaracin var), as como su tipo o su,.c:; cotas. Cada restriccin debe ser declarada explcitamente (con la declaracin subjact to), conveniente darle un nombre, inmediatamente antes de los dos puntos :.. La funcin objetivo se introduce despus de maximiza o minimiza, y tambin es conveniente darle un nombre. #Ejemplo de un modelo de PL explcito con dos variables (modl.mod): ' #Modelo de PL explicito var X>=0,<=15; var Y>=0,<=15; x'\. 3.s H1"' o.( '{*::; '(S' ,{ ; o maximize obj:20*X+30*Y; '-.f ---"- .tJ4 ;: y,P :e 0 , , subject to res1 :X+Y<=19; subject to res2:2*X+3*Y<=52; Yt-;.1o U na sesin inicial para resolver el problema anterior podra consistir de los siguientes comandos: Q\''
reset;" model C.'\MOM. MOb ) option solver cplex; sol ve;' printf 1 "\n Modelo mod1. Solucion optima\n"; displar obj; displl:\f X,Y; j\') ?l' El comando reset elimina de la memoria de AMPL el modelo y los datos presentes. El comando model enva al procesador el modelo especificado, y es preciso indicar todo'el camino donde est el archivo correspondiente. A contin- uacin se elige el solver con el comando option solver, dependiendo del tipo 3 de problema que vaya a resolverse. El comando sol ve llama al solver elegido y aplica el algoritmo correspondiente, obteniendose una solucin ptima. Por ltimo, con los comandos printf y display se envan mensajes de texto y se visualizan los valores de las variables. Con el comando display se pueden tambin visualizar otros valores asociados a las variables y a las restricciones, mediante el uso de sufijos. En las siguientes tablas aparecen los sufijos ms habituale.."l para variables: '- Sufijo .lb .ub .re .val Interpretacin Cota inferior Cota superior Coste reducido Valor actual Y los sufijos para restricciones: reset; Sufijo .body .dual .slack model c:\modi.mod; Interpretacin Valor actual de la expresin Variable dual o precio sombra Holgura printf "\n\n***Modelo mod1. Componentesdel modelo***\n\n"; show; printf "\n***Modelo mod1. Modelo completo***\n\n"; expand; option solver minos; solve; , printf "\n***Modelo mod1. Solucion optima***\n"; display obj; display X,X.rc;. display Y,Y.rc; display res1.body,res1.dual,res1.slack; display res2.body,res2.dual,res2.slack; Estos comandos producen la siguiente salida, que puede ser guardada en un archivo para su posterior edicin o exmen: 4
***Modelo mod1. Componentes del modelo*** variables: X y constraints : res1 res2 objective: obj ***Modelo mod1. Modelo completo*** maximize obj: 20*X + 30*Y; s.t. res1: X + Y <= 19; s.t. res2: 2*X + 3*Y <= 52; 1-o( 3 .f)+ 3<> (.1 !>)., f;l,_,Q '2.0 (o)+ :o. sz.o Zo(S")+ MINOS 5.5: optimal solution found. 2 iterations, objective 520 ***Modelo mod1. Solucion optima*** obj = X = 3.5 X.rc = -3.55271e-15 Y = 15 Y.rc = -7 .10543e-15 1:\ 1 res1.body = 18.5 res1.dual = O res1.slack = 0.5 ( . res2.body =52 res2.dual = 10 res2.slack = \ t-J.,v\.- So\A.)Cit>t.JCS' i S oL1.1 e\ o tJ es. A LTf:fLt>J/It;S ! 5 Parte II: Ellenguage AMPL, elementos bsicos Normalmente los modelos tienen algn tipo de estructura que permite el uso de conjuntos, que generalmente son lo.<J conjuntos de ndice..<; de un modelo. Esto facilita todas las declaraciones del modelo y .adems la separacin completa del modelo de los datos. En las siguientes seccioneS de esta parte II se describen los elementos fundamentales del lenguage AMPL, y cmo se introducen en AMPL los archivos .mod, .dat y .run, y en la parte 111, se aplica lo anterior a una serie de ejemplos sencillos de PL y otros tipos de modelos. Conjuntos e ndices Conjuntos simples El tipo ms sencillo de conjunto est definido explcitamente mediante sus el- emento.<; como sucesin de caracteres. As, podemos definir en el archivo .mod dos conjuntos mediante las declaraciones: set productos; set maquinas; Y en al archivo .dat especificar sus elementos mediante: ,set productos:=pl p2 p3 p4; set maquinas:=m1 m2 m3; Esta forma de definicin de conjuntos suele hacerse slo para conjuntos peque os, donde adems se quiere conservar el nombre de los elementos. Los tipos de conjuntos ms utilizados son los conjuntos de nmero..,, y generalmente van a corresponder a lo.'! conjuntos de ndices de un modelo. Por ejemplo, para definir un conjunto de 12 elementos con nombre productos, basta doclarar: set productos:=1 .. 12 Aunque la anterior declaracin es vlida, es ms conveniente declarar en el mod- elo: , param n; set productos:=1 .. n; y entonces en el fichero de dato.<; especificar: param n: =12; De esta forma se logra la separacin efectiva del modelo de los datos. Cuando en la definicin de un conjunto interviene un perodo distinto de 1, esto puede indicarse mediante la clasula by, indicando el perodo. Por ejemplo, son equiv- alentes: set quinquenios:={1990,1995,2000,2005,2010,2015,2020}; set quinquenios :=1990 .. 2020by5; Esta tltima declaracin puede ser sustituida por las siguientes ms eficientes, aunque ms largas:
J. ,. param inicio integer; param final > inicio integer; param intervalo > O integer; set quinquenios := inicio .. final by intervalo; Y posteriormente en el archivo de datos declarar: param inicio : = 1990; param final :=2020; param intervalo : = 5; Operaciones sobre conjuntos AMPL di'lpone de cuatro operadores para construir nuevos conjuntos a partir de otros ya existentes: A union B union: o en A o en B A inter B interseccin: a la vez en A y en B A diff B diferencia: en A pero no en B A symdiff B diferencia simetrica: en A o en B pero no en ambos Otros operadores valen para examinar la pertenencia de elementos a conjunto..'! o la inclusin de conjuntos: in pertenece wi thin contenido not in not within card no pertenece no contenido cardinal / Indicando expresiones sobre conjuntos A veces, para: parmetros, variables o restricciones es necesario introducir ' d' l l d . P . 1 un m tce ummy que recorre os e ementos e un conJunto. or eJemp o, para introducir cotas superiores sobre variables asociada.'! a un conjunto de productos, puede hacerse: set productos; param cota{productos}>=O; o de forma equivalente param cota{j in productos}>=O; var X{j in productos}>=O,<=cota[j]; Notar gue todas la..'l declaraciones referentes a con,iuptos .. mientras que los ndices de las variables o :earmetros van con corchetes X [j] , o A diferencia de los nombres de componentesndel modelo, los ndices dummy tienen un alcance (scope) que termina en la misma declaracin donde se introdujo. Por esto mismo puede volverse a usar el mismo ndice en otra declaracin. Conjuntos de pares ordenados En la mayora de modelos aparecen matrices de datos, como Cij, o variables con dos ndices, como Xij, donde i, j recorren ciertos conjuntos de ndices. Para 7 definir estas componentes en AMPL se puede usar el conjunto de todos los pares, o producto cartesiano, de dos conjuntos, por ejemplo conjl y conj2, de las siguientes formas equivalentes: {conj1,conj2}; {i in conj1,j in conj2}; conj1 cross conj 2; Y para definir parmetros o varaibles con dos ndices basta p&per: param costo{conj1,conj2}; " var X{conj1,conj2}; Conjuntos de n tuplas De la misma forma que para pares, pueden definirse parmetros y variables con tres o ms ndices, definiendo primero los conjuntos simples y despus el pro- ducto cartesiano. As, si se han definido tres conjuntos con nombres productos, periodos y metodos, y queremos definir una variable con tres ndices Xijt, ba..qta poner: var x{productos,periodos,metodos}>=O; y lo mismo para parmetros. Parmetros y expresiones Declaracin de parmetros Los dato..'! de un modelo son introducidos en ste mediante su declaracin como parmetros. Para parmetros unidimensionales basta una declaracin del tipo: param n; param T; Parmetros asociados a conjuntos se declaran poniendo en conjunto entre llaves, por ejemplo: param demanda{plantas}; param costo{origenes,destinos}; E.'lta..'l declaraciones son equivalentes a: param demanda{i in plantas}; param costo{i in origenes,j in destinos}; Lo..'l parmetros asociados a conjuntos simples son los anlogos de los vectores y los los a..qociados a pares de conjuntos corresponden a las matrices. Para acceder a un parmetro particular basta poner el ndice o los ndices entre corchetes, como en: demanda[i] o costo[i,jl. / Expresiones aritmticas Como la mayora de los lenguages de programacin, AMPL dispone de una serie de operadores aritmticos y lgicos, y una serie de funciones aritmticas/En la siguiente Tabla aparecen los operadores arimtcos con orden de precedencia creciente: / 8 " usual tipo de operandos tipo de resultado + - less aritmtico aritmtico sum prod max min aritmtico aritmtico * 1 div mod aritmtico aritmtico + - (unario) aritmtico aritmtico -o** aritmtico aritmtico Con estos operadores se pueden combinar nmeros, parmetros y variables con las convenciones estandar sobre precedencias (en caso de duda es mejor poner parntesis}. Los operadores ms sencillos son los estandar de adicin (+),sustraccin(-), multiplicacin(*), divisin(/) y exponenciacin e- o**}. Tambin puede usarse el operador div que devuelve el cociente truncado al dividir el operando de la izquierda por el de la derecha; el operador mod devuelve el resto de la divisin, y el operador less devuelve el operando de la izquierda menos el de la derecha si el resultado es positivo, y cero en otro caso. Otra manera de construir expresiones aritmticas es aplicando funciones a otras expresiones. AMPL dispone de gran variedad de funciones como son las funciones aritmticas, las funciones de redondeo y la..'l funciones de nmeros aleatorios. A continuacin aparecen las funciones aritmtica..'! ms usuales: abs (x) exp(x) log(x} loglO(x} max(x,y, ... ) min (x, y, ... ) sqrt(x} y las funciones de redondeo: valor absoluto, jxj exponencial, ex logaritmo natural, loge(x) logaritmo comn, loglo(x) mximo (2 o ms argumentos) mnimo (2 o m.'l argumentos) raz cuadrada foil. 1-\1.\ ceil(x) ceiling of x (nexfh.gher integer); fil' floor of x (next lower integer), LxJ
floor (x} precision (x, n) round(x, n} round (x) trunc (x, n) trunc (x) x rounded to n significant decimal digits x rounded to n digits pa..'lt decimal point x rounded to an integer x truncated to n digits past decimal point x truncated to an integer Por ltimo, la..'l siguientes funciones u operadores actan recorriendo un ndice sobre los elementos de un conjuntos, y efectuando la operacin corre- spondiente: L._ 1 Operador sum prod uso suma producto 'l?IA.., . .,z max mximo min mnimo Para la construccin de modelos de optimizacin el m.'l utilizado es el op- erador sum, que suma cierta expresin cuando se recorre los elementos de un conjunto, y corresponde a 1&'> sumatoriS. en modelos matemticos. As, se pueden usar expresiones del tipo: sum {i in plantas}capacidad[i]; sum {i in origenes, j in destinos}coste[i,j]*X[i,j]; En las expresiones con ndices pueden aparecer tanto como variables definidas en el conjunto correspondiente. De esta forma se definen en AMPL la funcin objetivo y las restricciones de los modelos de optimizacin como una simple traslacin de en los modelos genricos o matemticos. En la parte III de esta introduccin e definen diferentes modelos de Programacin Lineal usando fundamentalmente el operador sum. Expresiones lgicas y condicionales De un uso algo ms avanzado son los operadores lgicos que aparecen en la siguiente tabla: Estilo usual estilo alternativo if-then-else or 11 exists forall F1>1t. P..ll and &;&; not < <= = <> > >= < <= == != > >= in not in Restricciones sobre parmetros tipo de operandos lgico-aritmtico lgico lgico lgico lgico aritmtico aritmtico tipo de resultado aritmtico lgico lgico lgico lgico lgico aritmtico Cuando se declara un parmetro, tanto los sencillos como los asociados a un conjunto, se puede aadir una restriccin sobre el parmetro para que AMPL rechace valores inadecuados de ste. As, pueden declararse parmetros de la forma: param T > 1 integer; param dem {plantas} > = O; param U{j in productos}>=L[j]; Otras veces es preciso introducir condiciones ms compleja..'! sobre los datos. Esto se hace mediante la sentencia check. Por ejemplo, en los modelos para el problema del transporte se suele aadir la condicin de que la suma de ofertas sea igual a la suma de demandas: check:sum{i in origenes}oferta[i] = sum{j in destinos}demanda[j]; Si hay varias condiciones check, se puede dar un nombre a cada una de ellas. Notar que una condicin check no es una restriccin del modelo, e.."l slo una comprobacin de que los datos que se vayan a introducir verifican la condici6n. 9 10 .. Parmetros calculados En la mayor parte de los modelos, los parmetros son datos, cuyos valores son especificados en el archivo de datos mediante : =. En algunas ocasiones hay parmetros que son calculados en el mismo modelo en funcin de otros parmetros. As por ejmplo se pueden declarar: param dem_total := sum { j in productos }dem[j]; param dist_corr {i in plantas} :=dist[i]*factor; Variables, objetivos y restricciones La.<s declaraciones fundamentales para definir un modelo son la.<s siguientes, ya vistas en la parte I: Declaracin set param var node are minimize maximize subject to Uso para definir un conjunto declaracin de parmetro declaracin de variable declaracin de nodo para los modelos de redes declaracin de arco para los modelo..<s de redes declaracin de objetivo (minimizar) declaracin de objetivo (maximizar) declaracin de restriccin Cuando se declara una variable, si no se especifica nada la variable es con- tinua y no tiene restriccin de signo. Las restricciones de signo, las cota.<s sencillas y las restricciones de ser entera o binaria se especifican en la misma declaracin, como en: var X > = O, < = cota; var y >=0, integer; var delta binary; . Cuando una variable est asociada a un conjunto la declaracin puede hacerse en la misma lnea, y as son equivalentes: var X {productos}> = O; var X {j in productos}> = O; Sin embargo, si en las restricciones sobre la variable interviene algn parmetro, hay que poner necesariamente la expresin con un ndice: var X {j in productos}>= O, < = cota[j]; A partir de la.'! variables y parmetros definidos, se pueden formar expre- siones utilizando funciones y operadores vistos. Estas expresiones forman parte de la funcin objetivo y las restricciones del problema. Como se vi en la parte I, la funcin objetivo se declara mediante maximize o minimize, seguido de un nombre, los dos puntos : y la expresin correspondiente. As, puede definirse: minimize costo_total :sum{j in productos}costo[j]*X[j]; maximize beneficio: sum{i in plantas, j in productos}g[i,j]*x[i,j]; 11 Las restriccines se introducen con subject to, o abreviadamente s. t., seguido de un nombre, los dos puntos : y la expresin definiendo la re..<striccn. Para restricciones asociadas a conjuntos es indispensable un ndice, como en : subject to res_cota{j in productos}:x[j] <= cota[j]; subject to tiempo{i in seccion}: Ullllf u te', :f't*x [j] <= total [t]; " Datos Como se ha indicado en varias ocasione..<s, en AMPL es importante la distincin entre un modelo para un problema de optimizacin, y un conjunto de datos que definen un ejemplo especfico de ese modelo. En las secciqnes anteriores hemos vistos cmo se definen modelos mediante las declaraciones de conjuntos, parmetros, variables, objetivos y restricciones. En esta seccin veremos cmo se introducen datos para modelos sencillos, aunque existen formas alternativas ms avanzadas de introducir datos de..'!de archivos externos, hojas de clculo y bases de datos. Los datos de un modelo son guardados en un archivo de texto con la extensin .dat, por ejemplo produ.dat, para ser ledos con el comando data mediante: ampl: data produ.dat; Cuando AMPL lee datos, trata cualquier sucesin de espacios en blanco, ta buladores y final de lnea como un tnico espacio en blanco. De esta forma los datos son colocados en tabla.'! fciles de ver y mantener. La asignacin de datos se hace mediante : =, y al finalizar cualquier sentencia de declaracin de datos debe figurar el punto y coma ; . En el archivo de datos se especifican en primer lugar los conjuntos simple..'! que intervienen en el modelo, bien definiendo sus nombre..'! explcitamente o bien mediante un ndice numrico. As, son declaraciones vlida.'!: set productos : p1 p2 p3 p4; set perodos:=ene feb mar abr may jun jul; set periodos:=1 .. 12; Los parmetros de dimensin 1 son especificados con asignaciones como: param n:=15; pai.am T:=12; Los datos de un parmetro definido sobre un conjunto se dan en forma de lista donde aparecen cada elemento del conjunto y a continuacin valor del parmetro. As, si en el modelo se han declarado set productos ; param coste{productos} > O; se puede especificar: set productos := p1 p2 p3 p4; param coste:= p1 35 p2 22 p3 43 12 l .. p4 29; Tambin pueden usarse comas como separadores, de forma que la anterior asig- nacin sera equivalente a: param coste:= p1 35, p2 22, p3 43, p4 29; Frecuentemente se tienen definidos varios parmetros sobre el mismo con- junto, como en: param coste{productos}; param L{productos}; param U{j in productos}>=L(j]; En vez de dar valores a cada parmetro en una declaracin distinta, como en param coste:= p1 35 p2 22 p3 43 p4 29; param L:= p1 100 p2 150 p3 150 p4 i80 param U:= pi 1000 p2 i500 p3 1200 p4 2000; se puede hacer todo en la misma declaracin: param coste L U:= pi 35 iOO iOOO p2 22 150 i500 p3 43 150 1200 p4 29 i80 2000; Los parmetros de dimensin dos se especifican de forma anloga. Lo vemos con el siguiente ejemplo, donde en el modelo se tienen declarados: set PRODUCTOS; set RECURSOS param a{RECURSOS,PRODUCTOS} >= O; y en los datos se especifica: 13 set PRODUCTOS := p1 p2 p3 p4; set RECURSOS : = mi m2 m3; param a: pi p2 p3 p4:= m1 i 1.5 2 1 m2 3 2 O 2 m3 2 0.5 3 1; " Si la matriz tiene ms columnas filas,_ a en forma traspuesta con la notacin (tr) como en: - . .. param a (tr): m1 m2 m3 pi. 1 3 2 p2 1.5 2 0.5 p3 2 o 3 p4 1 2 i; Comandos ms utilizados. Aunque no est completa, en la siguiente lista aparecen los comandos AMPL ms utilizados, con una breve descripcin: Comando Descripcin model Lee las declaraciones del modelo de un archivo data data Lee la.c; declaraciones de datos de un archivo sol ve Resuelve el modelo acual display Visualiza conjuntos, parmetros y variables print Para obtener salidas sin formatear printf Permite salidas de texto r include Incluye archivos externos option Para incluir opciones reset Elimina de memoria el modelo y los datos actuales drop Elimina restricciones resto re fix unfix let reset data update data for repeat while repeat until if then else problem expand show Vuelve a activar restricciones Fija variables a los valores actuales Elimina la fijacin Cambia el valor de parmetros Elinima de la memoria los datos actuales Actualiza datos cambiados con let Bucle de repeticin sobre un conjunto Bucle de repeticin mientras Bucle de repeticin ha.c;ta Bucle condicional si-entonces-en otro ca.'!o Define un problema Expande el modelo actual Muestra las componentes del modelo 14 .. Algunos comandos ya han sido vi'ltos en la parte I, y pueden ser suficientes para las sesiones iniciales de AMPL. En la parte IV se ver un uso ms intensivo de este tipo de comandos y bucles, lo que permite el dio:reo de algoritmos y opcione.<J avanzadas para diferentes problemas de optimizacin. Parte III: Modelos 1 Modelos de Programacin Lineal. Un modelo de produccin con un nico recurso. Supongamos que hay n posibles productos a producir, un nico recurso oon tma cantidad di"lponible b (por ejemplo el tiempo di"lponible para fabricacin), y para cadaj=1, ... ,n se tienen los siguientes datos: 9J = ganancia por unidad del producto j Uj = cantidad mxima del producto j aj = tasa de produccin del producto j, es decir Toneladas producidas en una hora. El modelo matemtico para este problema sera: n Maximizar Z = 2: YJ Xj j=l n Sujeto a E (1/ai )xj b j=l O< Xj s ui ,j = 1, ... , n El modelo en formato AMPL Prod.mod para este problema podra ser: set P; param a {j in P}; param b; param g {j in P}; param u {j in P}; var X {j in P}>=O,<=u[j]; maximize ganancia: sum {j in P} g[j] * X[j); subject to tiempo:sum{jinP} (1/a(j)) * X[j) <= b; Y un conjunto de datos (en el archivo Prod.dat) puede ser: set P := p1 p2; param: a g u := p1 200 25 6000 p2 140 30 4000 ; param b := 40; Finalmente, el fichero de comandos ms sencillo (en Prod.run) puede ser: 15 reset; model C:\Prod.mod; data C:\Prod.dat; option solver cplex; sol ve; display X.lb,X,X.ub,X.rc; produciendo la siguiente salida en la ventana de CPLEX 6.5.3: optimal solution; objective 192000 2 simplex iterations (O in phase I) X.lb X X.ub X.rc := pl o: 6000 6000 4 p2 o! 1400 4000 o Por ltimo, el comando expand produce el modelo expandido siguiente: maximiza ganancia: 25*X('p1'] + 30*X['p2']; s.t. tiempo: 0.005*X['p1']+0.00714286*X['p2'] <= 40; s.t. Limites['p1'): O <= X['p1'] <= 6000; s.t. Limites['p2']: O<= X('p2'] <= 4000; Un modelo de produccin con varios recursos. Existen multitud de problemas de optimizacin que pueden englobarse en los trmino..'! de Anlisis de Actividades u Optimizacin de Recursos, y que consti- tuyen el ncleo de los problemas clsicos de Investigacin Operativa. Supong- amos que se tienen n actividades, para las que hay que determinar su nivel de actividad, y m recursos que limitan el nivel de la."l actividades. El ejemplo ms comn de actividades es la cantidad que se va a producir de ciertos productos. Para cada actividad (o producto) j = 1, ... ,n sea Xj la variable indicando su nivel de actividad (o cantidad producida), 93 la ganancia obtenida por unidad , lj el nivel mnimo y Uj el nivel mximo permitido; para cada recurso i=1, ... ,m sea bi > O la cantidad disponible; y para cada i,j sea aij la cantidad del recurso i necesaria para producir una unidad del producto j. Un modelo matemtico para este problema sera: r Maximizar : 9jXj j=l n Sujeto a E bi, i = 1, ... , rn j=l lj Xj Uj,j = 1, ... ,n Como ejemplo especfico supongamos que van a procesarse 3 productos a travs de 3 operaciones diferentes. Los tiempos (en minutos) requeridos por unidad de cada producto, la capacidad diaria de la."l operaciones (en minutos), las cantidades mnimas y mximas y la."l ganancias por unidad fabricada de cada producto vienen en la siguiente tabla: 16 .. " ... ' Tiempo/u Cp.pacidad Operacin Producto 1 Producto 2 Producto 3 tiA. 01 1 2 1 430 02 3 o 2 460 03 1 4 o 420 Cant..min 10 10 10 Cant..max 100 150 100 Ganancia/u 3 2 5 Los archivos con el moaelo y los daJos para AMPL podran ser: Contenido del archivo recursos.mod: set PRODUCTOS; set RECURSOS; pararn usos{RECURSOS,PRODUCTOS} >= O; pararn {RECURSOS}>= O; pararn beneficio {PRODUCTOS}; pararn cant..min {PRODUCTOS} >= O; pararn cant..max {PRODUCTOS} >= O; var X {j in PRODUCTOS}>= canLminf.il, <= cant..maxfj]; maximize ganancia: sum {j in PRODUCTOS} beneficio[j] * XUJ; ' subject to tiempo {i in RECURSOS}: sum {j in PRODUCTOS}usos[i,j]* XUJ <= recurso_disponible[i]; Conteniddo del archivo recursos.dat: set PRODUCTOS := p1 p2 p3; set RECURSOS := 01 02 03; pararn usos: p1p2 p3 := 01131 02 204 03 120; pararn: beneficio cant..min cant..max := p1 310100 p2 210150 p3 510100; pararn recurso_disponible:= 01 430 02 460 03 420; Todas las salidas obtenidas con display o printf, o cualquier otra, pueden ser desviadas a un archivo de la forma habitual con > o > >. As, con un comando display Trans>Trans.out; se envan los valores de las variables Trans al archivo Trans.out, de forma que si no exista se crea uno con e..'le nombre, y si existe uno 17 lo sustituye. Sin embargo con > > se aade la salida al final del archivo si ya exista. Observar cmo pueden sacarse diferentes valores relacionados con las vari- ables y las restricciones. As, para una variable con nombre X los valores X.lb, X, X.ub y X.rc indican, re..'lpectivarnente los valores de la cota inferior, el valor de X, la cota superior y el coste reducido. Mientras que para una restriccin con nombre genrico Res, y de la forma lb <= Re..'l <= ub, las ca.p.tidade..'l Res.lb, Res.body, Res.ub y Res.dual indican, respectivamente la cota inferior, el valor tomado, la cota superior y el precio dual o precio sombra. IAAXMi 2:-Al... = 3X ,+ 2. )(._ r5X> x, + z. -.,.. + "/.1> +lo 3)(, + Z.}(J y: 1 4.)<'t 4 4l.O 1 0L\t """o ""\ ,;, ; " ll o 1 ,.. ,f., V., t: 1 f''i', .. fs. e: \..,t:.J> }0 !;:. "{ 'j /00 !. f\ ""'?f
,.'L 1 (' p, '_(, '-.;; 18 '! t--;.. .2: crx
1 \_. l,_ 1 r, 7 '""j: (-."" Ct,.,J X 1 .. ' ' L l. '"