You are on page 1of 35

Tema3:Lenguajesdemodeladodeproblemasdeoptimizacin.

Objetivos del tema: Conocer las diferentes alternativas que existen en la actualidad para expresar y ejecutar problemas de optimizacin. Estudiar la estructura general de un lenguaje de modelado a travs de OPL Conocer los principios operativos de los dos tipos de problemas expresables en OPL: CP y MP Utilizar las construcciones iterativas y operadores de agregacin sobre variables de decisin y datos indexados Intercambiar datos entre OPL y una hoja de clculo Excel

1
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Alternativas para el desarrollo de modelos de optimizacin Varias V i son l alternativas que se presentan a l h las lt ti t la hora d i l de implementar un modelo d optimizacin li t d l de ti i i lineal en un computador. C d una l t d Cada presenta sus ventajas e inconvenientes, por lo que la eleccin deber hacerse en cada caso en funcin del uso que se le vaya a dar al modelo. Podemos sealar cuatro alternativas principales: 1. Hojas de clculo con resolutor asociado. Se trata de la alternativa ms simple y asequible para especificar y resolver modelos pequeos de optimizacin lineal La entrada y salida de datos se beneficia de todas las facilidades que presenta el entorno de la lineal. hoja, especialmente la posibilidad de representar grficamente los resultados. El principal inconveniente proviene de la dispersin en que queda la especificacin del modelo, al tener que expresarse a travs de frmulas asociadas a las diferentes celdas. Si el modelo tiene cierto tamao, la implantacin y mantenimiento se hace muy tediosa. Esta alternativa resulta vlida a la hora de ensayar pequeos prototipos de modelos. 2. Entornos de clculo numrico y/o simblico. Muchos entornos de desarrollo matemtico numricos y simblicos como MatLab, Maple o Mathematica, disponen de resolutores asociados que se pueden utilizar desde el propio medio de programacin del entorno. La presentacin de los resultados, como en el caso de las hojas de clculo, se ve potenciada por las abundantes herramientas de visualizacin grfica de que disponen. El principal inconveniente proviene de la ausencia de recursos especficos para la expresin de los modelos y la depuracin de su funcionamiento. 3. Biblioteca de algoritmos de optimizacin + lenguaje de programacin de propsito general (Java, Fortran, C#, etc.). Esta alternativa se ha venido utilizando cuando el modelo deba integrarse en una aplicacin y requera interfaces especficas para la entrada y salida de datos. Se benefician de las facilidades que proporcionan los entornos de desarrollo para estos lenguajes, pero p p p q p g carecen de recursos de depuracin orientados a un problema de optimizacin con restricciones. Requieren un tiempo largo de desarrollo y presentan dificultades a la hora del mantenimiento y modificacin del modelo. 4. Lenguajes algebraicos de modelado. Estos lenguajes permiten expresar el modelo con una sintaxis prxima a la propia especificacin matemtica. Suelen disponer de recursos especficos para ayudar a la depuracin del modelo. Las modificaciones y p p g ampliaciones del modelo resultan relativamente fciles, permitiendo una estrategia incremental de desarrollo. Los modernos lenguajes como OPL permiten la integracin del modelo final en cualquier entorno de programacin, por lo que en este aspecto no existe diferencia con la alternativa anterior. El principal inconveniente proviene de la limitacin que presentan para el acceso a determinados recursos del resolutor sobre el que ejecuta el modelo. Por ejemplo, OPL no tiene acceso a las restricciones SOS1 y SOS2 ni a las variables indicadoras de reificacin de CPLEX, muy importantes en la expresin eficiente de comportamientos no lineales. Esto se puede superar manipulando el modelo generado con OPL desde un lenguaje(C#, Java, C++) que disponga de una interfaz (API) con OPL.

2
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Lenguajes de modelado Los lenguajes de modelado de problemas de optimizacin son lenguajes declarativos con una sintaxis prxima a la especificacin matemtica de estos de problemas. En esencia constituyen una interfaz de programacin declarativa a travs de la cual se utiliza el resolutor lineal de una forma ms cmoda y productiva para el diseador. En el siguiente esquema hemos representado su ubicacin en el proceso de resolucin de un problema de optimizacin:
Modeloen Modelo en lenguaje algebraico

Lenguajede Modelado

Modeloen Modelo en formato intermedio

Resolutor Lineal

Resultados

Una de las principales aportaciones de estos lenguajes es el sistema de indexacin de variables y datos que posibilita el uso de expresiones iterativas y funciones de agregacin. Existe un buen nmero de lenguajes de modelado y entornos de desarrollo asociados, muchos de ellos presentan caractersticas comunes, aunque difieren en las posibilidades de conexin e integracin con fuentes de datos y entornos profesionales de desarrollo software. Una lista de los ms importantes y utilizados sera la siguiente: GAMS http://www.gams.com/ Mosel http://www.fico.com/en/Products/DMTools/xpressoverview/Pages/XpressMosel.aspx AMPL http://www.ampl.com/ AIMS http://www.aimms.com/ Lingo http://www lindo com/index php?option=com content&view=article&id=2&Itemid=10 http://www.lindo.com/index.php?option=com_content&view=article&id=2&Itemid=10 MPL http://www.maximalusa.com/ OML http://msdn.microsoft.com/enus/library/ff524507(VS.93).aspx OPL http://www01.ibm.com/software/integration/optimization/cplexoptimizationstudio/ En t E este curso, por motivos d eficiencia, nos referiremos exclusivamente al l ti de fi i i f i l i t l lenguaje OPL S t t d un l j OPL. Se trata de lenguaje moderno, con j d abundantes recursos expresivos, un resolutor muy potente, CPLEX, con amplias facilidades de conexin a diferentes fuentes de datos (bases de datos, hojas de clculo, archivos de texto) y con la posibilidad de integracin directa de los modelos desarrollados en prcticamente todos los entornos modernos de software.

3
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Entorno de desarrollo para OPL OPL es un lenguaje de modelado diseado para facilitar la expresin de problemas de programacin matemtica continua y entera (MP) y de programacin con restricciones (CP). Estos dos paradigmas de optimizacin con restricciones tienen orgenes y fundamentos tericos bastante diferentes, aunque participan de la estructura general de los problemas de optimizacin. Para los problemas de programacin matemtica OPL dispone de un resolutor denominado CPLEX que integra un conjunto de algoritmos de optimizacin matemtica (simplex punto interior red B&B etc ) . (simplex, interior, red, B&B, etc.) Para los problemas de programacin con restricciones OPL dispone de un resolutor de propagacin de consistencia y bsqueda denominado CP (Constraint Programming). Aunque ambos paradigmas de optimizacin son diferentes, comparten muchos recursos expresivos a nivel del modelado, por ello conviven en el mismo lenguaje y entorno de desarrollo. Pero conviene tener muy claro que el modelo que se ejecute deber estar g j y q q j diseado para un solo paradigma, que por defecto es el de la programacin matemtica. El objetivo de este tema es introducir las posibilidades de expresin de los lenguajes de modelado a travs de OPL. No obstante daremos en las siguientes transparencias unas ideas muy generales e intuitivas de los mecanismos operacionales que utilizan ambos paradigmas. L programacin con restricciones opera sobre d i i fi i La i i i b dominios finitos d enteros utilizando d f de ili d de forma entrelazada d f l d dos fases dif diferentes: propagacin de consistencia para eliminar valores de los dominios de las variables que son inconsistentes con las restricciones, y bsqueda de soluciones sobre espacios de bsqueda reducidos por la propagacin. La programacin matemtica opera sobre nmeros reales o enteros utilizando principalmente el algoritmo del Simplex para los primeros y mtodos de bifurcacin y acotacin (branch&bound) para los segundos. Estos mtodos se potencian con la introduccin de planos de corte, dando lugar a los mtodos de bifurcacin y corte (branch&cut) El entorno de desarrollo de OPL se denomina IBM ILOG CPLEX STUDIO y est compuesto por los dos resolutores mencionados (CP y CPLEX), una interfaz de programacin (API) comn denominada CONCERT, escrita en C++, con un conjunto de clases cuya funcionalidad facilita la especificacin de problemas CP de scheduling y dispatching. El lenguaje OPL se sita como una interfaz de CONCERT que p permite utilizar sus recursos de optimizacin de una forma declarativa. Adems, el entorno dispone de un lenguaje de tipo script que p , p g j p p q permite manipular los modelos desde una semntica imperativa, haciendo posible la implementacin de tcnicas avanzadas de descomposicin de problemas lineales. Finalmente existen interfaces de programacin (APIs) que permiten modificar los datos, ejecutar modelos OPL, y obtener resultados desde muchos lenguajes de programacin (C#, Java, C++, etc.) En la siguiente transparencia se presenta un esquema de bloques del entorno de desarrollo de OPL.

4
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

LenguajeOPL(Optimization Programming Language )

IBMILOGCPLEXSTUDIO(Entornodedesarrollo)
IBMILOGCPLEX (Motordeprogramacinlinealcontinuayentera) IBMILOGCP ( (Motordeprogramacinconrestricciones) p g )

IBMILOGCONCERT(InterfazcomnC++)

IBMILOGSCHEDULER

IBMILOGDISPATCHER

OPL(OptimizationProgrammingLanguage)

LenguajeScript

CdigoOPL

API 1) EldeCP,queutilizapropagacindeconsistencia+bsqueda. Lenguajeexterno 2) EldeCPLEX,queutilizaSimplexparalasvariablescontinuasy C#,Java,C++ C# Java C++ Branch&Bound +planosdecorteparalasenteras

Enlassiguientestransparenciasveremoslosprincipiosdeoperacindelosdos motoresderesolucindeOPL:

5
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Perfiloperativodelaprogramacinconrestricciones(CP):propagacindeconsistencia+bsqueda VamosaseguirelperfiloperativodeCPutilizandoelsiguienteejemploderestriccionessinfuncindecoste:
Variablesdedecisin Ain1..5,Bin1..5,Cin1..5 Restricciones A>B; A>C; B>C+1 Seaplicapropagacin entreByCutilizandola restriccindesuarco comnB>C+1.Seelimina elvalor3deCpornoser soportadoporningn t d i valordeBatravsde B>C+1,ylosvalores1y2 deBpornoser soportadosporningn valordeCatravsdela mismarestriccin. Despusdeaplicar consistenciaentre variablessurgennuevas oportunidadesdevolvera aplicarlaalasmismas variablesalhaberse variables al haberse reducidosusdominiosen propagacionesdeotras restricciones.Enestecaso sevuelveaaplicarA>By seelimina3deA. Enunmomento determinadosealcanza unpuntofijoqueno permitereducirmslos dominiosdelasvariables aplicadoconsistencialocal entrevariablesatravs delasrestricciones.El problemaoriginalhasido reducidoaotro equivalente(conlas mismassoluciones)pero condominiosreducidos

Elproblemaqueda definidoporla declaracindelas variablesenterasysus dominiosdevariacin,y porelconjuntode restricciones.Se representacomoungrafo conlasvariablesenlos nodosylasrestricciones enlosarcos. Alaplicarpropagacinde consistenciaentrelos nodosAyButilizandola restriccinA>Bse eliminandelosdominios eliminan de los dominios deAyBaquellosvalores quenosonconsistentes enningncasoconla restriccin,esdecir,el1 enA(noesmayorque algnvalorenB)yel5en B(noesmenorquealgn B (no es menor que algn valordeA). Seaplicapropagacin entreAyCutilizandola restriccindesuarco comnA>C.Seeliminael valor5deCpornoser valor 5 de C por no ser soportadoporningn valordeAa travsdeA>C.

6
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Perfiloperativodelaprogramacinconrestricciones(CP):propagacindeconsistencia+bsqueda
Cuandosealcanzaun Cuando se alcanza un puntofijosepasaalafase debsqueda:seeligeuna variableysefijaaalgn valordesudominio.En estecasoelegimosAyel valor4,loquesignifica queeliminamoslosdems que eliminamos los dems valoresdeA(5eneste caso)yvolvemosaaplicar propagacinde consistencia. Lapropagacinde consistenciaentreByCa travsdeB>C+1eliminael valor2deC

Seeliminaelvalor4deB alaplicarconsistencia entraAyBatravsde A>B.

Sealcanzaotropuntofijo peroenestecasoconuna solucin(dominiosdelas variablesconunsolo valor):A=4,B=3,C=1.

Lapropagacinde consistenciaentreAyCa travsdeA>Cnoelimina ningnvalordelos dominiosdeAoC.

ComosepuedeobservarenCPesposibleutilizardesigualdadesestrictas(<,>)en lasrestricciones(cosaquenoocurreenprogramacinlineal). Tambinsonposiblestrminosnolinealeseinclusorestriccionespredefinidasmuy tilesenlaexpresindedeterminadosproblemas,porejemplo,alldifferent(X1, X2,)queimponequelasvariablesX1,X2,tomentodasvaloresdiferentes. X2 ) que impone que las variables X1 X2 tomen todas valores diferentes LaeficienciadeCPdependedelacapacidaddelospropagadoresdiseadospara cadarestriccinydelprocesodebsqueda,quepuedesercontroladoporel programadorconexpresionesadecuadasquedeterminanelordendelasvariables yelvalorqueseeligeencadapasodebsqueda.

7
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Programacinconrestricciones:efectodelapropagacindeconsistenciaentredosbsquedas Lapropagacindeconsistenciareducelosespaciosdebsqueda.Enelejemploanteriorhemosreducidounespaciodebsqueda La propagacin de consistencia reduce los espacios de bsqueda En el ejemplo anterior hemos reducido un espacio de bsqueda original5x5x5=125aunespaciode1x3x2=6despusdelaprimerafasedepropagacin.

Variables Ain1..5; Bin1..5; Cin1..5;

Variables Ain4..5; Bin3..5; Cin1..2;

Espaciosdebsquedaantesdelapropagacin Programacinconrestricciones:programaOPL Programacin con restricciones: programa OPL


using CP;

Espaciosdebsquedadespusdelapropagacin

dvar int A in 1..5; dvar int B in 1 5; 1..5; dvar int C in 1..5; subject to { A > B; A > C; B > C + 1; }

Pordefectolosprogramas OPLseinterpretancomo programaslineales,para queseinterpretencomo programacincon restricciones(CP)hayque escribirestadirectiva. escribir esta directiva Unadesigualdadestricta produciraunerrorenun programalineal

//solution A=4; B=3; C=1;

8
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Perfiloperativodelaprogramacinlinealcontinua(CPLEX):algoritmodelSimplex Estealgoritmoresuelveproblemaslinealesconvariablescontinuasrealizandounaseriedetransformacionessucesivassobreelproblemaoriginal:

Maximizar 4 x1 + 5 x2 + 3x3 sujeto a : x1 + x2 x3 2 x1 + x2 + 2 x3 3 x1 , x2 , x3 0


Problema

Seintroduce lavariablede maximizacin z

Maximizar z sujeto a : z = 4 x1 + 5 x2 + 3x3


x1 + x2 x3 2

Seintroducen lasvariables slack

Maximizar z sujeto a : z +4 x1 5 x2 3x3 = 0


x1 + x2 -x3 + x4 = 2

x4,x5
Convierten inecuaciones enecuaciones

x1 + x2 + 2 x3 3 x1 , x2 , x3 0

x1 + x2 +2 x3 + x5 = 3 x1 , x2 , x3 , x4 , x5 0

Seeligelabase:Z,x4,x5 YanoexisteenlaecuacindeZninguna variablequepuedaincrementarsuvalor

Seeligenlavariablepivote:x2 ylaecuacinpivote:x4=2+x1x2+x3

Seeligenlavariablepivote:x3 ylaecuacinpivote:x5=12x1+x43x3 Seeligela nueva base: Z,x2,x5

Maximizar z sujeto a : z = 0 4 x1 + 5 x2 + 3x3 x4 = 2 + x1 - x2 + x3 x5 = 3 - x1 - x2 - 2 x3

Maximizar z sujeto a : z = 10 + x1 5 x4 + 8 x3 x2 = 2 + x1 - x4 + x3 x5 = 1 - 2 x1 + x4 - 3x3

Maximizar z sujeto a :
Seeligela nueva base: Z,x2,x3

z =

x1 , x2 , x3 , x4 , x5 0
X2 eslavariablequemsaportaaZ x4=2+x1x2+x3eslaecuacinque mslimitaelincrementodex2 antesquex4 sehaganegativa

x1 , x2 , x3 , x4 , x5 0
x3 eslavariablequemsaportaaZ x5=12x1+x43x3eslaecuacinque mslimitaelincrementodex3 antesquex5 sehaganegativa

38 13 7 8 x1 x4 x5 3 3 3 3 7 1 2 1 x2 = + x1 x4 - x5 3 3 3 3 1 2 1 1 x3 = - x1 + x4 - x5 3 3 3 3 x1 , x2 , x3 , x4 , x5 0

Solucin

7 x2 = , 3

x3 =

1 3

con z =

38 3

9
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Perfiloperativodelaprogramacinlinealentera(CPLEX):mtododeBranch&Bound Los problemas lineales enteros se resuelven utilizando mtodos de bifurcacin y acotacin. Se inicia el mtodo relajando el carcter entero de las variables y resolvindolo como si fuesen continuas. Si la solucin ptima produce valores enteros para las variables, sta es la solucin del problema. En caso contrario se elige una variable cuyo valor no haya resultado entero, por ejemplo x1=2,2857 en el problema de la figura, y se crean dos subproblemas (nodos), uno el problema original ms la restriccin x1=2, y otro el problema original ms la restriccin x1=3. Este proceso se denomina de bifurcacin sobre la variable x1. El proceso contina sobre los subproblemas (nodos) pendientes de resolucin. Cuando se obtenga g j q q p p ) g p una solucin entera en algn nodo mejor que la ltima obtenida (y an quedan nodos pendientes de proceso) se guarda como solucin provisional. Cuando se obtenga una solucin no entera pero con funcin de coste peor que la solucin provisional, se aborta esa rama de proceso. Tambin se aborta cuando el problema resulta insatisfacible o no acotado. La diferencia entre la funcin de coste de la solucin entera provisional y la de la mejor relajacin lineal no entera (nodo) constituye el gap de convergencia. Cuando este gap se hace cero o menor que un cierto valor umbral, la solucin provisional se convierte en solucin final.
Objetivo:18,0714 j , x1=2,2857 x2=1,9286 x3=0 X12 X13

Minimize 2x1 + 7 x2 + 2 x3 s.t. x1 + 4 x2 + x3 10 4 x1 + 2 x2 + 2 x3 13 x1 + x2 x3 0 x1 , x2 , x3 0 y enteras


X21

Objetivo:18,1667 x1=2 x2=1,8333 x3=0,6666 X22 X2 2

Objetivo:18,25 x1=3 x2=1,75 x3=0 X21 Objetivo:19 x1=6 x2=1 x3=0 X31 X22 X2 2

Insatisfacible

Objetivo:19 x1=2 x2=2 x3=0,5 X30

Objetivo: 20 x1 = 3 x2 = 2 x3 = 0

Objetivo:21,5 x1=2 x2=2,5 x2 = 2 5 x3=0

Objetivo:19,5 x1=1,75 x2=2 x2 = 2 x3=1

10
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Perfiloperativodelaprogramacinlinealentera(CPLEX):introduccindeplanosdecorte(mtododeBranch&Cut) El rbol de bsqueda del mtodo de bifurcacin y acotacin se puede reducir introduciendo en los nodos restricciones que no eliminen soluciones enteras pero que reduzcan la regin factible del los problemas relajados. Estas restricciones se denominan planos de corte (cortan la regin factible) y se pueden obtener a partir de las restricciones del problema. Por ejemplo, si dividimos los dos miembros de la restriccin 4 x1 + 2 x2 + 2 x3 13 por 2 tenemos 2 x1 + 1x2 + 1x3 6,5 , y si las variables deben ser enteras, esa restriccin es equivalente a 2 x1 + 1x2 + 1x3 7 , es decir, tiene las mismas soluciones enteras. Por tanto, la introduccin de esta restriccin en el problema no elimina soluciones enteras. Si ahora ejecutamos la j relajacin lineal con la restriccin aadida tenemos:

Minimize 2x1 + 7 x2 + 2 x3 s.t. x1 + 4 x2 + x3 10 4 x1 + 2 x2 + 2 x3 13 2 x1 + x2 + x3 7 x1 + x2 x3 0 x1 , x2 , x3 0 y enteras


Objetivo: 18.1429 x1 = 2.5714 x2 = 1.8571 x3 = 0 X21 X22

Objetivo:19 x1=6 x2=1 x3=0

Objetivo:19 x1=2.5 x2=2 x3=0

Queevidentementereduceelrboldebsqueda. Q id t t d l b l d b d

11
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

IntroduccinaOPL Para introducir la sintaxis y semntica operacional de OPL vamos a partir del modelo lineal con variables continuas de un problema p p p sencillo de planificacin de la produccin. Despus iremos viendo diferentes formas de expresin (versiones) del modelo en OPL. Esto nos permitir introducir de forma gradual y motivada los principales recursos expresivos de OPL. Ejemplo:planificacindelaproduccin1 Se trata de una factora que produce amoniaco (NH3) y cloruro amnico (NH4Cl) a partir de nitrgeno (N) hidrgeno (H) y cloro (Cl) (N), (Cl). La cantidad disponible de cada uno de los tres componentes as como el beneficio por unidad que se obtiene de cada producto aparecen en la siguiente tabla. Se trata de planificar la produccin para obtener el mximo beneficio.
Componentes nitrgeno hidrgeno cloro Beneficioporunidaddeproducto Productos Cantidaddecomponenteencadaproducto amoniaco(NH3) i (NH cloruro_amnico (NH4Cl) l i Cl) 1*N 1*N 3*H 4*H 0*Cl 1*Cl 40 50 Disponibilidad componentes 50 180 40

Modelolineal Variablesdedecisin p amoniaco = cantidad de amoniaco a producir cloruro_amonico = cantidad de cloruro amnico a producir Restricciones Sujeto a

amoniaco + cloruro_amonico <= 50 3 * amoniaco + 4 * cloruro_amonico <= 180 cloruro_amonico <= 40; amoniaco >= 0 cloruro_amonico >= 0

Funcinobjetivo Maximizar

40 * amoniaco + 50 * cloruro_amonico

12
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

PrimeraversinOPL OPLpermiteescribirelmodelodeformacasiliteralalaespecificacinanterior,utilizandonombresindependientesparacada variablededecisin(comoyahemospracticadoenlosdosprimerostemasaunqueutilizandonombresgenricosdevariables).

p1.mod

// Variables de decisin dvar float+ amoniaco; dvar float+ cloruro_amonico; // Funcin objetivo Maximize 40*amoniaco+50*cloruro_amonico; // Restricciones subject to { amoniaco+cloruro_amonico <= 50; 3*amoniaco+4*cloruro_amonico <= 180; cloruro_amonico <= 40; };

Optimal Solution with Objective Value: 2300 amoniaco = 20 cloruro_amonico = 30

13
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Segundaversin OPL Si queremos generalizar el modelo para que se pueda adaptar a otra situacin en la que cambiemos o ampliemos los productos, OPL q g p q p p q p p permite definir conjuntos de cadenas de caracteres (strings) para utilizar como ndices de un nico nombre para las variables de decisin. Al conjunto de ndices podemos llamarle Productos y a la variable (indexada con Productos) produccion. La nueva versin del programa sera la siguiente:

p2.mod

// Indices {string} Productos = {"amoniaco","cloruro_amonico"}; // Variables de decisin dvar float+ produccion[Productos]; // Funcin objetivo maximize 40*produccion["amoniaco"] + 50 * produccion["cloruro_amonico"]; // Restricciones subject to { produccion ["amoniaco"] + produccion ["cloruro_amonico"] <= 50; 3*produccion ["amoniaco"] + 4 * produccion ["cloruro_amonico"] <= 180; produccion ["cloruro amonico"] <= 40; [ cloruro_amonico ] < };

Optimal Solution with Objective Value:2300 produccion[amoniaco]=20 produccion[cloruro_amonico]=30

14
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Terceraversin OPL Podemos seguir el proceso de generalizacin del modelo indexando tambin los datos del problema demanda, beneficio y stock , g p g p f previa introduccin de un nuevo conjunto de ndices denominado Componentes. De esta forma podremos utilizar una expresin genrica de sumatorio (sum) para la funcin de coste y una iteracin (forall) ms un sumatorio para la expresin de las restricciones. En ambos casos se introducen unos parmetros formales (p y c) que recorren los respectivos conjuntos.
p3.mod p3 mod

// Indices {string} Productos = {"amoniaco", "cloruro_amonico"}; {string} Componentes = {"nitrogeno", "hidrogeno", "oxigeno"}; // Datos float demanda[Productos][Componentes] = [[1, 3, 0], [1, 4, 1]]; float beneficio[Productos] = [40, 50]; float stock[Componentes] = [50, 180, 40]; // Variables de decisin p [ ]; dvar float+ produccion[Productos];
Equivalentealaexpresinmatemtica:

// Funcin objetivo maximize sum(p in Productos) beneficio[p] * produccion[p];

p Productos

beneficio p produccion p

Equivalentealaexpresinmatemtica: q p

// Restricciones c Componentes subject to { forall(c in Componentes) sum(p in Productos) demanda[p][c] * produccion[p] <= stock[c]; }; Optimal Solution with Objective Value:2300 produccion[amoniaco]=20 produccion[cloruro_amonico]=30

15
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Cuartaversin OPL Un grado ms de independencia del modelo se consigue si se separan datos y cdigo en archivos independientes. OPL permite g p g p g p p descomponer el modelo en dos archivos, uno para el modelo propiamente dicho con extensin .mod, y otro para los datos con extensin .dat. La declaracin de datos se sigue realizando en el archivo .mod pero de una forma elptica, utilizando el smbolo (=). Los dos archivos se pueden asociar en un proyecto utilizando el entorno de desarrollo. De esta forma podemos tener ms de una instancia de datos (ms de un archivo .dat) asociable a un mismo modelo (archivo .mod). Para nuestro problema de planificacin de la produccin tendramos la siguiente descomposicin:
p4.mod // Declaracin de ndices {string}Productos =; {string}Componentes ; // Declaracin de datos float demanda[Productos][Componentes] = ; float beneficio[Productos] = ; float stock[Componentes] = ; // Variables de decisin dvar float+ produccion[Productos]; // Funcin objetivo maximize sum(p in Productos) beneficio[p] * produccion[p]; // Restricciones subject to { forall(c in Componentes) sum(p in Productos) demanda[p][c] * produccion[p] <= stock[c]; }; p4.dat Productos = {"amoniaco", "cloruro_amonico"}; Componentes = {"nitrogeno", "hidrogeno", "oxigeno"}; demanda = [[1, 3, 0], [1, 4, 1]]; beneficio = [40, 50]; stock = [50, 180, 40];

Optimal Solution with Objective Value:2300 produccion[amoniaco]=20 produccion[cloruro_amonico]=30

16
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

EstructurageneraldeunprogramaOPL
EnunprogramaOPLexisten4zonasprincipalesdeinformacin:Datos,Variablesdedecisin,FuncindeCosteyRestricciones: Datos Bsicos Enteros Rangodeenteros(utilizadoscomorangodelndicedeunarray ocomorangodevariacindeunavariableentera) Rango de enteros (utilizados como rango del ndice de un array o como rango de variacin de una variable entera) Reales Rangodereales(utilizadoscomorangodevariacindeunavariablereal) Cadenasdecaracteres Compuestos Tuples Arrays Conjuntos Variablesdedecisin Enteras Reales Funcindecoste maximize ominimize Expresinlinealdevariablesdedecisin(condatosconstantes); Restricciones subject to { Expresinlinealdevariablesdedecisin(<=,==,<=)Expresinlinealdevariablesdedecisin }

Enlassiguientestransparenciasestudiaremosconejemploslosrecursosexpresivosdecadazona.

17
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

DatosbsicosenOPL D b i OPL
Enteros Inicializacinmedianteunvalor int i t a = 25; Inicializacinmedianteunaexpresin
int n = 3; int dimension = n*n; Declaraunnmeroenterodevalor25

Declaraunnmeroenterodevalor9

Rangosdeenteros Valoresenloslmites
range Filas = 1..10;

Declaraelrangodeenterosquevade1a10

Declaraelrangodeenterosque vade9a17

Expresionesenloslmites
int n = 8; range Filas = n+1..2*n+1; Declaraunnmerorealdevalor3.2

Reales
float f = 3.2; Declaraelrangoderealesquevade1a10

Rangosdereales
range rf = f1 0 f10 0 f f1.0..f10.0;

Cadenas(sring)
string s = "lunes";

Declarauncadenadecaracteres(string )sdevalor"lunes";

18
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

DatoscompuestosenOPL
Declaraunconjuntode3strings

Conjuntos C j t
{string} Componentes = {"nitrogeno", "hidrogeno", "oxigeno"};

Tuples
tuple Ruta { string a; string c; }; Ruta t = <"a","b">;

DeclaraRutacomountipotuple condoscomponentesdetipo string:ayb.Eltipotuple esanlogoaltiporecord deloslenguajes deprogramacinimperativos.Permiteconstruirdatoscompuestos porotrosdatos(campos)dediferentestipos Declaraeltuple tconvalor<"a","b"> de tipo Ruta

Conjuntodetuples

Declaraunconjuntode4tuples detipoRuta

{Ruta} rutas = {<"a1", "c1">, <"a1", "c4">, <"a4", "c4">, <"a5", "c4">} ;

Arrays A Enterosindexadosconunrangodefinido
range R= 1..4; int a[R] = [10, 20, 30, 40];

Declaraunvector a de4enterosindexadosporunrangode enteros,ylosinicializaconlosvaloresa[1]=10,a[4]=40 Declaraunvectorede4enterosindexadosporunrangode enteros,ylosinicializaconlosvalorese[1]=10,e[4]=40 enteros y los inicializa con los valores e[1]=10 e[4]=40 Declaraunvectorade3enterosindexadosporunconjuntode strings,ylosinicializaconlosvaloresa["nitrogeno"]=10, a["hidrogeno"]=20,a["oxigeno]=30.

Enterosindexadosconunrangoexplcito
int e[1..4] = [10, 20, 30, 40];

Enterosindexadosconunconjuntodestrings
int a [Componentes] = [10, 20, 30];

Realesindexadosconunrangoexplcito
float f [1..4] = [1.2, 2.3, 3.4, 4.5]

Declaraunvectorfde4realesindexadosporunrangodeenteros, ylosinicializaconlosvaloresf[1]=1.2,f[4]=4.5

19
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Array destring indexadoconunrangoexplcito


string s [1..2] = ["nitrogeno", "hidrogeno"]; Define s[1]= "nitrogeno" y s[2] = "hidrogeno"

Enteroindexadoconuntuple
tuple Arco { int origen; int destino; i t d ti }; {Arco} Arcos = {<1, 2>, <1, 4>, <1, 5>}; int a[Arcos] = [10, 20, 30];

Define a[<1,2>], a[<1,4>] y a[<1,5>] con valores respectivos 10, 20 y 30

Array multidimensionalfrenteaarray unidimensionalderegistros Enbastantesocasionesesmseconmicodefinirarrays unidimensionalesindexadossobreuntuple quearrays bidimensionales:

{string} Almacenes = {"a1", "a2", "a3", "a4", "a5"}; {string} Clientes = {"c1", "c2", "c3", "c4"}; int transporte1[Almacenes][Clientes] = [[2,0,0,5], [0,0,0,0], [0,0,0,0], [0,0,0,8], [0,0,0,9] ]; Unarray bidimensionaldefinevaloresdetransporteparatodas lascombinacionesdealmacenesyclientes,esdecir, transporte["a1","c1"], transporte["a1","c2"] etc., aunqueparamuchasdeellasnoexistaconexin,recogindose estehechoconunvalor0.

tuple Ruta { string a; string c; }; {Ruta} rutas = {<"a1", "c1">, <"a1", "c4">, <"a4", "c4">, <"a5", "c4">} ; int transporte2[rutas] = [2, 5, 8, 9]; Unarray conndicetipotuple permitedefinirvaloresde transporte sloparalacombinacindealmacenesyclientesdefinidosenel conjuntoderutas

20
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Inicializacin externa de arrays Los arrays se pueden inicializar con datos externos, declarndose en el archivo .mod e inicializndose en el archivo .dat: y p ,
// archivo .mod

int a[1..2][1..3] = ...;


// archivo .dat

a = [[10, 20, 30],[40, 50, 60]];

Tambin se pueden inicializar especificando los pares (ndice, valor). En este caso se deben utilizar los delimitadores #[ y ]# en lugar de [ y ]. //archivo .mod
int a[Dias] = ...;

/archivo .dat
a = #[ "Lunes": 1, "Martes": 2, "Miercoles": 3, , "Jueves": 4, "Viernes": 5, "Sabado": 6, "Domingo": 7 ];#

El orden de los pares puede ser arbitrario, y las dos formas de inicializacin se pueden combinar: // archivo .mod
int a[1..2][1..3] = ...;

// archivo .dat
a = #[ 2: [40, 50, 60], 1: [10, 20, 30] ]#;

21
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Inicializacinexternadetuples Lostuples tambinsepuedeninicializarcondatosexternos,declarndoseenelarchivo.mod einicializndoseenelarchivo.dat.Sepueden inicializardandolalistadelosvaloresdelosdiferentescampos,olistandolospares(campo,valor).Enestecaso,comoocurreconlos arrays, losdelimitadores<y>sesustituyenpor#<y>#ynoimportaelordenamientodelospares. Por ejemplo:


// archive .mod tuple punto { int x; int y; } punto p1=...; punto p2=...; // archive .dat p1=#<y:1,x:2>#; p2=<2,1>; 2 <2 1>

Inicializacin externa de conjuntos Los conjuntos de tuples tambin se pueden inicializar con datos externos, declarndose en el archivo .mod e inicializndose en el archivo .dat. Por ejemplo:
// archivo .mod tuple Precedencia { int antes; int despues; } {Precedencia} precedencias = ...;

// archivo .dat dat precedencias = {<1,2>, <1,3>, <3,4>};

22
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Variablesdedecisin Variables de decisin LasvariablesdedecisinenOPL(CPLEX)slopuedenserdetipoenteroodetiporeal(tomanvaloresenterosoreales).Susdeclaraciones respectivasson: dvar int nombre_de_la_variable_entera in rango_entero_de variacin
El rango en las variables de decisin de tipo float es opcional

dvar float nombre_de_la_variable_real [in rango_entero_de variacin] La nonegatividadsepuedeespecificarexplcitamenteconelsigno+comosubfijo delnombredeltipo: dvar int+nombre_de_la_variable_entera in rango_entero_de variacin dvar float+nombre_de_la_variable_real [in rango_entero_de variacin] Lasvariablesdedecisinpuedenindexarsedelamismamaneraquelosdatos,esdecir,conrangosdeenteros(implcitosoexplcitos), conjuntosdestrings,conjuntosdetuples,etc. conjuntos de strings conjuntos de tuples etc
{string} dias = {"Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo"}; {string} barcos= {"B1","B2","B3"}; Define 7 variables reales no negativas var1["Lunes"],, var1["Domingo"] [ ]; dvar float+ var1[dias]; dvar int var2[barcos][dias] in 0..1; Define 21 variables enteras var2["B1"]["Lunes"],, var2["B3"]["Domingo"]

Las dimensiones de um array pueden ser de diferente tipo:


dvar int var3[1..10][dias] in 0..1; Define 70 variables enteras var3[1]["Lunes"],, var3[10]["Domingo"]

23
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Funcindecoste Unafuncindecosteserunaexpresinlinealdevariablesdedecisin: Expresin_lineal_de_variables_de_decisin := c1 var1 +c2 var2+ Expresin lineal de variables de decisin := c1*var1 + c2*var2 + Dondec1,c2,sondatosconstantes(enterosoreales)yvar1,var2,variablesdedecisin(tambinenterasoreales) Laexpresinlinealdevariablesyconstantesindexadassepuedesimplificarutilizandoelsiguienteoperadordeagregacin: sum(iin rango_de_variacin_de_i) sum(i in rango de variacin de i) El operador sum es equivalente al smbolo matemtico del sumatorio. La expresin i in rango_de_variacin_de_i se denomina parmetro formal y su sintaxis la veremos en la siguiente transparencia. Un ejemplo de expresin lineal indexada utilizada como funcin de coste de minimizacin sera la siguiente:
minimize sum (i in dias) const1[i]*var1[i] + sum (p in productos) const2[p]*var2[p] const1[i] var1[i] const2[p] var2[p]

Restricciones Unarestriccintienelaformageneral: Expresin_lineal_de_variables_de_decisin_1(<===<=)Expresin_lineal_de_variables_de_decisin_2 Donde Expresin_lineal_de_variables_de_decisin tienelamismasintaxisqueenlafuncindecoste.Enparticularunaconstante,incluidael 0,puedeserunaExpresin_lineal_de_variables_de_decisin. Parasimplificarlaexpresinderestriccionessepuedenincluirdentrodeconstruccionesiterativasforall (iin rango_de_variacin_de_i) siemprequeelparmetroformaliaparezcacomondiceenlasvariablesdedecisiny/oconstantesdelasexpresioneslineales.Porejemplo, laexpresiniterativa:
subject to { forall (i in 1..3)const1[i]*var[i] >= const2[i]; }

Esequivalentealassiguientestresrestricciones:
subject to { const1[1]*var[1] >= const2[1]; const1[2]*var[2] >= const2[2]; const1[3]*var[3] >= const2[3]; }

24
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Parmetrosformales LosparmetrosformalesjueganunpapelfundamentalenOPL. Seutilizanconoperadoresdeagregacin,conjuntosysentenciasforall. Elparmetroformalmssimpletienelaforma: p in S donde p eselparmetroformalyS elconjuntodelcualp tomasusvalores. ElconjuntoS puedeser: Unrangodeenteros

int n=6; int s == sum(i in 1..n) i*i;

Unconjunto destrings

{string} Productos ={"coche", "camion"}; g float costo[Productos] =[12000,10000]; float maxCosto = max(p in Productos) costo[p];

Unconjunto detuples

{string} Ciudades = {"Paris", "Londres", "Berlin"}; { Paris Londres Berlin }; tuple Conexion { string orig; string dest; } {Conexion} conexiones ={<"Paris","Berlin">,<"Paris", "Londres">}; { i } i { i li i d } float costo[connections] = [ 1000, 2000 ]; float maxCosto= max(r in conexiones ) costo[r];

25
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Parmetrosformalesconfiltro Sisenecesitafiltraralgunosvaloresdelrangodeunparmetroformalsepuedenutilizarcondiciones: Si se necesita filtrar algunos valores del rango de un parmetro formal se pueden utilizar condiciones: p in S : condicion queasignaap todosloselementosdeS quecumplenlacondicin.Por ejemplo:
int n=8; dvar int a[1..n][1..n]; subject to { forall(i in 1..8) forall(j in 1..8: i < j) a[i][j] >= 0; }

Larestriccina[i][j] >= 0 esmodeladaparatodoiyj talque1i<j8. tal que 1 i < j 8

Sepuedencombinarparmetrosparaproducirunaexpresinmscompacta.Por ejemplo,ladosdeclaraciones siguientes sonequivalentes:


int s = sum(i,j in 1..n: i < j) i*j; int s = sum(i in 1..n) sum(j in 1..n: i < j) i*j;

Tambinsonequivalenteslassiguientesdeclaraciones:
int s = sum(i in 1..n, j in 1..m) i*j; int s = sum(i in 1..n) sum(j in 1..m) i*j;

Estosparmetrostambinpuedensometerseacondicionesdefiltro.Porejemplo ladosdeclaraciones siguientes sonequivalentes:


forall(i,j forall(i j in 1 n : i < j) a[i][j] >= 0; 1..n forall(i in 1..n, j in 1..n : i<j) a[i][j] >= 0;

Lasiguienteesunaexpressin equivalenteyanmscompacta:
forall(ordered i,j in 1..n)a[i][j] >= 0;

26
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Ejemplo:planificacindelaproduccin2 Ejemplo: planificacin de la produccin 2 Una compaa fabrica tres productos p1, p2 y p3 utilizando dos materias primas m1 y m2. En la siguiente tabla aparece el consumo de materias primas para fabricar cada producto (consumo), la disponibilidad total de materias primas, la demanda prevista, el coste interno de produccin para cada producto, y el coste externo de cada producto para cuando la produccin interna no sea suficiente y haya que recurrir a la compra externa de los productos. Hay que determinar la produccin interna y externa de cada producto de manera que se minimice el costo total de la produccin. produccin
Componentes m1 m2 demanda costeinterno costeexterno p1 0.5 0.2 100 0.6 0.8 Productos consumo p2 0.4 0.4 200 0.8 0.9 Disponibilidaddemateriasprimas p3 0.3 0.6 300 0.3 0.4 20 40

Datos costInterno p costExterna p costeInventario p consumorp disponibilidad r demanda p

Variables de decisin prodInterna p prodExterna p

Minimizar z = Mi i i

p Productos

costeInterno p prodInterna p + costExterna p prodExterna p I dI E dE

sujeto a : j

p Productos

consumo pr prodInterna p disponibilidad r r M P i dI di ibilid d MatPrimas

prodInterna p + compraExterna p demanda p

p Productos

r MatPrimas pP d t Productos

27
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Ejemplo:Planificacindelaproduccin2 (Solucin1:usodearrays paralosdatosdelosproductos)


.mod {string} Productos =...; {st {string} MatPrimas =...; g} at as ...; float float float float float fl t consumo[Productos][MatPrimas] = ...; disponibilidad[MatPrimas] = ...; demanda[Productos] = ...; costeInterno[Productos] = ...; costeExterno[Productos] = ...; t E t [P d t ]

dvar float+ prodInterna[Productos]; dvar float+ compraExterna[Productos]; minimize sum(p in Productos) (costeInterno[p]*prodInterna[p] + costeExterno[p]*compraExterna[p]); subject to { forall(r in MatPrimas) sum(p in Productos) consumo[p][r] * prodInterna[p] <= disponibilidad[r]; forall(p in Productos) prodInterna[p] + compraExterna[p] >= demanda[p]; }; .dat Productos = { "p1", "p2", "p3" }; MatPrimas = { "m1", "m2" }; consumo = [ [0.5, 0.2], [0.4, 0.4], [0.3, 0.6] ]; disponibilidad demanda = [ costeInterno costeExterno = [ 20, 40 ]; 100, 200, 300 ]; = [ 0.6, 0.8, 0.3 ]; = [ 0.8, 0.9, 0.4 ];

solution(optimal)withobjective372 prodInterna =[40 0 0]; compraExterna =[60 200300];

28
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Ejemplo:Planificacindelaproduccin2(Solucin2:usodetuples paralosdatosdelosproductos)
.mod {string} Productos =...; {string} MatPrimas =...; { t i } M tP i tuple DatosProd { float demanda; float costeInterno; float costeExterno; float consumo[MatPrimas]; }; DatosProd producto[Productos] = ...; float disponibilidad[MatPrimas] = ...; dvar float+ prodInterna[Productos]; float dvar float+ compraExterna[Productos]; minimize sum(p in Productos) (producto[p].costeInterno*prodInterna[p] + producto[p].costeExterno*compraExterna[p]); subject t { bj t to forall(r in MatPrimas) sum(p in Productos) producto[p].consumo[r] * prodInterna[p] <= disponibilidad[r]; forall(p in Productos) prodInterna[p] + compraExterna[p] >= producto[p].demanda; .dat Productos = { "p1", "p2", "p3" }; MatPrimas = { "m1", "m2" }; producto p1 p2 p3 = : : : #[ < 100, 0.6, 0.8, [ 0.5, 0.2 ] > < 200, 0.8, 0.9, [ 0.4, 0.4 ] > < 300, 0.3, 0.4, [ 0.3, 0.6 ] >]#;

disponibilidad = [ 20, 40 ];

solution(optimal)withobjective372 prodInterna =[4000]; compraExterna =[60200300];

29
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Ejemplo:Problemadelamochilaconobjetosdemltiplesatributos Objetos con mltiples atributos (por ejemplo, peso, volumen, etc.) y un valor (por ejemplo, euros) deben ubicarse en una mochila que tiene una determinada capacidad para cada atributo (peso mximo, volumen mximo, etc.) de manera tal que se maximice el valor de los objetos seleccionados.

Datos : valori = valor del objeto i j capacidad _ objeto ji = capacidad del objeto i en el atributo j no = nmero de objetos na = nmero de atributos Variablesdedecisin : seleccionari = nmero de objetos de tipo i seleccionados Maximizar z = valori seleccionari
i =1 no

int numObjetos =...; int numAtributos =...; range Objetos = 1..numObjetos; range Atributos = 1..numAtributos; int capacidad_mochila[Atributos] =...; int valor[Objetos] =...; int capacidad_objetos[Atributos][Objetos] =...; int maxValor = max(a in Atributos) capacidad_mochila[a]; dvar int seleccionar[Objetos] in 0..maxValor; maximize sum(o in Objetos) valor[o]*seleccionar[o]; subject to { forall(a in Atributos) sum(o in Objetos) capacidad_objetos[a][o]*seleccionar[o] <= capacidad_mochila[a]; numObjetos = 12; numAtributos = 7; capacidad_mochila=[18209, 7692, 1333, 924, 26638, 61188, 13360]; valor = [96, 76, 56, 11, 86, 10, 66, 86, 83, 12, 9, 81]; capacidad_objetos = [ [19, 1, 10, 1, 1, 14, 152, 11, 1, 1, 1, 1], [ 0, 4, 53, 0, 0, 80, 0, 4, 5, 0, 0, 0], [ 4, 660, 3, 0, 30, 0, 3, 0, 4, 90, 0, 0], [ 7, 0, 18, 6, 770, 330, 7, 0, 0, 6, 0, 0], [ 0, 20, 0, 4, 52, 3, 0, 0, 0, 5, 4, 0], [ 0, 0, 40, 70, 4, 63, 0, 0, 60, 0, 4, 0], [ 0, 32, 0, 0, 0, 5, 0, 3, 0, 660, 0, 9] ];

sujeto a :

capacidad _ objeto
i =1

no

ji

seleccionari j = 1...na

OptimalSolutionwithObjectiveValue:261922 seleccionar[1]=0 seleccionar[2]=0 seleccionar[3]=0 seleccionar[4]=154 seleccionar[5]=0 l i [5] 0 seleccionar[6]=0 seleccionar[7]=0 seleccionar[8]=913 seleccionar[9]=333 seleccionar[10]=0 seleccionar[11]=6499 seleccionar[11] = 6499 seleccionar[12]=1180

30
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Ejemplo:Produccinmultiperodo Una compaa fabrica tres productos p1, p2 y p3 utilizando dos materias primas m1 y m2. El consumo de materias primas para cada producto aparece en la tabla consumo as como la disponibilidad total de materias primas La previsin de demanda para tres perodos (meses) de consumo, primas. produccin aparece en la tabla demanda. Los costes de produccin internos para cada perodo aparecen en la tabla coste. Tambin aparece en esta tabla el coste externo de cada producto para cuando la produccin interna no sea suficiente y haya que recurrir a la compra externa de los productos. El coste de los inventarios (almacenes) tambin aparece en esta tabla. Hay que determinar la produccin interna y externa de cada producto as como los inventarios de cada perodo de manera que se minimice el costo.
consumo m1 m2 p1 0.5 0.2 p2 0.4 0.4 p3 0.3 0.6 disponibilidad 20 40 demanda p1 p2 p3 t=1 10 20 50 t=2 100 200 100 t=3 50 100 100 coste interno externo inventario
inventa[p1,2] Perodo2 inventa[p2,2] inventa[p3,2] i t [ 3 2] Perodo3

p1 0.4 0.8 0.1

p2 0.6 0.9 0.2

p3 0.1 0.4 0.1


inventa[p1,3] inventa[p2,3] inventa[p3,3] i t [ 3 3]

Datos costInterno p costExterna p costeInventario p consumorp disponibilidad r demanda pt inventa pt inventario p

Variables de decisin
inventa[p1,0] inventa[p1,1] Perodo1 inventa[p2,1] inventa[p3,1] i t [ 3 1]

prodInterna pt p prodExterna pt inventario pt


r matPrimas p Productos; t = 0,1,2,3
3

inventa[p2,0] inventa[p3,0] i t [ 3 0]

prodInterna[p,1]

compraExterna[p,1] prodInterna[p,2] Demanda t1 1 Demanda t2 2

prodInterna[p,3] compraExterna[p,2] Demanda t3 3

compraExterna[p,3]

Minimizar z = sujeto a :

t =1 p Productos

costInterno p prodInterna pt + costExterna p prodExterna pt + costeInventario p inventario pt

p Productos

consumorp prodInterna pt disponibilidad r r , t r matPrimas; t = 1,2,3

inventa pt1 + prodInterna pt + compraExterna pt = demanda pt + inventa pt p, t p Productos; t = 1,2,3 inventa p 0 = inventario p

p Productos

31
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Produccinmultiperodo:ModeloOPL
// .mod mod
// DECLARACION DE DATOS {string} Productos =...; {string} MatPrimas =...; int nuPeriodos = ...; range Periodos = 1..nuPeriodos; float consumo[MatPrimas][Productos] = ...; float disponibilidad[MatPrimas] = ...; float demanda[Productos][Periodos] = ...; float costInterno[Productos] = ...; float costExterno[Productos] = ...; float inventario[Productos] = ...; float costInventario[Productos] = ...;

// .dat Productos = { "p1", "p2", "p3" }; MatPrimas = { "m1", "m2" }; nuPeriodos = 3;

// // // // // // // // // // //

enumeracin de los productos enumeracin de las materias primas nmero de perodos de produccin rango de perodos de produccin materias primas por producto disponibilidad de materias primas demanda de productos por perodo coste interno de los productos coste externo de los productos inventario inicial de cada producto coste almacenamiento de productos

consumo = [ [ 0.5, 0.4, 0.3 ], [ 0.2, 0.4, 0.6 ] ]; disponibilidad = [ 20, 40 ]; demanda = [ [ 10 100 50 ], [ 20 200 100 ], [ 50 100 100 ] ]; inventario = [ 0 0 0 ] ]; costInventario = [ 0.1 0.2 0.1]; costInterno = [ 0.4, 0.6, 0.1 ]; costExterno = [ 0.8, 0.9, 0.4 ];

// VARIABLES DE DECISION dvar float+ prodInterna[Productos][Periodos]; dvar float+ compraExterna[Productos][Periodos]; dvar float+ inventa[Productos][0..nuPeriodos]; // FUNCION DE OPTIMO minimize sum(p in Productos, t in Periodos) (costInterno[p]*prodInterna[p][t] + costExterno[p]*compraExterna[p][t] + costInventario[p]*inventa[p][t]);

// Produccin interna de cada producto en cada perodo // Compra externa de cada producto en cada perodo // Inventario de cada producto en cada perodo

solution (optimal) with objective 457 p prodInterna = [ [ [10 0 0 ] [ 0 0 0 ] [50 66.667 66.667] ]; compraExterna =[ [ 0 100 50 ] [20 200 100 ] [ 0 33.333 33.333] ]; inventa = [ [0 0 0 0] [0 0 0 0] [0 0 0 0] ]; ]

// RESTRICCIONES subject to { forall(r in MatPrimas, t in Periodos) sum(p in Productos)consumo[r][p] * prodInterna[p][t] <= disponibilidad[r]; forall(p in Productos, t in Periodos) inventa[p][t-1] + prodInterna[p][t] + compraExterna[p][t] == demanda[p][t] + inventa[p][t]; forall(p in Productos) inventa[p][0] == inventario[p]; };

32
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

ConexindeOPLconunahojadeclculo(excel) Establecimientodelaconexin Lasentencia:


// archivo .dat SheetConnection sheet("gasolina.xls");

Establece una conexin delprograma OPLconuna hoja declculo denominada gasolina.xls. Enlaespecificacindelarchivo.xls sepueden utilizarcaminosrelativosaldirectoriodelarchivo.dat. utilizar caminos relativos al directorio del archivo dat Lecturadesdeunahojaconectada Losrangosdelahojadeclculopuedenleersesobrearrays unidimensionalesomultidimensionalesosobreconjuntos.Por ejemplo:
// archivo .mod {string} Gasolinas = ...; tuple TipoGasolina { float demanda; float precio; float octanaje; float l fl t plomo; } TipoGasolina gas[Gasolinas] = ...; // archivo .dat SheetConnection sheet("gasolina.xls"); Gasolinas from SheetRead(sheet,"gas!A2:A4"); gas from SheetRead(sheet,"gas!B2:E4"); DefineGasolinas comounconjuntodestring DefineTipoGasolina comountuple con4componentesdetipofloat Definegas comounarray ndexado sobreelconjuntodestring Gasolinas ycuyos elementossontuples deTipoGasolina Archivo:gasolina.xls Archivo: gasolina xls Hoja:gas

Establecelaconexinconelarchivoexcel gasolina.xsl InstanciaGasolinas conlosstring delrangoA2:A4delahojagas delarchivogasolina.xls Instanciagas conlosfloat delrangoB2:E4delahojagas delarchivogasolina.xls. gas[g1]=<5,7,10,13>,gas[g2]=<6,8,11,14>,gas[g3]=<7,9,12,15>

Escrituraenunahojadeclculo E i h j d l l Lasalidaderesultadossobreunahojadeclculoconectadaserealizaconsentenciasdeltipo:
a to SheetWrite(sheet,"RESULTADO!A2:A4"); b to SheetWrite(sheet,"RESULTADO!B2:D4"); Llevaelarray aalrangoA2:A4delahojaRESULTADO Llevaelarray balrangoA2:A4delahojaRESULTADO

EnestecasoOPLabrelahojadeclculoenmodolecturaescritura,ylaaccinpuedefallarsiotroprocesoestyautilizandolamismahojade clculo.Lostiposutilizadossonlosmismosqueenlalectura.Lasceldasserellenandeizquierdaaderechaydearribaaabajo.

33
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

Ejemplo:lecturadelosdatosdel modelop4.moddesdeunahojaexcel
p4.dat Productos = {"amoniaco", "cloruro_amonico"}; Componentes = {"nitrogeno", "hidrogeno", "oxigeno"}; demanda = [[1, 3, 0], [1, 4, 1]]; beneficio = [40, 50]; stock = [50, 180, 40]; p4.dat // Conexin con la hoja de clculo SheetConnection sheet("produccion.xls"); produccion.xls Elarchivo.xls deberestarenelmismodirectorio queel.dat.Encasocontrariohabrqueespecificar elcaminodeubicacinquepuedeserrelativoala ubicacinde.dat

// Lectura de datos Productos from SheetRead(sheet,"Hoja1!A10:A11"); Componentes from SheetRead(sheet,"Hoja1!A4:A6"); demanda from SheetRead(sheet,"Hoja1!B4:C6"); beneficio from SheetRead(sheet,"Hoja1!B10:B11"); stock from SheetRead(sheet,"Hoja1!D4:D6"); SheetRead(sheet, Hoja1!D4:D6 );

// Escritura de resultados produccion to SheetWrite(sheet,"Hoja1!D10:D11");

34

Ejercicio1 Una empresa debe contratar trabajadores de un conjunto {1, 2, ...,32} para construir un edificio. El trabajo implica una serie de tareas t1, t2,...,t15 especficas cuya realizacin requiere cualificacin. Cada trabajador est cualificado para un subconjunto de tareas y tiene un coste de contratacin. Determinar el subconjunto de trabajadores que hay que contratar de manera que rena todas las cualificaciones necesarias para la construccin del edificio minimizando el coste.
nuTrabajadores = 32; Tareas = {t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15 }; cualificacion = [ { 1 9 19 22 25 28 31 } // trabajadores cualificados para la tarea t1 { 2 12 15 19 21 23 27 29 30 31 32 } // trabajadores cualificados para la tarea t2 { 3 10 19 2 26 30 32 } 0 9 24 // trabajadores cualificados para la tarea t3 j i i 3 { 4 21 25 28 32 } // trabajadores cualificados para la tarea t4 { 5 11 16 22 23 27 31 } // trabajadores cualificados para la tarea t5 { 6 20 24 26 30 32 } // trabajadores cualificados para la tarea t6 { 7 12 17 25 30 31 } // trabajadores cualificados para la tarea t7 { 8 17 20 22 23 } // trabajadores cualificados p j para la tarea t8 { 9 13 14 26 29 30 31 } // trabajadores cualificados para la tarea t9 {10 21 25 31 32 } // trabajadores cualificados para la tarea t10 {14 15 18 23 24 27 30 32 } // trabajadores cualificados para la tarea t10 {18 19 22 24 26 29 31 } // trabajadores cualificados para la tarea t12 {11 20 25 28 30 32 } // trabajadores cualificados para la tarea t13 {16 19 23 31 } // trabajadores cualificados para la tarea t14 {9 18 26 28 31 32 } // trabajadores cualificados para la tarea t15 ]; coste = [ 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 6 6 6 7 8 9 ]; //coste de cada trabajador

Ejercicio2 Ubicar los datos del problema de la produccin multiperodo en una hoja excel y modificar el cdigo OPL del archivo .dat para que la lectura de datos y escritura de resultados se haga desde el dicha hoja.

35
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL

You might also like