Sistema de apoyo a procesos productivos en Pymes: Un caso de aplicación1 Ricardo Contreras A., M. Angélica Pinninghoff J., Evelyn Osses L. Departamento de Ingeniería Informática y Ciencias de la Computación Facultad de Ingeniería Universidad de Concepción, Chile e-mail: {rcontrer,mpinning}@udec.cl Resumen Este trabajo muestra la experiencia de desarrollo de un software que utiliza técnicas de inteligencia artificial para optimizar los procesos de producción de una empresa Pyme (Pequeñas y medianas empresas) del sector metalmecánico. El software busca apoyar la planificación de tareas productivas de la empresa, en particular la planificación de tiempos y prioridades de ejecución de diferentes órdenes de trabajo. Para esta aplicación se optó por el uso de algoritmos genéticos, los cuales aunque no necesariamente encuentran soluciones óptimas, permiten llegar a soluciones satisfactorias, como lo muestran los resultados alcanzados, que validan la utilización de esta técnica. Palabras clave. Optimización, Algoritmos genéticos, Planificación de la producción, Aplicaciones en el sector productivo. 1 Trabajo con financiamiento DIUC, Proyecto 203.093.008-1.0, Universidad de Concepción 1. Introducción El caso a tratar corresponde a una Fundición, empresa del sector metal-mecánico, encargada de producir bienes físicos, específicamente productos (piezas y partes) para otras empresas que abarcan rubros asociados a madera, cemento, celulosa, papel, aserraderos entre otras. La mayoría de las empresas catalogadas como Pymes no busca soluciones de índole computacional para agilizar sus procesos productivos, principalmente por la idea de los altos costos involucrados en un desarrollo computacional concreto, limitándose al uso de computadores sólo para el apoyo a las actividades administrativas. La idea tras este proyecto es que es posible disponer de soluciones computacionales con costos marginales y que por lo tanto es posible masificar el uso de soluciones computacionales de bajo costo para apoyar a sectores particulares en el mundo productivo. El problema del scheduling plantea la necesidad de un procedimiento para lograr distribuir una cantidad limitada de recursos a un conjunto de tareas, en un cierto plazo. O sea, se trata de un proceso de toma de decisiones que tiene como meta la optimización de uno o más objetivos. Los recursos y tareas pueden tomar muchas formas. Los recursos pueden ser, por ejemplo, máquinas en una industria, pistas de aterrizaje en un aeropuerto, unidades de procesamiento en un ambiente computacional. Las tareas pueden tener diferentes niveles de prioridad, criterio según el cual ocupan un lugar dentro de una configuración solución. En el caso de la empresa de esta experiencia, los recursos son trabajadores y/o maquinarias y las tareas corresponden a los procesos que deben seguir los productos y piezas para su elaboración. El problema del scheduling es reconocidamente un problema de la clase NP para los cuales no existen soluciones algorítmicas polinomiales conocidas, lo que justifica su tratamiento con heurísticas. En este caso particular se explora la capacidad de los algoritmos genéticos para llegar a soluciones satisfactorias. Por otra parte, diversos intentos de resolver este tipo de problemas se vienen desarrollando desde hace algún tiempo, siendo crítico el tipo particular de aplicación y la naturaleza de los operadores de recombinación utilizados [Beat92]. La diferencia, a veces no bien comprendida, entre scheduling y secuenciación de tareas también es analizada en la referencia anterior. El presente artículo está estructurado de la siguiente forma: La sección 2 presenta la definición del problema específico a resolver; la sección 3 plantea el proyecto general. La sección 4 ilustra la propuesta de solución mediante el uso de algoritmos genéticos y muestra algunos aspectos involucrados en el diseño e implementación de la solución; la sección 5 muestra las pruebas y resultados obtenidos para finalmente en la sección 6 presentar las conclusiones derivadas del trabajo. 2. El problema Como se mencionó en la Introducción, se trata de solucionar el problema de asignación de recursos (incluido el recurso tiempo) a las diversas etapas del proceso de elaboración de productos en una pequeña empresa metalmecánica genérica, cuyo negocio consiste en la fabricación de productos en algún metal fundido. Es necesario identificar los elementos que son comunes a todas las empresas que poseen las características anteriormente señaladas. Se destacan tres grandes conjuntos de elementos: las Etapas (E i) metal-mecánicas que deben seguir los productos para su elaboración, los Recursos (Rij) que permitirán llevar a cabo dichas etapas y los Productos (Pi) que se deben elaborar en un plazo determinado. Así, se tiene los siguientes conjuntos involucrados: E = {E1, ..., Ei, ... En} R = {R1, ..., Ri, ..., Rn} Rj = {Rj1, ..., Rji, ..., Rjm} P = {P1, ..., Pi, ..., Pk} (conjunto de n etapas productivas) (conjunto de n tipos de recursos) (conjunto de m recursos del tipo i) (conjunto de k productos a elaborar) Algunas suposiciones necesarias para acotar el problema son; existe una cantidad determinada n de etapas productivas, en que n es la cantidad de recursos disponibles, además a cada etapa E i le corresponde un cierto tiempo de duración, esta cantidad depende del proceso de producción definido en cada empresa en forma particular, es decir, el proceso tendrá una cantidad de etapas productivas que podría diferir para empresas diferentes, según la orientación del negocio. Las etapas Ei son consecutivas de acuerdo al índice i, es decir, si para un determinado tiempo t se ha puesto en ejecución la etapa E1, entonces la etapa 2 se podrá ejecutar a partir del tiempo t+x, en que x es el tiempo que toma en completarse la etapa E1. Adicionalmente, para elaborar un producto no siempre son necesarias n etapas, aunque el proceso debe contemplar como mínimo una de ellas. Las etapas que se necesita ejecutar dependen del tipo de producto considerado, el tiempo que tome cada etapa para elaborar un producto también depende del tipo de producto en particular. Si bien existen otras consideraciones adicionales, no resulta indispensable describirlas en su totalidad ya que corresponden más bien a detalles necesarios para la operación pero cuya falta no oscurece la descripción del problema que se intenta dar en este punto. En resumen, lo que se intenta es minimizar el tiempo de elaboración total de un conjunto de productos que aparecen en, eventualmente, diferentes órdenes de trabajo. 2.1 El problema específico. Como se mencionó, se trata de crear un software de apoyo para la planificación de órdenes de trabajo (asignación de tiempos y otros recursos a los procesos de elaboración de productos) para una empresa de fundición, pequeña empresa perteneciente al sector metal-mecánico. En la actualidad dicha planificación se lleva a cabo en forma manual e intuitiva, si se refiere a las estimaciones de tiempo, por ejemplo, y está a cargo de funcionarios expertos en la producción de los bienes. El modo en que la empresa elabora los productos es a pedido, es decir, no se produce stock, sino que son elaborados a medida que los clientes efectúan sus pedidos. La empresa dispone de un grupo de personas cuya función es recopilar las órdenes de trabajo, coherentemente con el movimiento de la empresa, lo que a su vez está asociado a su tamaño. Una vez efectuado el contrato de negocio con los clientes, la empresa adquiere el compromiso de entregar los productos en un cierto plazo y bajo ciertas condiciones de acuerdo al contrato original; dichas condiciones quedan especificadas en una orden de trabajo. Desde el punto de vista de la producción, la empresa puede dividirse en seis unidades que se ordenan de acuerdo a la disposición mostrada en la figura 1, que representa el diagrama general de la fase de producción llevada a cabo por la empresa. Fabricación de modelos Moldeo Fusión y preparación de aleación Limpieza y Rebabado Tratamiento Térmico y Terminación Mecanizado de piezas Figura 1. Diagrama General de la Fase de Producción Si bien es cierto la elaboración de cualquier producto sigue el orden señalado en la figura 1, ésta no necesariamente debe considerar los seis procesos. Además, con el objeto de cumplir con los plazos estipulados la empresa puede tomar la decisión de subcontratar procesos a otras empresas, lo que ocurre en dos situaciones definidas: falta de tiempo para efectuar el proceso (recursos no disponibles) o falta de maquinaria (recursos no existentes). Al generar una orden de trabajo puede quedar especificado, a priori, qué partes del proceso se van a subcontratar o bien dicha decisión puede ser tomada sobre la marcha bajo consideraciones de fecha de entrega, por sobrecarga de trabajo en alguna sección o si el costo de subcontratar es menor que el costo de realizarlo en la empresa. Si el precio de la subcontratación es mayor al estipulado, la diferencia debe ser asumida por la empresa. Los procesos que pueden subcontratarse son tres: Mecanizado, Modelo y Tratamiento térmico. 3. El proyecto En la actualidad no existen herramientas que se sustenten en la inteligencia artificial para encontrar soluciones en la planificación de la producción para las Pymes. Existe en este sector la creencia de que cualquier sistema computacional implica una alta inversión, lo que suele ser efectivo en el caso de software distribuido por grandes compañías comerciales. Aunque el mercado ofrece, en general, múltiples soluciones software para resolver problemas del sector productivo, no se consigue satisfacer las necesidades de las empresas pues son aplicaciones de tipo general y no se amoldan a una realidad particular. Elaborar una herramienta que cumpla estas características es factible, de bajo costo y puede requerir pocos recursos operacionales. En consecuencia, los objetivos generales planteados para el proyecto son dos; primero diseñar un modelo algorítmico modificable que se adapte a los cambios en el medio empresarial productivo de modo de adecuarse a diferentes realidades dentro de una familia acotada, por ejemplo empresas del sector metal-mecánico; y segundo, construir un software que se apoye en los algoritmos genéticos para optimizar un sistema de producción manufacturero. En resumen, se debe construir un software que permita la planificación de las órdenes de trabajo en una fundición, bajo el criterio de la optimización de los tiempos de producción, o sea, se busca minimizar el tiempo total de producción. Para ello, el software debe generar como respuesta una planificación lo suficientemente clara para que los usuarios puedan entenderla y ponerla en práctica con un esfuerzo mínimo. 4. Propuesta de solución Los algoritmos genéticos corresponden a una técnica de la inteligencia artificial, constituyendo un mecanismo interesante para encontrar soluciones aproximadamente óptimas a problemas de optimización, con base en los principios de la herencia y la evolución de las especies. En la década del 70, Holland [Holl95] planteó la posibilidad de incorporar los mecanismos naturales de selección y supervivencia de las especies para resolver una gran cantidad de problemas asociados al área de inteligencia artificial que habían sido resueltos de manera muy eficiente por la naturaleza pero que resultaban un desastre al abordarlos a través de computadores. Para una descripción más detallada de los principios, terminología usada y aplicaciones en el contexto de los algoritmos genéticos, es posible referirse a [Bell96, Gold89, Holl95, Mich96, Mitc96, Vose99]. La solución al problema consiste en una calendarización factible de las etapas productivas que debe efectuar la empresa (fundición) para elaborar un determinado número de productos, más una asignación de recursos apropiados para la realización de las etapas. El objetivo ya enunciado es optimizar el tiempo que toma la elaboración de la totalidad de los productos, el cual se espera sea el menor posible. Desde el punto de vista de la implementación utilizando algoritmos genéticos, la estructura del cromosoma debe admitir cualquier configuración posible, por esta razón debe contener las n Etapas de producción, pues corresponden a la mayor configuración (representando el paso de un producto por todas las etapas de producción). Cada etapa y cada recurso asignado corresponderán a un gen del cromosoma. Si un producto no realiza una o más etapas, éstas deberán codificarse con un valor tal (típicamente nulo) que no sean consideradas en la asignación de recursos. La estructura del cromosoma se muestra en la figura 2, a continuación. Etapa 1 R 1j Etapa… R… Etapa k R kj Etapa… R… Etapa n R nj Figura 2. Estructura o Genotipo del Cromosoma La estructura solución está compuesta por un total de n genes (largo fijo del cromosoma), los cuales contienen los datos asociados a las n posibles etapas de producción y a sus respectivos recursos asignados. En la figura 2, el recurso R1j asignado a la Etapa1 representa a cualquier recurso del tipo R1 que se encuentre disponible en el momento de la asignación. La Etapak representa a una etapa intermedia cualquiera con su respectivo recurso Rkj. Las etapas y recursos sin subíndices y con puntos suspensivos representan un sinnúmero de etapas y recursos que podrían formar parte del cromosoma. Esto dependerá directamente de la cantidad n de etapas de producción llevadas a cabo por la empresa. Los valores que puede tomar cada gen (alelos) corresponden a: una cantidad de tiempo t, una hora de inicio h i, una fecha de inicio fi, una hora de término ht, una fecha de término ft y un recurso Rkj. Los valores considerados para las etapas y recursos se explicitan en términos de rangos con mayor precisión en la Tabla 1 a continuación. Tipo de Valor Datos Rango Cantidad de tiempo t t ∈ Z + ∪ { 0} Hora de Inicio hi hi = (hhi , mmi ) / hhi , mmi ∈ Z + ∪ { 0} Fecha de Inicio fi f i = (d i , mi , a i ) / d i , mi , ai ∈ Z + ∪ { 0} Hora de Término ht ht = ( hht , mmt ) / hht , mmt ∈ Z + ∪ { 0} Fecha de Término ft f t = (d t , mt , at ) / d t , mt , at ∈ Z + ∪ { 0} Recurso Rkj Rkj ∈ Rk , j = 1..m , m = Rk Etapas Recursos Tabla 1. Alelos correspondientes a cada gen El valor del subíndice k para Rkj es igual al valor del subíndice de la etapa del gen al que pertenece. Por ejemplo, si el valor del Recurso contenido en un gen es R23, este gen debe contener a la Etapa2. La figura 3 presenta un ejemplo de cromosoma para la empresa considerando un proceso productivo que consta solamente de 5 etapas. Etapa1 Etapa2 20 R 15 Locus: 1 Etapa3 25 R21 2 Etapa4 60 R 32 3 Etapa5 95 R41 4 33 R 52 5 Figura 3. Ejemplo de Cromosoma para un Proceso Productivo de 5 Etapas Como se puede apreciar, el total de genes es 5, que equivale al número de etapas. Con respecto a los datos, sólo se ha incluido el tiempo de duración de cada etapa y el recurso asignado. La unidad de medida, para el caso del tiempo, se considerará como minutos. Los valores de cada uno de los genes pueden variar dentro de los dominios permitidos, no así la estructura del gen que será siempre la misma para cada ubicación (locus) y para cualquier cromosoma. 4.1 Aspectos técnicos de la solución La cantidad de individuos (cromosomas) en la población inicial se elige como la cantidad k de productos a elaborar en un intervalo de tiempo determinado. Los tiempos asociados a cada gen son especificados por el usuario mientras que la asignación de recursos será responsabilidad del sistema construido. Un recurso puede tener dos estados posibles: libre u ocupado; las transiciones entre uno y otro estado dependen del tiempo que tome una etapa en la utilización del recurso (lo que es identificado como la hora de su liberación). La hora de liberación del recurso se acompaña de la fecha, pues es posible que la utilización de un recurso particular se prolongue por más de un día. Al momento de iniciar la planificación, se considera que todos los recursos se encuentran disponibles. Además, dado que la empresa tiene un horario de trabajo determinado, los recursos están disponibles al inicio de la jornada laboral en la fecha en que se hace la planificación. La población inicial es una solución arbitraria, factible, ordenando los productos en filas y realizando la atribución de recursos por columnas, con el criterio de asignar al producto bajo consideración el primer recurso disponible. En el caso bajo estudio, es la población completa la que representa una solución al problema y no cada uno de los cromosomas particulares. Esto porque cada individuo representa una calendarización particular para ese producto, mientras que el conjunto de individuos representa la calendarización total de la población en una fecha determinada; así, cada nueva población es también una nueva propuesta de solución. Con lo anterior, resulta relativamente sencillo determinar el fitness, el que es expresado como Fitness(P(t)) = tf (xtjn) – ti (xti1) donde tf representa el tiempo de finalización del proceso correspondiente al gen n del producto xtj (último producto en terminar su elaboración) y ti representa al tiempo de inicio del proceso correspondiente al gen 1 del producto xti (primer producto en iniciar su elaboración). El superíndice t identifica la generación. Evidentemente las mejores soluciones son las que tienen un valor de fitness menor. El fitness aplicado a la evaluación de cromosomas particulares considera como criterio el tiempo de elaboración de un producto. La comparación entre individuos no es factible si se trata de individuos que difieren en sus etapas productivas (por ejemplo, comparar un producto que tenga mecanizado con otro que no lo contemple), pero el fitness individual entrega información del tiempo de elaboración del producto individual y aquellos cuyo tiempo de elaboración es mayor son de alguna forma castigados. El método para seleccionar individuos aptos para el cruzamiento es el método ruleta [Mitc96], generando las probabilidades de selección de acuerdo al mecanismo de evaluación individual recién descrito. El método de cruzamiento difiere de la forma habitual. Para generar una nueva solución, basta con modificar los recursos que han sido asignados a cada proceso, por lo que el cruzamiento propuesto es efectuado dentro de cada configuración (candidata a solución). Así, se intercambian los recursos asignados a procesos del mismo tipo entre los padres (productos) escogidos para el cruzamiento, lo que es efectuado para cada proceso de elaboración. La razón de lo anterior es que los métodos tradicionales de cruzamiento llegan a generar soluciones eventualmente no factibles [Grut02]. Algunas consideraciones a tener en cuenta a la hora de realizar el cruzamiento descrito son las siguientes: - - Un padre no debe ser escogido más de una vez para efectuar el cruzamiento (para evitar considerar productos duplicados cuando no corresponde). Una vez escogida la pareja de padres, se decide el cruzamiento en función de la probabilidad de cruzamiento; si ese valor de probabilidad no es alcanzado, ambos padres pasan intactos a la próxima generación. Todos los padres deben cruzarse o pasar intactos a la generación siguiente, pues la nueva generación debe contemplar todos los productos. Si un padre no tiene pareja (el caso que se presenta cuando la cantidad de productos es impar), debe pasar intacto a la generación siguiente. A medida que vayan reasignándose los recursos a los procesos, se debe asignar fecha y hora de inicio de cada proceso y se debe modificar la disponibilidad del recurso. La probabilidad de cruzamiento se establece en 80%, pues es el valor que entregó, para este caso particular, los mejores resultados. Además de las particularidades que presenta la solución, se ha omitido la aplicación del operador de mutación, por su alta posibilidad de generar soluciones no factibles, por una parte, y por otra porque podría quedar fuera de consideración, por ejemplo, un recurso disponible cuyo uso agilizaría el proceso completo de producción. 5. Resultados Para la construcción del software se comenzó con el desarrollo de prototipos que representaban los aspectos más visibles a los usuarios (entradas, salidas y algunas funcionalidades básicas). Luego se derivó a un modelo incremental de manera de permitir la incorporación de nuevas funcionalidades. El lenguaje elegido para el desarrollo es C++ dadas sus propiedades de reutilización y extensibilidad por una parte y a la correspondencia entre las estructuras utilizadas y los elementos típicamente genéticos, es decir, a la facilidad para representar los genes mediante una estructura (clase). Para el diseño de la interfaz se escogió C++ Builder, pues provee un conjunto importante de componentes reutilizables en lenguaje C++ que permiten la creación de ventanas gráficas, menús desplegables entre otros elementos y funcionalidades. Además, la comunicación entre la interfaz y el código del programa resulta directa. Para analizar el desempeño del sistema se usó una familia de pruebas con 15 productos (un producto puede tener hasta 200 partes). La cantidad de unidades a elaborar por producto fue variable, al igual que los procesos involucrados en la elaboración de cada uno de ellos. Se consideró además una cantidad variable de generaciones: 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1500, 2000, 2500 y 3000, con un porcentaje de probabilidad del operador de cruzamiento entre 60% y 80%. Las pruebas se realizaron de la siguiente forma: para cada valor que asumía la cantidad de generaciones, se varió el porcentaje de cruzamiento entre los valores arriba citados, generando un total de 70 situaciones diferentes (identificadas por su número de generaciones y su porcentaje de cruzamiento), cada situación descrita fue ejecutada 10 veces. La figura 4, a continuación, ilustra los mejores valores de fitness obtenidos en las pruebas realizadas para 1000 generaciones, para todos los porcentajes de variación del operador de cruzamiento. En la esquina superior derecha se encuentra la leyenda que indica el caso representado en cada curva. En la sigla “Gnk_Cnj”, nk corresponde a la cantidad de generaciones y nj al porcentaje del operador de cruzamiento. Cada curva contiene diez puntos que representan a los mejores resultados obtenidos por ejecución. G1000_C60 G1000_C65 G1000_C70 G1000_C75 G1000_C80 Análisis con 1000 Generaciones 46000 Valor del Fitness 44000 42000 40000 38000 36000 34000 32000 0 100 200 300 400 500 600 700 800 900 1000 No. Generación Figura 4. Resultados obtenidos para 1000 generaciones Para todas las variaciones del operador de cruzamiento se logra encontrar el mejor valor. Cuando el porcentaje de cruzamiento es del 80%, el valor se encuentra tempranamente, en la generación 265. De todas formas, el criterio de detención del algoritmo es la completación del total de generaciones indicadas. En resumen, los resultados más relevantes son los siguientes. La familia de productos constituyó una población inicial (de acuerdo a los criterios que corresponden a la forma habitual de operar de los usuarios) con un fitness igual a 55746. El mejor resultado encontrado es una población cuyo fitness es igual a 36036. Según lo anterior, se obtiene una mejora de tiempos superior al 30% con respecto a la población inicial. Por otra parte, los mejores resultados se obtienen a partir de 200 generaciones; para el caso de 100 generaciones las mejoras son menos relevantes. En cuanto al operador de cruzamiento, el resultado mejor alcanzado se obtiene a partir de un porcentaje de cruzamiento del 70%. Para el caso de 100 generaciones, el resultado óptimo se encontró en todas las variaciones del porcentaje de cruzamiento, pero sólo en una de las 10 ejecuciones por cada situación; para el caso de 2500 generaciones el mejor valor se encuentra hasta en cinco de las diez ejecuciones para un 75% como valor de la probabilidad de cruzamiento 6. Conclusiones A simple vista, la función fitness asociada a las soluciones y la función fitness asociada a la selección de padres no consideran una función de penalidad que represente las eventuales variaciones (típicamente aumentos) en los tiempos. Dicha función es de gran relevancia cuando se trata del cálculo de tiempos totales, pues siempre se están produciendo corrimientos en los plazos estimados, debido a que los procesos no tienen un cambio de etapa instantáneo o bien, existen otros factores que retrasan el inicio de alguna etapa particular. Para reflejar mejor esta situación, a cada etapa se le ha agregado un porcentaje de tiempo muerto, incorporado al tiempo total del proceso correspondiente. El método propuesto para el cruzamiento no permite generar soluciones no factibles y nace como resultado de la disposición de los cromosomas (productos), pudiendo identificar claramente los procesos de un mismo tipo que compiten por el uso de recursos de un tipo determinado. El sistema desarrollado abre las puertas a la tecnología y a los sistemas automatizados dentro de la empresa en estudio. En la actualidad, la mayoría de las empresas de mediano y pequeño porte, al menos a nivel de la región, no utiliza sistemas computacionales para apoyar procesos productivos, por lo que se espera un efecto multiplicador de la experiencia a mediano plazo. De todas formas, la experiencia global de reducir los tiempos de ejecución de un conjunto de órdenes de trabajo, en alrededor de un 35%, es un resultado de alto impacto desde el punto de vista del usuario y un incentivo para profundizar en el uso de técnicas apoyadas por computadores para mejorar los procesos productivos. Uno de los puntos apreciados por el usuario es el disponer de una herramienta computarizada que, con un bajo consumo de recursos computacionales (de hecho, no ha habido adquisición de nuevo equipamiento computacional en la empresa), facilita la planificación de la producción al presentar un abanico de posibilidades desde las cuales el usuario elige aquella que más se ajuste a sus necesidades. El sistema desarrollado es naturalmente perfectible. Algunas sugerencias para el trabajo futuro incluyen la habilitación de nuevos criterios, como por ejemplo priorizar una orden de trabajo particular o priorizar un cliente. El sistema actualmente considera un máximo de 150 productos involucrados en una planificación, lo que hasta el momento satisface con holgura las necesidades de la empresa; no obstante al imaginar la portabilidad del software a otra realidad, posiblemente sería aconsejable levantar la restricción antes mencionada. Bibliografía [Back96] Back, Thomas. Evolutionary Algorithms in Theory and Practice: Evolution Strategies, Evolutionary Programming, Genetic Algorithms. Oxford University Press, 1996 [Beat92] Beaty, Steven J. Genetic Algorithms for Instruction Sequencing and Scheduling. Workshop on Computer Architecture Technology and Formalism for Computer Science Research and Applications, Naples, Italy, 1992 [Bell96] Belew, R. and Mitchell, M. (Eds). Adaptive Individuals in Evolving Populations. Addison Wesley, 1996 [Coel02] Coello Coello, Carlos; Van Veldhuizen, David; Lamont, Gary. Evolutionary Algorithms for Solving Multi-Objective Problems (Genetic Algorithms and Evolutionary Computation). Kluwer Academic Publishers, 2002 [Eibe99] Eiben E. Ágoston; Hinterding, Robert; Michalewicz, Zbigniew. Parameter Control in Evolutionary Algorithms. IEEE Transactions on Evolutionary Computation, Vol. 3, No.2, pp. 124141, 1999 [Forr93] Forrest, S.; Mitchell, M. What makes a problem hard for a genetic algorithm? Some anomalous results and their explanation. Machine Learning, 13, pp.285-319, 1993 [Gold89] Goldberg, David, E. Genetic Algorithms in Search, Optimization and Machine Learning. Addison Wesley, 1989 [Gref88] Grefenstett, John. Proceedings of the First International Conference on Genetic Algorithms and Their Applications. Lea, 1988 [Grut02] Gruttner, E.; Pinninghoff, M. A. Algoritmos Genéticos en Recorridos Óptimos de Líneas de Transporte Público. XI Congreso Latino Iberoamericano de Investigación de Operaciones, Concepción, Chile, 2002 [Hint97] Hinterding, R.; Michalewicz, Z.; Eiben, A. Adaptation in Evolutionary Computation: A Survey. Proceedings of the 4th IEEE International Conference on Evolutionary Computation, Indianapolis, pp. 65-69, 1997 [Holl95] Holland, John. Adaptation in Natural and Artificial Systems. MIT Press edition, Fourth Printing, 1995 [Pine95] Pinedo, Michael. Scheduling. Theory, Algorithms and Systems. Prentice Hall, 1995 [Mich96] Michalewicz, Zbigniew. Genetic Algorithms + Data Structures = Evolution Programs. Springer Verlag, 1996 [Mich00] Michalewicz, Zbigniew. How to Solve It: Modern Heuristics. Springer Verlag, 2000 [Mitc96] Mitchell, Melanie. An Introduction to Genetic Algorithms, Cambridge, MA: MIT Press, 1996 [Verg02] Vergara, F.E., Khouja, M.; Michalewicz, Z. An Evolutionary Algorithm for Optimizing Material Flow in Supply Chains. Computer & Industrial Engineering, Vol.43, pp. 407-421, 2002 [Vose99] Vose, Michael D. The Simple Genetic Algorithm: Foundations and Theory (Complex Adaptive Systems). Bradford Books, 1999