Professional Documents
Culture Documents
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
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
IBMILOGCPLEXSTUDIO(Entornodedesarrollo)
IBMILOGCPLEX (Motordeprogramacinlinealcontinuayentera) IBMILOGCP ( (Motordeprogramacinconrestricciones) p g )
IBMILOGCONCERT(InterfazcomnC++)
IBMILOGSCHEDULER
IBMILOGDISPATCHER
OPL(OptimizationProgrammingLanguage)
LenguajeScript
CdigoOPL
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
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.
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
8
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL
Perfiloperativodelaprogramacinlinealcontinua(CPLEX):algoritmodelSimplex Estealgoritmoresuelveproblemaslinealesconvariablescontinuasrealizandounaseriedetransformacionessucesivassobreelproblemaoriginal:
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
Seeligenlavariablepivote:x2 ylaecuacinpivote:x4=2+x1x2+x3
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
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: 20 x1 = 3 x2 = 2 x3 = 0
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:
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
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; };
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 ] < };
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:
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];
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
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];
{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
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
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 = ...;
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"]
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
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; }
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;
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
Minimizar z = Mi i i
p Productos
sujeto a : j
p Productos
p Productos
r MatPrimas pP d t Productos
27
J.J.RUZ,INTRODUCCINALAPROGRAMACINMATEMTICA,MSTERUNIVERSITARIOENINGENIERADESISTEMASYDECONTROL
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 ];
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 ];
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
Variables de decisin
inventa[p1,0] inventa[p1,1] Perodo1 inventa[p2,1] inventa[p3,1] i t [ 3 1]
inventa[p2,0] inventa[p3,0] i t [ 3 0]
prodInterna[p,1]
compraExterna[p,3]
Minimizar z = sujeto a :
t =1 p Productos
p Productos
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] = ...;
// // // // // // // // // // //
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
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 );
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