Tutorial Básico de OPL

Embed Size (px)

Citation preview

  • 7/25/2019 Tutorial Bsico de OPL

    1/30

    Investigacin Operacional II

    Sebastian Weitzler

    1

  • 7/25/2019 Tutorial Bsico de OPL

    2/30

    Introduccin

    OPL es un lenguaje de programacin, que esempleado en el software ILOG OPL STUDIO, el

    cual permite el modelado, anlisis y resolucin de

    modelos matemticos, tales como son problemas

    de optimizacin.

    2

  • 7/25/2019 Tutorial Bsico de OPL

    3/30

    Caractersticas ms Importantes1. Dado la estructura de su cdigo, OPL permite utilizar un mismo modelo con

    base, para la resolucin de problemas de diferentes dimensiones, realizando

    solo ajustes para que este se adapte a su nuevo tamao.

    2. Tambin permite escribir de forma compacta las distintas restricciones que

    componen el modelo, mediante el adecuado empleo de los sub-ndices de las

    variables y parmetros que lo componen .

    3. El proceso de modelado y resolucin del problema son independientes, lo

    que permite al modelador concentrarse en la construccin del modelo,

    procurando que este sea consistente con el problema que se desea resolver y

    dejar que el software se encargue de su resolucin del modelo, mediante el

    empleo de los algoritmo internos que este posee.

    3

  • 7/25/2019 Tutorial Bsico de OPL

    4/30

    EjemploProblema de transporte

    Considrese un conjunto de consumidores y productores. Conocida la demanda

    de cada consumidor, la produccin mxima de los productores, y el costo de transporte

    de los productos desde los productores hasta los consumidores, el problema de transporteconsiste en determinar la cantidad de producto a transportar de forma que el costo sea

    mnimo. Se tienen i productores y j consumidores.

    Variables de decision

    xij: Cantidad de producto que se transporta desde el productor i hasta el consumidor j, en

    toneladas.

    4

  • 7/25/2019 Tutorial Bsico de OPL

    5/30

    EjemploDatos

    cij: costo de tranportar desde el productor i al consumidor j.

    ai: produccin mxima del productor i, en toneladas.

    bj: demanda del consumidor j, en toneladas

    Las distancias en kilometros entre productores y consumidores se muestran en la siguientetabla:

    Las producciones mximas son de 300 y 500 toneladas respectivamente. Las demandas sonde 100, 200 y 300 toneladas respectivamente. Y el costo de transporte en euros es de 0.09 por toneladay kilmetro.

    5

    Consumidores

    Productores m1 m2 m3

    p1 2.0 1.6 1.8

    p2 2.5 1.2 1.4

  • 7/25/2019 Tutorial Bsico de OPL

    6/30

    EjemploFormulacin del problema

    Minimizar:

    Sujeto a:

    6

    i j

    ijijxc

    iax ij

    ij ,

    jbx ji

    ij ,

    ijxij ,,0

  • 7/25/2019 Tutorial Bsico de OPL

    7/30

    EjemploEn OPL, el problema anterior se codifica y almacena en un fichero cuya extensin por

    defecto es.mod. El contenido de este fichero es el siguiente:

    //Definicin de sub-ndices.

    intproductores = 2;rangei 1..productores;

    intconsumidores = 3;

    rangej 1..consumidores;

    //Definicin Parmetros

    float+d[i,j] =[[2, 1.6, 1.8],[2.5,1.2,1.4]];float+a[i] = [300,500];

    float+b[j] = [100, 200, 300];

    float+f = 0.09;

    7

  • 7/25/2019 Tutorial Bsico de OPL

    8/30

    Ejemplo

    8

    //Definicin de variablevar float+X[i, j];

    // F.O.minimizesum(ii in i, jj in j) ((d[ii,jj]*f) * X[ii,jj])

    // S.A.subject to{

    forall(ii in i)sum(jj in j)X[ii,jj] = b[jj];};

  • 7/25/2019 Tutorial Bsico de OPL

    9/30

    Ejemplo Si se observa el modelo matemtico propuesto para resolver el problema y el modelo escrito en OPL,

    se puede examinar que ambos modelos poseen la misma estructura lgica y solo varia la estructura,donde la simbologa matemtica es remplazada por los comandos que tiene definido OPL.

    La primera parte del modelo corresponde a la definicin de los sub-indices que sern empleados en el

    modelo, los cuales establecern la dimensin de este. Para este fin se utilizan el comando int, quedefine que se esta haciendo referencia a un valor entero y el comando range hace referencia a lacreacin de un sub-ndice.

    Cabe sealar que el comando //tiene la finalidad de indicar que lo que se esta escribiendo no debeser considerado como parte del modelo y se emplea principalmente para poner notas en el modelo quepermitan una mejor comprensin de est.

    En la definicin de los parmetros se utiliza el comando float+ que hace referencia a la creacin de unvalor positivo. En este punto se le pueden instaurar los valores de forma directa a los parmetro, comose realiza en el ejemplo, o estos pueden ser llamados desde una base de datos.

    9

  • 7/25/2019 Tutorial Bsico de OPL

    10/30

    Ejemplo En la creacin de variables solo se hace referencia al tipo y se antepone el comando var, en este

    ejemplo se crea mediante el comando var float+ que crea una variable no negativa.

    Para construir la funcin objetivo primero se identifica si esta busca minimizar (cuyo comando esminimize) o maximizar (cuyo comando es maximize), para despus poner la funcin objetivo que se

    quiere resolver.

    Para instaurar las condiciones bajo las cuales se construye el modelo, se emplea el comando subjectto, en el cual se deben de escribir todas las condiciones que sern analizadas.

    Para la construccin de las ecuaciones se emplean los comando sum, que hace referencias a sumatoriay el comando forall, el cual indica se debe analizar una condicin para todos las condiciones que enella se indiquen.

    10

  • 7/25/2019 Tutorial Bsico de OPL

    11/30

    Ejemplo OPL entrega los valores de todas las variables que son procesadas y el valor de la

    funcin objetivo como se muestra a continuacin.

    Optimal Solution with Objective Value: 77.4000

    X[1,1] = 100.0000X[1,2] = 0.0000

    X[1,3] = 0.0000

    X[2,1] = 0.0000

    X[2,2] = 200.0000

    X[2,3] = 300.0000

    Cabe sealar que si el nmero de variables es muy grande, OPL solo entrega el valorde la funcin objetivo y los valores de las variables deben ser solicitados por medio

    del comando display, que se escribe despus de las condiciones o enviados a una

    planilla de datos.

    11

  • 7/25/2019 Tutorial Bsico de OPL

    12/30

    Comandos Bsicos de OPL

    12

    Para poder instanciar un parmetro simple, se debe identificar el tipoal cual este pertenecer y asignarle un valor.

    intpar_int = 4; (parmetro entero)floatpar_float = 4.5; (parmetro decimal)

    stringpar_sting = Hola; (parmetro entero)Obs:1. Un parmetro puede ser creado sin valor, par despus asignarle

    una ms adelante en el modelo de la siguiente manera.

    intpar_int = ;

    2. Siempre que se termina una lnea de comando se debe de poner ;al final de est.

    intpar_int = 4;

  • 7/25/2019 Tutorial Bsico de OPL

    13/30

    Comandos Bsicos de OPL

    13

    Para poder crear un parmetro con un sub-ndice y poder asignarle losvalores correspondientes se realiza de la siguiente forma.

    intCAP[ind] = [3, 2, 3, 4];

    En el caso que el parmetro tenga dos o ms sub-ndices, se define dela siguiente forma.

    floatdemanda[ind,ind] = [[3, 1, 4, 5],[5, 2, 1, 1],[0, 0, 5, 1],[5, 8, 2, 3]];

  • 7/25/2019 Tutorial Bsico de OPL

    14/30

    Comandos Bsicos de OPL

    14

    Para crea una variable de decisin se debe anteponervar antes de indicar el tipo al cual corresponde esta.

    var float+ var[ind];

    Para poder definir una variables binarias, se debeindicar que esta es int y despus de definir la variable

    agregar in 0..1.

    var int+varbin[ind] in0..1;

  • 7/25/2019 Tutorial Bsico de OPL

    15/30

  • 7/25/2019 Tutorial Bsico de OPL

    16/30

    Comandos Bsicos de OPL

    16

    La funcin objetivo se define, primero indicando al tipo que pertenece(maximizar o minimizar), para luego escribir la ecuacin que lecorresponda a est.

    minimizesum(i in ind) (var[i])

    OBS:

    La estructura de la operacin sumatoria es la siguiente:sum(i in ind) var[i], donde la sentencia entre parntesis indica elintervalo de la sumatoria y lo que va posterior a la sumatoria indica el olos valores que ser empleados en esta.

  • 7/25/2019 Tutorial Bsico de OPL

    17/30

    Caractersticas del Lenguajes

    Reglas de Uso de OPLA continuacin se describen las reglas ms importantes para el uso de

    OPL.

    1. En OPL no es indiferente el uso de maysculas o minsculas.

    2. Cada lnea de comando debe terminar con un punto y coma. El olvido de esteseparador de rdenes puede provocar muchos errores de compilacin.

    3. Se debe seguir el orden para la construccin del modelo, siendo este el siguiente:1. Cargar las hojas de calculo con las que trabaja el modelo. (opcional)2. Definir los rangos (sub-ndices)3. Definir los parmetros.

    4. Carga datos de los parmetros desde las hojas de datos. (opcional)5. Definir las variables.6. Definir la Funcin Objetivo.7. Establecer la restricciones.8. Escribir los resultados en las hojas de calculo correspondientes. (opcional)

    17

  • 7/25/2019 Tutorial Bsico de OPL

    18/30

    4. Como en cualquier otro lenguaje de programacin, los identificadores que seutilicen para declarar datos o variables no pueden coincidir con las palabras

    reservadas de OPL.

    5. Es posible escribir varios comandos en una misma lnea siempre que estnseparadas por punto y coma. El compilador considera sucesivos espacios en blanco

    como uno solo.

    6. Los identificadores usados en OPL deben comenzar por una letra y pueden irseguidos por hasta nueve caracteres alfanumricos, no estando permitida la letra ,

    ni los caracteres especiales como los acentos (esto ltimo tampoco est permitidoen los textos explicativos).

    18

    Caractersticas del Lenguajes

    Reglas de Uso de OPL

  • 7/25/2019 Tutorial Bsico de OPL

    19/30

    Grabar y leer datos desde documentos Excel

    Lo primero que se debe realizar es conectar el modelo en OPL con el archivoExcel, esto se realiza por medio del siguiente comando:

    SheetConnection sheet(direccin del archivo\NombreArchivo.xls, 1);

    El numero que se pone al final, indica si el archivo va a ser empleado solo paralectura, en cuyo caso se pone el nmero 1 o si se quiere leer y escribir sobre elmismo archivo donde se debe poner el nmero 0.

    OBS:

    sheetcorresponde al nombre del documento Excel dentro del modelo, por lo queeste puede ser cambiado por otro nombre que sea mas adecuado para el modelo

    SheetConnectionData1("C:\Modelo_Proyecto_OPL3.7\Datos_Pedido.xls",1);

    19

    Comandos Avanzados de OPL

  • 7/25/2019 Tutorial Bsico de OPL

    20/30

    20

    Comandos Avanzados de OPL

    Lectura de Datos.

    Esta se puede realizar de tres formas:

    1. Se extraen los rango de los datos indicando el nombre de lasceldas, y luego los otros datos que se agregan a sus respectivasmatrices. En vez de rangos (range) se utilizan conjuntos (Set),tienen la misma utilidad.

    {string} Ciudad from SheetRead(sheet, ciudades);{string} Productos from SheetRead(sheet, productos);

    floatcostos[Products, Cities] from SheetRead(sheet, costos);

  • 7/25/2019 Tutorial Bsico de OPL

    21/30

    21

    Comandos Avanzados de OPL

    El comandofrom SheetReadse utiliza para leer los valores desdeel archivo Excel, los parmetros son nombre delSheetConnectiony el nombre de la celda.

    2. Se extraen los rangos de los datos indicando slo lascoordenadas dentro de la planilla Excel.

    {string} Ciudad from SheetRead(sheet, C2:E2);

    {string} Productos from SheetRead(sheet, B3:B5);floatcostos[Products, Cities] from SheetRead(sheet, C3:E5);

  • 7/25/2019 Tutorial Bsico de OPL

    22/30

    22

    Comandos Avanzados de OPL3. Indicando slo las coordenadas en la planilla de los datos o

    parmetros a utilizar.

    floatcosto[0..2,0..2] from SheetRead(sheet, C3:E5);

  • 7/25/2019 Tutorial Bsico de OPL

    23/30

    23

    Comandos Avanzados de OPLGrabar Datos en documento Excel

    Se utiliza el comandoSheetWrite, el que lleva como parmetro el

    nombre del SheetConnection y las coordenadas de las celdasdonde queremos pegar los valores dentro de la planilla Excel.Posterior al comando se pone entre parntesis el nombre de lasvariables o parmetros que se desea almacenar.

    SheetWrite(sheet, A2:D3)(produccion);SheetWrite(sheet, A4)(Venta);SheetWrite(sheet, A5:E6)(Inv);

    OBS: Esto siempre se escribe al final del modelo.

  • 7/25/2019 Tutorial Bsico de OPL

    24/30

    24

    Comandos Avanzados de OPLUn detalle relevante al momento de emplear los comandos de lecturay escritura, es el asegurarse que las dimensiones de la matriz queestn siendo ingresadas son las adecuada.

    Lo anterior es importante ya que se pueden genera errores delectura, que ingresen datos incorrectos al motor de resolucin,entregado una resultado incorrecto.

    En el caso de la escritura un mal dimensionamiento de la matriz,provocara el que programa tire un error, al no poder escribir todoslos valores pertinentes que se le han solicitado.

  • 7/25/2019 Tutorial Bsico de OPL

    25/30

    25

    Comandos Avanzados de OPLLa dificultad de emplear sub-ndices mayores a 2, es que las bases de datosestn diseadas para trabajar en dos dimensiones, como es el caso de Excel.

    Por este motivo al momento de asignarle los valores a un parmetro, este debeser construido mediante el comandoinitialize, el cual permite realizar procesosa los parmetros del modelo, antes de que OPL inicie la resolucin de est.

    Sea el parmetro:float+C_S[o,p,t] = ;

    Con sus datos almacenado en el documento con nombre en el modelo desheet.

    Se instancia de la forma que se presenta a continuacin.

  • 7/25/2019 Tutorial Bsico de OPL

    26/30

    26

    Comandos Avanzados de OPLPrimero se crea un parmetro auxiliar en el que en este caso sel leagregar el nmero del sub-ndice t al final (C_S[o,p,1] = C_S1[o,p])

    float+C_S1[o,p]from SheetRead(sheet, "O5:V9");float+C_S2[o,p]from SheetRead(sheet, "W5:AD9");float+C_S3[o,p]from SheetRead(sheet, "AE5:AL9");

  • 7/25/2019 Tutorial Bsico de OPL

    27/30

    27

    Comandos Avanzados de OPLLuego se procede con el comando initialize definir una funcin que leasigne los nuevos valores a los parmetros.

    initializeforall(oo in o, pp in p)C_S[oo,pp,1] = C_S1[oo,pp];

    initialize

    forall(oo in o, pp in p)C_S[oo,pp,2] = C_S2[oo,pp];

    initializeforall(oo in o, pp in p)C_S[oo,pp,3] = C_S3[oo,pp];

  • 7/25/2019 Tutorial Bsico de OPL

    28/30

    28

    Comandos Avanzados de OPLEn el caso de las variables, el motor no tiene problemas para resolveraquellas que tiene un subndice superior a 2, pero al momento deobtener los resultados se presenta el mismo problema que con los

    parmetros.

    Esto se soluciona generando una variable auxiliar de forma similar a laempleada para los parmetros, a la cual dentro del conjunto derestricciones del problema se emplea la misma condicin que la

    empleada en el initialize para los parmetros.

  • 7/25/2019 Tutorial Bsico de OPL

    29/30

    29

    Comandos Avanzados de OPLVar float+C_E1[oo,pp];Var float+C_E2[oo,pp];Var float+C_E3[oo,pp];

    Subject to {forall(oo in o, pp in p)C_E[oo,pp,1] = C_E1[oo,pp];

    forall(oo in o, pp in p)C_E[oo,pp,2] = C_E2[oo,pp];

    forall(oo in o, pp in p)C_E[oo,pp,3] = C_E3[oo,pp];}

    SheetWrite(sheet,"B3:G10")(C_E1);SheetWrite(sheet,B15:G22")(C_E2);

    SheetWrite(sheet, "B27:G34")(C_E3);

  • 7/25/2019 Tutorial Bsico de OPL

    30/30

    30