7 Optimización de Horarios de Examen Utilizando Algoritmos Genéticos Sergio Morel1, Gabriela Bobadilla2 Becario del PDTA categoría iniciación científica Universidad Nacional- Facultad Politécnica 1 [email protected], [email protected] 1 Resumen. En este trabajo de investigación se utiliza la inteligencia artificial, específicamente los algoritmos genéticos, para optimizar los horarios de exámenes de tal forma que las materias queden lo más distanciadas posibles. Para la elaboración del horario de exámenes se debe tener en cuenta ciertas restricciones, tales como: el horario disponible para rendir las asignaturas, la disponibilidad del profesor y de los alumnos, y la dificultad de los exámenes. Los algoritmos genéticos se encargan de calificar un conjunto de horarios iniciales, y luego de encontrar el horario que mejor cumpla con los requerimientos. Se ha programado en Java utilizando el entorno de desarrollo Eclipse; los resultados obtenidos fueron satisfactorios en la optimización de horarios de exámenes para cada semestre en forma individual. Palabras Claves: algoritmos genéticos, horarios de examen, optimización, inteligencia artificial. Abstract. This paper uses artificial intelligence, specifically genetic algorithms to optimize the exam schedules so that the exam dates can be separated from each other. For the construction of the schedule many considerations must be taken, such as: the available dates for each exam, the time availability of the teachers and students, and the grade of difficulty of each exam. The genetic algorithms are responsible for qualifying a set of initial schedules, and then finding the schedule that best meets the requirements. The programming was made in Java, using an integrated development environment called Eclipse. Satisfactory results were obtained when optimizing the schedules for each semester individually. Keywords: genetic algorithm, exam schedule, optimization, artificial intelligence. 1. Introducción Uno de los objetivos de este trabajo es introducir en la vida cotidiana el uso de la inteligencia artificial, y de esta manera delegar a las computadoras algunas de las tareas que actualmente ocupan un tiempo importante de las personas. De esta forma, ellas pueden aumentar su eficiencia en el trabajo que están desempeñando, pues enfocan su concentración en las demás tareas. En esta investigación se utilizan los algoritmos genéticos, o evolutivos, que han demostrado ser los más eficientes para los trabajos de optimización. Estos algoritmos se basan en la teoría de la evolución de Charles Darwin, según la cual todos los seres vivos evolucionan por medio de la selección natural, proceso en el que los representantes más aptos de cada especie son los que tienen mayor oportunidad de procrear, lo que permite que la siguiente generación herede características que ayuden a mejorar su aptitud con relación a la generación anterior. Los algoritmos genéticos crean una primera generación de resultados, y tratan de simular la selección natural para obtener resultados cada vez más satisfactorios. Las soluciones de un problema se representan de forma similar a la estructura del ADN (Acido Desoxirribonucleico), en donde una secuencia de aminoácidos determina cuáles serán las características de cada individuo. Este tipo de representación facilita la implementación de algoritmos de cruce y mutación. El algoritmo de cruce es el que se encarga de seleccionar resultados iniciales, y combinarlos para crear los nuevos resultados que pertenecerán a la siguiente generación. La forma de seleccionar dichos resultados es muy importante, pues de ello depende que se pueda ARTÍCULOS CIENTÍFICOS – INFORMÁTICA – Nº 4 – AÑO 2008 8 simular correctamente la selección natural de Darwin. El modo de realizar las combinaciones también es un punto importante a tener en cuenta. inglés) Eclipse se puede conseguir en la página http://www.eclipse.org/. El algoritmo de mutación se encarga de modificar, generalmente en forma aleatoria, la población de resultados. Esto es necesario, debido a que el algoritmo de cruce puede estancarse con una población de resultados iguales o similares. Gracias a la mutación se puede introducir variedad a la población y de esa manera examinar diferentes resultados posibles. 4.1. Representación El algoritmo que se utiliza para calificar a cada resultado es de suma importancia, puesto que define cuáles resultados son los más satisfactorios. La alteración de este algoritmo puede cambiar totalmente los resultados obtenidos. 2. Objetivo El objetivo de este proyecto es brindar a la Facultad Politécnica de la UNE un software capaz de generar automáticamente los horarios para los exámenes parciales y finales; y de esta forma ahorrar gran parte del tiempo de su elaboración. Además, el programa tiene como objetivo que estos horarios sean óptimos y se adecuen a las disponibilidades de los profesores y alumnos. 4. Métodos Lo primero que se debe definir es la forma de representar los resultados que se van a evaluar. Para este programa se utilizó un vector de números enteros para representar cada horario de examen. Cada posición del vector representa una materia, y el valor en esa posición determina el horario de dicha materia. Los horarios se representan de 30 en 30 minutos a partir del primer día disponible. Si se considera el lunes 1 como el primer día, una materia que tenga como valor un 0 estará definida para el lunes 1 a las 00:00hs.; de la misma forma, una materia que tenga como valor 5 estará definida para el lunes 1 a las 02:30hs. La Figura 1 muestra un ejemplo de cómo se representa el horario, mientras que la Tabla 1 muestra cómo se interpreta. Figura 1. Representación de un horario Horario 3. Materiales Para la implementación de los algoritmos genéticos, se decidió utilizar el lenguaje de programación Java debido a su gran portabilidad y por las ventajas que ofrece la programación orientada a objetos. Para programar en Java se necesita tener instalado el JDK (Java Development Kit) para el sistema operativo a utilizar. El JDK es la herramienta que permitirá compilar el programa a “bytecodes”. Los “bytecodes” después pueden ser ejecutados en cualquier máquina que disponga de una máquina virtual java JVM (Java Virtual Machine). Todo lo necesario se puede conseguir en la página http://www.java.com/. Como ayuda para la programación en Java se decidió utilizar el entorno de desarrollo integrado Eclipse. Mediante éste se pudo acelerar la programación gracias a la ayuda que proporciona en el momento de detectar errores, en el seguimiento de variables, etc. El entorno de desarrollo integrado (IDE por sus siglas en Lunes Materia Valor 01 15:00hs. : Materia 3 (30) Viernes 05 14:00hs. : Materia 5 (220) Lunes 08 14:00hs. : Materia 1 (364) Jueves 11 14:00hs. : Materia 4 (508) Martes 16 08:00hs. : Materia 2 (736) Sábado 20 08:00hs. : Materia 6 (928) Tabla 1. Interpretación de un horario 4.2. Generación En este programa se incluyen las restricciones fuertes en el momento de la generación de los horarios; de esta forma, no se pierde tiempo con horarios que no son factibles, y se libera al algoritmo de calificación de tratar con dichos horarios. Se llama restricciones fuertes a aquellas que todos los horarios deben cumplir para ser factibles, como por ejemplo que los exámenes se realicen en horarios que tengan disponibles los profesores y alumnos. ARTÍCULOS CIENTÍFICOS – INFORMÁTICA – Nº 4 – AÑO 2008 9 A cada materia se le puede asignar varios rangos que delimiten los horarios en que son factibles, esto permite, por ejemplo, restringir a una materia para que se genere solo los días lunes, como también fijar la fecha y hora exacta de una materia cuyo horario ya queda definido de antemano. En caso de que no se asigne rangos a la materia, ésta puede generarse desde las 07:00hs hasta las 19:00hs de cualquier día en forma aleatoria (incluyendo los domingos). La duración del periodo de examen en este programa se mide en semanas; en caso de que el periodo de exámenes no dure una cantidad entera de semanas, se puede utilizar los rangos para evitar que algunos exámenes caigan fuera del tiempo permitido. 4.2.1. Generación sin rangos Para generar el valor de una materia, en caso de que no tenga rangos asignados, se utiliza la fórmula descripta más abajo. Cabe destacar que la función rand (x, y ) genera valores aleatorios entre x e y, incluyendo los límites. Se segmenta esta fórmula para que pueda ser comprendida con mayor facilidad. Para generar en un día perteneciente al periodo de examen se utiliza este término: (24 × 2) × rand (0, [semanas × 7] − 1) ; en caso de que rand devuelva 0, caerá en el primer día; en caso que devuelva 1, caerá en el segundo día; y en caso de que devuelva [semanas × 7 ] − 1 , caerá en el último día. Si se utilizara solo la parte de la fórmula explicada anteriormente, todos los exámenes comenzarían a las 00:00hs, por lo tanto es necesario sumarle el término (7 × 2 ) , el cual define que los exámenes puedan comenzar recién a partir de las 07:00hs. Luego, sumarle rand (0, [12 × 2]) permite que el horario pueda variar 12 horas a partir de las 07:00hs. De esta manera el horario generado puede llegar hasta las 19:00hs. 4.2.2. Generación con rangos rango utiliza dos posiciones consecutivas para definir los límites. Todos los rangos empiezan en posiciones pares; estando, por ejemplo, los límites del primer rango en las posiciones 0 – 1. Cada materia puede tener un número indefinido de rangos. La Figura 2 muestra los rangos asignados a la Materia 1. Puede observarse que en este caso cada rango contiene límites superiores e inferiores iguales, esto es debido a que se desea limitar el horario de la materia a los días lunes a las 14:00hs. Cada rango corresponde a un lunes de cada semana del periodo de examen. Figura 2. Representación de los rangos de una materia Para generar los valores dentro de los rangos, primeramente se procede a elegir uno de ellos utilizando esta formula: Después de haber seleccionado el rango en forma aleatoria, se deben generar los datos dentro de los límites de ese rango de esta forma: 4.3. Calificación Uno de los algoritmos más importantes es el que se utiliza para calificar a los resultados, ya que aquí se define cuáles son los resultados que se pretende hallar. En este caso el objetivo es obtener horarios en los que las materias estén lo más separadas posible. Para lograr este cometido se optó por imitar el comportamiento de las cargas eléctricas de signos iguales. Estas cargas se repelen con una fuerza F que se calcula de la siguiente manera según la “Ley de Coulomb” F = k× q1 × q 2 r2 donde q1 y q2 son las magnitudes de las cargas participantes y r es la distancia entre ellas. El valor de la fuerza de repulsión aumenta a medida que las cargas se acercan, puesto que el valor de r se hace cada vez menor, esto se puede observar en la Figura 3. Para representar los rangos de una materia se utiliza un vector de tamaño par, en donde cada ARTÍCULOS CIENTÍFICOS – INFORMÁTICA – Nº 4 – AÑO 2008 10 Individuo Calificación Porcentaje A 300 25,00% B 100 8,33% C 250 20,83% D 50 4,17% E 500 41,67% Tabla 2. Población de 5 Individuos Figura 3. Gráfico de la función de calificación (verde), y de la Ley de Coulomb (azul) Lo que nosotros buscamos es dar mayor calificación a los horarios más distantes, por lo tanto la calificación se obtendrá hallando la inversa de la sumatoria de los resultados obtenidos con la Ley de Coulomb. La calificación se obtendrá por medio de esta fórmula: N −1 N −1 p × p 1 j = ∑∑ i calificaci on i = 0 jj=≠0i dist (i , j )2 Donde p es el peso asignado a cada materia según el grado de dificultad; la función dist (i, j ) es la que halla la distancia entre las materias i y j; y N es el número total de materias. En el caso de que la distancia entre 2 materias sea 0, el valor de la distancia se sustituye por 1, para evitar una división por cero, y luego se aplica una penalización a la calificación final, dividiéndola por 10 por cada sustitución hecha. El tamaño de la población no varía al realizar el cruce, y la totalidad de los individuos de la nueva generación son resultado de los cruces con los individuos de la generación padre. Para realizar el cruce es necesario seleccionar los individuos que participarán del mismo, para ello se crea una tabla de cruce de N filas y 2 columnas. Los cruces se realizarán entre los individuos de la misma fila. Los individuos son cargados en la tabla de tal forma que los individuos con mayor porcentaje tengan mayores probabilidades de ser sorteados. Para el sorteo, se asigna un rango a cada individuo según su porcentaje de aptitud, como puede verse en la Figura 4, y luego se procede a generar en forma aleatoria números del 0 al 100. Figura 4. Rango de Probabilidad para Sorteo 4.4. Cruce A cada individuo (horario), una vez que pertenezca a una población (conjunto de horarios), se le asigna un porcentaje de aptitud con respecto a los demás miembros de la población. Este porcentaje se calcula de la siguiente forma: calificacioni porcentajei = 100 × N −1 ∑ calificacion j j =0 Una vez seleccionados los individuos que participarán del cruce, se procede a realizarlo. En este programa, el cruce se realiza recorriendo materia por materia; para cada materia se genera un valor aleatorio entre 0 y 1, de esa forma se elige el valor de uno de los participantes para el nuevo individuo. Un individuo puede pasar a la siguiente generación sin ser modificado si en la tabla de cruce aparece en las 2 columnas de la misma fila, puesto que se trataría de un cruce consigo mismo. La Figura 5 muestra un ejemplo de cruce. En donde N es la cantidad de individuos de la población. La Tabla 2 nos muestra un ejemplo de una población de 5 individuos. ARTÍCULOS CIENTÍFICOS – INFORMÁTICA – Nº 4 – AÑO 2008 11 Se pudo observar que para tener mayor variedad de soluciones es mejor asignar una hora exacta de inicio de examen para cada materia, en lugar de un rango de horas posibles. Esto se debe a que al utilizar los rangos, se obtienen un conjunto de soluciones similares, en donde cada solución tiene los exámenes en el mismo día que las demás, pero con variaciones mínimas en el horario de inicio. Figura 5. Ejemplo de Cruce 4.5. Mutación Para realizar la mutación se debe establecer un porcentaje de mutación, el cual determinará con qué probabilidad un individuo será modificado; y un porcentaje de intensidad, el cual indicará cuánto variará el individuo. Primeramente, se procede a recorrer la población; para cada individuo se genera un valor aleatorio desde 1 hasta 100, si el valor generado es menor o igual que el porcentaje de mutación, entonces ese individuo será seleccionado para la mutación. Una vez seleccionado el individuo, se procede a recorrer cada materia. Se vuelve a generar un valor aleatorio entre 1 y 100, y en caso de que el valor generado sea menor o igual al porcentaje de intensidad, se generará un nuevo valor para la materia. 5. Discusión Para utilizar los algoritmos genéticos es necesario determinar ciertos parámetros que pueden influir en la calidad de los resultados que obtenemos. Entre ellos se pueden incluir el método de parada del algoritmo, el tamaño de la población y los parámetros de mutación. Los mejores resultados se obtuvieron con los siguientes parámetros: Tamaño de población 20, probabilidad de mutación 25%, intensidad de mutación de 20%. Para el criterio de parada se decidió utilizar 500 de ciclos de cruce y mutación, debido a que utilizar una calificación mínima puede generar ciclos infinitos. Se podría también tener en cuenta otra forma alternativa de calificar a los individuos. Por ejemplo, se podría tener en cuenta solo la materia inmediatamente anterior en el momento de calcular la calificación, y utilizar solamente el peso de la materia actual, de acuerdo a la siguiente formula: En donde materiaAnterior (i ) encuentra la posición de la materia con el horario inmediatamente anterior a la materia actual. Se debe tener en cuenta que la materia con el horario más temprano no tendrá materia anterior, por lo tanto no se la debe incluir en el cálculo. Otro detalle que se podría tener en cuenta es la manera de generar los horarios dentro de los rangos. En este programa se realiza un sorteo en forma aleatoria de los rangos, y luego se procede a generar dentro del rango seleccionado. Esto causa que los horarios, dentro de los rangos menores, tengan mayor probabilidad de ser seleccionados. Para solucionar este inconveniente se podría utilizar un método similar al utilizado en el cruce, mostrado en la Figura 5. 6. Conclusión Mediante este proyecto se logró solucionar el problema de creación y optimización de horarios para la Facultad Politécnica de la UNE, a través de la utilización de la inteligencia artificial. Durante la realización del proyecto se buscó la mejor forma de representar y resolver el problema; y como resultado se pudo encontrar más de una manera de resolverlo. Para guardar los resultados de mayor calificación, se decidió utilizar un vector de tamaño 5, en el cual se va guardando los individuos de cada generación con la mayor calificación, sin repetir ningún individuo. ARTÍCULOS CIENTÍFICOS – INFORMÁTICA – Nº 4 – AÑO 2008 12 7. Referencias [1]GOLDBERG, D.E. (1989): Genetic Algorithms in Search, Optimization, and Machine Learning. Addison-Wesley, Reading, MA. Wikipedia, La enciclopedia libre. Algoritmo genético [17-11-2007] http://es.wikipedia.org/wiki/Algoritmo_genético ALGORITMOS GENETICOS [18-03-2008] http://eddyalfaro.galeon.com/geneticos.html Juan Julian Merelo Guervos. Tutorial de algoritmos evolutivos [12-03-2008] http://geneura.ugr.es/~jmerelo/ie/ags.htm [Linden Ricardo 2006], “Algoritmos Geneticos, Uma importate ferramenta da Inteligência Computacional”, Rio de Janeiro: Brasport. ARTÍCULOS CIENTÍFICOS – INFORMÁTICA – Nº 4 – AÑO 2008