Tutorial Básico de OPL

March 23, 2018 | Author: Kevin Aldair Castillo Iturrieta | Category: Model Theory, Programming Language, Compiler, Software, Function (Mathematics)


Comments



Description

Investigación Operacional IISebastian Weitzler 1 Introducción  OPL es un lenguaje de programación, que es empleado en el software ILOG OPL STUDIO, el cual permite el modelado, análisis y resolución de modelos matemáticos, tales como son problemas de optimización. 2 Características más Importantes 1. Dado la estructura de su código, OPL permite utilizar un mismo modelo con base, para la resolución de problemas de diferentes dimensiones, realizando solo ajustes para que este se adapte a su nuevo tamaño. 2. También permite escribir de forma compacta las distintas restricciones que componen el modelo, mediante el adecuado empleo de los sub-índices de las variables y parámetros que lo componen . 3. El proceso de modelado y resolución del problema son independientes, lo que permite al modelador concentrarse en la construcción del modelo, procurando que este sea consistente con el problema que se desea resolver y dejar que el software se encargue de su resolución del modelo, mediante el empleo de los algoritmo internos que este posee. 3 y el costo de transporte de los productos desde los productores hasta los consumidores. el problema de transporte consiste en determinar la cantidad de producto a transportar de forma que el costo sea mínimo. en toneladas. Conocida la demanda de cada consumidor.Ejemplo Problema de transporte Considérese un conjunto de consumidores y productores. Se tienen i productores y j consumidores. la producción máxima de los productores. 4 . Variables de decision xij: Cantidad de producto que se transporta desde el productor i hasta el consumidor j. ai: producción máxima del productor i. Las demandas son de 100. bj: demanda del consumidor j. en toneladas Las distancias en kilometros entre productores y consumidores se muestran en la siguiente tabla: Consumidores Productores m1 m2 m3 p1 2. en toneladas. 5 .6 1.8 p2 2.0 1.Ejemplo Datos cij: costo de tranportar desde el productor i al consumidor j.5 1. 200 y 300 toneladas respectivamente.4 Las producciones máximas son de 300 y 500 toneladas respectivamente.2 1.09 por tonelada y kilómetro. Y el costo de transporte en euros es de 0. i xij bj . j xij 0.Ejemplo Formulación del problema cij xij Minimizar: i Sujeto a: j xij ai . j. i j i 6 . [2.1. //Definición Parámetros float+ d[i.productores. 300]. range j 1. int productores = 2. 7 . El contenido de este fichero es el siguiente: //Definición de sub-índices.consumidores. float+ a[i] = [300.. 1.j] =[[2.09. range i 1.6. el problema anterior se codifica y almacena en un fichero cuya extensión por defecto es “.mod”.4]]. 1. 200. float+ b[j] = [100.5.8].1.500]. float+ f = 0. int consumidores = 3..2.Ejemplo En OPL. Ejemplo //Definición de variable var float+ X[i.A.jj]) // S.jj] <= a[ii]. // F. forall(jj in j) sum(ii in i)X[ii. }.jj] >= b[jj]. 8 .jj]*f) * X[ii. j]. minimize sum(ii in i.O. subject to { forall(ii in i) sum(jj in j)X[ii. jj in j) ((d[ii.  La primera parte del modelo corresponde a la definición de los sub-indices que serán empleados en el modelo. o estos pueden ser llamados desde una base de datos.Ejemplo  Si se observa el modelo matemático propuesto para resolver el problema y el modelo escrito en OPL. Para este fin se utilizan el comando int. En este punto se le pueden instaurar los valores de forma directa a los parámetro.  En la definición de los parámetros se utiliza el comando float+ que hace referencia a la creación de un valor positivo.  Cabe señalar que el comando “//” tiene la finalidad de indicar que lo que se esta escribiendo no debe ser considerado como parte del modelo y se emplea principalmente para poner notas en el modelo que permitan una mejor comprensión de esté. se puede examinar que ambos modelos poseen la misma estructura lógica y solo varia la estructura. que define que se esta haciendo referencia a un valor entero y el comando range hace referencia a la creación de un sub-índice. donde la simbología matemática es remplazada por los comandos que tiene definido OPL. como se realiza en el ejemplo. 9 . los cuales establecerán la dimensión de este. se emplea el comando subject to. en el cual se deben de escribir todas las condiciones que serán analizadas. en este ejemplo se crea mediante el comando var float+ que crea una variable no negativa.  Para instaurar las condiciones bajo las cuales se construye el modelo.  Para la construcción de las ecuaciones se emplean los comando sum. el cual indica se debe analizar una condición para todos las condiciones que en ella se indiquen.Ejemplo  En la creación de variables solo se hace referencia al tipo y se antepone el comando var. para después poner la función objetivo que se quiere resolver.  Para construir la función objetivo primero se identifica si esta busca minimizar (cuyo comando es minimize) o maximizar (cuyo comando es maximize). que hace referencias a sumatoria y el comando forall. 10 . OPL solo entrega el valor de la función objetivo y los valores de las variables deben ser solicitados por medio del comando display. 11 .2] = 0.Ejemplo  OPL entrega los valores de todas las variables que son procesadas y el valor de la función objetivo como se muestra a continuación.4000 X[1.0000 X[2.0000 X[1.2] = 200.3] = 0.0000 X[2.0000 X[1.0000 Cabe señalar que si el número de variables es muy grande.3] = 300. Optimal Solution with Objective Value: 77.1] = 100.1] = 0. que se escribe después de las condiciones o enviados a una planilla de datos.0000 X[2. Comandos Básicos de OPL Para poder instanciar un parámetro simple. 12 . (parámetro entero) Obs: 1. (parámetro entero) float par_float = 4. int par_int = 4. int par_int = …. int par_int = 4. al final de está. par después asignarle una más adelante en el modelo de la siguiente manera. Siempre que se termina una línea de comando se debe de poner .5. 2. Un parámetro puede ser creado sin valor. se debe identificar el tipo al cual este pertenecerá y asignarle un valor. (parámetro decimal) string par_sting = “Hola”. 5]. 1. 1. 4. 5.Comandos Básicos de OPL Para poder crear un parámetro con un sub-índice y poder asignarle los valores correspondientes se realiza de la siguiente forma. 8. 1]. [0. 13 . int CAP[ind] = [3. 2. 2. se define de la siguiente forma. [5. 0. 4]. 2. 3]]. float demanda[ind. 3. En el caso que el parámetro tenga dos o más sub-índices. 1]. ind] = [[3. [5. ..Comandos Básicos de OPL Para crea una variable de decisión se debe anteponer var antes de indicar el tipo al cual corresponde esta.1. 14 .1. se debe indicar que esta es int y después de definir la variable agregar in 0. var int+ varbin[ind] in 0. var float+ var[ind]. Para poder definir una variables binarias. 15 . 4]. ind] = [[3.1.Comandos Básicos de OPL Para poder definir que las variables y parámetros empleados en el modelo sean valores positivos mayores a 0. [0. 4. int+ CAP[ind] = [3. 3]]. [5. 2.. 0. 5]. 8. 1]. [5. 1]. 2. var int+ varbin[ind] in 0. 3. 5. var float+ var[ind]. 1. float+ demanda[ind. 1. se incluir el signo +. 2. minimize sum(i in ind) (var[i]) OBS: La estructura de la operación sumatoria es la siguiente: sum(i in ind) var[i]. donde la sentencia entre paréntesis indica el intervalo de la sumatoria y lo que va posterior a la sumatoria indica el o los valores que será empleados en esta. 16 .Comandos Básicos de OPL La función objetivo se define. para luego escribir la ecuación que le corresponda a está. primero indicando al tipo que pertenece (maximizar o minimizar). 3. Cargar las hojas de calculo con las que trabaja el modelo. (opcional) Definir las variables. 7. Establecer la restricciones. Definir la Función Objetivo. 5. El olvido de este separador de órdenes puede provocar muchos errores de compilación. (opcional) 17 . Carga datos de los parámetros desde las hojas de datos. 2. Se debe seguir el orden para la construcción del modelo. 4. Escribir los resultados en las hojas de calculo correspondientes. 3. En OPL no es indiferente el uso de mayúsculas o minúsculas. (opcional) Definir los rangos (sub-índices) Definir los parámetros. 8. Cada línea de comando debe terminar con un punto y coma. 2. 1. siendo este el siguiente: 1.Características del Lenguajes Reglas de Uso de OPL A continuación se describen las reglas más importantes para el uso de OPL. 6. 6. 5. Los identificadores usados en OPL deben comenzar por una letra y pueden ir seguidos por hasta nueve caracteres alfanuméricos. 18 . Es posible escribir varios comandos en una misma línea siempre que estén separadas por punto y coma. ni los caracteres especiales como los acentos (esto último tampoco está permitido en los textos explicativos).Características del Lenguajes Reglas de Uso de OPL 4. El compilador considera sucesivos espacios en blanco como uno solo. Como en cualquier otro lenguaje de programación. los identificadores que se utilicen para declarar datos o variables no pueden coincidir con las palabras reservadas de OPL. no estando permitida la letra ñ. 7\Datos_Pedido. 19 .xls". esto se realiza por medio del siguiente comando: SheetConnection sheet(“dirección del archivo\NombreArchivo. en cuyo caso se pone el número 1 o si se quiere leer y escribir sobre el mismo archivo donde se debe poner el número 0.1).Comandos Avanzados de OPL Grabar y leer datos desde documentos Excel Lo primero que se debe realizar es conectar el modelo en OPL con el archivo Excel. OBS: sheet corresponde al nombre del documento Excel dentro del modelo. 1). El numero que se pone al final. por lo que este puede ser cambiado por otro nombre que sea mas adecuado para el modelo SheetConnection Data1("C:\Modelo_Proyecto_OPL3.xls”. indica si el archivo va a ser empleado solo para lectura. Cities] from SheetRead(sheet. y luego los otros datos que se agregan a sus respectivas matrices. En vez de rangos (range) se utilizan conjuntos (Set). “ciudades”). float costos[Products. Esta se puede realizar de tres formas: 1. tienen la misma utilidad.Comandos Avanzados de OPL Lectura de Datos. 20 . {string} Ciudad from SheetRead(sheet. “costos”). Se extraen los rango de los datos indicando el nombre de las celdas. “productos”). {string} Productos from SheetRead (sheet. 2. “C2:E2”). “B3:B5”). los parámetros son nombre del SheetConnection y el nombre de la celda. Cities] from SheetRead(sheet. Se extraen los rangos de los datos indicando sólo las coordenadas dentro de la planilla Excel. 21 . {string} Productos from SheetRead (sheet. float costos[Products. “C3:E5”).Comandos Avanzados de OPL El comando from SheetRead se utiliza para leer los valores desde el archivo Excel. {string} Ciudad from SheetRead(sheet. 2. float costo[0.0.Comandos Avanzados de OPL 3.. 22 .. “C3:E5”).2] from SheetRead(sheet. Indicando sólo las coordenadas en la planilla de los datos o parámetros a utilizar. el que lleva como parámetro el nombre del SheetConnection y las coordenadas de las celdas donde queremos pegar los valores dentro de la planilla Excel. SheetWrite(sheet. OBS: Esto siempre se escribe al final del modelo. SheetWrite(sheet. “A5:E6”)(Inv). Posterior al comando se pone entre paréntesis el nombre de las variables o parámetros que se desea almacenar. 23 . “A4”)(Venta). “A2:D3”)(produccion).Comandos Avanzados de OPL Grabar Datos en documento Excel Se utiliza el comando SheetWrite. SheetWrite(sheet. Comandos Avanzados de OPL Un detalle relevante al momento de emplear los comandos de lectura y escritura. al no poder escribir todos los valores pertinentes que se le han solicitado. Lo anterior es importante ya que se pueden genera errores de lectura. provocara el que programa tire un error. 24 . entregado una resultado incorrecto. es el asegurarse que las dimensiones de la matriz que están siendo ingresadas son las adecuada. En el caso de la escritura un mal dimensionamiento de la matriz. que ingresen datos incorrectos al motor de resolución. Por este motivo al momento de asignarle los valores a un parámetro. Se instancia de la forma que se presenta a continuación. es que las bases de datos están diseñadas para trabajar en dos dimensiones. el cual permite realizar procesos a los parámetros del modelo. Sea el parámetro: float+ C_S[o. como es el caso de Excel.Comandos Avanzados de OPL La dificultad de emplear sub-índices mayores a 2.p. Con sus datos almacenado en el documento con nombre en el modelo de sheet.t] = …. antes de que OPL inicie la resolución de esté. 25 . este debe ser construido mediante el comando initialize. "O5:V9").p]) float+ C_S1[o.Comandos Avanzados de OPL Primero se crea un parámetro auxiliar en el que en este caso sel le agregar el número del sub-índice t al final (C_S[o.1] = C_S1[o. 26 . float+ C_S2[o. "W5:AD9"). "AE5:AL9").p.p] from SheetRead(sheet. float+ C_S3[o.p] from SheetRead(sheet.p] from SheetRead(sheet. initialize forall (oo in o.pp].pp.pp].2] = C_S2[oo.pp. initialize forall (oo in o.1] = C_S1[oo. initialize forall (oo in o. pp in p) C_S[oo.pp. 27 .3] = C_S3[oo.Comandos Avanzados de OPL Luego se procede con el comando initialize definir una función que le asigne los nuevos valores a los parámetros. pp in p) C_S[oo.pp]. pp in p) C_S[oo. 28 .Comandos Avanzados de OPL En el caso de las variables. a la cual dentro del conjunto de restricciones del problema se emplea la misma condición que la empleada en el initialize para los parámetros. el motor no tiene problemas para resolver aquellas que tiene un subíndice superior a 2. pero al momento de obtener los resultados se presenta el mismo problema que con los parámetros. Esto se soluciona generando una variable auxiliar de forma similar a la empleada para los parámetros. "B3:G10")(C_E1). forall (oo in o.pp. Var float+ C_E2[oo. Subject to { forall (oo in o. pp in p) C_E[oo. 29 .Comandos Avanzados de OPL Var float+ C_E1[oo.pp.pp].pp].1] = C_E1[oo. SheetWrite(sheet. pp in p) C_E[oo.”B15:G22")(C_E2). forall (oo in o.2] = C_E2[oo. SheetWrite(sheet.pp].pp].pp]. "B27:G34")(C_E3).pp]. pp in p) C_E[oo.3] = C_E3[oo.pp. Var float+ C_E3[oo. } SheetWrite(sheet. 30 .
Copyright © 2024 DOKUMEN.SITE Inc.