Descargar

Introducción al programa AMPL

Enviado por Pablo Turmero


  1. Introducción
  2. Modelos explícitos de programación lineal resueltos interactivamente
  3. Resolución automatizada o por lotes (batch). creación de un fichero .run
  4. Conjuntos. Creación de fichero .dat
  5. Otros comandos

Introducción

  • Introducción

AMPL es un programa dirigido a la construcción y resolución de modelos de optimización, fundamentalmente modelos de Programación Lineal, Programación Entera y Programación No Lineal. A diferencia de otros programas parecidos, como LINGO, una vez definido un modelo en AMPL puede especificarse el cómo queremos resolverlo, lo que permite el diseño de muchos tipos de algoritmos. Simultáneamente, existe una variedad muy grande de solvers que pueden ser llamados desde AMPL (algunos de dominio público), lo que da una gran potencia y versatilidad al programa. Otro hecho a destacar es la continua incorporación de mejoras y procedimientos recientes. Para una descripción completa de los elementos básicos del lenguaje la mejor fuente sigue siendo 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 dirección http://www.ampl.com.

Para una descripción de las mejoras que se han ido incorporando desde la versión inicial, de los solvers disponibles y de otras muchas cuestiones, consultar en http://netlib.bell-labs.com/cm/cs/what/ampl/index.html

  • Elementos fundamentales

El programa AMPL consta fundamentalmente de las siguientes componentes:

  • El procesador del lenguage 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 más cómodamente desde una ventana windows ejecutando el programa sw.exe (scroll windows).

  • Los solvers, que son los algoritmos para resolver diferentes tipos de problemas. La edición Standar 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 limitación de hasta 300 variables y 300 restricciones. Además de la versión Standar AMPL Student for Windows, hay otras versiones como AMPL Plus para Windows, o versiones para Linux, Unix y otras plataformas.

  • La forma más 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 podrían ser ejecutados manualmente en la ventana de comandos, es más conveniente agruparlos en un archivo o script con extensión .run, donde además pueden ir todo tipo de opciones, bucles repetitivos, etc.

  • Además de las tres ventanas de texto, es preciso tener activo el procesador de comandos AMPL o bien en una ventana de DOS, o más cómodamente desde una ventana windows en sw.exe.

  • De una manera informal, podemos decir que en un fichero .mod decimos al ordenador qué modelo queremos resolver, con un fichero .dat le decimos al ordenador con que datos vamos a trabajar y con un fichero .run le decimos de que modo queremos resolver el problema y que información queremos que nos muestre.

  • Instalación de AMPL

Ampl ofrece una versión gratuita para estudiantes. Para instalar los ficheros necesarios pueden seguirse los siguientes pasos.

Instalación 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 párrafo que sigue a TryAMPL!

  • 3. Pinchar en CPLEX8.0 Studet 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 botón derecho y eligiendo la opción 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 (librería de cplex).

  • minos.exe (solver de PL y PNL).

  • sw.exe (ventana en la que puede ejecutar el procesador de AMPL de una forma cómoda).

Instalación del editor PFE32.exe

Este editor resulta cómodo para trabajar en la elaboración de los ficheros .mod, .dat y .run.

Puede bajarse buscando con google las palabras pfe32.zip. Entre las búsquedas encontradas elegir una adecuada. Por ejemplo, pinchando en factsheet. Notas:

  • La carpeta de trabajo del editor PFE32 (es decir, donde busca y guarda directamente los ficheros, si no le indicamos otra cosa) puede cambiarse seleccionando file + chage directory.

  • El número de espacios en blanco que se obtienen al pulsar la tecla del tabulador puede cambiarse si, dentro del editor PFE32, usamos Options + Current modes + Test formatting.

Modelos explícitos de programación lineal resueltos interactivamente

  • Introducción

En esta sección vamos a ver cómo se introducen en AMPL ejemplos sencillos de Programación Lineal de pocas variables, y cómo se ejecutan archivos de comandos para las sesiones iniciales de AMPL. En estos ejemplos los datos del problema (coeficientes de la función objetivo, de las restricciones y del lado derecho), están 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 explícitos. Posteriormente veremos que, como es importante lograr la separación completa entre el modelo y los datos, es mejor usar también este tipo de archivo. Tampoco usaremos el archivo .run. Algunas ideas generales son:

  • Los comentarios pueden ser añadidos desde el símbolo # hasta el final de la línea.

  • Al final de cada declaración o comando debe ir un punto y coma (;).

  • Las mayúsculas son distintas de las minúsculas.

  • Se pueden insertar espacios en blanco o líneas en blanco sin afectar a la ejecución del programa.

  • La multiplicación debe indicarse con el signo *; por ejemplo, debe escribirse 3*x1 + 4*x2, y no 3×1 + 4×2.

A continuación, seguiremos los siguientes pasos:

  • Creación de un fichero .mod para indicar el modelo a resolver.

  • Resolución del problema con AMPL desde la ventana de sw.exe.

Nota: no usaremos

  • Creación de un fichero .mod

Tendremos en cuenta las siguientes consideraciones:

  • Cada variable debe ser declarada explícitamente (con la declaración var); además, si corresponde, podemos indicar su no negatividad, sus cotas, si es entera o si es binaria.

  • La función objetivo debe ser declarada explícitamente después de maximize o minimize, y es conveniente darle un nombre seguido de dos puntos. En cada problema el nombre de la función objetivo puede ser distinto, aunque, por comodidad, podemos poner siempre el mismo nombre (por ejemplo, objetivo).

  • Cada restricción debe ser declarada explícitamente (con la declaración subject to), y es conveniente darle un nombre seguido de dos puntos.

Resumen

Declaración

Uso

Var

Declaración de variable

Minimize

Declaración de objetivo (minimizar)

Maximize

Declaración de objetivo (maximizar)

Subject to

Declaración de restricción

Ejemplo de un modelo de PL explícito con dos variables (ejemplo1.mod): Supongamos que queremos resolver el problema:

maximizar la funcion 3×1+4×2 sujeta a: x1+x2 <= 2 4×1+6×2 <= 9 x1>=0, x2>=0 Con el editor pfe32.exe creamos el fichero ejemplo1.mod siguiente:

# declaracion de las variables y de su no negatividad var x1>=0; var x2>=0; # declaracion de la funcion objetivo # la palabra objetivo es elegible a gusto personal maximize objetivo: 3*x1+4*x2; # declaracion de las restricciones subject to res1: x1+x2 <= 2; # la palabra res1 es elegible a gusto personal subject to res2: 4*x1+6*x2 <= 9; # la palabra res2 es elegible a gusto personal Notas:

  • La declaración de variables debe preceder a la declaración de restricciones y de la función objetivo.

  • Entre las declaraciones de restricciones y de la función objetivo no hay precedencias obligatorias .

  • Resolución interactiva del problema anterior usando el procesador de comandos en la ventana sw.exe

Una sesión 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 anteriores.

  • el comando model envía al procesador de comandos el modelo especificado, y es preciso indicar todo el camino (path) donde esté el archivo correspondiente.

  • con el comando option solver se elige el solver con el que resolver el modelo actual; dependiendo del tipo de problema a resolver elegiremos el más adecuado. Nosotros eligiremos la opción option solver cplex.

  • el comando solve llama al solver elegido y aplica el algoritmo correspondiente, obteniéndose una solución óptima.

Una vez obtenida una solución óptima podemos elegir lo que queremos que nos muestre el programa. Para ello tenemos varios comandos. Por ejemplo, los comandos display y printf permiten mostrar en pantalla datos, resultados o mensajes de texto preestablecidos.

  • Sufijos

Con el comando display se pueden también visualizar otros valores asociados a las variables y a las restricciones, mediante el uso de sufijos.

Los sufijos más habituales para las variables son:

Sufijo

Interpretación

.val

Valor actual

.lb

Cota inferior

.ub

Cota superior

.rc

Coste reducido

Los sufijos más habituales para las restricciones son:

Sufijo

Interpretación

.body

Valor actual de la expresión

.dual

Variable dual o precio sombra

.slack

Holgura

  • Otros comandos

Aunque más adelante se verá un uso más 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).

  • Cotas y atributos integer y binary para las variables

En un fichero .mod, cuando se declara una variable, si no se especifica nada la variable es continua y no tiene restricción de signo. Las restricciones de signo, las cotas sencillas y las restricciones de ser entera o binaria se especifican en la misma declaración. Ejemplo:

Para poner x1 ( 0, 0 ( x2 ( 8, x3 ( 0 y entera, x4 binaria se escribe, respectivamente:

var x1 >=0 ; var x2 >=0, <=8 ; var x3 >=0, integer ; var x1 binary ;

  • Un primer ejercicio. El problema del transporte

Usando lo anteriormente expuesto, resolver el problema del transporte de Winston p. 337.

  • Ejercicios sobre los comandos print y printf

Se trata de entender la diferencia entre los comandos print y printf , así como entre los atributos n y t. sw: ampl ampl: print "jose"; jose ampl: printf "jose"; joseampl: printf "josen"; jose ampl: printf "jose perez mateos"; jose perez mateosampl: printf "jose perez mateosn"; jose perez mateos ampl: printf "njose nperez nmateosn"; jose perez mateos ampl: printf "njose nperez nmateosnn"; jose perez mateos ampl: printf "ntjose ntperez ntmateosnn"; jose perez mateos ampl: printf "ntjose nttperez ntttmateosnn"; jose perez mateos ampl:

Resolución automatizada o por lotes (batch). Creación de un fichero .run

  • Introducción

Una alternativa cómoda al modo interactivo usado anteriormente se tiene usando 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 ejecución por lotes. Para ello ponemos tales comandos conjuntamente en un fichero .run que ejecutamos en el procesador de comandos por medio de la instrucción incluye.

Ejemplo para resolver el problema de Problema Lineal establecido en la Parte II, secciones 2 y 3 (modelo explícito), suponiendo que hemos guardado el fichero .mod en D:userejemplo1.mod, se procede como sigue:. Con el editor pfe32.exe creamos el fichero ejemplo1.run siguiente:

# intruccion para eliminar de la memoria de AMPL el modelo y los datos anteriores reset; # intruccion para enviar al procesador de AMPL el modelo actual model D:usersejemplo1.mod; # intruccion para elegir solver (en este caso elegimos el cplex) option solver cplex; # intruccion para que el solver elegido actue solve; # intruccion para mostrar en pantalla los valores optimos de las variables indicadas display x1, x2; # intruccion para mostrar en pantalla el valor optimo de la funcion objetivo display objetivo; Nota: Es claro que podemos suprimir todas las líneas de comentarios que siguen al signo #.

  • Una forma práctica de proceder

Una forma sencilla de ejecutar los comandos introducidos en el fichero de comandos ejemplo1.run es la siguiente.

  • primero se guarda el archivo con extensión .run, es decir, en nuestro caso el fichero ejemplo1.run.

  • a continuación se activa el fichero sw.exe y en el se escribe ampl para que aparezca el prompt de AMPL (ampl:).

  • después con el comando include se incluyen en bloque los comandos escritos en ejemplo1.run; para ello se escribe include seguido del camino o "path" que localiza este fichro en el ordenador. Por ejemplo, si hemos guardado el fichero ejemplo1.run en el disco D, ponemos:

include D:usersejemplo1.run;

  • se pulsa la tecla return.

  • Ejemplo resumen

Una fichero . run con todo lo explicado hasta aquí es el siguiente:

# fichero ejemplo1b.run # fichero .run para un problema de Programacion Lineal ; # inclusion de sufijos y otros comandos # intruccion para eliminar de la memoria de AMPL el modelo y los datos anteriores reset; # intruccion para enviar al procesador de AMPL el modelo actual model D:usersejemplo1.mod; # intruccion para elegir solver (en este caso elegimos el cplex) option solver cplex; # intruccion para que el solver elegido actue solve; # instrucion para mostrar en pantalla un rotulo fijo elegido por nosotros printf "n mostrar en pantalla los valores optimos de las variables indicadas "; # intruccion 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; # intruccion 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; # intruccion para mostrar en pantalla el valor optimo de la funcion objetivo display objetivo; # intruccion para mostrar en pantalla las componentes del modelo actual (variables, restricciones y objetivo) show; # intruccion 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 líneas de comentarios que siguen al signo #.

  • Nota

Puede resultar cómodo incluir en el fichero .run el camino o path donde localizar el propio fichero para luego copiarlo fácilmente en la ventana sw.exe. Es decir, al final del programa anterior, podemos añadir:

# intrucción a copiar en el programa AMPL (dentro de la ventana sw.exe) # para facilitar a AMPL la ubicación de este fichero # include D:usersejemplo1b.run;

  • Ejercicios sobre problemas mochila

A. Mochila continua 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 # 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 ; 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 ;

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 ;

Conjuntos. Creación de fichero .dat

Para lo que sigue puede ser útil disponer de ficheros en los que se dan ejemplos de modelos concretos ya elaborados. En la página de www.ampl.com se dispone de los siguientes de "Examples from the AMPL book".

  • En la parte alta pinchar en BOOK.

  • El la columna de la izquierda pinchar en examples.

  • Pinchar en by filename.

  • Otro método de búsqueda:

  • En la parte alta pinchar en EXAMPLES.

  • En el apartado "Examples from the AMPL book" pinchar en by filename.

  • Conjuntos simples e índices

  • Conjuntos simples definidos explícitamente

El tipo más sencillo de conjunto está definido explícitamente mediante sus elementos como sucesión de caracteres. Así podemos definir en el archivo .mod dos conjuntos mediante las declaraciones:

set ORIGENES; set DESTINOS; y en el archivo de datos ( xxx.dat) especificar sus elementos del siguiente modo: set ORIGENES:= orig1 orig2 orig3 ; set DESTINOS:= dest1,dest2,dest3,dest4; Esta forma de definición de conjuntos suele hacerse sólo para conjuntos pequeños, donde, además, se quiere conservar el nombre de los elementos.

  • Conjuntos simples definidos implícitamente. Índices

Los tipos de conjuntos más utilizados son los conjuntos de números, y generalmente van a corresponder a los conjuntos de índices de un modelo. Por ejemplo, para definir un conjunto de 12 elementos con nombre origenes, basta declarar: set ORIGENES:= 1..12; Aunque la anterior declaración es válida, es más conveniente declarar en el modelo:

param m; set ORIGENES:= 1..m; y en el fichero de datos especificar:

param m:=12; De esta forma se logra la separación efectiva entre el modelo y los datos. Cuando en la definición de un conjunto interviene un periodo distinto de 1, esto puede indicarse mediante la cláusula by, indicando el periodo. Por ejemplo, son equivalentes:

set QUINQUENIOS:={1990, 1995, 2000, 2005, 2010, 2015, 2020}; set QUINQUENIOS:=1990..2020 by 5;

  • Conjuntos de pares ordenados

A partir de conjuntos simples es posible formar conjuntos compuestos. El más sencillo de todos ellos es el producto cartesiano o conjunto de pares ordenados. Es útil para manejar matrices de datos como cij o variables con dos índices como xij. Hay varias formas de manejar tales situaciones.

  • Forma implícita: no se da nombre explícitamente al nuevo conjunto, pero se definen parámetros o variables sobre dicho conjunto. Por ejemplo:

param coste {ORIGENES,DESTINOS}>=0; # indica el coste unitario del transporte var Transp {ORIGENES,DESTINOS}>=0; # indica la cantidad a transportar Este método se usa en el ejemplo que más adelante veremos en los ficheros transp.mod y transp.dat.

  • Forma explícita completa (se consideran todos los pares ordenados): se da nombre explícitamente al nuevo conjunto y, en su caso, se definen parámetros o variables sobre dicho conjunto. Por ejemplo:

set RUTAS:={ORIGENES, DESTINOS}; param coste {RUTAS}>=0; # indica el coste unitario del transporte var transp {RUTAS}>=0; # indica la cantidad a transportar

  • Forma explícita imcompleta (no se consideran todos los pares ordenados): se da nombre explícitamente al nuevo conjunto y, en su caso, se definen parámetros o variables sobre dicho conjunto. Por ejemplo:

set RUTAS within {ORIGENES, DESTINOS}; param coste {RUTAS}>=0; # indica el coste unitario del transporte var Transp {RUTAS}>=0; # indica la cantidad a transportar

  • Conjuntos de n-uplas

De la misma forma que para pares, pueden definirse parámetros y variables con tres o más índices, definiendo primero los conjuntos simples y después el producto cartesiano. Así, por ejemplo, si se han definido tres conjuntos con nombres PRODUCTOS, PERIODOS y METODOS, y queremos definir una variable con tres índices xijk basta poner:

var x {PRODUCTOS, PERIODOS,METODOS,}>=0; y del mismo modo para los parámetros.

  • Parámetros y expresiones

Los datos de un modelo se introducen en este mediante su declaración como parámetros. Son posibles varias situaciones:

  • Parámetros unidimensionales. Basta una declaración del tipo:

param m;

  • Parámetros vectoriales. Se asocian a conjuntos simples. Si DESTINOS es un conjunto simple, basta una declaración del tipo:

param demanda {DESTINOS}; Una alternativa válida es poner:

param demanda {i in DESTINOS};

  • Parámetros matriciales. Se asocian a conjuntos de pares ordenados. Si RUTAS es un conjunto de pares ordenados, basta una declaración del tipo:

param coste {RUTAS}; Alternativas válidas son:

param coste {(i,j) in RUTAS}; param coste {i in ORIGENES , j in DESTINOS}; En este último caso se supone que ORIGENES y DESTINOS son conjuntos simples.

Restricciones sobre parámetros. (ver los apuntes Breve introducción al programa AMPL de Jesús Sáez Aguado, de fecha 18 de febrero de 2004, p. 11).

Parámetros calculados. (ver los apuntes Breve introducción al programa AMPL de Jesús Sáez Aguado, de fecha 18 de febrero de 2004, p. 12).

Expresiones. Para la construcción de modelos de optimización un operador muy utilizado es sum, que suma cierta expresión cuando se recorre los elementos de un conjunto, y corresponde a los sumatorios en modelos matemáticos. Así se pueden usar expresiones del tipo:

sum {i in ORIGENES} oferta[i]; sum {j in DESTINOS} demanda [j]; sum {(i,j) in RUTAS} coste[i,j]; sum {i in ORIGENES, j in DESTINOS} coste[i,j];

  • Comandos más utilizados

Comandos / Acción

data Lee el contenido de un archivo .dat.

display Muestra en pantalla los valores de conjuntos, parámetros y variables.

expand Expande el modelo actual.

include Incluye ficheros externos.

model Lee el contenido de un archivo .mod.

printf Muestra en pantalla textos con formato.

reset Elimina de la memoria de AMPL el modelo y los datos anteriores.

reset data Elimina de la memoria de AMPL los datos anteriores.

show Muestra las componentes del modelo actual.

solve Resuelve el modelo actual.

  • Ejercicios sobre la teoría anterior

  • El problema del transporte (Winston p. 337).

  • El problema de la dieta (Winston p. 79).

  • El problema de producción (ver los apuntes Breve introducción al programa AMPL de Jesús Sáez Aguado, de fecha 18 de febrero de 2004, p. 252).

  • El problema de flujo con coste mínimo (Winston p. 445 o alguno de los enunciados en la p. 452).

  • El problema del camino más corto (Winston p. 396).

  • El problema de flujo máximo (Winston p. 402).

Otros comandos

  • El comando LET

  • Sirve para asignar o cambiar el valor de un parámetro ya declarado.

  • Ejemplo para un parámetro simple.

param a; let a:=5; display a; let a:=10;

  • Ejemplo para un parámetro vectorial. Supongamos que se tiene declarado el conjunto DESTINOS y sobe el mismo los parametros oferta y demanda. Conocido este último, podemos poner:

let {i in DESTINOS} ofera[i]:=demanda[i];

  • El comando FOR

  • Sirve para ejecutar repetidamente una serie de comandos (bucle) que se escribe entre llaves, es decir, en la forma { serie de comandos}.

  • Ejemplo sencillo.

for {i in 1..n} {serie de comandos}.

  • Ejemplo si se tiene un conjunto simple cualquiera, llamémosle CONTADOR.

for {i in CONTADOR} {serie de comandos}.

  • Ejemplo más complejo. Supongamos que en un modelo hay un parámetro llamado tasa y queremos resolver el modelo para los siguientes valores de tasa: 8, 9, 10, 11 y 12. Puede hacerse lo siguiente:

set VALORES:= 8 9 10 11 12; for {t in VALORES} {let tasa:=t; solve; display; }

  • Ejercicios

  • Del problema del CPM (ver fichero lasana03.doc en mi página web).

  • Del problema del PERT.

  • Otros ejercicios

 

 

Autor:

Iván José Pablo Turmero Astros