Professional Documents
Culture Documents
1 Introduccin
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, plstico, madera, etc.) que se debe cortar en piezas ms pequeas.
Realizar los cortes de manera ptima es crucial, por lo que el problema de corte ha sido
ampliamente estudiado y se han desarrollado mltiples aproximaciones.
El problema de corte bidimensional (2-Dimensional Cutting Stock Problem - 2DCSP)
es una de las variaciones ms interesantes de los problemas de corte. Para facilitar la
1
Este trabajo ha sido subvencionado con fondos FEDER y del Ministerio de Educacin 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.
(b) Asillas
425
esta forma, se ahorran muchos clculos (ya que, manejar piezas irregulares es mucho
ms 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 nmero determinado de piezas
sobre la tela, de forma que el desperdicio obtenido de dicha tela sea el mnimo posible.
Se trata de un proyecto innovador, puesto que en el campo acadmico 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 acadmico 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 dimensin, mientras que en este trabajo se resuelve para dos dimensiones.
En [8] se explica el funcionamiento de una interfaz para la resolucin 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
aplicacin de la que no se especifica el lenguaje de desarrollo. Aunque ofrece un
resultado en formato de texto y grfico, 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 cmodo e intuitivo el proceso. Adems no permite seguir la traza para la
construccin de la solucin.
El resto del artculo se organiza de la siguiente forma: En la seccin 2 se describe
formalmente el problema de corte bidimensional. La descripcin del entorno de trabajo
se realiza en la seccin 3. La seccin 4 se dedica a los detalles de implementacin.
Finalmente se presentan las conclusiones y los trabajos futuros.
asociado ci. Sean bi el nmero de piezas del tipo i disponibles y xi el nmero de piezas
del tipo i empleadas. El problema consiste en encontrar la distribucin del conjunto de
patrones sobre la superficie S que haga que el beneficio obtenido sea mximo y el
desperdicio de material sea mnimo, esto es:
Maximizar n i=1 cixi sujeto a {R}
donde R es un conjunto de restricciones especficas. Segn la definicin 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 resolucin automtica 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 resolucin est basado en el de Viswanathan y Bagchi [1] (que
usa una bsqueda primero-el-mejor) e incluye mejoras en el clculo de las cotas [11].
Para este algoritmo cualquier solucin se puede obtener como la combinacin de
distintas disposiciones de piezas tanto en horizontal como en vertical. Una disposicin
horizontal de dos rectngulos T1 y T2 de dimensiones x1 x y1 y x2 x y2 es un rectngulo
de dimensiones (x1 + x2) x mx{y1, y2}. Por otro lado, una disposicin vertical de los
mismos rectngulos es un rectngulo de dimensiones mx{y1, y2} x (x1 + x2) (Figura5).
427
429
4 Detalles de la implementacin
Cuando el usuario ha especificado el problema a resolver y pulsa el botn de
ejecucin, se comprueba si ya se dispone del archivo de la solucin 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 solucin. Este servicio se
encuentra implementado como un servlet que se encarga de recibir el archivo con la
informacin del problema e invocar al algoritmo de resolucin. Para la transmisin de
los datos de entrada a dicho servlet se ha utilizado la clase
MultiPartFormOutputStream. El hilo correspondiente queda a la espera de obtener la
solucin, que ser almacenada en otro archivo. El archivo de salida sigue una sintaxis
especfica que permite representar la traza de todas las posibilidades que el algoritmo
ha descartado o directamente la solucin final. La notacin utilizada [10] para
representar la solucin permite definir la forma en la que hay que colocar los patrones
para obtener la representacin grfica de la misma. Haciendo uso de ella y de la
informacin 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 solucin est analizada completamente, en la cima de la
pila se encontrar el objeto con el GeneralPath correspondiente a la distribucin final
de los patrones [12]. Cada patrn consta de un conjunto de lneas y arcos en unas
disposiciones concretas, que se van concatenando hasta obtener la forma completa. El
objeto final de tipo ClaseGraficoPatrones se aade 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
sern los que se concatenen vertical u horizontalmente segn indique la notacin de la
solucin y el resultado se insertar a su vez en la cima de la pila.
En la Figura 9 se muestra el cdigo correspondiente a la distribucin 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 transformacin afn
(AffineTransform) se desplaza la posicin de los atributos de tipo GeneralPath del
primero de ellos para finalmente concatenrselos a los correspondientes atributos del
segundo objeto. Para realizar una concatenacin en horizontal es necesario desplazar
la posicin en el eje x de un patrn 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 concatenacin en vertical la posicin 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 concatenacin e introducirlo en la cima de
la pila.
Una vez que el sistema ha realizado la propuesta de disposicin de patrones sobre la
tela, el usuario podr modificarla arrastrando los patrones con el ratn. 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 mtodos 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 adems un mtodo que, dado un punto y una lista de
patrones, devuelve el primer patrn que contiene el punto. La clase AreaCorte dispone
de cdigo donde se determina el patrn que se est intentando desplazar, se mueve a la
nueva posicin mediante una transformacin afn y se actualiza el dibujo. En el cdigo
mostrado en la Figura 9 se observa que a la hora de realizar una concatenacin en
horizontal o vertical, se obtiene el listado de patrones de los que consta la composicin
que se ha llevado hasta el momento y se desplaza cada uno de ellos a la posicin
correspondiente. El atributo indicesListaP de la clase ClaseGraficoPatrones es el que
se utiliza para almacenar los ndices de los patrones que conforman un grfico. Esto es
necesario para poder disponer de la localizacin de cada patrn cuando se desea
realizar un desplazamiento con el ratn. Si el usuario desea volver a ver la propuesta de
disposicin de patrones que realiza el sistema, ha de volver a pulsar los botones de
ejecucin y visualizacin.
int indice;
ClaseGraficoPatrones gr1 = (ClaseGraficoPatrones) SolStack.pop();
ClaseGraficoPatrones gr2 = (ClaseGraficoPatrones) SolStack.pop();
GeneralPath p1 = gr1.getPath();
GeneralPath pbg1 = gr1.getPathbg();
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);
5 Conclusiones
Se ha presentado una interfaz grfica de usuario que permite la definicin y
manipulacin de los patrones que componen el traje regional de la Villa de la Orotava
en las Islas Canarias. La herramienta proporciona de forma automtica una disposicin
visual de los patrones de las prendas elegidas sobre el material seleccionado, haciendo
uso de la solucin en formato de texto que propone el sistema de resolucin. De este
modo se consigue que el desperdicio de tela sea inferior al que producira una persona
especializada en la correspondiente etapa de produccin (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 representacin de la
solucin. Asimismo, se pretende trabajar en las implementaciones paralelas del
algoritmo de resolucin para que se pueda escoger entre llevar a cabo una invocacin
de estas versiones en OpenMP y MPI, y la versin 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.