Algoritmos Geneticos - Guia ¡SUP... Cosma Análisis y Diseño de Datos y Algoritmos 2º Grado en Ingeniería Informática - Ingeniería del Software Escuela Técnica Superior de Ingeniería Informática Universidad de Sevilla Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. @COSMA en Wuolah GUÍA SUPREMA DE ALGORITMOS GENÉTICOS (Lo que nadie te dijo de los AG) a64b0469ff35958ef4ab887a898bd50bdfbbe91a-10375746 Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. ¿Cuándo escuchas AG te suena a un idioma inventado? ¿Miras los ejercicios de ejemplo del repositorio una y otra vez y te quedas igual que antes? ¿Te da pereza pedir tutorías? Pues en el día de hoy, vas a encontrar la primera guía de como resolver los problemas de AG para poder sacar un 10 bien bueno y sabrosón, ya que hay muy poco material relativo a este tema en la facultad (donde en general, solo se enseña la teoría, pero no como implementarla, por lo que en esta guía, la teoría no se explicara en profundidad). A partir de ahora trabajaremos con el tercer ejercicio de ejemplo de la PI4, el cuál es perfecto para entender de manera simple como implementar un AG, por lo que te recomiendo tener a mano el ejercicio para poder trabajar con esta guía simultáneamente. Tercer ejercicio PI4 2023/2024 Supongamos que tenemos ya el modelo matemático hecho (usaremos el LSI en este caso), y que tenemos definidas las clases necesarias para poder leer archivos, y los métodos que sean necesarios. Analizando el problema, tenemos el siguiente objetivo y restricciones : R1: Los grupos tienen todos el mismo número de alumnos R2: Los alumnos no pueden tener afinidad 0 OF: Maximizar la afinidad de los grupos creados En PLI solo tenemos que crear un módelo con las restricciones y ya, sin embargo, en AG tenemos que crear 3 clases principalmente: Una para el algoritmo, que tendrá la fitnessFunction - InRangeAlumnosAG Una que nos haga un parseo para los datos del Output (Lo dejamos a nuestro gusto) - SolucionAlumnos a64b0469ff35958ef4ab887a898bd50bdfbbe91a-10375746 Elimina la publicidad de este documento con 1 coin Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. @COSMA en Wuolah Análisis y Diseño de Datos y... Banco de apuntes de la @COSMA en Wuolah El test, en el que introduciremos el elitismo, el tamaño de la población… TestAlumnosAGRange En la cabecera de nuestra clase, expresamos como van a ser nuestros cromosomas, en este caso ValuesInRange, ya que vamos a tener una lista con todos los alumnos, sea tal que: listaManin = [0,0,1,…,2] Si recorremos la lista, cada índice es un alumno, por lo tanto, el alumno 0 será del grupo 0, el alumno 1 del grupo 0, el alumno 2 del grupo 1, … y el último alumno del grupo 2. El size es el tamaño del cromosoma, en este caso, como queremos asignar cada alumno a un grupo, en el cromosoma deben aparecer todos los alumnos, usando el método getNumAlumnos(). El min y el max serán los valores que pueden adoptar los cromosomas, si ponemos min 0, y max 3 [0,3), significaría que los alumnos deben estar divididos entre 3 grupos (Grupo 0, 1 y 2). a64b0469ff35958ef4ab887a898bd50bdfbbe91a-10375746 Elimina la publicidad de este documento con 1 coin Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. Analicemos primero la clase InRangeAlumnosAG: @COSMA en Wuolah Este método simplemente nos devuelve el cromosoma final, para luego tratarlo en la clase SolucionAlumnos. Finalmente, llegamos a la joya de la corona, a la fitnessFunction, vamos a analizarla: Emperamos primero definiendo las variables goal, y error, pensemos en que si el cromosoma es un crack, le damos una recompensa, pero si no lo es, le castigamos, y le sumamos al error las cuales son siempre comunes a todos los ejercicios. Ahora, definiremos un vector cuya dimensión es el número de grupos que hay. El primer LOOP lo que hace es iterar sobre los elementos de la lista, por lo que, si el alumno0 es del grupo 1, nos añadirá un 1 en la posición 1 de v (V = [0,1,0,0,0,0]). Si el alumno1 es del grupo 0 -> V = [1,1,0,0,0,0] Si el alumno3 es del grupo 0 -> V = [2,1,0,0,0,0] Lo vas pillando no? Bieeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeen Con esto, sabremos cuantos alumnos hay en cada grupo en el cromosoma generado. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-10375746 Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. @COSMA en Wuolah Si la afinidad del alumno i es > 0, le damos una galletita al cromosoma, y añadimos al goal 1, ya que hemos conseguido que 1 alumno tenga afinidad > 0, sin embargo si la afinidad del alumno es menor que 0, le castigamos sin móvil, y le sumamos 1 al error. No es tan complicado, a qué no? Finalmente, tenemos otro LOOP, que itera sobre los elementos del vector v, si el tamaño no es el mismo que el tamaño predeterminado que deben tener los grupos, penalizamos, y sumamos 1 al error. Finalmente, como queremos maximizar (si quisiéramos minimizar ponemos un – antes del goal), devolvemos goal – k * error (siendo k el Tamaño del torneo, una constante). La clase del parseo y del test no serán explicadas, ya que son siempre iguales en todos los ejercicios (CTRL+C -> CTRL+V). Pues esto sería todo, para más dudas, pedid tutorías >:) a64b0469ff35958ef4ab887a898bd50bdfbbe91a-10375746 Elimina la publicidad de este documento con 1 coin Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. Ahora, centrémonos en este if, siendo a, la afinidad del alumno i: