Académique Documents
Professionnel Documents
Culture Documents
Septiembre, 2011
ndice
Glosario ..............................................................................................................................3 Lista de abreviaturas y siglas ..............................................................................................4 Lista de figuras ...................................................................................................................5 Introduccin ......................................................................................................................6
2 Descripcin general del problema MCLSP...................................................................7 2.1 Descripcin particular del problema MCLSP ................................................................7 2.2 Formulacin matemtica ...............................................................................................7 2.2.1 Parmetros y variables ...............................................................................................7 2.2.2 Modelo matemtica y restricciones.............................................................................8 2.2.3 Representacin grfica ...............................................................................................9 2.3 Resultados obtenidos..................................................... Error! Bookmark not defined. 2.3.1 Resultados obtenidos de cada instancia ...................... Error! Bookmark not defined. 3 Conclusin .................................................................... Error! Bookmark not defined.2 Bibliografa ...................................................................................................................... 13 Anexo 1 Datos de la instancia 1 ....................................... Error! Bookmark not defined. Anexo 2 Datos de la instancia 2 ..................................................................................... 16 Anexo 3 Cdigo .............................................................................................................. 17 Anexo 4 Tabla de resultados instancia 1 ........................................................................ 18 Anexo 5 Tabla de resultados instancia 2 ........................................................................ 19
Glosario
Software: Conjunto de programas, instrucciones y reglas informticas para ejecutar ciertas tareas en una computadora. Setup: preparacin de la maquinaria para iniciar la produccin. JAVA: lenguaje de programacin orientado a obejetos. C-plex: Programa de optimizacin IBM: (International Business Machines), empresa multinacional de programas y equipos informticos.
Lista de figuras
Figura 1.1 Representacin grfica de MCLSP.
1 Introduccin
En este informe se presenta el Problema del Tamao de Lote Capacitado con Multiproducto (MCLSP), su definicin, su estructura a travs de un diagrama, y una resolucin real a un problema ficticio dado. El MCLSP consiste en planificar produccin e inventario, y es un tema muy estudiado en cursos de investigacin de operaciones, debido a la utilidad que presenta para las empresas o industrias la aplicacin de la solucin de estos problemas. En esta oportunidad, el grupo de trabajo resuelve este complejo problema a travs del uso del lenguaje de programacin JAVA y la herramienta para resolucin de problemas de programacin lineal CPLEX. CPLEX de IBM, resuelve tanto programacin entera, como grandes problemas de programacin lineal, ya sea usando variantes primarias o duales del mtodo simplex, problemas de programacin cuadrtica (rea convexa o no), adems de otros problemas relacionados con la optimizacin y programacin. En esta ocasin, y durante la extensin del informe se muestra tanto el problema presentado como la resolucin a travs de las herramientas sealadas para su realizacin. Bsicamente se trabaja con un modelo ficticio en el cual se aplican todos los conocimientos adquiridos en el curso de investigacin operacional II.
y ai = y Kt =
Uso de capacidad unitaria del tem i. (tiempo/und) Capacidad total disponible en el perodo t. (tiempo)
Variables de decisin del problema y Xit = Cantidad producida del tem i en el periodo t. (und) y Iit = Nivel de inventario almacenado del tem i al final del periodo t. (und) y Yit = Variable de binaria que indica (1) si se produce el tem i en el periodo t o (0) si no se produce el tem i en el periodo t. (adimensional)
S.a. El problema debe cumplir con la satisfaccin de la demanda para cada periodo en que se desarrolle el ejercicio. Es importante sealar que para el problema MCLSP estudiado, siempre habr demanda de produccin y no oferta. Esta restriccin procura que se respete la condicin de borde, es decir que mantenga una relacin entre lo producido, lo inventariado y la demanda de un periodo hacia el siguiente, para cada producto.
La siguiente restriccin alude a la capacidad de un determinado periodo, y que la produccin en tal periodo no debe ser superior a su capacidad total.
Si se decide producir un producto i en un cierto periodo, la variable de decisin debe permitir activar la produccin para dicho producto en tal periodo, la cual no debe sobrepasar la capacidad del recurso productivo. Esta restriccin se muestra a continuacin.
Figura 1.1 Representacin grafica de MCLSP. Lo grande del esquema, se debe a la gran cantidad de flujos, y cada uno con sus N variedades de productos. Se ha querido demostrar de forma visual el problema y exponer de algn modo, que no solo el recurso productivo satisface cada perodo, si no que tambin es posible que un perodo pueda recibir productos del periodo anterior.
datos que corresponden a variables respuestas calculados por el C-plex son entregadas en un archivo tipo Excel. Con el cdigo correspondiente, mostrado en el anexo 3, y los parmetros, Java en conjunto con las herramientas de C-plex es capaz de entregar una solucin al problema planteado. A continuacin se comentaran los resultados de cada instancia, y en la parte de los anexos se encontraran los datos de los parmetros de cada problema.
3 Conclusin
En el mbito de la ingeniera industrial, la resolucin de problemas de optimizacin es una de las reas en que como profesionales los integrantes del grupo podran trabajar, por lo que este trabajo les entreg herramientas para su futuro desempeo profesional. Generalmente los conocimientos adquiridos en el aula no poseen una aplicacin prctica directa en el corto plazo, por lo que este proyecto fue muy atractivo, ya que permiti utilizar los conocimientos aprendidos en herramientas computacionales reales, sacndolo de la abstraccin del papel a una aplicacin computacional que permiti comparar resultados de dos instancias, de manera ms tangible. El proyecto fue exitoso, tanto en su planteamiento, como en su resolucin, ya que dado un problema ficticio de MCLSP, se pudo resolver de buena manera con IBM CPLEX. Se dieron las instancias de manera correcta, y las variables mostraron resultados coherentes. Finalmente cabe destacar la unin entre los conocimientos aprendidos durante los primeros semestres de la carrera y el actual perodo, ya que el presente trabajo utiliz elementos de los cursos de Tecnologas de la Informacin y Estructuras de Datos y por supuesto del curso de Investigacin Operacional II.
4 Bibliografa
http://www.scielo.br/scielo.php?pid=S0101-74382005000300010&script=sci_arttext http://www.meiss.com/download/SC-02-Federgruen-Meissner.pdf
Anexos
CP it 1 2 3 4 5 6 7 8 9 10 11 12
1 2441 2194 214 2480 3539 3462 3251 113 1057 338 1760 507
2 25 654 2349 73 3884 1371 2122 716 3770 2872 2421 197
3 3749 64 2748 2796 202 3998 945 1234 1024 3915 2230 254
CI it 1 2 3 4 5 6 7 8 9 10 11 12
1 21 414 289 436 441 272 496 96 133 333 385 409
ai 1 2 3
i 3 2 4
Kt 1 2 3 4 5 6
Kt 7 8 9 10 11 12
CP it 1 2 3 4 5 6 7 8 9 10 11 12
1 627 66 3396 1110 3583 3356 3245 2785 1321 1715 3238 2188
2 1822 814 3030 3003 2029 774 710 1131 2903 26 3474 823
3 758 2992 736 782 2499 1696 700 1746 3565 2564 1268 2153
CI it 1 2 3 4 5 6 7 8 9 10 11 12
1 54 168 149 237 494 346 362 47 320 418 249 157
ai 1 2 3
i 5 4 3
Kt 1 2 3 4 5 6
Kt 7 8 9 10 11 12
Anexo 3 Cdigo
import import import import import import import import import import import import import ilog.concert.IloIntVar; ilog.concert.IloLinearNumExpr; ilog.concert.IloNumVar; ilog.concert.IloNumVarType; ilog.cplex.IloCplex; java.io.File; java.io.IOException; jxl.Sheet; jxl.Workbook; jxl.write.Label; jxl.write.Number; jxl.write.WritableSheet; jxl.write.WritableWorkbook;
public class CLSPMULP { public static void main(String[] args)throws IOException{ // inicializacion de parametros. int productos=0; int periodos=0; int demanda[][]=null; int CInventario[][]=null; int CProduccion[][]=null; int CSetup[][]=null; int VolProd[]=null; int CapPer[]=null; // Lectura e inicializacion de parametros desde una hoja excel try{ // Cargamos archivo excel Workbook excel=Workbook.getWorkbook(new File("C:/Users/alex/Desktop/CLSPTAREA2.xlsx")); Sheet sheet=excel.getSheet(0);//leemos la primera hoja productos=Integer.parseInt(sheet.getCell(2, 31).getContents()); periodos=Integer.parseInt(sheet.getCell(2, 32).getContents()); CSetup=new int[productos][periodos]; for(int i=0;i<productos;i++){ for(int j=0;j<periodos;j++){ CSetup[i][j]=Integer.parseInt(sheet.getCell(j+2,i+4).getContents()); } }//cierre de for(), termino de llenado de setup. CProduccion=new int[productos][periodos]; for(int i=0;i<productos;i++){ for(int j=0;j<periodos;j++){ CProduccion[i][j]=Integer.parseInt(sheet.getCell(j+2,i+12).getContents()); } }// llenado de Costos de produccion CInventario=new int[productos][periodos]; for(int i=0;i<productos;i++){ for(int j=0;j<periodos;j++){ CInventario[i][j]=Integer.parseInt(sheet.getCell(j+2,i+19).getContents()); } }// llenado de costos de inventario
demanda=new int[productos][periodos]; for(int i=0;i<productos;i++){ for(int j=0;j<periodos;j++){ demanda[i][j]=Integer.parseInt(sheet.getCell(j+2,i+27).getContents()); } }// llenado de datos de demanda VolProd=new int[productos]; for(int i=0;i<productos;i++){ VolProd[i]=Integer.parseInt(sheet.getCell(2,i+35).getContents()); } CapPer=new int[periodos]; for(int i=0;i<periodos;i++){ CapPer[i]=Integer.parseInt(sheet.getCell(2,i+41).getContents()); } excel.close(); }catch(Exception ex){ ex.printStackTrace(); System.out.println(ex.getMessage()); System.out.println("Fall la lectura de parmetros"); } try{ //Declara e inicializa el objeto modelo cplex que va a contener las variables, restricciones, funciones objetivo, etc IloCplex cplex= new IloCplex(); IloNumVar[][] cantidad=new IloNumVar[productos][periodos]; IloIntVar[][] DescProd=new IloIntVar[productos][periodos]; IloNumVar[][] inventario=new IloNumVar[productos][periodos]; int pp=0; String[] nombres=new String[periodos];//Arreglo auxiliar de nombres de variables for(int i=0;i<productos;i++){ for(int j=0; j<periodos;j++) nombres[j]="Producto_"+(i+1)+"_Periodo_"+(j+1); pp=nombres.length; cantidad[i]=cplex.numVarArray(pp, 0.0, Double.MAX_VALUE, nombres); } //Devuelve un arreglo de variables numericas String[]decision=new String[periodos];//Arreglo auxiliar de nombres de variables for(int i=0;i<productos;i++){ for(int j=0; j<periodos;j++) decision[j]="Se_Produce_"+(i+1)+"_En_el_Periodo_"+(j+1); pp=decision.length; DescProd[i]=(IloIntVar[]) cplex.numVarArray(pp, 0.0, 1, decision); } //Devuelve un arreglo de variables numericas String[] almacenaje=new String[periodos];//Arreglo auxiliar de nombres de variables for(int i=0;i<productos;i++){ for(int j=0; j<periodos;j++) almacenaje[j]="Almacenado_del_Producto_"+(i+1)+"_En_el_Periodo_"+(j+1); pp=almacenaje.length; inventario[i]=cplex.numVarArray(pp, 0.0, Double.MAX_VALUE, almacenaje); }
//Devuelve un arreglo de variables numericas //Creacion del modelo IloLinearNumExpr objetivo=cplex.linearNumExpr();//Creo expresion para la FO for(int i=0;i<productos;i++){// Primera sumatoria, de productos for(int j=0;j<periodos;j++){ objetivo.addTerm(cantidad[i][j], CProduccion[i][j]); objetivo.addTerm(DescProd[i][j], CSetup[i][j]); objetivo.addTerm(inventario[i][j], CInventario[i][j]); } } //Ingreso de funcion objetivo con direccion de optimizacion cplex.addMinimize(objetivo); //Restricciones de balance IloLinearNumExpr expresion=cplex.linearNumExpr(); for(int j=1;j<periodos;j++){//periodo expresion=cplex.linearNumExpr(); for(int i=0;i<productos;i++){ expresion.addTerm(cantidad[i][j-1], 1); expresion.addTerm(inventario[i][j-1], 1); expresion.addTerm(inventario[i][j], -1); cplex.addEq(expresion, demanda[i][j],"balance_en_ "+(j+1));//addLe(mayor o igual) addGe(menor o igual) } } IloLinearNumExpr expresionDos=cplex.linearNumExpr(); for(int j=0;j<periodos;j++){//periodo expresionDos=cplex.linearNumExpr(); for(int i=0;i<productos;i++) expresionDos.addTerm(cantidad[i][j], VolProd[i]); cplex.addGe(expresionDos, CapPer[j] ,"produccion_en_"+(j+1));//addLe(mayor o igual) addGe(menor o igual) } IloLinearNumExpr expresionTres=cplex.linearNumExpr(); IloLinearNumExpr expresionTresN=cplex.linearNumExpr(); for(int j=0;j<periodos;j++){//periodo expresionTres=cplex.linearNumExpr(); for(int i=0;i<productos;i++){ expresionTres.addTerm(cantidad[i][j], 1); expresionTresN.addTerm(DescProd[i][j], 1000000); } cplex.addGe(expresionTres, expresionTresN,"balance_en_ "+(j+1));//addLe(mayor o igual) addGe(menor o igual) } //Se resuelve el modelo cplex.setParam(IloCplex.DoubleParam.TiLim, 60);// tiempo limite de la ejecucion (sg) cplex.exportModel("C:/Users/alex/Desktop/CLSPMulti.lp");//Exporta un archivo lp if(cplex.solve()){ System.out.println("Funcin Objetivo "+cplex.getObjValue()); WritableWorkbook workbook=Workbook.createWorkbook(new File("C:/Users/alex/Desktop/CLSPMulti.xlsx"));//Crea archivo excel
WritableSheet sheet=workbook.createSheet("Funcion Objetivos y Variables", 0);//Crea hoja en archivo excel sheet.addCell(new Label(0,0,"Funcion Objetivo"));//Agrega celda label sheet.addCell(new Number(1,0,cplex.getObjValue()));//Agrega celda numero for(int i=0;i<productos;i++){ for(int jj=0;jj<periodos;jj++){ sheet.addCell(new Label((1),(i+2),"Produccion_Producto "+(i)));//Agrega celda label sheet.addCell(new Label((jj+2),(1)," Periodo "+(jj))); sheet.addCell(new Number((jj+2),(i+2),cplex.getValue(cantidad[i][jj]))); } } for(int i=0;i<productos;i++){ for(int j=0;j<periodos;j++){ sheet.addCell(new Label((1),(i+8),"Produccion_Set-up "+(i)));//Agrega celda label sheet.addCell(new Label((j+2),(8)," Periodo "+(j))); sheet.addCell(new Number((j+2),(i+9),cplex.getValue(DescProd[i][j]))); } } for(int i=0;i<productos;i++){ for(int j=0;j<periodos;j++){ sheet.addCell(new Label((1),(i+15),"Inventario_Producto "+(i)));//Agrega celda label sheet.addCell(new Label((j+2),(15)," Periodo "+(j))); sheet.addCell(new Number((j+2),(i+16),cplex.getValue(inventario[i][j]))); } } workbook.write();//Escribe el archivo excel workbook.close();//Cierra el archivo excel }else{ System.out.println("NO es factible est mal diseado"); } }catch(Exception exs){ exs.printStackTrace(); System.out.println(exs.getMessage()); System.out.println("Fall el modelo o la escritura de resultados"); } }