Interfaz Gráfica de Usuario para el Problema de Corte Bidimensional: Una Aplicación al Traje Típico de las Islas Canarias Jesica de Armas, Coromoto Leon, Gara Miranda and Carlos Segura1 Universidad de La Laguna. Dpto. Estadística, I.O. y Computación. Av. Astrofísico Fco. Sánchez, s/n, 38271 La Laguna, Spain {jdearmas,cleon,gmiranda,csegura}@ull.es http://nereida.deioc.ull Resumen. Este artículo presenta una interfaz gráfica de usuario para la resolución del problema de corte bidimendional. Es sistema está aplicado a la industria textil, permitiendo la definición y manipulación de los patrones que componen el traje tradicional de las Islas Canarias. A través de los menús, el usuario ha de seleccionar la prenda que quiere confeccionar, la cantidad y las tallas, así como la cantidad de material disponible. Partiendo de ello el sistema se encarga de colocar los patrones. También se admite la elección de patrones individuales. Internamente, el sistema implementa una variante del algoritmo de Viswanathan y Bagchi para la resolución del problema de corte bidimensional. La herramienta permite seguir la traza de todas las posibilidades que el algoritmo ha descartado en la búsqueda de la solución que propone, que es calculada de forma remota en un servidor dedicado. Dicha solución final podrá ser modificada por el usuario arrastrando los patrones con el ratón hacia la posición de la tela que desee. En la programación de la interfaz se ha utilizado el API Swing de Java y en el algoritmo de resolución C/C++. 1 Introducción El problema de corte bidimensional tiene multitud de aplicaciones en el campo de la industria. Este tipo de problema surge cuando se dispone de una pieza grande de material (vidrio, tela, plástico, madera, etc.) que se debe cortar en piezas más pequeñas. Realizar los cortes de manera óptima es crucial, por lo que el problema de corte ha sido ampliamente estudiado y se han desarrollado múltiples aproximaciones. El problema de corte bidimensional (2-Dimensional Cutting Stock Problem - 2DCSP) es una de las variaciones más interesantes de los problemas de corte. Para facilitar la 1 Este trabajo ha sido subvencionado con fondos FEDER y del Ministerio de Educación y Ciencia dentro del 'Plan Nacional de I+D+i' (TIN2005-08818-c04-04). El trabajo de J. de Armas se ha desarrollado con una beca CajaCanarias-Universidad de La Laguna y el de G. Miranda con la beca FPU-AP2004-2290. IX Congreso Internacional Interacción, Albacete 9-11 de Junio de 2008 Grupo LoUISE-Universidad de Castilla-La Mancha 424 J. de Armas, C. Leon, G. Miranda, C. Segura visualización de las soluciones aportadas por el 2DCSP se ha desarrollado una interfaz gráfica de usuario adaptada a la industria textil. Figura. 4.Interacción entre el usuario y el sistema resolutor. Se han propuesto diversos algoritmos [1][2][3][4][5] para la resolución del problema de corte. Sin embargo, las herramientas que los implementan suelen proporcionar la solución en formato de texto. Lo ideal sería contar con una representación gráfica de la misma de forma que se pueda visualizar la disposición final de las piezas [6]. En este trabajo, el sistema implementa una variante del algoritmo de Viswanathan y Bagchi [1] y representa la solución de forma gráfica (Figura 1). Además, proporciona la posibilidad de seguir la traza de todas las posibilidades que el algoritmo ha descartado en la búsqueda de la solución final. Dicha solución final podrá ser modificada por el usuario arrastrando los patrones con el ratón hacia la posición de la tela que desee. En la programación de la interfaz se ha utilizado el API Swing de Java y en el algoritmo de resolución C/C++. Concretamente se ha implementado una interfaz de usuario para un sistema informático que resuelve el problema de corte de las piezas del traje regional de mujer de la Orotava, localidad de la isla Canaria de Tenerife. El usuario ha de elegir de entre el conjunto de opciones disponibles las prendas en las que está interesado (falda, chaleco, camisa, etc.), la talla de las mismas y las dimensiones del material sobre el que se desea distribuir los patrones. Todo el trabajo de distribución de los patrones se realiza automáticamente, esto es, la herramienta lo que permite es simular en el ordenador el trabajo antes de llevarlo a cabo manualmente. Como ejemplo se considerará el Chaleco del traje típico de la Orotava (Figura). Cada chaleco está compuesto de varios patrones de tela roja: dos hojas delanteras (Figura 3-a), dos asillas (Figura 3-b) y un patrón trasero que consta de una sola pieza (Figura 3-c). Para simplificar el problema, se puede aproximar cada una de las plantillas anteriores necesarias para elaborar un chaleco, por un patrón rectangular. De (a) Parte delantera del chaleco (b) Parte trasera del chaleco Figura 2. Chaleco del traje típico de la Orotava Interfaz gráfica de usuario para el problema de corte bidimensional (a) Patrón delantero (b) Asillas 425 (c) Patrón trasero Figura 3. Aproximación de los patrones del chaleco esta forma, se ahorran muchos cálculos (ya que, manejar piezas irregulares es mucho más complejo) y el desperdicio introducido por ello es casi inapreciable. Hay que tener en cuenta que para cada uno de los chalecos a confeccionar se debe distribuir sobre la tela los cuatro patrones que lo conforman (dos hojas delanteras, dos asillas y una parte trasera). Así pues, el problema consiste en distribuir un número determinado de piezas sobre la tela, de forma que el desperdicio obtenido de dicha tela sea el mínimo posible. Se trata de un proyecto innovador, puesto que en el campo académico y utilizando Java no se han encontrado programas de este tipo. El software al que se puede acceder normalmente es propietario y comercial. Dentro el ámbito académico se han podido consultar diversos programas, y ninguno de ellos cumple con las cualidades de este. Por ejemplo, el marco de clases [7] desarrollado en Java resuelve el problema de corte para una sola dimensión, mientras que en este trabajo se resuelve para dos dimensiones. En [8] se explica el funcionamiento de una interfaz para la resolución del problema de corte bidimensional de guillotina, pero se ha desarrollado en Visual Basic y Prolog, con los consecuentes inconvenientes de este software propietario. Finalmente, en [9] se pueden resolver on-line ejemplos de corte bidimensional de guillotina mediante una aplicación de la que no se especifica el lenguaje de desarrollo. Aunque ofrece un resultado en formato de texto y gráfico, para la recogida de datos es necesario construir y enviar un archivo usando un editor que hay que descargar, con lo que se vuelve menos cómodo e intuitivo el proceso. Además no permite seguir la traza para la construcción de la solución. El resto del artículo se organiza de la siguiente forma: En la sección 2 se describe formalmente el problema de corte bidimensional. La descripción del entorno de trabajo se realiza en la sección 3. La sección 4 se dedica a los detalles de implementación. Finalmente se presentan las conclusiones y los trabajos futuros. 2 El problema de corte bidimensional El 2DCSP es una de las variantes más interesantes del problema de corte.Su definición formal es la siguiente: Considere que se dispone de una superficie S de tamaño L x A de un material determinado (Figura 4). Se cuenta además con un conjunto de n patrones distintos, cada uno de dimensiones li x ai y con un beneficio 426 J. de Armas, C. Leon, G. Miranda, C. Segura Figura 4. Elementos del Problema de Corte Bidimensional asociado ci. Sean bi el número de piezas del tipo i disponibles y xi el número de piezas del tipo i empleadas. El problema consiste en encontrar la distribución del conjunto de patrones sobre la superficie S que haga que el beneficio obtenido sea máximo y el desperdicio de material sea mínimo, esto es: Maximizar n i=1 cixi sujeto a {R} donde R es un conjunto de restricciones específicas. Según la definición de este conjunto de restricciones se tendrá un tipo de problema de corte particular. En el caso que nos ocupa, se trabajará con el denominado problema de corte guillotina, en el que todos los cortes son ortogonales a uno de los ejes. El sistema de resolución automática está implementado en C y C++.Se cuenta con implementaciones secuenciales y paralelas. Para utilizar estas últimas es necesario tener acceso al hardware adecuado, por ello se ha optado por proporcionar un servicio remoto. El algoritmo de resolución está basado en el de Viswanathan y Bagchi [1] (que usa una búsqueda primero-el-mejor) e incluye mejoras en el cálculo de las cotas [11]. Para este algoritmo cualquier solución se puede obtener como la combinación de distintas disposiciones de piezas tanto en horizontal como en vertical. Una disposición horizontal de dos rectángulos T1 y T2 de dimensiones x1 x y1 y x2 x y2 es un rectángulo de dimensiones (x1 + x2) x máx{y1, y2}. Por otro lado, una disposición vertical de los mismos rectángulos es un rectángulo de dimensiones máx{y1, y2} x (x1 + x2) (Figura5). Figura 5. Construcción Vertical y Horizontal Interfaz gráfica de usuario para el problema de corte bidimensional 427 Figura 6. Ejemplos de construcciones Verticales y Horizontales En la Figura 6 se muestran algunos ejemplos, nótese que las áreas sombreadas representan desperdicio. Las soluciones factibles se representan mediante la fórmula (T2|T3)|(T1-T2), o incluso mejor, se utiliza la notación postfija para eliminar la necesidad de los paréntesis y obtener una representación más compacta de la misma: T2 T3 | T1 T2 - |. Esta última notación es la que utiliza el sistema de resolución para devolver la solución y para realizar la representación gráfica. 3 Interfaz gráfica de usuario La interfaz de usuario se muestra en la Figura 7. El entorno cuenta con una barra de menús en la parte superior, una barra de botones de acceso directo y una zona principal constituida por dos pestañas: Datos de Entrada y Datos de Salida. Datos de Entrada: es la pestaña activa por defecto y en ella se especifican los datos de entrada del problema a resolver (Figura 7-a). Los datos que se han de definir en esta pestaña son los relativos al tipo de material (tela), las prendas o patrones y la ejecución. En cuanto a la tela, el usuario podrá escoger entre Fieltro Rojo, Fieltro Verde, Tela Blanca y Tela a Rayas. Además, se ha de fijar el alto y ancho del material elegido. En función del tipo de material elegido se habilitará un grupo de prendas y patrones que se pueden confeccionar con él. Para cada prenda se ha de especificar la talla (pequeña, mediana, grande o extragrande) y cantidad que se necesita. Para que el conjunto de patrones que conforman la prenda escogida se almacene en la Tabla de patrones es necesario SXOVDU HO ERWyQ µ,QWURGXFLU¶ de la sección. De igual manera, si se desean introducir patrones individuales en lugar de prendas completas, se podrán seleccionar indicando su alto, ancho, cantidad y beneficio. Por último, en la ]RQDGHµ(MHFXFLyQ¶ se definen las opciones con las que el sistema 428 J. de Armas, C. Leon, G. Miranda, C. Segura (a) Pestaña de datos de entrada (b) Pestaña de datos de salida Figura 7.Interfaz gráfica de usuario resolverá el problema especificado. Se ha de asignar un nombre a la instancia del SUREOHPD HQ HO FDPSR GH WH[WR µ$UFKLYR GH HQWUDGD¶. Además el usuario puede escoger si desea que se muestre la traza de todas las posibilidades que el algoritmo ha descartado en la búsqueda de la solución, seleccionando la casilla µ7UD]D¶. Para obtener la VROXFLyQVHKDGHSXOVDUHOERWyQµ(MHFXWDU¶ o acceder a HVWDRSFLyQDWUDYpVGHOPHQ~µ+HUUDPLHQWDV¶. Datos de Salida: en esta pestaña se le presenta al usuario la disposición de los patrones propuesta por el sistema (Figura7-b). Se puede comprobar el estado en que se encuentra la ejecución. Una vez el sistema haya terminado de resolver el pUREOHPD VH KDELOLWDUi HO ERWyQ µVer SolXFLyQ¶. Cuando el usuario lo pulse se presentará la solución en la zona de la izquierda. La BaUUD GH PHQ~V FRQVWD GH XQ PHQ~ µArchivo', que proporciona las opciones relativas a la carga y almacenamiento de archivos con los datos de entrada a un problema. (OPHQ~µ(GLWDU¶ proporciona las opciones de cortar, copiar y pegar distinto tipo de información y modificación de los beneficios asociados por defecto a cada Interfaz gráfica de usuario para el problema de corte bidimensional 429 prenda y talla. (O PHQ~ µ+HUUDPLHQWDV¶ posibilita la ejecución de un problema y visualización de la solución, así como la manipulación de la información que se agrega en la tabla de patrones. (OPHQ~µ$\XGD¶ permite desplegar información acerca del uso del entorno gráfico. Se dispone ademáV GH XQ ERWyQ µ(MHFXWDU¶ HQ OD µBarra de AcFHVR 'LUHFWR¶ que permite obWHQHU OD VROXFLyQ DO SUREOHPD XQ ERWyQ µ/LPSLDU 7DEOD¶ que permite eliminar el contenido de la tabla de patrones y un bRWyQµ(OLPLQDU)LODV¶ con el que se eliminan las filas de la tabla de patrones que se encuentren seleccionadas. 4 Detalles de la implementación Cuando el usuario ha especificado el problema a resolver y pulsa el botón de ejecución, se comprueba si ya se dispone del archivo de la solución en el directorio correspondiente a los ejemplos. Si es la primera vez que se ejecuta la instancia es necesario invocar al servicio remoto para obtener la solución. Este servicio se encuentra implementado como un servlet que se encarga de recibir el archivo con la información del problema e invocar al algoritmo de resolución. Para la transmisión de los datos de entrada a dicho servlet se ha utilizado la clase MultiPartFormOutputStream. El hilo correspondiente queda a la espera de obtener la solución, que será almacenada en otro archivo. El archivo de salida sigue una sintaxis específica que permite representar la traza de todas las posibilidades que el algoritmo ha descartado o directamente la solución final. La notación utilizada [10] para representar la solución permite definir la forma en la que hay que colocar los patrones para obtener la representación gráfica de la misma. Haciendo uso de ella y de la información asociada a cada uno de los patrones, se crea una pila de objetos (Figura 8). Esta pila representa el dibujo de uno o varios patrones distribuidos vertical u horizontalmente. Cuando la solución está analizada completamente, en la cima de la pila se encontrará el objeto con el GeneralPath correspondiente a la distribución final de los patrones [12]. Cada patrón consta de un conjunto de líneas y arcos en unas disposiciones concretas, que se van concatenando hasta obtener la forma completa. El objeto final de tipo ClaseGraficoPatrones se añade a la lista de patrones, se le agrega su índice en la lista y se inserta en la pila. Los dos objetos de la pila situados en la cima serán los que se concatenen vertical u horizontalmente según indique la notación de la solución y el resultado se insertará a su vez en la cima de la pila. En la Figura 9 se muestra el código correspondiente a la distribución horizontal de objetos. La vertical es similar. Como se puede observar, se extraen los dos objetos que se encuentran en la cima de la pila y mediante una transformación afín (AffineTransform) se desplaza la posición de los atributos de tipo GeneralPath del primero de ellos para finalmente concatenárselos a los correspondientes atributos del segundo objeto. Para realizar una concatenación en horizontal es necesario desplazar 430 J. de Armas, C. Leon, G. Miranda, C. Segura Figura 8. Ejemplo de funcionamiento de la pila la posición en el eje x de un patrón tanto como indique el atributo posX del objeto con el que se desea concatenar, mientras que en el eje y se dejará como estaba originalmente. En cambio, para realizar una concatenación en vertical la posición en el eje x no se cambia y para el eje y se hace uso del atributo posY del objeto con el que se desea concatenar. Para finalizar se han de actualizar correctamente los nuevos atributos posX y posY del objeto correspondiente a la concatenación e introducirlo en la cima de la pila. Una vez que el sistema ha realizado la propuesta de disposición de patrones sobre la tela, el usuario podrá modificarla arrastrando los patrones con el ratón. Para hacer esto posible se ha creado la clase ListaPatrones. Dicha clase consta de un atributo de tipo java.util.Vector y un conjunto de métodos para manejarlo. Se trata de una lista formada por el conjunto de patrones que el usuario ha seleccionado para colocar sobre la tela. Cada elemento de la lista será del tipo ClaseGraficoPatrones que contendrá los dibujos (GeneralPath) de dichos patrones en las posiciones que les corresponda. La clase ListaPatrones posee además un método que, dado un punto y una lista de patrones, devuelve el primer patrón que contiene el punto. La clase AreaCorte dispone de código donde se determina el patrón que se está intentando desplazar, se mueve a la nueva posición mediante una transformación afín y se actualiza el dibujo. En el código mostrado en la Figura 9 se observa que a la hora de realizar una concatenación en horizontal o vertical, se obtiene el listado de patrones de los que consta la composición que se ha llevado hasta el momento y se desplaza cada uno de ellos a la posición correspondiente. El atributo indicesListaP de la clase ClaseGraficoPatrones es el que se utiliza para almacenar los índices de los patrones que conforman un gráfico. Esto es necesario para poder disponer de la localización de cada patrón cuando se desea realizar un desplazamiento con el ratón. Si el usuario desea volver a ver la propuesta de disposición de patrones que realiza el sistema, ha de volver a pulsar los botones de ejecución y visualización. int indice; ClaseGraficoPatrones gr1 = (ClaseGraficoPatrones) SolStack.pop(); ClaseGraficoPatrones gr2 = (ClaseGraficoPatrones) SolStack.pop(); GeneralPath p1 = gr1.getPath(); GeneralPath pbg1 = gr1.getPathbg(); Interfaz gráfica de usuario para el problema de corte bidimensional 431 if (!ficticia) { AffineTransform af = new AffineTransform(); af.translate(gr2.getPosX(), 0); for (int i = 0; i < gr1.getSizeVector(); i++) { indice = (Integer) gr1.getIndice(i); ClaseGraficoPatrones gr3 = (ClaseGraficoPatrones)listaP.getObj(indice); gr3.getPath().transform(af); gr3.getPathbg().transform(af); listaP.insertObjAt(gr3,indice); gr2.insertIndice(indice); } gr2.addShape(p1); gr2.addShapebg(pbg1); } ficticia = false; // Actualizar posicion posX y posY gr2.setPosX(gr2.getPosX() + gr1.getPosX()); int altura = gr1.getPosY(); if (altura < gr2.getPosY()) gr2.setPosY(altura); SolStack.push(gr2); Figura 9. Concatenación horizontal 5 Conclusiones Se ha presentado una interfaz gráfica de usuario que permite la definición y manipulación de los patrones que componen el traje regional de la Villa de la Orotava en las Islas Canarias. La herramienta proporciona de forma automática una disposición visual de los patrones de las prendas elegidas sobre el material seleccionado, haciendo uso de la solución en formato de texto que propone el sistema de resolución. De este modo se consigue que el desperdicio de tela sea inferior al que produciría una persona especializada en la correspondiente etapa de producción (en este caso textil), con el consecuente ahorro de personal y tiempo empleado en estas labores. Actualmente se está profundizando en una mejora de la representación de la solución. Asimismo, se pretende trabajar en las implementaciones paralelas del algoritmo de resolución para que se pueda escoger entre llevar a cabo una invocación de estas versiones en OpenMP y MPI, y la versión secuencial. Referencias 1. Viswanathan, K. V. , Bagchi, A. (1993). Best-First Search Methods for Constrained TwoDimensional Cutting Stock Problems. Operations Research, vol.41, n.4, p.768--776. 2. Hifi, M. (1997). An Improvement of Viswanathan and Bagchi's Exact Algorithm for Constrained Two-Dimensional Cutting Stock. Computer Operations Research, vol.24, n.8, p.727--736. 432 J. de Armas, C. Leon, G. Miranda, C. Segura 3. Wang, P. Y. (1983). Two Algorithms for Constrained Two-Dimensional Cutting Stock Problems. Operations Research, vol.31, n.3, p.573--586. 4. Burke, E., Kendall, G. (1999). Applying Simulated Annealing and the No Fit Polygon to the Nesting Problem. Proceedings of the International Conference on Artificial Intelligence (ICAI'99), vol.1, p.51--57. 5. Maouche, S., Bounsaythip, C. (1996). Optimizing Textile Shape Placement by Tree Genetic Annealing}.Proceedings of the Society for Computer Simulation Conference (SCSC'96). 6. Shneiderman, B., Plaisant, C. (2006). Diseño de Interfaces de Usuario. Estrategias para una Interacción Persona-Computador Efectiva. Pearson Education. 7. BEA WebLogic Catalog. http://www.componentsource.com/beasv/products/it-componentfactory-guillo\-tine-cutting-stock-problem-solver/summary.html 8. Mc Hale, M. L., Shah, R. P. http://www.amzi.com/articles/papercutter.htm 9. Guillotina/GPC. http://optimos1.diinf.usach.cl/guillotina/index.php 10. León, C.; Miranda, G.; Rodríguez, C. and Segura, C.} (2007) 2D Cutting Stock Problem: A New Parallel Algorithm and Bounds. In Proceedings of the Euro-Par 2007, Parallel Processing, 13th International Euro-Par Conference, LNCS 4641, p.795²804. 11. Miranda, G. , León, C. (2005). Búsquedas A*: Un Esqueleto Paralelo. In Actas de las XVI Jornadas de Paralelismo, Granada. Thompson p.503²510. 12. Horstmann, C., Cornell, G.(2002). JAVA 2. Características Avanzadas. Prentice Hall.